Vba 即使在插入列之后也引用标题范围

Vba 即使在插入列之后也引用标题范围,vba,excel,Vba,Excel,我有如下所示的电子表格: 根据下面的宏,带有绿色文本的按钮允许我展开和折叠A:F列 问题是宏专门引用列A:F。如果我在我的主列标题(“LäkemedelInformation”)下插入一个附加列,我仍然只能折叠/展开A:F列,除非我手动编辑代码 如何让宏根据主列标题动态检测相关列 Public Sub LKMinfo() Dim SH As Worksheet Dim Rng As Range Dim obj As Variant Dim BTN As Button Dim iLen

我有如下所示的电子表格:

根据下面的宏,带有绿色文本的按钮允许我展开和折叠A:F列

问题是宏专门引用列
A:F
。如果我在我的主列标题(“LäkemedelInformation”)下插入一个附加列,我仍然只能折叠/展开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
Public Sub-LKMinfo()
将SH设置为工作表
变暗Rng As范围
Dim obj作为变体
变光BTN As按钮
暗淡如长

Const myColumns As String=“A:F”您可以使用查找列,并传入列标题名称

我建议将
.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

您可以使用查找列,并传入列标题名称

我建议将
.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
只要说出你的范围

在下面的示例中,我有三个标题,并使用名称框(功能栏左侧的小字段)将该范围命名为“Barn”。有关这方面的更多帮助,请参阅例如或使用简单的web搜索找到的许多帮助中的任何一个

如果我在B列之后插入一列,命名范围“Barn”将扩展以包含它。当我使用“名称”框下拉菜单选择“谷仓”范围时,就会显示这一点:

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

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

With r.EntireColumn
    '... do stuff
因此,您无需再指定范围
r
应指的列(例如A到F-无需指定)。您只需说
r
指的是名为“Barn”的范围。

只需说出您的范围即可

在下面的示例中,我有三个标题,并使用名称框(功能栏左侧的小字段)将该范围命名为“Barn”。有关这方面的更多帮助,请参阅例如或使用简单的web搜索找到的许多帮助中的任何一个

如果我在B列之后插入一列,命名范围“Barn”将扩展以包含它。当我使用“名称”框下拉菜单选择“谷仓”范围时,就会显示这一点:

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

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

With r.EntireColumn
    '... do stuff


因此,您无需再指定范围
r
应指的列(例如A到F-无需指定)。您只是说
r
引用了名为“Barn”的区域。

循环第3行中的单元格,并在第一个不包含文本的单元格处停止?通过动态列,我了解所有包含某些内容的列标题,您可能希望执行类似于
Dim startCell As range Set startCell=ThisWorkbook.Sheets(“Sheet1”).range(“a1”)的操作''这应该是工作簿的起始单元格,您可能必须更改工作表名称和范围详细信息范围(起始单元格,选择。结束(xlToRight))。选择
循环第3行中的单元格,并在第一个不包含文本的单元格处停止?通过动态列,我了解所有包含内容的列标题,您可能需要执行类似于
Dim startCell As Range Set startCell=ThisWorkbook.Sheets(“Sheet1”).Range(“a1”)的操作。这应该是工作簿的起始单元格,您可能需要更改工作表名称和范围详细信息范围(startCell,Selection.End(xlToRight))。选择
这确实是一个解决方案,但值得注意的是,对标题文本的任何更改都需要维护代码,否则它将中断。您能告诉我如何将您的代码包含到我的代码中吗?我对VBA仍然很陌生…非常正确@Jean FrançoisCorbett-当打开包含数据集但没有静态结构的工作簿时,这是一种更有用的技术,尽管标题名称不变。这确实是一种解决方案,但值得注意的是,标题文本的任何更改都需要维护代码,你能告诉我如何将你的代码包含到我的代码中吗?我对VBA还是很陌生…非常正确@Jean FrançoisCorbett-当打开包含数据集但没有静态结构的工作簿时,这是一种更有用的技术,尽管标题名称不变。感谢您的帮助,但我仍然不确定如何重新排列原始代码以获得所需的结果…好的。。。你对此有什么特别的问题吗?我给了你一个代码片段。我建议您尝试将其添加到代码中。如果你遇到问题。问一个问题。如果我将列的范围命名为“mycolumns”,并将(Const mycolumns as String=“A:F”)替换为(Dim Rng as range Set Rng=range(“mycolumns”),那么如果你不尝试,你永远也学不会,我无法使代码正常工作,因为我有其他语句必须进行编辑,以说明该列不再是常量。我不知道如何做到这一点。再次,我建议您发布一个问题,描述这个特定的新问题。感谢您的帮助,但我仍然不确定如何重新排列原始代码以获得desi红色结果…好的…你对此有什么特别的问题吗?我给了你一个代码片段。我建议你尝试将其加入到你的代码中。如果你遇到问题,问一个问题。如果你不尝试,你永远不会知道。如果我将列的范围命名为“mycolumns”,并将(Const mycolumns as String=“a:F”)替换为(Dim Rng As Range Set Rng=Range(“mycolumns”),我无法让代码工作,因为我有其他语句必须编辑以解释列不再是常量的事实。我不知道如何做。Ag