Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Skript Erweiterung

Skript Erweiterung
06.08.2020 16:52:03
Thomas
Guten Tag, ich möchte ein Skript erweitern oder anpassen, ich komme da aber mit dem With Block nicht weiter... Ich habe keine Ahnung wie ich das ausbauen soll? Hier mal das ganz normale Skript:
Sub Test ()
Dim finden As Range
Set finden = Sheets(2).Range("B:B").Find(What:="Toni")
Sheets(2).Range("A1").Value = finden.Row
End Sub
Das Skript so wie es hier steht funktioniert.
Nun Möchte ich aber der Name der gesucht wird nicht im Skrip eingeben, sondern zum Beispiel in Sheets(2).Range("C5").
Kann mir jemand weiter helfen und zeigen wie ich für mein Vorhaben das Skript anpassen muss?
Besten Dank im Voraus

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Skript Erweiterung
06.08.2020 16:56:35
Hajo_Zi
what:= Sheets(2).Range("c5")
es kommt ein Fehler falls nicht gefunden.

AW: Skript Erweiterung
06.08.2020 18:55:13
Thomas
Guten Abend Hajo,
danke für den Hinweis.
Ich weiss jetzt nicht ob das richtig ist, ich habe alles was ab .Find ist in eine neue Zeile geschrieben sozusagen vom vorderen Teil abgetrennt. Die Klammern habe ich weg gelassen und so geschrieben wie du es hast.
jetzt funktioniert alles so wie es sollte. aber wo liegt jetzt der Haken? Was kann das für Nebenwirkungen haben?
AW: Skript Erweiterung
06.08.2020 19:36:37
Thomas
Korrektur,
das was ich gemacht habe funktioniert so nicht. Habe mich da irgendwie verheddert.
Auch wenn ich dein Codeschnipsel so ausführe wie du ihn gepostet hast, geht nicht...
Werner hat aber wohl für mich die richtige Lösung gezeigt.
Gruss
Thomas
Anzeige
AW: Skript Erweiterung
06.08.2020 17:27:05
Werner
Hallo,
Anmerkung:
Bei Find sollten immer auch zumindest die Parameter LookIn und LookAt mit angegeben werden.
Warum: Bei einer "händischen" Suche speichert Excel die entpsrechenden Parameter der letzten Such ab. Werden diese Parameter dann im VBA-Code nicht angegeben, dann greift Excel auf die zuletzt abgespeicherten Parameter zu und das kann dann zu fehlerhaften Ergebnissen führen.
Zudem sollten mit Set befüllte Variable sicherheitshalber am Codende auch wieder geleert werden.
Hier dann auch noch der Code mit Fehlerbehandlung, falls der Suchbegriff nicht gefunden wird.
Sub Test()
Dim finden As Range
With Sheets(2)
Set finden = .Range("B:B").Find(What:=.Range("C5"), LookIn:=xlValues, lookat:=xlWhole)
If Not finden Is Nothing Then
.Range("A1") = finden.Row
Else
MsgBox .Range("C5") & " wurde nicht gefunden."
End If
End With
Set finden = Nothing
End Sub
Gruß Werner
Anzeige
AW: Skript Erweiterung
06.08.2020 19:03:11
Thomas
Hallo Werner und danke für diese ausführliche Arbeit.
Danke für diese Erklärung, das war etwas das ich später noch vertiefen wollte.
Habe aber noch zwei Fragen. Frage 1, wenn ich die Zelle worin der Name zum suchen steht nicht auf Scheet2 sondern auf Sheet1 will, was muss ich am Code ändern?
Frage 2, Das wegen dem leeren der Set Anweisung ist mir bekannt, aber wieso muss man oder sollte man das machen? Angenommen man macht das nicht, was kann da passieren?
Ist das leere der Set Anweisung eine Muss bei bestimmten Bedingungen in einem Skript oder ist das etwas was unbedingt in jedem Skript getan werden muss oder sollte?
Gruss
Thomas
Anzeige
AW: Skript Erweiterung
06.08.2020 19:27:03
Werner
Hallo,
na dann einfach bei Find beim What:= noch das Sheet(1) vor die Range schreiben.
Also:
 Set finden = .Range("B:B").Find(What:=Sheet(1).Range("C5"), LookIn:=xlValues, lookat:=xlWhole)
