从excel单元格中提取textpattern

时间:2016-09-23 20:06:11

标签: excel excel-vba excel-formula vba

我有一个大约500行的excel表。一列(D)包含一个文本,在该文本的某处可能有一个ISBN号,看起来像这样#34; ISBN 123-456-67-8-90"。我想提取那个ISBN(从单元格中删除它)并将其移动到同一行(K)中的不同单元格。

到目前为止,我已经能够为我的字符串

构建一个正则表达式
[ISBN]+ [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+

我认为我也有一个与我的细胞匹配的外部机制的粗略概念:

Sub MoveISBN() 
Dim myrange, cell As Range 
Set myrange = ActiveSheet.Range("D:D", Range("D:D").End(xlDown)) 
For Each cell In myrange 
If *** HERE GOES MY REGEX SOMEHOW ***
Then *** HERE THE FOUND ISBN IS REMOVED FROM THE CURRENT CELL AND MOVED TO COL K ***
End If 
Next cell

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

如果您只想提取ISBN号,我有一个现成的公式。

=LEFT(RIGHT(SUBSTITUTE(A2,"ISBN ","|"),LEN(SUBSTITUTE(A2,"ISBN ","|"))-FIND("|",SUBSTITUTE(A2,"ISBN ","|"))),IFERROR(FIND(" ",RIGHT(SUBSTITUTE(A2,"ISBN ","|"),LEN(SUBSTITUTE(A2,"ISBN ","|"))-FIND("|",SUBSTITUTE(A2,"ISBN ","|")))),LEN(RIGHT(SUBSTITUTE(A2,"ISBN ","|"),LEN(SUBSTITUTE(A2,"ISBN ","|"))-FIND("|",SUBSTITUTE(A2,"ISBN ","|"))))))

这假设源单元格是A2,ISBN后跟“空格”或位于单元格的末尾。

这只会获取ISBN。如果要从源单元格中删除ISBN,则必须仅使用VBA。

答案 1 :(得分:0)

您的代码(或缺少样本数据)不清楚您的数据是从第1行还是第2行开始(第1行包含列标题标签)。无论哪种情况,您当前的代码都将遍历D列中的每个单元格;共计1,048,576个细胞,这可能不是优选的。

要定义列中已填充单元格的范围,请通过提供起始单元格来定义Range object,然后从下往上查看结束单元格¹。

Dim myrange
with worksheets("Sheet1")    '<~~ know what worksheet you are on!!!
    'your current method
    Set myrange = ActiveSheet.Range("D:D", Range("D:D").End(xlDown)) 
    debug.print myrange.address(0,0)   '<~~ results in D:D, the entire column

    'with data in D2 to D99 use this alternate
    Set myrange = .Range(.cells(2, "D"), .cells(.rows.count, "D").end(xlup)) 
    debug.print myrange.address(0,0)   '<~~ results in D2:D99, only the populated cells
end with

还有许多其他示例可以在中使用静态变量。

¹有关定义具有Is the . in .Range necessary when defined by .Cells个属性的Range object的详情,请参阅Range.Cells

²用户定义函数(又名UDF)被放入标准模块代码表中。点击 Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块 Alt + 中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。