【问题标题】:VBA parse string Place values to new columnsVBA解析字符串将值放入新列
【发布时间】:2015-04-29 15:50:12
【问题描述】:

我有一张表,上面有类似的数据行。

NOM(LSL,USL)=207.3980(206.1990,208.5970)    NOM(LSL,USL)=207.3980(206.1990,208.5970)    NOM(LSL,USL)=18.8200(18.4400,19.2100)

我只想获取值并将它们放在自己的单元格中,例如

207.3980    207.3980    18.8200
206.1990    206.1990    18.4400
208.5970    208.5970    19.2100

我继续收到“ByRef 参数不匹配”错误。我相信与我如何定义参考单元格有关。

Sub Parse_Replace()
        Dim i As Double
        Dim ws As Worksheet
            Set ws = ThisWorkbook.ActiveSheet
        Dim Col As Range
        Dim rLastCell As Range
            Set rLastCell = ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
            xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
    For i = rLastCell.Column To 1 Step -1
        Col = ColLett(rLastCell.Column)
        Columns(i).Cells(4) = SplitString(Col3, ",", 4)
        Columns(i).Cells(5) = SplitString(Col3, ",", 5)
        Columns(i).Cells(6) = SplitString(Col3, ",", 6)
    Next i

    End Sub

Function ColLett(Col As Integer) As String

    If Col > 26 Then
        ColLett = ColLett((Col - (Col Mod 26)) / 26) + Chr(Col Mod 26 + 64)
    Else
        ColLett = Chr(Col + 64)
    End If

    End Function

Function SplitString(pValue As String, pChar As String, pIndex As Integer) As Variant
    Dim YString As Variant

        YString = Replace(Replace(Replace(Replace(pValue, " ", ""), "=", ""), "(", ","), ")", ",")
        SplitString = Split(YString, pChar)(pIndex - 1)

    End Function

流程

  • 用数据确定列数
  • 遍历每一列

    • 将列索引转换为带有ColLett的列

    • SplitString设置单元格值

  • 循环

谢谢

编辑:SplitString 值替换为 inteded。

【问题讨论】:

  • 您在哪一行收到错误消息?
  • Columns(i).Cells(4) = SplitString(B3, ",", 4)
  • 是否可以假设 NOM(LSL,USL) 文本在所有行中都不相同?
  • @Jeeped,所有列都一样

标签: parsing excel replace split vba


【解决方案1】:

您在这里声明 Col 是一个范围:

Dim Col As Range

然后您尝试在此处将Col 设置为字符串:

Col = ColLett(rLastCell.Column)

设置范围时,必须将其设置为范围。此外,您必须使用 SET 关键字来执行此操作:

Set Col = <a range>

当您设置 Col 时,您只会在 For 的每个循环中将其设置为 rLastCell.Column。如果您只需要最后一列的列字母,请在进入 for 循环之前执行此操作。

无论如何,所有这些都是毫无意义的。您在任何时候都不会使用您在函数中检索时遇到的麻烦的列字母。实际上,对于您正在做的事情,您不需要列信。列字母适用于人类;列号在 VBA 中无论如何都是重要的。

【讨论】:

  • SplitString 传递参数时,它会逐个字母地查找吗?我可以按原样修改那个函数给我们rLastCell.Column吗?
  • 啊。那么这里又发生了一件奇怪的事情。您对 SplitString 的调用会发送未声明且从未设置的变量 Col3。所以......我上面提到的一点会导致错误,一旦你用Col3变量解决了这个问题。 Col3 应该是什么?
  • Col 也需要更新到当前列,以便解析正确的数据。
  • 但您不想将“B3”作为字符串传递给 SplitString 函数。您想发送 RANGE B3 中的字符串。 B 是您正在迭代的列,对吗?因此,在您调用 SplitString 之前,将行 Col3=ws.cells(3,i).value 现在 Col3 根据 splitstring 函数参数必须是一个字符串,现在已正确设置为您要解析的大字符串。然后你可以去掉列字母逻辑,因为这里不需要它。
  • 这是 Excel 的“友好”前端猜测这些是数字,而不是文本。将splitstring 的返回类型更改为STRING 而不是VARIANT,然后在调用它之前将单元格格式设置为text。所以在Columns(i).Cells(4) = SplitString(Col3, ",", 4) 之前使用Columns(i).Cells(4).NumberFormat = "@" 这样的行。它也可能有助于事后唱诵、念咒或雨舞,因为 Excel 真的很喜欢改变格式。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2011-09-19
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多