2

VBA 不是我的专长,但我们开始吧:

一旦隐藏或显示一组列,我想触发一个宏。我该如何存档?


我之前的研究结果

我能找到的唯一好的提示是MSDN 上的这个讨论。在这里,一个解决方案是使用以下方式起草的:

从 xlsx 文件的根目录创建一个customUI\customUI.xml包含内容的文件

<customUI  xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
    <commands >
        <command 
            idMso="ColumnsHide"
            onAction="ColumnHide_onAction"/>
        <command 
            idMso="ColumnsUnhide"
            onAction="ColumnUnhide_onAction"/>
    </commands >
</customUI >

并添加

<Relationship Id="edTAB" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml" />

_rels\_rels.xml. (所有这一切使用 Visual Studio 可能要容易得多,但我无法访问微软世界中如此复杂的工具......)现在,可以通过以下方式使用宏:

Public Sub ColumnHide_onAction(control As IRibbonControl, ByRef cancelDefault)
'
' Code for onAction callback. Ribbon control command
'
    MsgBox "Ribbon Column Hide"
    cancelDefault = False

End Sub
Public Sub ColumnUnhide_onAction(control As IRibbonControl, ByRef cancelDefault)
'
' Code for onAction callback. Ribbon control command
'
    MsgBox "Ribbon Column Unhide"
    cancelDefault = False
End Sub

这种方法完美地捕获了列的隐藏和取消隐藏,但不能隐藏和取消隐藏组。所以,接近,但不完全在那里。

从这里下载可能的idMso值,我得到了控件的通知。但是,使用与或不归档所需结果相同的方式。GroupViewShowHideColumnsHideColumnsUnhide

有任何想法吗?

4

1 回答 1

0

对于隐藏列组,我注意到您没有.Hidden在代码示例中使用该属性。它可能非常有用,尤其是当您在数组中定义一组列时。例如: ……等等。
For byti = 0 To UBound(cols())
If Hide Then
ActiveSheet.columns(cols(byti)).EntireColumn.Hidden = True


检查一组列是否已经隐藏,您还可以使用数组。通过将列分配给数组来对列进行分组,然后将工作表的当前状态(隐藏哪些列,隐藏哪些列)与该数组进行比较。

下面的代码是一个开始的建议,你可以适应你的项目。它不需要您在问题中提到的 customUI.xml 文件。

关键部分是用于检查列是否隐藏的 MyColumnCheck 变体和.Match方法。这是Match电子表格函数的 VBA 等效项。

处理这段代码教会了我很多关于如何在数组中搜索的知识,以及使用与其他方法相比的起伏Match——例如Find循环遍历数组!这已经在几篇文章中讨论过,请参阅这篇文章作为一个很好的例子。我选择做Match而不是循环,尽管包含一个检查隐藏列是否在您分配的组中的循环For...Next很容易。For..Next

如果您对以下IfError语句感到疑惑:
Application.IfError(Application.Match(MyColumnCheck.Column, MyColumnArray, 0),... ...这是因为Match在 VBA 代码中使用通常有些棘手,如此所述。此外,正如@Lori_m 在这里所写的那样,“使用没有 .WorksheetFunction 的应用程序会返回一个变体,该变体允许在参数和结果中使用数组。”

此外,我选择在检查组数组的值时将它们更改为 -1,因此当该过程完成时,一个简单的数学运算将显示该数组引用的所有列是否都被隐藏。对于此检查,负数更好,因为我假设您将引用只有正数的实际列。


因此,总而言之,.Match可以有效地检查工作表上的隐藏列是否与数组定义的一组列匹配。

'the column group you're looking for, dim as a dynamic array of column numbers
Dim MyColumnArray(1) As Long
'MyColumnArray(0) is column 2 or "B", MyColumnArray(1) is column 3 or "C", etc
MyColumnArray(0) = 2
MyColumnArray(1) = 3
Dim MyColumnCheck As Variant 'column check

For Each MyColumnCheck In Worksheets("Sheet1").columns
  'if the column is hidden and exists in MyColumnArray array...
  If columns(MyColumnCheck.Column).EntireColumn.Hidden = True And _
  Application.IfError(Application.Match(MyColumnCheck.Column, MyColumnArray, 0), 0) > 0 _
  Then
    MyColumnArray(Application.Match(MyColumnCheck.Column, MyColumnArray, 0) - 1) = -1
    '... set that element of the MyColumnArray array to -1.
  End If
Next

If WorksheetFunction.Sum(MyColumnArray) = 0 - (UBound(MyColumnArray) + 1) Then
  Debug.Print "group MyColumnArray is hidden"
  'execute code here for when the group is hidden
Else
  Debug.Print "group MyColumnArray is visible"
  'execute code here for when the group is visible
End If
于 2013-09-06T20:33:17.153 回答