2016-04-20 10 views
3

Was ich versuche zu tun
Suchen Sie die Spalte, deren Header-Zelle eine eindeutige Zeichenfolge enthält. Mit anderen Worten, ich kenne den Text der Zelle, und ich weiß, dass die Zelle in Zeile 1 ist, aber ich weiß nicht, welche Spalte. HINWEIS: Ich möchte nach dem vollständigen Text suchen, nicht nur ein Teil davon. HINWEIS2: Der Text kann variieren, daher kann ich den Wert nicht in meinen Code codieren. Eher muss ich die Variable verwenden, in der der Wert gespeichert wird.Range.Find() Text mit Wagenrücklauf Excel VBA

Das Problem
Wenn im Kopftext keine Wagenrücklauf ist, arbeitet ein einfaches newCol = Range("1:1").Find(headerText).Columnfeinen. Wenn jedoch ein Wagenrücklauf vorhanden ist, funktioniert dies nicht. Es gibt den Fehler "Objektvariable oder mit Blockvariable nicht gesetzt" aus. Hier ist mein genauer Kopf string:

Incomplete Email 
(more text) 

Was ich schon versucht
Ich habe auch versucht WorksheetFunction.Match(headerText, Range("1:1"), 0) mit, bekam aber das gleiche Problem.

Zusätzliche Hinweise und Anforderungen
Dieser Teil von einer Add-In ist, so will ich nicht, etwas ändern in dem Excel-Tabelle des Benutzers, wenn ich nicht haben (dh ich nicht tun möchte den Wagenrücklauf entfernen).

Technisch Ich tue dies in einer Funktion:

Public Function getColumn(headerText As Variant) 
    getColumn = Range("1:1").Find(headerText).Column 
End Function 

Dank!

+1

Was ist, wenn Sie versuchen, Bereich ("1: 1"). Finden ("*" & HeaderText & "*"). Spalte " – BruceWayne

+0

Kein Glück. Gleiches Problem –

+0

Wie haben Sie 'newCol' deklariert? Ich legte "Test [alt-enter] Test" und führte 'newCol = Range (" 1: 1 "). Find (" Test "). Spalte" und es hat funktioniert. – BruceWayne

Antwort

1

pls mit folgendem Code versucht

Public Function getColumn(headerText As String) 
    str1 = Split(headerText, vbCrLf) 
    str2 = UBound(str1) 
    b = Range("1:1").Find(str1(0) & Chr(10) & str1(1)).Column 
End Function 
+0

Siehe BruceWaynes Kommentar oben. Das funktioniert nicht. Macht irgendwie Sinn, dass es nicht wäre, da ich die ganze Zeichenfolge habe, also machen die Wildcards "*" nicht wirklich viel. –

+0

können Sie bitte Ihren headertext String zeigen? –

+0

Siehe aktualisierte Frage oben. –

0

Den Code sollte auch funktionieren, wenn die Kopfzelle Zeilenumbrüche enthält:

Sub FindColumnWithTextInRowOne() 
    Dim headerText As String, newCol As Long 

    headerText = "whatever" 
    newCol = Range("1:1").Find(headerText).Column 
    MsgBox newCol 
End Sub 

enter image description here


Dies liegt daran, Ihre Verwendung von finden() erfordert keine Übereinstimmung mit dem GANZEN Inhalt der Zelle.

EDIT # 1:

Wurde die Header-Zelle mit einer Formel konstruiert, ein dann etwas anders Find() sollte verwendet werden:

Sub FindColumnWithTextInRowOne() 
    Dim headerText As String, newCol As Long, r As Range 
    headerText = Range("H1").Text 
    newCol = Range("1:1").Find(What:=headerText, LookAt:=xlWhole, LookIn:=xlValues).Column 
    MsgBox newCol 
End Sub 

enter image description here

+0

Sie suchen nach einem Teil des Header-Textes, nicht die ganze Sache. –

+0

Suchen Sie nach dem Bereich ("H1"). Wert oder wo immer Sie diesen Text gespeichert haben. Es sollte nicht funktionieren. –

+0

@AlexSilverman Sie sind richtig ..... sehen Sie meine ** EDIT # 1 ** –

1

Hier ist das Ding : Text mit und ohne Zeilenumbruch ist NICHT der gleiche Text daher die .Find scheitern. Was Sie tun sollten, ist eine Mustersuche.Ich habe dies nur getestet und es funktioniert, vorausgesetzt, dass, wenn es keine Zeilenumbrüche gibt es soll ein Raum sein:

Sub test() 
Dim rex As RegExp, ran As Range 
Dim col As Integer, headerText As String 

'read you headerText here 

Set rex = New RegExp 
rex.Pattern = RegexIt(headerText) 

For Each ran In Range("1:1") 
    If rex.test(ran.Text) Then 
     col = ran.Column 
     Exit For 
    End If 
Next ran 

MsgBox col 

End Sub 

Function RegexIt(what As String) As String 

what = Replace(what, "(", "\(") 
what = Replace(what, ")", "\)") 
what = Replace(what, "[", "\[") 
what = Replace(what, "]", "\]") 
what = Replace(what, "<", "\<") 
what = Replace(what, ">", "\>") 
what = Replace(what, " ", "[\n ]?") 
what = Replace(what, vbCrLf, "[\n ]?") 

End Function 

Viel Glück!

Edit: Verweis auf Microsoft VBScript Regular Expressions 5.5 erforderlich

Edit2: Edited für den variablen Einsatz. Erläuterung: Ersetzen Sie Leerzeichen im Variablenwert durch optional Leerzeichen/Zeilenumbrüche, Escape-Klammern für Mustervergleiche.

+0

Danke. Leider muss ich, wie oben erwähnt, nach der Variablen suchen, da die genaue Zeichenfolge variieren kann. Können Sie RegEx mit einer Variablen verwenden? –

+0

Vorgesehene Pausen können nur zwischen Wörtern des Variablenwertes vorkommen, ja. Siehe edit2. – LocEngineer

+0

Dies scheint intuitiver, aber auch klobiger als die obige Karthick-Lösung. –