【问题标题】:Remove everything to the right after a list of strings删除字符串列表后右侧的所有内容
【发布时间】:2015-09-26 17:27:16
【问题描述】:

我正在尝试删除列的特定字符串列表之后右侧的所有内容。

Sub KeepItem()

Dim itemDescr As Range
Dim Rng As Range
Dim xChar As Variant

Set itemDescr = Range("$D:$D")
xChar = Array(" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " .")

For Each Rng In itemDescr
    xValue = Rng.Value
    Rng.Value = Left(xValue, InStr(xValue, xChar) - 1)
Next

End Sub

这个

VITA COCO TROP 16.9OZ
ARGO CAROLINA HNY 13.5OZ GLS
ARGO GRN TEA GNGR 13.5OZ GLS
ARGO HIBISC SNGRIA 13.5OZ GLS
ARGO MOJI TEA 13.5OZ GLS

应该是这样的:

VITA COCO TROP
ARGO CAROLINA HNY
ARGO GRN TEA GNGR
ARGO HIBISC SNGRIA
ARGO MOJI TEA

我是一名 VBA 程序员新手,非常感谢您的反馈。

错误:(类型不匹配):

Rng.Value = Left(xValue, InStr(xValue, xChar) - 1)

【问题讨论】:

  • 您是否要删除任何在第一次出现的数字之后(包括第一次出现的数字)?
  • 您当前的代码有错误吗?您有与当前代码相关的具体问题吗?
  • @Chrismas007 感谢您指出这一点。我编辑了问题
  • @Krishna 我想删除后面的所有内容,第一次出现空格后跟数字或小数点
  • 好的,更新了下面的正则表达式。这对我有用

标签: arrays vba for-loop


【解决方案1】:

如果您想在数字出现之前获取文本,这对您有用吗?

您需要添加对 Microsoft VBScript Reglar Expressions 5.5 的引用

Debug.print GetLeftPart ("TA COCO TROP 16.9OZ")

Function GetLeftPart (stringToCheck As String) as string
   Dim regex As New RegExp
   Dim regmatch As MatchCollection
   regex.Pattern = "\s\d"
   Set regmatch = regex.Execute(stringToCheck)
   GetLeftPart = Left(stringToCheck , regmatch.Item(0).FirstIndex)
End function

另一种更麻烦的方式,但由于作者已经开始工作,这可能适合上下文

Sub KeepItem()

Dim itemDescr As Range
Dim Rng As Range
Dim xChar As Variant
Dim ele As Variant
Dim iFoundAt As Integer
Dim xValue As String

Set itemDescr = Range("$D:$D")
xChar = Array(" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " .")

For Each Rng In itemDescr
    iFoundAt = 0
    xValue = Rng.Value
    'find if this is a line we are interested in
    If xValue = "" Then GoTo continue 'Question - do you want to continue or stop. if stop replace continue with exit for
    For Each ele In xChar
        iFoundAt = InStr(xValue, ele)
        If iFoundAt > 0 Then Exit For
    Next
    If iFoundAt > 0 Then Rng.Value = Left(xValue, iFoundAt - 1)
continue:

Next

End Sub

【讨论】:

  • 我不确定如何让它工作。我在哪里插入这个?无论如何调整我提供的代码?
  • 您提供的代码的问题是对于每个字符串,您需要检查数组中是否出现了某个项目。这将是繁琐且效率较低的。但如果这是唯一的方法,那么请看我的编辑。我强烈认为您应该将自己的方式更改为 Regex 方式
  • 你能解决它吗?
  • 是的,它有效。谢谢你解释清楚。我还是不明白你的正则表达式方式,但我只是一个 VBA 初学者!
【解决方案2】:

试试这个,对于范围内的每个单元格,它使用 Split 命令循环 0 到 9 以将字符串拆分为一个数组,我们希望所有内容都在左边,所以我们取第一个元素(索引 0),然后修剪掉空间。

Sub RemoveNumOnwards()
Dim X As Long, Y As Long
For X = 1 To Range("D" & Rows.Count).End(xlUp).Row
    For Y = 0 To 9
        Range("D" & X).Formula = Trim(Split(Range("D" & X).text, Y)(0))
    Next
Next
End Sub

编辑:刚刚看到你关于小数点的注释,这里是更新的代码:

Sub RemoveNumOnwards()
Dim X As Long, Y As Long, xChar As Variant
xChar = Array(" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " .")
For X = 1 To Range("D" & Rows.Count).End(xlUp).Row
    For Y = LBound(xChar) To UBound(xChar)
        Range("D" & X).Formula = Trim(Split(Range("D" & X).text, xChar(Y))(0))
    Next
Next
End Sub

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 2017-06-03
    • 1970-01-01
    • 2012-03-08
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多