Auffinden der Zellwerte in Excel-VBA
Mit: Excel 2007/Win 7
Zuerst habe ich eine subroutine zu finden, die den dynamischen Bereich in einem Arbeitsblatt namens "WIP':
Sub GetWIPRange()
Dim WIPrng1 As Range
Dim WIPrng2 As Range
Sheets("WIP").Activate
Set WIPrng1 = Cells.find("*", [a1], , , xlByRows, xlPrevious)
Set WIPrng2 = Cells.find("*", [a1], , , xlByColumns, xlPrevious)
If Not WIPrng1 Is Nothing Then
Set WIPrng3 = Range([a1], Cells(WIPrng1.Row, WIPrng2.Column))
Application.Goto WIPrng3
Else
MsgBox "sheet is blank", vbCritical
End If
End Sub
Nun möchte ich finden, einen bestimmten Vertrag-Nummer innerhalb des vorstehend definierten Bereichs:
Sub find()
Dim find As Long
find = Application.WorksheetFunction.Match("545499", Range(WIPrng3.Parent.Name & "!" & WIPrng3.Address), 0)
MsgBox "Found at row : " & find
End Sub
Aber die Fehlermeldung bekomme ich aus dem code oben ist:
Run-time error '91':
Objekt-variable Mit block-variable nicht festgelegt.
- Wie kann ich dieses Problem beheben code so, dass er gibt die Nummer der Zeile der Wert ich Suche?
- Gibt es einen effizienteren Weg finden, die Zelle Werte mit VBA? Zum Beispiel, wenn ich viele Arbeitsblätter und will ich Suche alle Arbeitsblätter und einen Wert zurückgeben den spezifischen Zeilennummer und Arbeitsblatt Lage.
Vielen Dank!
InformationsquelleAutor AME | 2011-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo ist WIPrng3 definiert? Ist es als Public definiert? Das problem ist, dass WIPrng3 gegangen ist out of scope durch die Zeit, die Sie ausführen, "finden" und ist deshalb Nichts. Sie können überprüfen Sie für Nichts in der "find" - code, und führen Sie die Get-Prozedur wenn nötig. Wie diese
Zwei Dinge zu beachten: Wenn WIPrng3 gibt einen mehrspaltigen Bereich der MATCH fehl mit Fehler 1004. SPIEL funktioniert nur auf eine einzelne Spalte oder Zeile. In dem Beispiel oben, ich beschränkte WIPrng3 in die erste Spalte in der MATCH-Funktion, dies zu vermeiden. Sie hatte nicht diese in Ihrem code.
Andere Sache ist, dass Sie suchen Sie die Zeichenfolge "545499", nicht die Anzahl 545499. Wenn Sie Ihre Auswahl enthält die Nummer und nicht der string, erhalten Sie eine Fehlermeldung. Sie können die Falle, die Fehler mit einer On Error-Anweisung und entsprechend behandeln.
Endlich, ich sehe nicht den Vorteil zu definieren WIPrng3 (aber ich kann nicht ganz sehen, was du tust). Sie könnten leicht verwenden
Können Sie am Ende der Suche über einen größeren Bereich, aber es wird nicht spürbar auf die Leistung auswirken.
Ich fügte hinzu, die Auf Fehler in diesem Beispiel, so konnte man sehen, wie es funktioniert. Nicht setzen die Auf Fehler in dort, bis du es getestet habe, weil es maskiert alle anderen Fehler.
Charles Williams hat einige nette Analyse auf der Suche nach Effizienz hier http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/
Es wird bestehen bleiben, bis Sie den code Bearbeiten, dann alle Ihre beständigen Variablen wieder. Ich kann mir vorstellen, wenn Sie es ausführen, eine nach der anderen, es würde funktionieren. Ich habe einige mögliche Fehler im text, so überprüfen Sie diese heraus.
Columns("I:I").Wählen Sie Auswahl.find(What:=x(0), After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Aktivieren BKRow = ActiveCell.Zeile
Wäre nicht so etwas wie der code über die gleiche Aufgabe? Es ist im wesentlichen die gleiche Suche nach einem Wert mit "STRG+F".
InformationsquelleAutor Dick Kusleika