Supportnet / Forum / Tabellenkalkulation
verschachtelte If-Schleifen
Frage
Hallo Liebe Helfer
so habe vor kurzen mit dem VBA´lern angefangen.
habe jetzt eine verschachtelte if-Bedingung (welche so auch funktioniert) und wollte mal nachfragen ob es eine "saubere" bzw einfachere Lösung dazu geben würde.
Also ich bekomme in mein activeSheet Daten aus einer Datenbank.
In Spalte A kommt der Name des Produktes:
In Spalte B, C und D jeweils eine Eigenschaft des Produktes als Zahl ausgegeben.
In Spalte E die Anzahl der Produkte im Lager.
Schaut so wie folgt aus:
Spalte A Spalte B Spalte C Spalte D Spalte E
test
1 1 0 22
1 1 1 43
2 1 4 14
3 1 1 4
3 1 2 35
3 1 20 37
3 1 8 5
4 1 20 19
4 1 5 521
4 1 8 13
Sorry für die Anzeige!
Mein Produkt ist jetzt in diesem Fall "Test"
Relevant nebem dem Produktnamen (SpalteA) sind Spalten B,D,E.
So - alle Lagerbestände(SpalteE) die einen Wert von 4 in Spalte B haben und zusätzlich einen Wert von 5 oder 20 in Spalte D sollen Ausgegeben werden. In meinem Makro erstmal als debug.print.
Mein makro schaut dann wie folgt aus:
Public Sub Uebertrag_der_Daten()
´Dimensionieren der Variablen
Dim dtm As Date
Dim max1 As Integer
Dim maxp09b As Integer
Dim i As Integer
Dim e As Integer
´Zuweisen der Variablen
dtm = Date
max1 = 60
maxtest = 10
i = 1
e = 1
´Bei A10 fängt die Ausgabe der Daten an
Range("A10").Select
For i = 1 To max1
If ActiveCell.Value = "test" _
Then
ActiveCell.Offset(1, 1).Activate
For e = 1 To maxtest
If ActiveCell.Value = 4 _
Then
ActiveCell.Offset(0, 2).Activate
If ActiveCell.Value = 20 _
Then
ActiveCell.Offset(0, 1).Activate
Debug.Print (ActiveCell)
ActiveCell.Offset(0, -3).Activate
ElseIf ActiveCell.Value = 5 _
Then
ActiveCell.Offset(0, 1).Activate
Debug.Print (ActiveCell)
ActiveCell.Offset(0, -3).Activate
Else
ActiveCell.Offset(1, -2).Activate
If ActiveCell.Value = Empty _
Then
GoTo marker1
Else
ActiveCell.Offset(-1, 0).Activate
End If
End If
End If
ActiveCell.Offset(1, 0).Activate
Next e
Else
ActiveCell.Offset(1, 0).Activate
End If
Next i
marker1:
End Sub
Ich hoffe ihr habt verstanden was ich damit bewirken will.
Jetzt nochmal meine Fragen.
1. Kann man das o.g. Makro vereinfachen??
2. optional: wie würde das makro aussehen wenn man nicht nur ein Produkt hätte. Angenommen man hätte 3 verschiedene Produkte (z.B. Test1, Test2, Test3). Jedes dieser Produkte hat wieder seine eigenen Eigenschaften und es werden auch unterschiedliche benötigt.
Bei test2 z.b. folgendes
test2
0 1 1 154
4 1 1 130
5 1 1 449
5 1 8 15
hier brauche ich z.b. 5/1 und 5/8.
wäre es bei mehreren Produkten sinnvoll eine übergeordnete Schleife einzubinden, welche die verschiedenen produkte durchgeht?
Ich glaube man versteht meinen Text nicht mehr 100%. Deswegen breche ich hier erstmal ab und warte auf Reaktionen und dann kann ich versuchen es weiter zu erklären.
THX im voraus
gez
Hardwarehacker
Antwort 1 von Event
Hallo
Wenn ich´s richtig verstanden hab´ dann sollte das:
funktionieren.
Weihnachtlichen Gruß
Wenn ich´s richtig verstanden hab´ dann sollte das:
Option Explicit
Public Sub Uebertrag_der_Daten()
´Dimensionieren der Variablen
Dim dtm As Date
Dim max1 As Integer
Dim maxp09b As Integer
Dim i As Integer
Dim e As Integer
Dim maxtest%
´Zuweisen der Variablen
dtm = Date
max1 = 60
maxtest = 10
´Bei A10 fängt die Ausgabe der Daten an
For i = 1 To max1
Range("A" & CStr(i)).Select
If ActiveCell.Value = "test" Then
For e = i To i + maxtest
If ActiveCell.Offset(e, 1).Value = 4 And _
ActiveCell.Offset(e, 3).Value = 5 Or _
ActiveCell.Offset(e, 3) = 20 Then
Debug.Print ActiveCell.Offset(e, 4).Value
End If
Next
End If
Next
End Sub
funktionieren.
Weihnachtlichen Gruß
Antwort 2 von Hardwarehacker
Herzlichen Dank erstmal
leider funktioniert es nicht.
Wenn ich mir den QC ansehe scheint es schon das zu sein, was ich benötige bzw du hast es richtig verstanden.
Zu meiner Formatierung der Liste:
Das Produkt steht z.B. in Zelle A10
Die erste Eigenschaft steht in Zelle B11.
Da der 2.Wert beim activecell.offset den Wert der Spalten angibt hab ich meine liste kurzerhand geändert. Hab dann das Produkt in die gleiche Zeile wie die Eigenschaften. Als das nichts nüzte hab ich alle Möglichkeiten ausprobiert die mir einfielen.
Entweder hatte ich einen Denkfehler oder es passt etwas anderes nicht.
Da ich wie gesagt erst kurz das VBAlern angefangen hab, weiß ich nicht woran es sonst noch liegen könnte. Wäre dir also sehr verbunden, wenn du dir dien makro nochmal anschaust ob vlt ein Fehler enthalten ist oder vlt weißt du ja schon was ich falsch mache.
Danke
gez
Hardwarehacker
leider funktioniert es nicht.
Wenn ich mir den QC ansehe scheint es schon das zu sein, was ich benötige bzw du hast es richtig verstanden.
Zu meiner Formatierung der Liste:
Das Produkt steht z.B. in Zelle A10
Die erste Eigenschaft steht in Zelle B11.
Da der 2.Wert beim activecell.offset den Wert der Spalten angibt hab ich meine liste kurzerhand geändert. Hab dann das Produkt in die gleiche Zeile wie die Eigenschaften. Als das nichts nüzte hab ich alle Möglichkeiten ausprobiert die mir einfielen.
Entweder hatte ich einen Denkfehler oder es passt etwas anderes nicht.
Da ich wie gesagt erst kurz das VBAlern angefangen hab, weiß ich nicht woran es sonst noch liegen könnte. Wäre dir also sehr verbunden, wenn du dir dien makro nochmal anschaust ob vlt ein Fehler enthalten ist oder vlt weißt du ja schon was ich falsch mache.
Danke
gez
Hardwarehacker
Antwort 3 von Hardwarehacker
Hi Event
hab jetzt ein wenig rumprobiert und bin auf die Lösung gestoßen.
Nach der Zeile mit:
For e = i To i + maxtest
hab ich folgendes eingefügt
Range(A1").Select"
Somit passen die Zellsprünge (activecell.offset).
Also herzlichen Dank nochmal. Es klappt jetzt schon wie es wollte. Hab jetzt wieder ein paar andere Anregungen. Werde ich aber in einem neuen Thread aufmachen.
PS: Wenn noch andere Vorschläge sind würde ich mich sehr freuen.
gez
Hardwarehacker
hab jetzt ein wenig rumprobiert und bin auf die Lösung gestoßen.
Nach der Zeile mit:
For e = i To i + maxtest
hab ich folgendes eingefügt
Range(A1").Select"
Somit passen die Zellsprünge (activecell.offset).
Also herzlichen Dank nochmal. Es klappt jetzt schon wie es wollte. Hab jetzt wieder ein paar andere Anregungen. Werde ich aber in einem neuen Thread aufmachen.
PS: Wenn noch andere Vorschläge sind würde ich mich sehr freuen.
gez
Hardwarehacker