Excel/vba Range dynamischer bzgl. Zeile?
Guten Abend zusammen,
eine kleine Frage am Rande, kann man die Range in der u.g. Quelle auch dynamischer bzw. flexibler machen? Gemeint ist damit die Zeile 102.
If myInput <> "" Then
FindData = Application.Match(myInput, Worksheets(myTab).Range("A3:A102"), 0)
If IsError(FindData) Then
Kann man die Zeile ändern, quasi aus einer anderen Zelle/anderen Tabelle die Zeilenanzahl entnehmen? Sprich sollte in Tabelle 2 A1 die Zahl 200 stehen, sollte die Range von A3:A200 gehen.
Wenn ja, wie müsste der Quellcode dann aussehen? Ich meine, dass es mit "i" irgendwie geht, aber keine Ahnung wie.
Gruß
2 Antworten
Worksheets(myTag).Range("A1:C20") ist gleichbedeutend mit:
Worksheets(myTag).Range(Worksheets(myTag).Cells(1,1), _
Worksheets(myTag).Range(20,3)
)
Wenn du die Ziffern aus Laufvariablen konstruierst kannst du alle möglichen Ranges dynamisch gestalten.
Man kann auch Ranges schachteln
Range("A1,B2:C50, F2:G9").Select
Alles ist möglich. Wenn du in einer Zelle etwas änderst, dann wird zunächst beim anklicken der Zelle das "Selection_Change" Event ausgelöst. Sobald du in den Zellen etwas änderst dass Change_Event. Sofern du dort einen Hinweis auf den Bereich verändert hast kann dies in der Event Prozedur verwendet werden.
@IchmalWiederXY also ich finde es echt super, dass du mir das erklärst, aber leider kann ich mit "Selection_Change" und "Change_Event" nichts anfangen. Deine Beispiele verstehe ich, aber es hilft nur halbherzig beim lösen. Bezogen auf das Beispiel von @Oubyi ist es schon verständlich, jedoch funktioniert es so nicht, obwohl ich es unter Berücksichtigung deiner Antwort als sinnvoll empfinde.
FindData = Application.Match(myInput, Worksheets(myTab). Range( Cells(3, 1), Cells(Sheets( "Tabelle2"). Range( "A1"). Value, 1)). Select)
Gruß
Das ".select" muss weg. Ggf auch noch ne klammer. Die function MATCH arbeitet auf einem Bereich. Dieser muss nicht selektiert sein. Was steht denn in A1 drin? Ne Zahl größer 3 hoffe ich. In findData steht dann eine Zahl 1 bis x je nachdem wo das Element im Array gefunden wurde.
Leider geht es immer noch nicht.
FindData = Application.Match(myInput, Worksheets(myTab).Range(Cells(3, 1), Cells(Sheets("Einstellungen").Range("C52").Value, 1)))
Folgender Fehler wird ausgerufen: Laufzeitfehler 1004 - Anwendungs- oder objektdefinierter Fehler.
Sollte ich eine klammer entfernen, gibt er schon ein Fehler beim Komplimentieren. Inhalt der Zelle Einstellung C52 ist die Zahl 100.
Mit dem ursprünglichen Code funktioniert alles.
FindData = Application.Match(myInput, Worksheets(myTab).Range("A3:A102"), 0)
Beim Debuggen wird mir auch die o.g. Zelle markiert. Langsam weiß ich echt nicht weiter :( Im Internet finde ich auch nichts.
Hier einmal der komplette Quelltext:
Sub Rechnung_speichern()
Dim myInput
Dim FindData
Dim zelle As Range
Const myTab = "Rechnungsliste"
myInput = InputBox("aufnehmen?", "Datenpr?fung")
If myInput <> "" Then
FindData = Application.Match(myInput, Worksheets(myTab).Range(Cells(3, 1), Cells(Sheets("Einstellungen").Range("C52").Value, 1)))
If IsError(FindData) Then
MsgBox "Die Rechnungsnummer: " & myInput & " wurde nicht gefunden."
Else
MsgBox "Die Rechnungsnummer: " & myInput & " wurde erfolgreich gefunden."
Set zelle = Worksheets(myTab).Range("B" & FindData + 2)
zelle.Value = Range("G9").Value
Set zelle = Worksheets(myTab).Range("D" & FindData + 2)
zelle.Value = Range("G39").Value
Set zelle = Worksheets(myTab).Range("E" & FindData + 2)
zelle.Value = Range("D41").Value
End If
End If
End Sub
Wenn du Dinge auf verschiedenen Blättern stehen hast dann mustt du das komplette Object angeben.
zelle.Value = Worksheets("xy").Range("G9").Value
Fehlt dies verwendet excel "G9" vom aktuell aktiven Sheet.
@ichmalwiederXY dort ist kein Problem. Die Zelle G9 soll auch aus dem aktiven Blatt verwendet werden. Der Fehler muss bei
FindData = Application.Match(myInput, Worksheets(myTab).Range(Cells(3, 1), Cells(Sheets("Einstellungen").Range("C52").Value, 1)))
Liegen
Innerhalb von Range ist das gleiche Problem: Cells ist "isoliert"
Worksheets(myTab).Range( Cells(3, 1)
Worksheets(myTab).Range( Worksheets("xy").Cells(3, 1),
UND ..was steht in der Zelle ?
Sheets("Einstellungen").Range("C52").Value
Ich würde mir den Range konstruieren
myRange = "$A$3:$A$" & Sheets("Einstellungen").Range("C52").Value
FindData = Application.Match(myInput, Worksheets(myTab).Range(myRange))
Dann im Debugger überprüfen ob der Range auch wirklich stimmt.
ich weiß nicht wie, aber es funktioniert. Obwohl ich dachte, dass ich
myRange = "$A$3:$A$" & Sheets("Einstellungen").Range("C52").Value
als Const setzen müsste. Egal, jedenfalls alles wunderbar.
Vielen Dank.
So wie ich Dich verstehe:
FindData = Application.Match(myInput, Worksheets(myTab).Range(Cells(3, 1), Cells(Sheets("Tabelle2").Range("A1").Value, 1)).Select)
Hilft das?
@Oubyi,
deine Zeile (bereits auf mein Script angepasst)
FindData = Application.Match(myInput, Worksheets(myTab).Range(Cells(3, 1), Cells(Sheets("Einstellungen").Range("C52").Value, 1)).Select)
wirft folgenden Fehler aus: Anwendungs- oder objektdefinierter Fehler.
Der Tabellenname und die Zeilen ist korrekt. Der Zeileninhalt 100 ist als Standard formatiert.
Gruß
Schön dass du mir auch bei dieser Frage behilflich bist @IchMalWiederXY. Leider bin ich bei vba ein absoluter Anfänger. Ich verstehe auch dein Beispiel aber besteht denn die Möglichkeit, dass ich die Range erweitere, ohne ins Script zu gehen (Quasi die Steuerung über den Zelleninhalt). So dann ich flexibel von Zelle 100 auf Zelle 200 erweitern kann, anhand der Änderung des Zelleninhalts
Gruß