我有一个大约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
有人能指出我正确的方向吗?
答案 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
还有许多其他示例可以在excel或excel-vba中使用静态变量。
¹有关定义具有Is the . in .Range necessary when defined by .Cells个属性的Range object的详情,请参阅Range.Cells。
²用户定义函数(又名UDF)被放入标准模块代码表中。点击 Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块( Alt + 我,中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。