我已经搜索过并发现了类似于我想要做的事情,但是我不理解VBA(没有注释)并且无法发表评论所以我无法使其适应我的目的。
我将SheetNames的范围放在Sheet1的C列中。这会随着时间的推移而增长/缩小。 我将它转换为Sheet2的第1行(C1:DZ1)的宽数组。 这留下了许多以#N / A为首的空列。
我在Sheet2(HideColumns)中有一个宏,当运行时(目前手动),将隐藏/取消隐藏列恰到好处。不要问我它是如何工作的,它没有注释。 信用:克里斯尼尔森在How to hide columns (G-AZ) when cell value is #N/A
当Sheet1中的范围发生变化时,我无法自动运行该Sheet2宏。我明白了 范围(Sheet2.D1:DZ1) 可以从某个地方完成,也可以 调用Sheet2.HideColumns 但我不知道如何在我的案例中做出工作这些事情。我相信这与Target有关,但这就是我迷失的地方。
[编辑]找到解决方案。删除了我之前的尝试,以避免误导他人/增加混淆。
很多,非常感谢Andy在OZGrid:http://www.ozgrid.com/forum/showthread.php?t=39060
我现在在Sheet1模块中有Andy的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Target, Range("ProductNames")) Is Nothing Then
Call Sheet2.HideColumns
End If
Application.ScreenUpdating = True
End Sub
和Sheet2模块中的Chris代码:
Sub HideColumns()
Dim rng As Range
Dim cl As Range
Application.ScreenUpdating = False
Set rng = [C1:DZ1]
For Each cl In rng
If IsError(cl) Then
cl.EntireColumn.Hidden = cl = CVErr(xlErrNA)
Else
cl.EntireColumn.Hidden = cl = ""
End If
Next
Application.ScreenUpdating = True
End Sub
它有效。当我在Sheet1中的C16:C300范围内添加或删除数据时,Sheet2的第1行值由于我的TRANSPOSE而改变,并且调用宏来隐藏仍然(或变为)#N / A或其他错误的列;并取消隐藏不再是#N / A或其他错误的列。
成功地弄明白了。只用了2天就开始...... #shouldhavebeeneasy
[编辑] 更简单的解决方案,其中转置单元格数组而不是命名范围(对于空白单元格返回0而不是#N / A):
Sub HideColumns()
Application.ScreenUpdating = False
Dim r As Range
Set r = Range("D1:DZ1")
For Each cell In r
If cell.Value = "0" Then
cell.EntireColumn.Hidden = True
Else
cell.EntireColumn.Hidden = False
End If
Next
Application.ScreenUpdating = True
End Sub
感谢CuberChase在这里为For Each cell.Value提供指导 vba loop through column and if certain value then increment