当数据输入到不同的工作表时,用于隐藏/取消隐藏列的宏

时间:2014-07-31 08:29:45

标签: excel vba automation hide

我已经搜索过并发现了类似于我想要做的事情,但是我不理解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

0 个答案:

没有答案