为什么在Split功能结束时添加(1)会清除类型不匹配错误?

时间:2017-04-29 16:26:51

标签: excel-vba vba excel

我想创建一个宏来查找列标题并选择该标题下面的所有内容。但是,我不想使用.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)实际上做了什么?

2 个答案:

答案 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的监视:

enter image description here

您可以清楚地看到下方的列表工具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