excel - 同一宏在一个 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
解决方案
你的不合格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()
,但总是最好说出你的意思并表达你所说的意思。
推荐阅读
- google-apps-script - 如果没有可用的“返回”,Google Apps 脚本 .getMonth 将不起作用
- python - 在列中的字符串中查找匹配项
- apache-spark - Spark SQL,是否可以编写一个可以解析 JAVA_OBJECT 类型并将其转换为 StructType 的 JdbcDialect?
- c++ - std::function 对象的 C++ 映射抛出“未能专门化函数模板”错误
- mysql - mysql2 0x0000000000000000 处的分段错误
- node.js - 纱线启动命令失败,退出代码为 1
- javascript - 无法在配置了 Babel 的模块外部使用 import 语句
- python-3.x - 使用 python OpenCv 循环中值滤波器
- react-native - React Native 使用导航类组件
- javascript - 无法使用 javascript 从阿拉伯文本中拆分英文文本