VBA根据动态第一行值隐藏和取消隐藏列

时间:2016-07-12 04:57:49

标签: excel vba excel-vba

我有一张包含2张的Excel工作簿:summaryClickHide

  • Summary Sheet包含多个复选框表单。选中此复选框后,他们会在TRUE中返回FALSEClickHide Sheet值,全部位于ROW A

  • ClickHideSheet:在A2:A20中的这些值旁边,我将一个" 0"或" 1" TRUE or FALSE结果的值。这些结果在B2:BZ45范围内水平移动。在ClickHide Row 1,我有公式可以在每列的顶部获得结果。

  • Summary B1:BZ1中,我复制了ClickHide A1:BZ1中单元格的链接。

我的问题

  

我打算让Summary中的列自动隐藏,当它们自己行中的值 0.时(如果B1不是0,则隐藏B列,否则取消隐藏) 。用户将与复选框进行交互,因此每次修改复选框时都需要触发宏。

我找到了代码片段,但它们似乎都没有用。我对VBA非常不好,所以这可能是一个我想念的简单编辑。

我已尝试过这两种方法,但没有成功。看看the following reference

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    For i = 2 To 80
        Cells(1, i).EntireColumn.Hidden = Cells(2, i) = 0
    Next
End Sub

下一个我真的不知道它是否是VBA代码。

oSheets = ThisComponent.getSheets()
oSheet1 = oSheets.getByName("Sheet1")
oColumns = oSheet1.getColumns()
for i = 0 to 25
   oCol = oColumns.getByIndex(i)
   oCell = oSheet1.getCellByPosition(i,0) 'First row has index 0
   If oCell.Value = 0 Then
      oCol.isVisible = False
   Else
      oCol.isVisible = True
   End If
next i

我不知道如何在这里嵌入电子表格,所以这里有两张图片,简化为一个示例。

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:0)

您发布的代码不属于Excel,而是属于openoffice。

下面的代码将隐藏值为0的单元格(第1行)中的列。您可以在宏的末尾包含此代码。

Public sub Hidecol()
'Count no. of used columns in 1st row
l = Cells(1, Columns.Count).End(xlToLeft).Column 
'Loop through 1st row  1stcolumn till 1st row lastcolumn
For i = 1 To l
'if cell vaue is 0 then hide cell column
If Cells(1, i).Value = 0 Then
Cells(1, i).EntireColumn.Hidden = True
End If
Next i
End Sub

答案 1 :(得分:0)

将此代码放在ThisWorkbook模块中:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim rng As Range
    Application.ScreenUpdating = False
    For i = 2 To 9
        Set rng = Cells(1, i)
        If rng.EntireColumn.Hidden = 0 Then
            If rng.Value = 1 Then rng.EntireColumn.Hidden = 1
        Else
            If rng.Value = 0 Then rng.EntireColumn.Hidden = 0
        End If
    Next i
End Sub

它可以在任何工作表上从B列到I(第2列到第9列)。如果您需要评估的列发生更改,请更改此编号。

enter image description here

如果您希望它仅适用于特定工作表,请将第一行更改为Private Sub Worksheet_Calculate()并将其放在该特定工作表的模块中。

编辑:经过修改的代码,当变化很少时,它应该可以更快地运行。

答案 2 :(得分:0)

我尝试过Vegard的答案,效果很好。

我也应用了这个脚本,它似乎运行得稍微快一些,但总体来说还是很慢。

Private Sub Worksheet_Calculate()


    For Each cell In Range("B1:BZ1")   '**edit if not correct range
        Select Case cell.Value <> 0
            Case False
                cell.EntireColumn.Hidden = False
            Case True
                cell.EntireColumn.Hidden = True
        End Select
    Next cell

    End Sub