excel - 如何删除前缀的动态数字

标签 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))

最佳答案

从评论中可以看出,有一些奇怪的问题我们没有从您的代码中得知。因此,让我们放弃简单的 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/

相关文章:

excel - 水平与垂直数组分隔符 - 国际

正则表达式 - 如何测试 2 个 str 模式并根据哪个 str 模式匹配进行替换

ms-access - 使用 Access 2007 中的 VBA 在 AutoCAD (dwg) 文件中搜索

python - Django创建包含Unicode的CSV文件,可以直接用Excel打开

excel - 无法解释的 Excel 崩溃

vba - excel vba内置函数的无效过程调用

vba - Excel VBA 搜索日期范围并删除旧条目

java - Excel 输出的第二列值放错位置

excel - 将数字格式化为 SSRS 中的文本

vba - 使用 ThisWorkbook.Sheets(1).Range 的 Excel vba 代码不起作用,但 Sheet1.Range 工作正常。为什么?