我想更改下面代码中提到的 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))
最佳答案
从评论中可以看出,有一些奇怪的问题我们没有从您的代码中得知。因此,让我们放弃简单的 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+
。首先,值得一提的是,我们将全局标志更改为True
,因为这将匹配字符串中该模式的每个实例。将其保持为 false 将仅匹配模式的第一个情况并停止。
现在讨论模式本身:
[+-]
是一个字符类 ([...]
),它将匹配其中的任何字符 - 因此在本例中要么是+
或-
\d
是一个特殊标记,表示任何单个数字- 我们用量词
+
修改了这个“任何单个数字”,这意味着一个或多个。因此\d+
表示 一个或多个\d。 - 我们本来可以更具体地使用
\d{6}
,这正好需要 6 个\d
。需要记住的事情。
- 我们用量词
关于excel - 如何删除前缀的动态数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59297874/