Verschachtelte With-Anweisung möglich?

Hallo

ich weiß, daß folgende VBA Routine nicht funktioniert, was mir der Debugger beim Kompilieren bestätigt, ich weiß aber nicht, wie das Problem gelöst wird.

With Sheets(2)
With Korrekturblatt
.TextBox1.Text = .Cells(Zeile, 1).Text
.TextBox2.Text = .Cells(Zeile, 2).Text
.TextBox3.Text = .Cells(Zeile, 4).Text
.TextBox4.Text = .Cells(Zeile, 3).Text
.TextBox5.Text = .Cells(Zeile, 5).Text
.TextBox6.Text = .Cells(Zeile, 6).Text
.TextBox7.Text = .Cells(Zeile, 7).Text
.TextBox8.Text = .Cells(Zeile, 9).Text
.TextBox9.Text = .Cells(Zeile, 8).Text
.TextBox10.Text = .Cells(Zeile, 10).Text
.TextBox11.Text = .Cells(Zeile, 11).Text
.TextBox12.Text = .Cells(Zeile, 12).Text
End With
End With
Korrekturblatt.Show

Ohne „with“ heißt es: "Korrekturblatt.TextBox1.Text = Sheets(2).Cells(Zeile, 1).Text

Ich weiß, wie das mit 1x with gemacht wird, würde aber gern wissen, ob es einen Trick gibt, dem „with“ klarzumachen, zu w e l c h e m Ausdruck es gehören soll bzw. das „with“ aufzuteilen.

Gruß
Pauli

ich weiß, daß folgende VBA Routine nicht funktioniert, was mir
der Debugger beim Kompilieren bestätigt, ich weiß aber nicht,
wie das Problem gelöst wird.

Hallo Pauli,

vllt. so:

Sub tt()
Dim wks2 As Worksheet
Set wk2 = Sheets(2)
With Korrekturblatt
 .TextBox1.Text = wks2.Cells(Zeile, 1).Text
 .TextBox2.Text = wks2.Cells(Zeile, 2).Text
 .TextBox3.Text = wks2.Cells(Zeile, 4).Text
 .TextBox4.Text = wks2.Cells(Zeile, 3).Text
 .TextBox5.Text = wks2.Cells(Zeile, 5).Text
 .TextBox6.Text = wks2.Cells(Zeile, 6).Text
 .TextBox7.Text = wks2.Cells(Zeile, 7).Text
 .TextBox8.Text = wks2.Cells(Zeile, 9).Text
 .TextBox9.Text = wks2.Cells(Zeile, 8).Text
 .TextBox10.Text = wks2.Cells(Zeile, 10).Text
 .TextBox11.Text = wks2.Cells(Zeile, 11).Text
 .TextBox12.Text = wks2.Cells(Zeile, 12).Text
 .Show
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

danke für diese Möglichkeit. Habe wieder etwas dazugelernt.

Gruß
Pauli

Textboxen in einer Schleife ansprechen

danke für diese Möglichkeit. Habe wieder etwas dazugelernt.

Hallo Pauli,

benenne bitte da die vier Textboxen um sodaß die Indexreihenfolge
stimmt.

Sub nn()
Dim N As Integer, wks2 As Worksheet
Set wks2 = Sheets(2)
Const Zeile As Long = 4
With UserForm1
 For N = 1 To 12
 .Controls("TextBox" & N).Text = wks2.Cells(Zeile, N).Text
 Next N
 .Show
End With
End Sub

Gruß
Reinhard

1 Like

Hallo Reinhard,

toller Vorschlag, funktioniert prima. Diese Anwendung von Controls kannte ich nicht. Das macht den Code wesentlich einfacher und übersichtlicher. Ich habe einige ähnliche Codes, bei denen noch diese Massen von Textboxen Programmzeilen füllen. Das ist nun vorbei. Danke.
Bei dieser Gelegenheit fand ich auch die für mich bislang unbekannte „for each…next“ Anweisung, mit der ich mit Hilfe von Controls jetzt die Textboxen beeinflussen kann.

Gruß
Pauli

toller Vorschlag, funktioniert prima. Diese Anwendung von
Controls kannte ich nicht. Das macht den Code wesentlich
einfacher und übersichtlicher. Ich habe einige ähnliche Codes,
bei denen noch diese Massen von Textboxen Programmzeilen
füllen. Das ist nun vorbei. Danke.

Hallo Pauli,

bei Kleincode den ich hier zeige nehme ich auch die Namen die Vba/Excel vorgibt. Aber bei Code mit z.B. mehreren Userformen mit
einigen Elementen verpasse ich den Elementen sprechende Namen.
Und auch sonst bei benenennung von Variablen.

Gockel mal bitte nach ungarischer Notation.
Ich halte mich natürlich nicht streng daran, aber eine Teilmenge
davon setzte ich schon ein. Denn es macht großen Sinn.

Du hast deine UF „Korrekturblatt“ genannt. Da ich sehr oft schlampig
lese habe ich das .Show nicht beim ersten mal gedeutet. Ich ging
also von textboxen auf einem Blatt aus.
Das wäre IN DIESEM FALL egal gewesen ABER in anderen Fällen gibt
es da gravierende Unterschiede.

