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

我有一堆像这样的string的单元格:WFM 1601

而这个:WFM 2231,WFM 2402

这也是:运动1680,2402,2784

我使用下面的代码将单个单元格中的string拆分为多个列(最多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,所以我希望将每个数字的URL,静态string的末尾以及刚刚拆分的数字旁边的单独的列。

这是一个屏幕截图。

在这里输入图像描述

我有列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

我会使用正则expression式来提取数字组。 如果事实certificate有什么构成一个有效的数字序列还有其他标准,通过改变正则expression式可以更容易实现。

以下是活动工作表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中的数据运行此macros的结果:

在这里输入图像描述

这是正则expression式的正式解释,链接到希望仍然有效的更多细节:

\ B \ d + \ b

 \b\d+\b 

选项:不区分大小写; 换行符$ ^

  • 在字边界处断言位置(位置在前或后 – 但不能同时用ASCII字母,数字或下划线) \b
  • 匹配一个“数字”(仅ASCII 0-9) \d+ 的单个字符
    • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
  • 在字边界处断言位置(位置在前或后 – 但不能同时用ASCII字母,数字或下划线) \b

用RegexBuddy创build

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

你做了分裂。 现在,你可以检查你得到的variables是否是数字。 例如:

我们要检查A1中的值是否是数值:

 isnum = isNumeric(range("A1")) 

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