2016-09-23 3 views
1

У меня есть таблица excel размером около 500 строк. один столбец (D) содержит текст и где-то в этом тексте может быть номер ISBN, выглядящий примерно так: «ISBN 123-456-67-8-90». Я хотел бы извлечь этот ISBN (удалить его из ячейки) и перенести его в другую ячейку в той же строке (K).extract textpattern from excel cell

До сих пор я был в состоянии построить регулярное выражение для моей строки

[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

Является ** гарантированным ** как формат 'ISBN ### - ### - ## - # - ##'? – BruceWayne

+0

Это действительно почти дубликат [Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри, так и в цикле] (http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions- regex-in-microsoft-excel-both-in-cell-and-loops) –

ответ

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 ","|")))))) 

Это предполагает ячейку источника является А2 и ISBN сопровождается «пространство» или находится в конце клетки.

Это будет использовать только ISBN. Если вы хотите удалить ISBN из исходной ячейки, вы должны сделать это только с помощью VBA.

+0

Я заметил, что у вас есть источник в столбце D. Вы можете найти-замените A2 на D2. – eshwar

+0

это сработало для меня, спасибо –

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 + I, M). Вставьте код функции в новый код модуля, обозначенный как-то вроде Book1 - Module1 (Code). Нажмите Alt + Q, чтобы вернуться на рабочий лист (ы).