VBA检查String元素是否为空

时间:2016-09-08 06:12:36

标签: string vba excel-vba excel

我目前正在从工作表1中拆分包含3个元素(a / b / c)的字符串,并在不同的列中粘贴工作表2上的每个部分。这是通过循环完成的。

然而,如果 字符串 只有2个元素,那么上面的“c”为空,我得到运行时错误9:“索引超出范围”

字符串可以并且有时只有1或2个元素而不是全部3.有什么方法可以避免这个错误吗?

我的研究让我尝试了If Len(Trim())= vbnullstring和Len()= 0但没有任何效果。

非常感谢任何帮助!

For Each IDrow In wsInput.Range(IDcolLetter & "2:" & IDcolLetter & lastRow)

    'Fourthly, get the respective row-number for each skill
    IDrowNumber = Split(IDrow.Address, "$")(2)

    'Fifthly, split the strings in 3 parts
    Dim myElements() As String
    myElements = Split(wsInput.Range(IDcolLetter & IDrowNumber).value, "\")

    'Sixthly, for every skill of that supplier, copy the ID in A, CG in B, Category in C and Product in D
    NextRow = ws4.Range("A" & Rows.Count).End(xlUp).row + 1

    If Len(myElements(2)) = 0 Then <<<<<<<<<<<<<<<<<<<<<ERROR HERE<<<<<<<<<<<<<<<<<<<<<<<
          wsInput.Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow) 'ID
          ws4.Range("B" & NextRow) = myElements(0)                                 'Commodity Group
          ws4.Range("C" & NextRow) = myElements(1)                                 'Category
    Else
          wsInput.Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow) 'ID
          ws4.Range("B" & NextRow) = myElements(0)                                 'Commodity Group
          ws4.Range("C" & NextRow) = myElements(1)                                 'Category
          ws4.Range("D" & NextRow) = myElements(2)                                 'Product
    End If


Next IDrow

3 个答案:

答案 0 :(得分:3)

您可以使用UBound(myElements)获取Split myElements 数组中的元素数量。

将以下代码添加到现有代码中:

'Fifthly, split the strings in 3 parts
Dim myElements() As String
myElements = Split(wsInput.Range(IDcolLetter & IDrowNumber).Value, "\")

Dim arrCount    As Long
' count the upper bound limit of myElements array
arrCount = UBound(myElements)

' if there is an Element 3 (from Split function)
If arrCount >= 2 Then
    ' add the rest of your code here...

End If

答案 1 :(得分:2)

这是一个代码审查,因为它是一个答案。

  • 最好在程序顶部声明所有变量

IDrow是一个范围对象。假设IDrow.Address = "A100"

  • Split(IDrow.Address, "$")(2) = 100
  • IDrow.Row = 100

这两个值也是相同的

  • wsInput.Range(IDcolLetter & IDrowNumber).value
  • IDrow.value

最好通过调整范围大小以匹配元素的数量来分配myElements的值。这更具可读性;因为它清理了大量重复的代码。

ws4.Range("B" & NextRow).Resize(1, UBound(myElements) + 1) = myElements

这两行都做同样的事情。我试图推广后来的模式,因为我感觉更清洁,更容易阅读。

  • For Each IDrow In wsInput.Range(IDcolLetter & "2:" & IDcolLetter & lastRow)

  • For Each IDrow In wsInput.Columns(IDcolLetter).Rows("2:" & lastRow)

Dim myElements() As String

With wsInput

    For Each IDrow In wsInput.Columns(IDcolLetter).Rows("2:" & lastRow)
        'Fifthly, split the strings in 3 parts
        myElements = Split(IDrow.Value, "\")

        'Sixthly, for every skill of that supplier, copy the ID in A, CG in B, Category in C and Product in D
        NextRow = ws4.Range("A" & Rows.Count).End(xlUp).Row + 1

        .Range(IDcolLetter & "1").Copy Destination:=ws4.Range("A" & NextRow)
        ws4.Range("B" & NextRow).Resize(1, UBound(myElements) + 1) = myElements

    Next IDrow

End With

答案 2 :(得分:1)

只需使用

ws4.Range("B" & NextRow).Resize(, UBound(myElements)).Value = myElements