Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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

Frage zu VBA Code

Frage zu VBA Code
16.06.2021 19:18:20
Thomas
Guten Abend, ich habe nur die Frage ob anhand dieses Codeschnipsels von euch jemand erkennt ob das VBA technisch korrekt ist oder ob ich das, so wie ich es zusammenstelle gerade wieder aus dem Kopf schlagen soll?
Worksheets("Tabelle1").Range(.Cells(Zaehler1, 9), Cells(Zaehler1, 11), Cells(Zaehler1, 13)).Value = Worksheets("Tabelle1").Range(.Cells(Zaehler1, 1), Cells(Zaehler1, 2), Cells(Zaehler1, 3))
Im Moment kommt der Fehler "Unzulässiger oder nicht ausreichend definierter verweis. Ich kenne mich damit zu wenig aus, um zu erkennen ob diese Art von Methode machbar ist oder nicht.
Danke für eure Hilfe wenn es welche gibt.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage zu VBA Code
16.06.2021 19:29:07
Hajo_Zi
mache jede Zeile einzeln da kein zusammenhängender Bereich.

Option Explicit
Sub nnhh()
Dim Zaehler1 As Long
Zaehler1 = 5
With Worksheets("Tabelle1")
.Cells(Zaehler1, 9) = .Cells(Zaehler1, 1)
.Cells(Zaehler1, 11) = .Cells(Zaehler1, 2)
.Cells(Zaehler1, 13) = .Cells(Zaehler1, 3)
End With
End Sub
GrußformelHomepage
Anzeige
AW: Frage zu VBA Code
16.06.2021 19:40:40
Thomas
Danke Hajo für deine Info.
Ich habe es vermutet das es darauf hinaus läuft. Weil so habe ich es zuerst gemacht. Und das funktioniert ja auch.
Und die Idee kam dann, ob es möglich ist diesen Code noch etwas zu komprimieren und habe es dann so versucht. Aber ich habe es, so glaube ich, verstanden. Da die Cell Bezüge zueinander im Zusammenhang mit dieser Methode ungleich sind, kann es nicht gehen.
Schade eigentlich.
AW: Frage zu VBA Code
16.06.2021 19:50:19
GerdL
Moin Thomas!

Worksheets("Tabelle1").Cells(Zaehler1, 9) = Worksheets("Tabelle1").Cells(Zaehler1, 1).Value
Worksheets("Tabelle1").Cells(Zaehler1, 11) = Worksheets("Tabelle1").Cells(Zaehler1, 2).Value
Worksheets("Tabelle1").Cells(Zaehler1, 13) = Worksheets("Tabelle1").Cells(Zaehler1, 3).Value
weil du nur "rechts" einen Block bilden könntest oder:

Dim ZielSpalte As Long, HolSpalte As Long, Zaehler1 As Long
Zaehler1 = 5
With Worksheets("Tabelle1")
For ZielSpalte = 9 To 13 Step 2
HolSpalte = HolSpalte + 1
.Cells(Zaehler1, ZielSpalte) = .Cells(Zaehler1, HolSpalte).Value
Next
End With

Wobei drei Codezeilen schon an der Untergrenze sind, wann sich eine Schleife überhaupt lohnt.
Gruß Gerd

Anzeige
AW: Frage zu VBA Code
16.06.2021 20:05:42
Thomas
Besten Dank auch.
Ja es bleibt dann natürlich schon nicht bei 3 Zeilen.
Und die Schleife wäre dann so zu verstehen For Zaehler1 = 1 To 25 usw.
Gruss
Thomas
AW: Frage zu VBA Code
16.06.2021 20:33:28
Daniel
Wenn du hier noch ne Schleife über die Zeilen machst, darfst du nicht vergessen, das HolSpalte immer wider auf den Startwert zu setzen:

For Zeile1 = 1 to 25
HolSpalte = 0
For ZielSpalte = 9 to 13 step 2
HolSpalte = HolSpalte + 1
Oder du berechnest:

For Zeile1 = 1 to 25
For ZielSpalte = 9 to 13 step 2
HolSpalte = (Zielspalte - 7) / 2
Gruß Daniel
Anzeige
AW: Frage zu VBA Code
17.06.2021 19:11:43
Thomas
Guten Abend,
habe es mal ganz alleine hingekriegt. Das Grundgerüst steht. Jetzt kommt dann noch Erklärungstext dazu und ev. noch MsgBoxen für hinweise im Ablaufprozess.