Zu 2.
Weil es wohl vorkommen kann, dass die Variable am Ende des Makros nicht automatisch (was eigentlich so ist) wieder geleert wird und du so auf der sicheren Seite bist.
Gruß Werner
AW: Skript Erweiterung
06.08.2020 19:28:57
Thomas
Danke Werner alles klar super!!!
Gerne u. Danke für die Rückmeldung. o.w.T.
06.08.2020 20:56:20
Werner
AW: Gerne u. Danke für die Rückmeldung. o.w.T.
06.08.2020 21:03:02
Thomas
Bitte!
Wenn du mir dann, ich hoffe es stört dich nicht, meine Frage zu With etwas beantworten könntest das würde mich freuen.
Hier nochmal die Frage-------------------------------------------------------------------------
Hallo Werner,
das Skript funktioniert genau so wie ich es mir vorgestellt habe. Danke.
Ich möchte abschliessend gerne noch eine Frage stellen.
Kannst du es in wenigen Sätzen erklären wieso man bei diesem Skript einen With Block benötigt?
Das würde mich sehr interessieren denn auf Google finde ich nichts passendes zu meinem Problem.
Ich habe vorher das Skript auch mal etwas manipuliert habe With Finden gemacht und bei der Range dann einfach mal Sheets(2) angefügt. Da kommt gerade die Fehlermeldung.
Ich habe da einfach keinen Durchblick wieso das eine With Anweisung benötigt da man ja ansonsten ja alles mit Worksheet, Sheets, Range, Cells referenzieren kann.
Wieso hier gerade bei diesem Skript nicht? Mir fehlt da geradezu die Logik dazu.
Wäre toll wenn du da etwas Licht ins dunkle bringen könntest. Danke
Gruss
Thomas
Anzeige
Antwort u. Beispiele
07.08.2020 06:13:30
Werner
Hallo,
benötigt wird diese With "Klammer" nicht.
Man könnte auch sagen: "Hat was mit Bequemlichkeit zu tun."
Um in einem Code ein Range-Objekt korrekt zu referenzieren muss vor jedem Range-Objekt (Range, Cells, Rows...) zwingend auch das Tabellenblatt angegeben werden, auf dem sich die Range befindet.
Ausnahme: Du sprichst eine Range an, die sich auf dem gerade aktiven Tabellenblatt befindet, dann kann das Tabellenblatt vor den Range-Objekten entfallen.
Verwendest du dagegen ein With... End With, dann werden die Range-Objekte (Range, Cells, Rows...) auf das im With angegebene Blatt referenziert, indem vor jedem Range-Objekt ein Punkt angefügt wird (.Range, .Cells, .Rows...).
Man spart sich also ständig das Tabellenblatt vor das Range-Objekt zu schreiben.
Die angefügten Makros machen alle das gleiche. Sie färben den Bereich A1:E1 gelb und schreiben einen Text in den Bereich A1:E1.
Ohne With musst du insgesamt 6 mal das Blatt in den Code schreiben um korrekt zu referenzieren.
Schau dir dann dazu im Vergleich mal das zweite Makro mit der With... End With "Klammer" an.
Dadurch, dass in diesen beiden Makros die Range explizit auf ein bestimmtes Blatt referenziert ist, kannst du die auch von einem anderen Blatt aus ausführen. Ausgeführt wird der Code im referenzierten Blatt. Du kannst diese Makros also auch von Blatt2 ausführen, ausgeführt werden sie im Blatt1.
Das Makro ohne angabe eines Blattes vor den Range-Objekten wird immer im gerade aktien Blatt ausgeführt.
Public Sub ohne_With()
Worksheets("Tabelle1").Range(Worksheets("Tabelle1").Cells(1, "A"), _
Worksheets("Tabelle1").Cells(1, "E")).Interior.Color = vbYellow
Worksheets("Tabelle1").Range(Worksheets("Tabelle1").Cells(1, "A"), _
Worksheets("Tabelle1").Cells(1, "E")) = "Hallo Thomas"
End Sub
Public Sub mit_With()
With Worksheets("Tabelle1")
.Range(.Cells(1, "A"), .Cells(1, "E")).Interior.Color = vbYellow
.Range(.Cells(1, "A"), .Cells(1, "E")) = "Hallo Thomas"
End With
End Sub
Public Sub aktives_Blatt()
Range(Cells(1, "A"), Cells(1, "E")).Interior.Color = vbYellow
Range(Cells(1, "A"), Cells(1, "E")) = "Hallo Thomas"
End Sub
Gruß Werner
Anzeige
AW: Antwort u. Beispiele
07.08.2020 16:26:09
Thomas
Hallo Werner,
besten Dank für deine Erklärungen.
Hilft mir so schon mal weiter...
Gruss
Thomas
Gerne. o.w.T.
07.08.2020 21:58:06
Werner
AW: Skript Erweiterung
06.08.2020 19:27:25
Thomas
Die Frage 1 habe ich lösen können. Ich schreibe statt .Range bla, bla, bla Sheets(1).Range bla,bla,bla
funktioniert so und hoffe dass es keine Nebenwirkungen auslöst.
Gruss
Thomas
AW: Skript Erweiterung
06.08.2020 20:55:41
Thomas
Hallo Werner,
das Skript funktioniert genau so wie ich es mir vorgestellt habe. Danke.
Ich möchte abschliessend gerne noch eine Frage stellen.
Kannst du es in wenigen Sätzen erklären wieso man bei diesem Skript einen With Block benötigt?
Das würde mich sehr interessieren denn auf Google finde ich nichts passendes zu meinem Problem.
Ich habe vorher das Skript auch mal etwas manipuliert habe With Finden gemacht und bei der Range dann einfach mal Sheets(2) angefügt. Da kommt gerade die Fehlermeldung.
Ich habe da einfach keinen Durchblick wieso das eine With Anweisung benötigt da man ja ansonsten ja alles mit Worksheet, Sheets, Range, Cells referenzieren kann.
Wieso hier gerade bei diesem Skript nicht? Mir fehlt da geradezu die Logik dazu.
Wäre toll wenn du da etwas Licht ins dunkle bringen könntest. Danke
Gruss
Thomas
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige