我想更改以下代码中提到的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))
答案 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个。注意事项。