如何删除单元格中的非数字字符并将结果连接到URL?

时间:2017-03-28 17:41:26

标签: excel vba excel-vba

我有一堆像这样的字符串的单元格: WFM 1601

这个: WFM 2231,WFM 2402

这也是: 运动1680,2402,2784

我使用下面的代码将单个单元格中的字符串拆分为多列(最多3列)。

Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next

lRow = Range("U" & Rows.Count).End(xlUp).Row
Set MyRows = Range("U19:U" & lRow)
For Each cell In MyRows

splitVals = Split(cell.Value, ",")
    totalVals = UBound(splitVals)
    Range(Cells(cell.Row, ActiveCell.Column + 1), Cells(cell.Row, ActiveCell.Column + 1 + totalVals)).Value = splitVals
Next

现在,我试图想办法摆脱所有非数字字符,只留下数字。然后,连接这些数字,这些数字是我使用的SharePoint网站中的进程的所有ID,因此我想在每个数字的位置放置一个静态字符串的末尾,并在刚刚拆分为的数字旁边单独的列。

这是一个截屏。

enter image description here

我有列U,我想生成第V列到第AA列。

我只能使用以下功能提取数字。

Function GetNums(target As Range)
    Dim MyStr As String, i As Integer
    MyStr = ""
    If Len(target.Value) = 0 Then GoTo GoExit
    If target.Value = "None" Then GoTo GoNone
    For i = 1 To Len(target.Value)
        If IsNumeric(Mid(target, i, 1)) Then MyStr = MyStr & Mid(target, i, 1)
    Next i
    GoTo GoExit
GoNone:
    GetNums = "None"
    Exit Function
GoExit:
    GetNums = MyStr

End Function

但是,这不符合要求,因为它会检查单元格中的所有字符,然后将其转为:WFM 2231,WFM 2402。 。 。 进入:22312402 我真的需要一些方法来区分这两个ID:2231 2402

2 个答案:

答案 0 :(得分:2)

我可以帮助第1部分,检查值是否为数字。

你做了分裂。现在,您可以检查您获得的变量是否为数字。示例:

我们想检查A1中的值是否为数字:

isnum = isNumeric(range("A1"))

如果A1中的值是数字,则isnum为true,否则为false。

答案 1 :(得分:2)

我会使用正则表达式来提取数字组。如果事实证明,对于有效数字序列的构成还有其他标准,通过更改正则表达式可以更容易实现。

以下是活动工作表A列中原始数据的示例。

Option Explicit
Sub CreateURL()
    Dim RE As Object, MC As Object, M As Object
    Const sPat As String = "\b\d+\b" 'whole words that are all digits
    Const sBaseURL As String = "htpps://collaborate.process...&ID="
    Dim I As Long, J As Long
    Dim rSrc As Range, C As Range

'This will be on active sheet
'Suggest you specify actual worksheet
Set rSrc = Range(Cells(1, 1), Cells(Rows.Count, "A").End(xlUp))

Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = sPat
    .Global = True
End With

For Each C In rSrc
    If RE.test(C.Text) = True Then
        Set MC = RE.Execute(C.Text)
        J = -1
        For Each M In MC
            J = J + 2
            C.Offset(0, J) = M
            C.Offset(0, J + 1) = sBaseURL & M
        Next M
    End If
Next C

End Sub

这是针对A列中的数据运行此宏的结果:

enter image description here

以下是正则表达式的正式解释,其中包含更多细节的链接,希望这些细节仍有效:

\ B \ d + \ B'/ H2>
\b\d+\b

选项:不区分大小写; ^ $匹配在换行

使用RegexBuddy

创建