如何删除前缀的动态数字

时间:2019-12-12 04:47:34

标签: excel vba

我想更改以下代码中提到的Array(OutArray)中值的格式。数组将以六个数字返回,以0开头,并带有符号(+或-)组成数字。如果实际值为5678,-5000、8,则数组将返回为+ 005678,-005000,+ 000008。我无法更改此数据类型的格式,因为它是仪器返回数据的唯一方法。

我正在尝试删除前缀0,以及每个值所附带的'+'。但是该类是,由于返回的值是动态的,所以我不知道作为前缀有多少个0。我对这行代码感到震惊,

                InArray = MID(Step, "", "")

我实际上要标识第一个非零值的地方。有什么办法吗?

 Public Function copy_XY()

   Dim idn As String
   idn = instrument.ReadString()  ' Reading a value from instrument (Dynamic)    
   Dim OutArray() As String
   OutArray = Split(idn)
   Dim Step As Variant
   Dim InArray As String
   For Each Step in OutArray
      InArray = MID(Step, "", "")
   Next Step

End function

当我按以下方式使用CInt时,出现溢出错误。

   Dim Val() As Int
   Val(0) = CInt(OutArray(0))

1 个答案:

答案 0 :(得分:2)

从注释中可以看出,您的代码并未告知我们一些奇怪的问题。因此,让我们删除简单的CLng()转换方法并使用一些正则表达式。

我假设根据您对Split()的使用,您返回的字符串包含一个+/-和六个用空格分隔的数字字符(因为您使用的是默认分隔符Split-这是一个空格)。那将使您的数据看起来像:

"+650280 +001503 +000000 -001258 +001250 -009870 +798023"

使用正则表达式(简称RegExp),您可以使用非常简单的模式轻松匹配这些数字并将它们放入集合中。从那里,很容易将集合移动到已声明为Long类型的数组中。由于将这些值转换为Long数据类型,因此您不再需要担心非有效0。

Public Function copy_XY()

    Dim ValArr() As Long, i As Long
    With CreateObject("VBScript.RegExp")

        .Pattern = "[+-]\d+"
        .Global = True

        With .Execute(instrument.ReadString)

            ' Place the collection into an array
            ReDim ValArr(.Count - 1)
            For i = 0 To .Count - 1
                ValArr(i) = .Item(i)
            Next

        End With

    End With

    ' Print the values to the immediate window to show it works
    For i = 0 To UBound(ValArr)
        Debug.Print ValArr(i)
    Next

End Function

打破模式

因此,我们为RegExp提供了以下模式[+-]\d+。首先,必须提到我们已将 Global Flag (全局标志)更改为True,因为这将匹配您字符串中该模式的每个实例。保持为假只会匹配您的模式的第一种情况并停止。

现在进入模式本身:

  • [+-]是一个字符类([...]),它将与其中的任何字符匹配-因此,在这种情况下,+-
  • \d是一个特殊的令牌,表示任何一位数字
    • 我们用量词+修改了这个“任何单个数字”,表示一个或多个。因此\d+表示一个或多个\ d
    • 我们本来可以更加具体并使用\d{6},而这恰好需要\d中的6个。注意事项。