2016-07-18 9 views
-1

Ich verwende die VBA Find() Funktion, kann aber die Suchfunktion nicht nur in einem bestimmten Bereich suchen. Könnte mir jemand freundlicherweise dabei helfen?VBA Find Funktion kann keinen Variablenbereich definieren

Ich erhalte einen Laufzeitfehler ‚1004‘ Anwendung definieren oder Objekt definiert Fehler auf y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Value 'full soln max

Ich versuche, den Bereich zwischen meiner Suchfunktion innerhalb suchen zu definieren. . Seine aus der 10. Reihe, was auch immer Zeile den Text „GLOBAL GROUP KÄUFE“ in ist

Unten finden Sie den Code ein:

Sub highlightcases() 
    Application.ScreenUpdating = False 
    For i = 2 To Worksheets.Count 
    k = 2 * i - 1 
    For j = 13 To Sheets(1).Cells.Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row 
     ID = Sheets(1).Cells(j, 1).Value 'case comparison stream name  
     frow = Cells.Find("GLOBAL GROUP PURCHASES").Row  
     x = Sheets(1).Cells(j, 1).Offset(0, 2).Value 'case comparison sheet activity 
     y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value 'full soln max  
     Z = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 5).Value ' full soln min  

     If x = y And x <> 0 And y <> Z Then 'check max   
     Sheets(1).Cells(j, k).Interior.ColorIndex = 35 
     ElseIf x = Z And x <> 0 And y <> Z Then 'check min 
     Sheets(1).Cells(j, k).Interior.ColorIndex = 22 
     ElseIf y = Z And y <> 0 Then 'check fixed 
     Sheets(1).Cells(j, k).Interior.ColorIndex = 19 
     End If 

     If Sheets(1).Cells(j, k).Value <> 0 Then  
     Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _ 
       "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:=Sheets(1).Cells(j, k).Text 
     Else  
     Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _ 
       "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(Cells.Find("GLOBAL GROUP PURCHASES").Row, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:="0" 
     End If 

    Next j 
    Next i 

    With Sheets(1).Cells  
    .Font.Color = vbBlack 
    .Font.Size = 8 
    .Font = Arial  
    End With 

    Application.ScreenUpdating = True 
End Sub 
+0

Tun Sie das nicht schon beim Setzen von 'y' und' Z'? – arcadeprecinct

+0

Ja, das ist das Problem. Es gibt mir einen Fehler –

+0

Dann müssen Sie diesen Fehler (die genaue Fehlermeldung) und die Zeile, wo es auftritt, beschreiben. – arcadeprecinct

Antwort

1
y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value 

Hier ist Ihr Problem sein kann: Cells(10, 1) bezieht sich offensichtlich auf die Zelle A10. Aber auf welchem ​​Blatt? Da Sie es nicht angegeben haben, wird das aktuell aktive Blatt so übernommen, dass es im Wesentlichen mit ActiveSheet.Cells(10,1) übereinstimmt.

Sie haben angeben, korrekt das Blatt für die .Range aber später Sie geben es nicht für die Cells wenn ja, sagen wir mal, Sheet(1) das aktive Blatt ist und i = 2, Ihre Linie ist die gleiche wie

y = Sheets(2).Range(Sheets(1).Cells(10, 1), Sheets(1).Cells(frow, 1)).Find(ID).Offset(0, 6).Value 

und Sie können keinen Bereich auf einem Blatt mit Zellen aus einem anderen Blatt angeben. Die Lösung besteht natürlich darin, immer die Blätter anzugeben. With Blöcke können machen, dass leichter

With Sheets(i) 
    y = .Range(.Cells(10, 1), .Cells(frow, 1)).Find(ID).Offset(0, 6).Value 
End With 

, wann immer Sie .Something in einem mit Block verwenden, ist es .Something auf dem mit Blockvariablen verwendet. Natürlich würden Sie mehr als eine Zeile hineinlegen, möglicherweise alles innerhalb der inneren for-Schleife.

+0

Danke! aber ich bekomme einen Laufzeitfehler 91: Objektvariable oder mit Blockvariable nicht gesetzt "nach der Verwendung Ihres oder RGA-Code. Nvm mein Fehler. Es ist ein .find Fehler, den ich gelöst habe. Danke! –

+0

@MarcusChua yep, Weisen Sie immer zuerst einen Bereich zu und überprüfen Sie dann, ob es "Nichts" ist, bevor Sie seine Zeile oder Spalte (oder Eigenschaft) erhalten – arcadeprecinct

0

Anstatt Find auf die Zellen Aufruf Objekt, es auf den spezifischen Bereich rufen Sie möchte suchen. Wenn Sie also die erste Spalte durchsuchen möchten, rufen Sie Sheets(1).Range("A:A").Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row oder sogar Sheets(1).Columns(1).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row. Für einen benannten Bereich, durch eine Variable definiert, verwendet Sheets(1).Range(YourRangeVariableName).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row

Dies kann für jeden Bereich von jeder Form und Größe

In Antwort auf die Fehler ausgelöst getan werden, wenn ein Blatt und Range-Call, müssen Sie Legen Sie das Blatt für die Zellen erneut fest. Sie müssen also anstelle von y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Valuey = Sheets(i).Range(Sheets(i).Cells(10, 1), Sheets(i).Cells(frow, k)).Find(ID).Offset(0, 6).Value anrufen. Dies geschieht, weil jede Zelle oder einen Bereich ohne ein spezifizierte Blatt namens aus dem aktiven Blatt nennen, also wenn Sheets(i) nicht das aktive Blatt ist, werden Sie Zellen erhalten, die nicht in den Sheets(i).Range()

+0

Danke! Aber ich kann nicht die ganze Spalte durchsuchen, weil es retrasting Werte gibt –

+0

@MarcusChua dann passen Sie den angegebenen Bereich an den Bereich an, den Sie benötigen – RGA

+0

Ja das ist, was ich versuche zu tun. Aber wo "globale Gruppeneinkäufe" sich ändern. –

Verwandte Themen