Also hätte ich einen Namen wie ufKorrekturblatt gewählt.
Der „spricht“ zu denen die den Namen lesen. Zu Fremden wie mir
aber auch zu dir wenn du als Fremder den Code liest.
Glaub mir, wenn du erst in 2 Monaten oder später den Code wieder
siehst biste wie ein Fremder.

Anderes Beispiel, eine UF hat 3 CommandButtons.
Die kriegen Namen wie cbAbbrechen, cbOK, cbSpeichern.

Die Idee kam mir eben erst, noch nicht getestet aber beim ersten
Durchdenken sieht sie gut aus.
Benennen sie doch tbDatumKauf1, tbtbDatumKauf2, tbPreis3

Dann haste die Vorteile der Indizes um sie in einer Schleife
durchlaufen zu lassen.
Ungetestet vllt. so

For each CB in .Controls
 if cb.name like "tb\*" then
 cb.text=wks2.cells(zeile,right(cb.name,1)).text
 end if
next cb

Wegen der Problematik wenn der Index zweistellig wird, dann halt
solche Namen tbDatumKauf01, tbDatumKauf02, tbPreis03
und mit right zwei Zeichen auslesen, ggfs. faslls nötig mit val
in Zahlen umwandeln.

Wegen langen Namen, Intellisense kennst du?

Gruß
Reinhard

Hallo Reinhard

toller Vorschlag, funktioniert prima. Diese Anwendung von
Controls kannte ich nicht. Das macht den Code wesentlich
einfacher und übersichtlicher. Ich habe einige ähnliche Codes,
bei denen noch diese Massen von Textboxen Programmzeilen
füllen. Das ist nun vorbei. Danke.

Hallo Pauli,

bei Kleincode den ich hier zeige nehme ich auch die Namen die
Vba/Excel vorgibt. Aber bei Code mit z.B. mehreren Userformen
mit
einigen Elementen verpasse ich den Elementen sprechende Namen.

das mache ich auch so, alleine schon, um in dem „Explorer“ links in Bild der VBA-Seite sofort die UF zu erkennen.

Und auch sonst bei benenennung von Variablen.

Gockel mal bitte nach ungarischer Notation.
Ich halte mich natürlich nicht streng daran, aber eine
Teilmenge
davon setzte ich schon ein. Denn es macht großen Sinn.

Um Namen kurz zu halten (wegen der Schreiberei), bediene ich mich häufig mit Namen wie AI,BI,CI für Integer, AS,BS,CS für String, AR,BR,CR für Real. Damit kann ein Fremder allerdings wenig anfangen.

Du hast deine UF „Korrekturblatt“ genannt. Da ich sehr oft
schlampig
lese habe ich das .Show nicht beim ersten mal gedeutet. Ich
ging
also von textboxen auf einem Blatt aus.
Das wäre IN DIESEM FALL egal gewesen ABER in anderen Fällen
gibt
es da gravierende Unterschiede.

Also hätte ich einen Namen wie ufKorrekturblatt gewählt.
Der „spricht“ zu denen die den Namen lesen. Zu Fremden wie mir
aber auch zu dir wenn du als Fremder den Code liest.
Glaub mir, wenn du erst in 2 Monaten oder später den Code
wieder
siehst biste wie ein Fremder.

ja, das kenne ich, ich schreibe grundsätzlich über jede Routine (Sub) die Info, was diese Routine tut und auch hinter komplexen Anweisungen, wozu sie da sind.

Anderes Beispiel, eine UF hat 3 CommandButtons.
Die kriegen Namen wie cbAbbrechen, cbOK, cbSpeichern.

Die Idee kam mir eben erst, noch nicht getestet aber beim
ersten
Durchdenken sieht sie gut aus.
Benennen sie doch tbDatumKauf1, tbtbDatumKauf2, tbPreis3

Dann haste die Vorteile der Indizes um sie in einer Schleife
durchlaufen zu lassen.
Ungetestet vllt. so

For each CB in .Controls
if cb.name like „tb*“ then
cb.text=wks2.cells(zeile,right(cb.name,1)).text
end if
next cb

Wegen der Problematik wenn der Index zweistellig wird, dann
halt
solche Namen tbDatumKauf01, tbDatumKauf02, tbPreis03
und mit right zwei Zeichen auslesen, ggfs. faslls nötig mit
val
in Zahlen umwandeln.

Ich werde damit etwas rumspielen, aber ich habe viele Anwendungen, bei denen der Code mit Schleifen einfacher zu machen wäre. Danke für die Anregung.

Wegen langen Namen, Intellisense kennst du?

ja, aber welche Verbindung zu langen Namen meinst Du? Die Namen, die das System mir vorschlägt?

Gruß
Reinhard

Gruß
Pauli

ja, aber welche Verbindung zu langen Namen meinst Du? Die
Namen, die das System mir vorschlägt?

Hallo Pauli,

nein. Mache mal ein Modul auf. Dann in etwa so:

Option Explizit

sub tt()
dim strNamenMeinerTante as string

Dann gebe in der Zeile darunter ein:
strn

und drücke dann Strg+Leertaste, das ist Intellisense.

Ein Tipp dazu, agenommen du hast das da:

With Worksheets(„Tabelle1“)
.

Intellisense zeigt dir da automatisch nix an.
Aber schreibste es so:

With Tabelle1
.

kommt nach der Eingabe des Punktes Intellisense und bietet dir alles
an was du nach dem Punkt benutzen kannst.

Gruß
Reinhard