Vba 即使在插入列之后也引用标题范围
我有如下所示的电子表格: 根据下面的宏,带有绿色文本的按钮允许我展开和折叠A:F列 问题是宏专门引用列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
。如果我在我的主列标题(“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