String VBA从字符串/单元格的开头删除数字

String VBA从字符串/单元格的开头删除数字,string,vba,excel,numbers,String,Vba,Excel,Numbers,我希望你能帮忙 我有一段代码,目前正在删除G列单元格中的所有文本。我需要的是,该代码不是删除文本,而是删除数字,我只希望它删除字符串/单元格开头的数字我希望其余数据保持不变 我已经附上了一张图片。1博彩了解 图1 下面是我目前拥有的代码,我希望可以修改。一如既往,非常感谢您的帮助 代码 我认为一个简单的改变如下: For X = StartRow To LastRow Cells(X, DataColumn).Formular1c1 = Application.Trim(Replace

我希望你能帮忙

我有一段代码,目前正在删除G列单元格中的所有文本。我需要的是,该代码不是删除文本,而是删除数字,我只希望它删除字符串/单元格开头的数字我希望其余数据保持不变

我已经附上了一张图片。1博彩了解

图1

下面是我目前拥有的代码,我希望可以修改。一如既往,非常感谢您的帮助

代码


我认为一个简单的改变如下:

For X = StartRow To LastRow
    Cells(X, DataColumn).Formular1c1 = Application.Trim(Replace(Cells(X, DataColumn).Text, Val(Cells(X, DataColumn).Text), ""))
Next X

将解决您的问题…

此函数将从字符串中删除前导数字和空格

Function RemoveLeadingDigits(str As String) As String

    Dim i As Long
    Dim chr As String
    ' Loop through string
    For i = 1 To Len(str)
        ' Get character i
        chr = Mid(str, i, 1)
        ' Keep looping until character is not a number or space
        If Not IsNumeric(chr) And Not chr = " " Then
            ' If it is a number or space, strip checked characters
            ' from str (because they'll be numeric or space)
            str = Right(str, Len(str) - i + 1)
            ' Stop looping as non-numeric characters encountered
            Exit For
        End If
    Next i

    ' Return the value of str
    RemoveLeadingDigits = str

End Function
您可以通过以下方式从代码中调用它:

Sub RemoveNonDigits()
    Dim X As Long, LastRow As Long, CellVal As String
    Const StartRow As Long = 1
    Const DataColumn As String = "G"
    Application.ScreenUpdating = False
    LastRow = Cells(Rows.Count, DataColumn).End(xlUp).Row
    For X = StartRow To LastRow
        CellVal = Cells(X, DataColumn).Value
        ' ----------------------------------------
        CellVal = RemoveLeadingDigits(CellVal)
        ' ----------------------------------------
    Next
    Application.ScreenUpdating = True
End Sub
关于代码的说明如下:


你真的应该让你的细胞完全合格。例如,使用此工作簿.Sheets(“YourSheet”)将整个循环部分包装在
中,然后使用
.cells(row,col)
访问单元格,而不仅仅是
单元格(row,col)
请参见下面修改的代码:

Sub RemoveNonDigits()
  Dim X As Long, Z As Long, LastRow As Long, CellVal As String
  Const StartRow As Long = 1
  Const DataColumn As String = "G"
  Application.ScreenUpdating = False
  LastRow = Cells(Rows.Count, DataColumn).End(xlUp).Row
  For X = StartRow To LastRow
    CellVal = Cells(X, DataColumn)
    While IsNumeric(Left(CellVal, 1))   ' Here
      CellVal = Mid(CellVal, 2)         ' all digits at the start 
    Wend                                ' are removed
    Cells(X, DataColumn) = Trim(CellVal)
  Next
  Application.ScreenUpdating = True
End Sub
也就是说,虽然
CellVal
中的起始字符是一个数字,但获取以第二个字符开始的子字符串,然后继续,直到没有匹配为止

CellVal = LTrimDigits(Cells(X, DataColumn))
这样做相当有效:

Public Function LTrimDigits(value As String) As String
    Dim i As Long
    For i = 1 To Len(value) '//loop each char
        Select Case Mid$(value, i, 1) '//examine current char
            Case "0" To "9" '//permitted chars
            Case Else: Exit For '// i is the cut off point
        End Select
    Next
    LTrimDigits = Mid$(value, i) '//strip lead
End Function

一个稍短的备选方案(假设所有值都以整数开头)


看起来,要删除的数字与其他数字之间用空格隔开。这能保证吗?因为在这种情况下,解决方案会简单得多。因此,您当前的代码会删除除数字以外的所有代码,而您想要的正好相反,对吗?
如果Mid(CellVal,Z,1)像“[0-9]”,那么Mid(CellVal,Z,1)=“”否则退出执行
a do,直到可能的更整洁的方法。大家好,感谢您花时间回复@ASH作为数字后的空格。很遗憾,数字不确定。地址:Wiktor Stibizew。我需要的是删除开始时的数字,只有单元格内容的其余部分可以保持不变。AT:Nathan_Sav很遗憾,我无法遵循代码逻辑。非常感谢大家的帮助。不,这也会删除字符串末尾的数字,这与字符串开头的数字相同!好主意是的,我试过那段代码。不按预期工作:-)呜呜!!真棒的工作Wiktor。非常感谢您抽出时间。这很好用。都柏林非常尊敬:-)祝您度过愉快的一天,再次感谢您:-)高效的实现,没有无用的字符串拷贝。我喜欢它。
Public Function LTrimDigits(value As String) As String
    Dim i As Long
    For i = 1 To Len(value) '//loop each char
        Select Case Mid$(value, i, 1) '//examine current char
            Case "0" To "9" '//permitted chars
            Case Else: Exit For '// i is the cut off point
        End Select
    Next
    LTrimDigits = Mid$(value, i) '//strip lead
End Function
For Each cell in Range([G7], [G7].End(xlDown))

    cell.Value2 = Trim(Mid(cell, Len(Str(Val(cell)))))

Next