Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA根据列的动态第一行值隐藏和取消隐藏列_Vba_Excel - Fatal编程技术网

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

VBA根据列的动态第一行值隐藏和取消隐藏列,vba,excel,Vba,Excel,我有一个Excel工作簿,有两张工作表:摘要和单击隐藏 摘要表包含多个复选框表单。选中该复选框后,它们在单击隐藏工作表中返回一个真或假值,全部在行a中 ClickHideSheet:在A2:A20中的这些值旁边,我将一个“0”或“1”值赋予TRUE或FALSE结果。这些结果在范围B2:BZ45内水平移动。在上单击隐藏第1行,我在每列的顶部都有一个计算结果的公式 在摘要B1:BZ1中,我复制了指向中单元格的链接,单击隐藏A1:BZ1 我的问题: 我打算使摘要中的列在其自身行中的值为非0时自动隐

我有一个Excel工作簿,有两张工作表:
摘要
单击隐藏

  • 摘要表
    包含多个复选框表单。选中该复选框后,它们在
    单击隐藏工作表
    中返回一个
    值,全部在
    行a

  • ClickHideSheet
    :在
    A2:A20
    中的这些值旁边,我将一个“0”或“1”值赋予
    TRUE或FALSE
    结果。这些结果在范围
    B2:BZ45
    内水平移动。在
    上单击隐藏第1行
    ,我在每列的顶部都有一个计算结果的公式

  • 摘要B1:BZ1
    中,我复制了指向
    中单元格的链接,单击隐藏A1:BZ1

我的问题

我打算使
摘要
中的列在其自身行中的值为0时自动隐藏。(如果B1不是0,则隐藏列B,否则取消隐藏)。用户将与复选框交互,因此每次修改复选框时都需要触发宏

我在那里找到了代码片段,但它们似乎都不起作用。我在VBA方面真的很差,所以它可能是我缺少的一个简单的编辑

这两种我都试过了,都没有成功。看一看

下一个我真的不知道它是否是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
我不知道如何在这里嵌入电子表格,所以这里是两张表的图片,简化后显示一个示例


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

您发布的代码不属于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

将此代码放入此工作簿的
模块:

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列)。如果需要评估的列发生更改,请更改此数字

如果希望它仅在特定工作表上工作,请将第一行更改为
专用子工作表\u Calculate()
,并将其放置在该特定工作表的模块中


编辑:修改后的代码,在几乎没有更改的情况下,它可能会运行得更快。

我尝试了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
Private子工作表_Calculate()
对于范围(“B1:BZ1”)中的每个单元格,**如果范围不正确,请编辑
选择大小写单元格。值为0
案例错误
cell.EntireColumn.Hidden=False
情况属实
cell.EntireColumn.Hidden=True
结束选择
下一个细胞
端接头

我已经清除了所有的VBA,因为我什么也没做。我已经在您的代码私有子工作表前面添加了这一点。\u更改(ByVal Target As Range)并用End Sub关闭,似乎不会触发或执行任何操作。我不知道把这些代码贴在哪里。。。工作表、工作簿、模块?
专用子工作表\u更改(ByVal目标作为范围)
仅适用于工作表中的更改事件。您必须将其包含在
公用子工作表
模块中。转到vba插入模块确认,这完全符合预期。由于某种原因,它相当慢。可能是因为它在所有列中循环。它在我的测试表中是瞬时的。可能会让它变慢的是,如果你有大量的重新计算,特别是如果它们是自动的。如果宏只需要处理一张工作表,你也可以尝试建议的方法,这可能有助于加快速度(通过在其他工作表上重新计算时不触发)。请看我答案的底部。@Nickstoy请看修改后的答案,我认为它应该运行得更快。是的,它确实运行得更快!!我使用
Private子工作表\u Calculate()Dim rng作为范围应用程序。对于I=2到80,屏幕更新=False设置rng=单元格(1,I)如果rng.entireclumn.Hidden=0,则如果rng.Value为0,则rng.entireclumn.Hidden=1;如果rng.Value=0,则rng.entireclumn.Hidden=0,则如果下一个i-End子项关闭屏幕更新,则可能会加快一点速度。将
Application.screenUpdate=False
放在
For
循环之前,并将
Application.screenUpdate=True
放在循环结束后。谢谢,它确实有了一些改进。
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