Sub MatTexTransver()
Dim Zaehler1 As Integer, Zaehler2 As Integer
For Zaehler1 = 11 To 17
If Worksheets("Rapportieren").Cells(42, 25) = "" Then
If Worksheets("Materialerfassung").Cells(Zaehler1, 3).Interior.ColorIndex = 3 Then Exit For
Worksheets("Rapportieren").Cells(Zaehler1 + 25, 2).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 2)
Worksheets("Rapportieren").Cells(Zaehler1 + 25, 6).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 3)
Worksheets("Materialerfassung").Cells(Zaehler1, 3).Interior.ColorIndex = 3
Worksheets("Rapportieren").Cells(Zaehler1 + 25, 8).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 4)
End If
Next Zaehler1
For Zaehler2 = Zaehler1 To 24
If Worksheets("Rapportieren").Cells(42, 25) = "" Then
If Worksheets("Materialerfassung").Cells(Zaehler2, 3).Interior.ColorIndex = 3 Then Exit For
Worksheets("Rapportieren").Cells(Zaehler2 + 18, 19).Value = Worksheets("Materialerfassung").Cells(Zaehler2, 2)
Worksheets("Rapportieren").Cells(Zaehler2 + 18, 23).Value = Worksheets("Materialerfassung").Cells(Zaehler2, 3)
Worksheets("Materialerfassung").Cells(Zaehler2, 3).Interior.ColorIndex = 3
Worksheets("Rapportieren").Cells(Zaehler2 + 18, 25).Value = Worksheets("Materialerfassung").Cells(Zaehler2, 4)
End If
Next Zaehler2
End Sub

Anzeige
AW: Frage zu VBA Code
17.06.2021 19:20:08
Thomas
Und diese Variante ist nun das was ich unter komprimieren gemeint habe gestern Abend.

Sub MatTextTransver()
Dim Zaehler1 As Integer, zeilenA As Integer
zeilenA = 0
For Zaehler1 = 11 To 200
If Worksheets("Rapportieren").Cells(42, 25) = "" Then
If Not Worksheets("Materialerfassung").Cells(Zaehler1, 3).Interior.ColorIndex = 3 Then
If Worksheets("Materialerfassung").Cells(Zaehler1, 3) = "" Then End
zeilenA = zeilenA + 1
If zeilenA = 15 Then End
Worksheets("Rapportieren").Cells(zeilenA + 28, 19).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 2)
Worksheets("Rapportieren").Cells(zeilenA + 28, 23).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 3)
Worksheets("Materialerfassung").Cells(Zaehler1, 3).Interior.ColorIndex = 3
Worksheets("Rapportieren").Cells(zeilenA + 28, 25).Value = Worksheets("Materialerfassung").Cells(Zaehler1, 4)
End If
End If
End If
Next Zaehler1
End Sub

Anzeige
AW: Frage zu VBA Code
18.06.2021 15:17:58
Yal
Hallo Thomas,
es ist ein doppelter Erfolg, wenn man es selber hinbekommt.
2 Vorschläge:
Zaehler werden meitens mit i benannt. Da keine Überschneidung kann dieselbe Variable in beide For verwenden.
Wenn Du die Tabellenblatt Variablen zuordnest (Hier Quell und Ziel), bekommst Du ein übersichtlicheren Code.

