EXCEL VBA如何使用函数和split来从字符串中提取整数

时间:2017-06-01 11:52:05

标签: excel vba excel-vba

我正在编写一段代码来从它的标记名中提取管道的名义大小。例如:L-P-50-00XX-0000-000。 50这将是它的标称尺寸(2“),我想提取。我知道我可以这样做:

TagnameArray() = Split("L-P-50-00XX-0000-000", "-")
DNSize = TagnameArray(2)

但是我希望它能成为一个函数,因为它只是我整个宏的一小部分而且我不需要它就是我正在研究的所有植物。我目前的代码是:

Sub WBDA_XXX()
Dim a As Range, b As Range
Dim TagnameArray() As String
Dim DNMaat As String
Dim DN As String

Set a = Selection

For Each b In a.Rows
    IntRow = b.Row
    TagnameArray() = Split(Cells(IntRow, 2).Value, "-")
    DN = DNMaat(IntRow, TagnameArray())
    Cells(IntRow, 3).Value = DN
Next b
End Sub



Function DNMaat(IntRow As Integer, TagnameArray() As String) As Integer
    For i = LBound(TagnameArray()) To UBound(TagnameArray())
        If IsNumeric(TagnameArray(i)) = True Then
            DNMaat = TagnameArray(i)
            Exit For
        End If
    Next i
End Function

但是这段代码给了我一个矩阵预期错误,我不知道如何解决。我还想在进一步的计算中使用标称大小,因此在从标记名中提取它之后必须将其转换为整数。有没有人在我的代码中看到我犯了错误?

2 个答案:

答案 0 :(得分:0)

这很容易做到分裂,并从“喜欢”中得到一些帮助。评价。

关于'喜欢'的一些背景知识。 - 根据输入变量是否与给定模式匹配,它将返回TRUE或FALSE。模式[A-Z]表示它可以是A和Z之间的任何大写字母,#表示任何数字。

代码:

' Function declared to return variant strictly for returning a Null string or a Long
Public Function PipeSize(ByVal TagName As String) As Variant
    ' If TagName doesn't meet the tag formatting requirements, return a null string
    If Not TagName Like "[A-Z]-[A-Z]-##-##[A-Z]-####-###" Then
        PipeSize = vbNullString
        Exit Function
    End If

    ' This will hold our split pipecodes
    Dim PipeCodes As Variant
    PipeCodes = Split(TagName, "-")

    ' Return the code in position 2 (Split returns a 0 based array by default)
    PipeSize = PipeCodes(2)
End Function

您需要考虑根据需要更改功能的返回类型。如果输入标记与模式不匹配,它将返回空字符串,否则返回long(数字)。如果需要,您可以将其更改为返回字符串,或者您可以编写第二个函数来将数字解释为它的长度。

这是您的代码的重构版本,只能找到第一个数字标记。我稍微清理了你的代码,我想我也发现了这个bug。您将DNMAAT声明为String,但也将其称为Function。这可能会导致您的阵列预期错误。

以下是代码:

' Don't use underscores '_' in names. These hold special value in VBA.
Sub WBDAXXX()
    Dim a As Range, b As Range
    Dim IntRow As Long

    Set a = Selection

    For Each b In a.Rows
        IntRow = b.Row
        ' No need to a middleman here. I directly pass the split values
        ' since the middleman was only used for the function. Same goes for cutting DN.
        ' Also, be sure to qualify these 'Cells' ranges. Relying on implicit
        ' Activesheet is dangerous and unpredictable.
        Cells(IntRow, 3).value = DNMaat(Split(Cells(IntRow, 2).value, "-"))

    Next b
End Sub

' By telling the function to expect a normal variant, we can input any
' value we like. This can be dangerous if you dont anticipate the errors
' caused by Variants. Thus, I check for Arrayness on the first line and 
' exit the function if an input value will cause an issue.
Function DNMaat(TagnameArray As Variant) As Long
    If Not IsArray(TagnameArray) Then Exit Function

    Dim i As Long
    For i = LBound(TagnameArray) To UBound(TagnameArray)
        If IsNumeric(TagnameArray(i)) = True Then
            DNMaat = TagnameArray(i)
            Exit Function
        End If
    Next i
End Function

答案 1 :(得分:0)

编译器抛出错误matrix expected,因为您已经定义了DNMaat两次:一次作为字符串变量,一次作为函数。将定义删除为变量。

另一件事:你的函数将返回一个整数,但是你将它分配给一个字符串(这个字符串只用于将结果写入一个单元格)。摆脱变量DN并直接分配:

Cells(IntRow, 3).Value = DNMaat(IntRow, TagnameArray())

加上使用option explicit强制定义所有已使用变量的全局建议,并定义一个行/列号的变量,始终为long而不是integer