我有一个电子表格,如下图所示:
带有绿色文本的按钮允许我根据下面的宏展开和折叠A:F列。
问题是宏特指列A:F
。如果我要在我的主列标题下插入一个额外的列(“Läkemedelsinformation”),我仍然只能折叠/展开列A:F,除非我手动编辑代码。
如何根据主列标题动态地检测相关列?
Public Sub LKMinfo()
Dim SH As Worksheet
Dim Rng As Range
Dim obj As Variant
Dim BTN As Button
Dim iLen As Long
Const myColumns As String = "A:F" '<<===== Change
Const släkemedelsinformation As String = "Läkemedelsinformation" '<<===== Change
Const sHidden As String = " Hidden"
Const sVisible As String = " Visible"
Set SH = ActiveSheet
Set BTN = SH.Buttons(Application.Caller)
Set Rng = SH.Columns(myColumns)
With Rng.EntireColumn
.Hidden = Not .Hidden
If .Hidden Then
iLen = Len(sHidden) + Len(släkemedelsinformation)
BTN.Characters.Text = släkemedelsinformation & " Hidden"
With BTN.Characters(Start:=1, Length:=iLen).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.ColorIndex = 3 '\\ RED
End With
Else
iLen = Len(sVisible) + Len(släkemedelsinformation)
BTN.Characters.Text = släkemedelsinformation & " Visible"
With BTN.Characters(Start:=1, Length:=iLen).Font
.Name = "Arial"
.FontStyle = "Bold"
.Size = 10
.ColorIndex = 4 '\\ GREEN
End With
End If
End With
End Sub
答案 0 :(得分:1)
您可以使用.Find
method找到列,并传入列标题名称。
我建议将.Find
设置为范围变量。
Dim col_header1 As Range, col_header2 As Range
Set col_header1 = Columns("A:Z").Find("header_name1")
Set col_header2 = Columns("A:Z").Find("header_name2")
然后,您可以评估您是否成功找到了所有标题。如果找到所有标题,您可以分配列号值并在代码中使用它们。
If Not col_header1 Is Nothing And _
Not col_header2 Is Nothing Then
col_number1 = col_header1.Column
col_number2 = col_header2.Column
Else
MsgBox ("One or more of the columns were not found!")
Exit Sub
End If
答案 1 :(得分:1)
只需命名您的范围。
在下面的示例中,我有三个标题,并命名为范围&#34; Barn&#34;使用名称框(功能栏左侧的小字段)。如需更多帮助,请参阅例如this video或使用简单的网络搜索找到的许多人。
如果我在B列之后插入一列,则命名范围&#34; Barn&#34;只是扩展到包括它。当我选择&#34; Barn&#34;范围使用名称框下拉列表:
您可以在VBA中引用此范围,如下所示:
Dim r As Range
Set r = Range("Barn")
With r.EntireColumn
'... do stuff
因此,您不需要指定范围r
应该引用的列(例如A到F - 不需要指定)。您只需说r
指的是名为&#34; Barn&#34;。