Sub MatTexTransver()
Dim wZ As Worksheet
Dim wQ As Worksheet
Dim i
Set wZ = Worksheets("Rapportieren")
Set wQ = Worksheets("Materialerfassung")
For i = 11 To 17
If wZ.Cells(42, 25) = "" Then
If wQ.Cells(i, 3).Interior.ColorIndex = 3 Then Exit For
wQ.Cells(i, 3).Interior.ColorIndex = 3
wZ.Cells(i + 25, 2).Value = wQ.Cells(i, 2)
wZ.Cells(i + 25, 6).Value = wQ.Cells(i, 3)
wZ.Cells(i + 25, 8).Value = wQ.Cells(i, 4)
End If
Next i
For i = i To 24
If wZ.Cells(42, 25) = "" Then
If wQ.Cells(i, 3).Interior.ColorIndex = 3 Then Exit For
wQ.Cells(i, 3).Interior.ColorIndex = 3
wZ.Cells(i + 18, 19).Value = wQ.Cells(i, 2)
wZ.Cells(i + 18, 23).Value = wQ.Cells(i, 3)
wZ.Cells(i + 18, 25).Value = wQ.Cells(i, 4)
End If
Next i
End Sub
aber es ist reine Geschmacksache.
VG
Yal
Anzeige
AW: Frage zu VBA Code
18.06.2021 21:21:12
Thomas
Hallo YAL,
danke für deine Stellungnahme. Ja da habe ich Fragen über Fragen an die Seite des Provis. Also zumal dass ich die Variable nicht mit i benennt habe ist nur deswegen weil ich langsam damit beginne Variablen nach Namen zu nennen die mit dem Prozess im Zusammenhang stehen. So habe ich auch eine Übersicht des Geschehens.
Da wäre dann aber schon mal die Frage: Ist das schlimm, stört das den Code, oder verlangsamt das gar den Prozess?
Und das man die gleiche Variable für zwei Vorschleifen nehmen kann, geht das generell dort wo keine Verschachtelung der For Schleifen sind? Oder nach was für einer Regel geht das denn da genau?
Das mit dem Set Objekt sehe ich für mich zur Zeit noch mit viel Respekt. Weil damit habe ich gar keine Erfahrung und sehe die Sinne dahinter noch zu wenig. Wie Vorteile und Nachteile eines Set Objektes. Aber ich sehe zumindest das es damit schon ordentlich aufgeräumt aussieht.
Und hier dir Frage: Muss das Set Objekt am Schluss vom Skript nicht beendet werden, oder muss man das nur bei bestimmten Anwendungen machen?
Ich habe auch immer mal wieder gelesen das die Set Methode etwas veraltetes ist. Ist das so?
Wo liegen da eigentlich die vor- und Nachteile beim Set Objekt?
Gruss
Thomas
Anzeige
AW: Frage zu VBA Code
19.06.2021 21:21:01
Yal
Hallo Thomas,
Sorry wenn ich dich durcheinander gebracht habe. Deine Fragen sind berechtigt.
Die Name der Variablen ist komplett Wurst.
Diese werden vor dem Ablauf kompiliert, spricht im Maschinencode übersetzt. Es gibt da keine Variablennamen mehr sondern nur Platzhalter.
Üblicherweise benennt man die Variablen, so dass der Sinn des Codes sich ergibt. Daher warst du komplett richtig. Dass man i,j,k in schleifen benutzt, ist reine Gewöhnungssache. Nur eins für die Lesbarkeit: je öfter die Verwendung der Variable wiederholt, desto kürzer sollte der Name sein.
Wegen Übersicht, idealerweise so wenig Variablen wie möglich verwenden. Ausnahme: während die Testphase. Da ist es nutzvoll zwischenvariablen zu haben, um im Schrittmodus zu nachvollziehen, was da passiert.
Verschachtelung:
Hier auch liegst du richtig. Wenn zwei "For" sich verschachteln, sollten die "Lauf"-Variablen verschiedenen sein: i, j, k, ... Bei Spalten und Zeilen verwende ich aber R (row) und C (column). Hier auch, Lesbarkeit und Sinn haben prio.
Set:
... ist keinesfalls veraltet, zumindest nicht in VBA. Nur eins ist für den Set zu verstehen: eine Variable bekommt eine Wert, entweder Zahl oder String. Bei Objekte werden nicht die Objekte in die Variable gespeichert, sondern einen Handel, eine Adresse des Objekts. Zum Beispiel, wenn Du schreibst

set ws = Worksheets ("xyz")
wird nicht die gesamte Arbeitsblatt in der Variable gespeichert, sondern nur, dass Du mit dieser Variable die AB "xyz" ansprichst.
So werden alle Objekte mit variablen angesprochen. Es hat keine Nachteil. Es sei denn, man macht Variablenallokationen in einer Schleife, die nicht notwendig wären, aber nur wenn die Schleife sehr oft wiederholt wird. Den nicht Verwendung der Variable kostet Zeit, sondern seine Allokation. Normale Variablen und gesettete machen da keine Unterschiede.
Allgemein lieber auf dem Objekt verweisen als auf einem deren Eigenschaften, insbesondere wenn man diese Eigenschaft verwenden möchte, um dass Objekt selbst zu adressieren. Es ist direkter, kürzer und flexibler.
VG
Yal
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige