即使在插入列之后也参考标题范围

时间:2016-03-08 11:01:26

标签: vba excel-vba excel

我有一个电子表格,如下图所示: image

带有绿色文本的按钮允许我根据下面的宏展开和折叠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

2 个答案:

答案 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或使用简单的网络搜索找到的许多人。

enter image description here

如果我在B列之后插入一列,则命名范围&#34; Barn&#34;只是扩展到包括它。当我选择&#34; Barn&#34;范围使用名称框下拉列表:

enter image description here

您可以在VBA中引用此范围,如下所示:

Dim r As Range
Set r = Range("Barn")

With r.EntireColumn
    '... do stuff

因此,您不需要指定范围r应该引用的列(例如A到F - 不需要指定)。您只需说r指的是名为&#34; Barn&#34;。

的范围