Excel/vba Range dynamischer bzgl. Zeile?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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  


RobinM66 
Fragesteller
 03.11.2019, 18:35

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ß

1
IchMalWiederXY  04.11.2019, 12:53
@RobinM66

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.

0
RobinM66 
Fragesteller
 05.11.2019, 18:34
@IchMalWiederXY

@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ß

0
IchMalWiederXY  05.11.2019, 21:49
@RobinM66

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.

0
RobinM66 
Fragesteller
 06.11.2019, 00:58
@IchMalWiederXY

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
0
IchMalWiederXY  06.11.2019, 19:30
@RobinM66

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. 

0
RobinM66 
Fragesteller
 06.11.2019, 22:32
@IchMalWiederXY

@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
0
IchMalWiederXY  07.11.2019, 07:16
@RobinM66

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. 

0
RobinM66 
Fragesteller
 07.11.2019, 16:25
@IchMalWiederXY

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.

0

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?

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)

RobinM66 
Fragesteller
 04.11.2019, 16:06

Ich werde es mal ausprobieren, aber sieht logisch aus.

1
RobinM66 
Fragesteller
 04.11.2019, 16:34

@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ß

0