2016-09-23 14 views
1

Ich habe eine Excel-Tabelle mit rund 500 Zeilen. Eine Spalte (D) enthält einen Text und irgendwo in diesem Text könnte eine ISBN-Nummer sein, die etwa so aussieht "ISBN 123-456-67-8-90". Ich möchte diese ISBN extrahieren (entfernen Sie es aus der Zelle) und verschieben Sie es in eine andere Zelle in der gleichen Zeile (K).extrahieren Textmuster von Excel-Zelle

Bisher konnte ich einen regulären Ausdruck für meinen String

[ISBN]+ [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+ 

Und ich denke, bauen Ich habe auch ein Grobkonzept des äußeren Mechanismus, der meine Zellen entspricht:

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 

Can jemand weist mich in die richtige Richtung?

+0

Ist ** garantiert ** das Format 'ISBN ### - ### - ## - # - ##'? – BruceWayne

+0

Dies ist wirklich fast ein Duplikat von [Wie reguläre Ausdrücke (Regex) in Microsoft Excel sowohl In-Zelle und Schleifen] (http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions- Regex-in-Microsoft-Excel-beide-in-Zelle-und-Schleifen) –

Antwort

1

Ich habe eine fertige Formel für diesen Fall, wenn Sie nur die ISBN-Nummer extrahieren möchten.

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

Dies setzt die Zellquelle ist A2 und die ISBN wird durch einen „Raum“, gefolgt oder am Ende der Zelle ist.

Dadurch wird nur die ISBN abgerufen. Wenn Sie möchten, dass die ISBN aus der Quellzelle entfernt wird, müssen Sie nur mit VBA arbeiten.

+0

Ich bemerkte, dass Sie die Quelle in Spalte D haben. Sie können-A2 mit D2 ersetzen. – eshwar

+0

das hat bei mir funktioniert, danke –

0

Aus Ihrem Code (oder fehlenden Beispieldaten) ist nicht ersichtlich, ob Ihre Daten in Zeile 1 oder Zeile 2 beginnen (Zeile 1 enthält eine Spaltenüberschrift). In beiden Fällen durchläuft Ihr aktueller Code jede Zelle in Spalte D; insgesamt 1.048.576 Zellen und das ist wahrscheinlich nicht bevorzugt.

Um einen Bereich der besiedelten Zellen in einer Spalte zu definieren, definieren Sie Range object, indem Sie die Anfangszelle bereitstellen und dann von unten nach oben nach der Endzelle¹ schauen.

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 

Es gibt viele andere Beispiele, bei denen eine statische Variable in oder zu verwenden.


¹ Siehe Is the . in .Range necessary when defined by .Cells für mehr auf ein Range object mit einem Paar Range.Cells Eigenschaften definieren.

² Eine benutzerdefinierte Funktion (auch bekannt als UDF) wird in ein Standardmodul-Codeblatt eingefügt. Tippen Sie Alt + F11 und wenn der VBE öffnet, sofort verwenden, um das Pull-Down-Menü Einfügen ► Modul (Alt + I, M). Fügen Sie den Funktionscode in das neue Modulcodeblatt mit dem Titel Book1 - Module1 (Code) ein. Tippen Sie auf Alt + Q, um zu Ihrem Arbeitsblatt zurückzukehren.

Verwandte Themen