VBA根据其dynamic第一行值隐藏和取消隐藏列

我有一个Excel工作簿2张: summaryClickHide

  • Summary Sheet包含多个checkbox表单。 当checkbox被选中时,它们将在ClickHide Sheet返回一个TRUEFALSE值,全部在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列,否则取消隐藏)。 用户将与checkbox进行交互,因此每次checkbox被修改时都需要触发macros。

我已经find了代码片断,但没有一个似乎工作。 我在VBA方面真的很糟糕,所以可能是我错过的一个简单的编辑。

我已经尝试了这两个,没有成功。 看看下面的参考 。

  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 

我不知道如何在这里embedded一个电子表格,所以这里是两张图片的图片,简化来显示一个例子。

  • 汇总表
  • 点击隐藏工作表

预先感谢您提供的任何帮助。

将此代码放在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列)工作。 如果需要评估更改的列,请更改此编号。

在这里输入图像说明

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

编辑:修改后的代码,它应该可能运行速度更快时,几乎没有变化。

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

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

 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 

我已经尝试了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