首页 > 解决方案 > 同一宏在一个 Excel 电子表格中工作,但在另一个电子表格中不工作(曾经工作)

问题描述

我需要一个宏来隐藏同一选项卡中两个不同表中的空白行。问题是下面提到的第一个宏在第二个选项卡(称为服务)中工作,但在第三个选项卡(称为第三方)中不起作用。每个选项卡中的两个宏都分配给按钮(每个选项卡上一个)。最重要的是,相同的宏(下面提到的第一个宏 - 没有循环的较长的宏)曾经在此选项卡中工作,但由于某种原因突然停止了,所以我真的需要知道为什么它停止工作以防止它将来不会发生,并找出如何修复下面提到的任何一个宏。

Sub HideRowsInThirdPartyTabTemp()
Call TurnOffFunctions
If Sheets("THIRD-PARTY").Rows("8:23") = " " Then
    Range("8:23").Rows.Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B36") = 0 Then
      Range("29:48").Rows.Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B57") = 0 Then
      Range("50:69").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B78") = 0 Then
      Range("71:90").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B99") = 0 Then
      Range("92:111").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B120") = 0 Then
      Range("113:132").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B141") = 0 Then
      Range("134:153").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B162") = 0 Then
      Range("155:174").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B183") = 0 Then
      Range("176:195").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B204") = 0 Then
      Range("197:216").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B225") = 0 Then
      Range("218:237").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B246") = 0 Then
      Range("239:258").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B267") = 0 Then
      Range("260:279").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B288") = 0 Then
      Range("281:300").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B309") = 0 Then
      Range("302:321").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B330") = 0 Then
      Range("323:342").Hidden = True
End If
If Sheets("THIRD-PARTY").Range("B351") = 0 Then
      Range("344:363").Hidden = True
End If
Call TurnOnFunctions
End Sub

上面的宏是一直在工作并且仍在另一个选项卡中工作的宏。我也尝试了下面的宏,因为我试图更多地使用循环。然而,这个宏有它自己的问题。它只隐藏第二个表(在 THIRD-PARTY 选项卡中)中的空白行,而不是第一个表(在 THIRD-PARTY 选项卡中)。当然,我是使用 VBA 的新手,但不明白为什么它会在工作簿的一部分中起作用,而在另一部分中不起作用。起初我认为 B8:B23 (如果在 THIRD-PARTY 选项卡的第一个表中为空白的行将被隐藏)不起作用,因为这些单元格已合并,但当我取消合并它们时我遇到了同样的问题。不确定它是否会影响它,但第一个表中的单元格(在第三方选项卡中)确实引用了第二个表中的单元格(也在第三方选项卡中,B8:B23 中的每个单元格对第二个表中的每个相应部分求和)桌子。

Sub HideRowsInThirdPartyTabDim()
Call TurnOffFunctions
Dim r As Range, c As Range
Set r = Range("B8:B23,C37:C56,C58:C77,C79:C98,C100:C119,C121:C140,C142:C161,C163:C182,C184:C203,C205:C224,C226:C245, C247:C266,C268:C287,C289:C308,C310:C329,C331:C350,C352:C371")
Application.ScreenUpdating = False
For Each c In r
If Len(c.Text) = 0 Then
    c.EntireRow.Hidden = True
Else
    c.EntireRow.Hidden = False
End If
Next c
Application.ScreenUpdating = True
Call TurnOnFunctions
End Sub

标签: excelvba

解决方案


你的不合格Range("num:num").Hidden = True总是隐含地在 ActiveSheet 上工作。

将所有代码包装在这样的With语句中,它应该可以正常工作

Sub HideRowsInThirdPartyTabTemp()
  TurnOffFunctions
  With Sheets("THIRD-PARTY")
  If .Rows("8:23") = " " Then
    .Range("8:23").Rows.Hidden = True
  End If
  If .Range("B36").Value = 0 Then
    .Range("29:48").Rows.Hidden = True
  End If
  If .Range("B57").Value = 0 Then
    .Range("50:69").Hidden = True
  End If
  'etc
  End With
End Sub

请注意,.在方法调用之前有一个Range(),它告诉编译器这属于你正在做的任何事情With

注意:一致的缩进对阅读你的代码很有帮助

注意 2:不需要Call- 它已被弃用多年,仅受支持,因此运行尚未编辑的古老代码的人不必编辑它以在较新版本的 VBA 中运行它。

注 3:我添加.Value.Range()语句的末尾以明确说明您正在查看的内容。.Value是这种方式使用时的默认属性.Range(),但总是最好说出你的意思并表达你所说的意思。


推荐阅读