我想创建一个宏来查找列标题并选择该标题下面的所有内容。但是,我不想使用.end(xldown)
并希望使用.end(xlup)
来防止出现空列问题。但是我遇到了一个问题,即标题所在的列是动态的。
我环顾四周,找到了一个使用split来查找列字母的代码:
Sub Macro1()
Dim rngHeader As Range
Dim rngHeadReq As Range
Set rngHeader = Range("A1:AL1")
Set rngHeadReq = rngHeader.Find("Adjustment Operation Type")
col = rngHeadReq.Address
colAddress = Split(col, "$")(1)
MsgBox colAddress
End Sub
msgbox返回正确的列字母。我抬头看起来很分裂,看起来很简单,我不明白的是编码器使用的(1)我把它复制了。当我删除(1)时,vba给我一个类型不匹配错误。看看拆分的参数,看起来它不是它的一部分。
(1)实际上做了什么?
答案 0 :(得分:2)
基本上,你所看到的是编程的捷径。这里是完全拼写出来的代码(在dummy-sub中为你自己复制和运行):
Sub tmpSO()
Dim tmp As String
Dim arr() As String
tmp = "$5$m$$a$1$"
arr = Split(tmp, "$")
Debug.Print arr(1)
End Sub
当您Split()
字符串时,您实际上是使用给定的分隔符将其转换为数组(或列表)。在上面的示例中,使用$
符号分隔字符串。因此,第一个项目(在第一个$
之前是""
因为在第一个$
符号之前没有任何内容。第二个项目是数字5
。由于VBA正在计数以项(0)
开头的列表第二项是(1)
。
以下是运行时代码的屏幕截图,其中添加了对arr
的监视:
您可以清楚地看到下方的列表工具arr
以及旁边带有索引编号的项目。
请注意,无论您是否在模块的开头使用Split()
,(0)
都会始终从项Option Base 1
开始生成数组。
个人提示:编码时,我也不是缩写/快捷键的忠实粉丝。这使得代码更难以阅读和理解新手。因此,我将其编码为长/扩展方式,如上面的示例所示,而不是使用给定的缩写。
答案 1 :(得分:1)
为什么需要专栏信?
Sub Macro1()
Dim rngHeader As Range
Dim rngHeadReq As Range
Dim rngDesired As Range
Dim col As Long
Set rngHeader = Range("A1:AL1")
Set rngHeadReq = rngHeader.Find("Adjustment Operation Type")
If Not rngHeadReq Is Nothing Then
col = rngHeadReq.Column
Set rngDesired = Range(Cells(1, col), Cells(Rows.Count, Col).End(xlUp))
End If
End Sub