Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1156to1160
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
Schleife in der Schleife
Martin
Hallo liebe Excel-Experten!
Ich habe ein kleines Problem mit einer Schleife in der Schleife, vermutlich muss man nur eine Klenigkeit ändern: Ich überprüfe, ob in Spalte 2 im Register "YTD_per_Month" "EUR/CHF" steht. Wenn ja, soll er drei bestimmte Werte in das Register "Hilfstabellen" kopieren. Das Problem ist, dass ich 2 Laufindices brauche, 1x um die ganzen Zeilen in YTD_per_Month zu überprüfen um ggf die Werte zu kopieren und 1x um im Register Hilfstabelle immer eine Zeile nach unten zu gehen. Hier ist mein Code bis jetzt:
'EUR/CHF YTD_per_Month
For i = 1 To 100
If ws_YTD_per_Month.Cells(i, 2) = "EUR/CHF" Then
For j = 3 To 14
'Summe CCY1+
ws_Hilfstabellen.Cells(j, 2) = ws_YTD_per_Month.Cells(i, 4)
'Summe CCY1-
ws_Hilfstabellen.Cells(j, 3) = ws_YTD_per_Month.Cells(i, 6)
'Summe CCY1-
ws_Hilfstabellen.Cells(j, 4) = ws_YTD_per_Month.Cells(i, 8)
Next j
End If
Next i
Bisher schreibt das Makro in ALLE Zeilen der Hilfstabelle das Ergebnis des letzten Treffers von YTD_per_Month...
Vielen Dank für eure Hilfe!

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Was soll sein?
12.05.2010 18:54:41
Erich
Hi Martin,
aus deiner Beschreibung wird mir nicht klar, was du erreichen möchtest.
Löse dich bitte kurz von dem Code.
Nehmen wir mal an, jetzt soll die Zeile 2 der Tabelle ws_YTD_per_Month (hier abgek. zu YTD) verarbeitet werden (i=2).
Interessant sind davon die Spalten 2, 4, 6 und 8 (B, D, F, H).
In YTD!B2 steht der Text EUR/CHF.
In welche Zelle der ws_Hilfstabellen (abgek. zu Hilf) soll jetzt YTD!D2 (Cells(2,4)) geschrieben werden?
(Gehen wir mal davon aus, dass auch für i=1 Zeilen ausgegeben wurden.)
Nach deinem Code wird der Wert von YTD!D2 12 mal in Hilf!B3:B14 geschrieben.
Diese 12 Zellen sind dann alle gleich YTD!D2. Soll das so sein?
Jetzt kommt die 3. Zeile von YTD dran (i=3).
Wenn in YTD!B3 der Text EUR/CHF steht, wird der Wert von YTD!D3 12 mal in Hilf!B3:B14 geschrieben,
der darin stehende Wert aus YTD!D2 wird überschrieben.
Entscheidende Frage 1:
Wohin soll der Wert von YTD!D3 geschrieben werden? Vielleicht in Hilf!B15:B26, unter die bisherigen Einträge?
Und Frage 2:
Ist wirklich gewollt, dass nachher jeder Wert aus YTD 12 mal in Hilf steht? (soweit YTD!B = "EUR/CHF")
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Was soll sein?
17.05.2010 09:04:41
Martin
Hallo Erich,
zu deinen beiden Fragen:
wenn in YTD!B2 EUR/CHF steht, dann sollen die entsprechenden Werte der Zeile (Spalten 2, 4, 6 und 8 (B, D, F, H) in Hilf!Zeile 3 reingeschrieben werden
wenn in YTD!B3 EUR/CHF steht, dann sollen die Werte in Hilf!Zeile 4 geschrieben werden.
Wichtig: Da ich diese Werte für verschiedene Währungen rauslesen muss, brauche ich wohl 2 Laufindices, 1x für YTD und 1x für Hilf
Zu deiner 2. Frage:
Es ist eben nicht bewollt, einen Wert 12x in der Hilfstabelle zu haben! Vielmehr soll sich die Hilfstabelle nach und nach selbst füllen da jeden Monat eine neue Zeile mit Werten für jedes Währungspaar in YTD hinzukommt und das Makro soll dann in die entsprechen Werte in Hilf kopieren.
Danke für jeden Tipp!
Anzeige
nur eine Schleife
17.05.2010 11:40:30
Erich
Hi Martin,
probier das mal aus - die beiden Blattnamen musst du anpassen, sind bei dir länger:

Option Explicit
Sub Uebertrage()
Dim wksE As Worksheet, lngQ As Long, lngE As Long
Set wksE = Worksheets("Hilf")    ' Ausgabeblatt
lngE = 3                         ' 1. Ausgabezeile
With Worksheets("YTD")           ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(lngQ, 2) = "EUR/CHF" Then
wksE.Cells(lngE, 1) = .Cells(lngQ, 2)
wksE.Cells(lngE, 2) = .Cells(lngQ, 4)
wksE.Cells(lngE, 3) = .Cells(lngQ, 6)
wksE.Cells(lngE, 4) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: nur eine Schleife
17.05.2010 12:16:23
Martin
Hallo Erich,
ich musste nur eine Spalte kurz anpassen, jetzt funktioniert es einwadnfrei! Vielen Dank!! Ich habe es jetzt auch für 3 Währungen gleichzeitig ausprobiert, funktioniert einwandfrei. Siehst du bei dem Code noch "Optimierungspotential", dh ihn ein wenig zu verkürzen denn es kommen noch ein paar Währungspaare hinzu:
Option Explicit
Sub Uebertrage()
Dim wksE As Worksheet, lngQ As Long, lngE As Long
Set wksE = Worksheets("Hilfstabellen")    ' Ausgabeblatt
lngE = 3                                  ' 1. Ausgabezeile
With Worksheets("YTD_per_Month")          ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(lngQ, 2) = "EUR/CHF" Then
wksE.Cells(lngE, 1) = .Cells(lngQ, 3)
wksE.Cells(lngE, 2) = .Cells(lngQ, 4)
wksE.Cells(lngE, 3) = .Cells(lngQ, 6)
wksE.Cells(lngE, 4) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
End With
lngE = 3                                    ' 1. Ausgabezeile
With Worksheets("YTD_per_Month")            ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(lngQ, 2) = "EUR/GBP" Then
wksE.Cells(lngE, 6) = .Cells(lngQ, 3)
wksE.Cells(lngE, 7) = .Cells(lngQ, 4)
wksE.Cells(lngE, 8) = .Cells(lngQ, 6)
wksE.Cells(lngE, 9) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
End With
lngE = 3                                    ' 1. Ausgabezeile
With Worksheets("YTD_per_Month")            ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(lngQ, 2) = "EUR/JPY" Then
wksE.Cells(lngE, 11) = .Cells(lngQ, 3)
wksE.Cells(lngE, 12) = .Cells(lngQ, 4)
wksE.Cells(lngE, 13) = .Cells(lngQ, 6)
wksE.Cells(lngE, 14) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
End With
End Sub

Anzeige
für etliche Währungen
17.05.2010 12:26:25
Erich
Hi Martin,
probier mal (ungetestet):

Option Explicit
Sub Uebertrage2()
Dim arrT, wksE As Worksheet, lngT As Long, lngQ As Long, lngE As Long
arrT = Split("EUR/CHF EUR/GBP EUR/JPY")
Set wksE = Worksheets("Hilfstabellen")    ' Ausgabeblatt
With Worksheets("YTD_per_Month")          ' Quellblatt
For lngT = 0 To UBound(arrT)
lngE = 3                                  ' 1. Ausgabezeile
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
If .Cells(lngQ, 2) = arrT(lngT) Then
wksE.Cells(lngE, 1 + 5 * lngT) = .Cells(lngQ, 3)
wksE.Cells(lngE, 2 + 5 * lngT) = .Cells(lngQ, 4)
wksE.Cells(lngE, 3 + 5 * lngT) = .Cells(lngQ, 6)
wksE.Cells(lngE, 4 + 5 * lngT) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
Next lngT
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
das gibt aber Lücken
17.05.2010 12:48:01
Rudi
Hallo,
in der Hilfstabelle, da lngE jedesmal hochgezählt wird.
Gruß
Rudi
Alternative
17.05.2010 12:42:36
Rudi
Hallo,
Sub Uebertrage()
Dim wksE As Worksheet, lngQ As Long, lngE As Long
Dim iStart As Integer
Set wksE = Worksheets("Hilfstabellen")    ' Ausgabeblatt
'lngE = 3                                  ' 1. Ausgabezeile
With Worksheets("YTD_per_Month")          ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
Select Case .Cells(lngQ, 2)
Case "EUR/CHF": iStart = 1
Case "EUR/GBP": iStart = 6
Case "EUR/JPY": iStart = 11
Case Else: iStart = 0
End Select
If iStart  0 Then
lngE = Max(wksE.Cells(Rows.Count, iStart).End(xlUp).Offset(1).Row, 3)
wksE.Cells(lngE, iStart) = .Cells(lngQ, 3)
wksE.Cells(lngE, iStart + 1) = .Cells(lngQ, 4)
wksE.Cells(lngE, iStart + 2) = .Cells(lngQ, 6)
wksE.Cells(lngE, iStart + 3) = .Cells(lngQ, 8)
lngE = lngE + 1
End If
Next lngQ
End With
End Sub

Gruß
Rudi
Anzeige
getestet?
17.05.2010 13:08:36
Erich
Hi Rudi,
deinen Code hast du wohl nicht getestet. Beim ersten Treffer ist lngE = 0, du willst dann in Zeile 0 schreiben.
Die Ausgabe sollte in Zeile 3 beginnen.
Deinen Einwand mit den Lücken verstehe ich nicht. :-(
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: getestet?
17.05.2010 14:02:47
Rudi
Hallo,
natürlich nicht getestet.
lngE ist beim ersten Treffe aber nicht 0, sondern mindestens 3.
lngE = Max(wksE.Cells(Rows.Count, iStart).End(xlUp).Offset(1).Row, 3)
Der einzige Fehler ist, dass ich Application. vergessen habe.
lngE = Application.Max(wksE.Cells(Rows.Count, iStart).End(xlUp).Offset(1).Row, 3)
Zu den Lücken:
Passiert natürlich nicht. Ich habe übersehen, dass du für jede Währung die komplette Tabelle durchgehst.
Erst genau lesen, dann meckern;-)
In meinem Code wird die Tabelle nur 1x abgearbeitet.
Die Idee mit dem Array ist aber gut!
Vereinigung unserer beiden Codes:
Sub Uebertrage()
Dim wksE As Worksheet, lngQ As Long, lngE As Long
Dim iStart, arrT
arrT = Split("EUR/CHF EUR/GBP EUR/JPY")
Set wksE = Worksheets("Hilfstabellen")    ' Ausgabeblatt
'lngE = 3                                  ' 1. Ausgabezeile
With Worksheets("YTD_per_Month")          ' Quellblatt
For lngQ = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
iStart = Application.Match(.Cells(lngQ, 2), arrT, 0)
If Not IsError(iStart) Then
iStart = iStart - 1
lngE = Application.Max(wksE.Cells(Rows.Count, 1 + 5 * iStart) _
.End(xlUp).Offset(1).Row, 3)
wksE.Cells(lngE, 1 + 5 * iStart) = .Cells(lngQ, 3)
wksE.Cells(lngE, 2 + 5 * iStart) = .Cells(lngQ, 4)
wksE.Cells(lngE, 3 + 5 * iStart) = .Cells(lngQ, 6)
wksE.Cells(lngE, 4 + 5 * iStart) = .Cells(lngQ, 8)
End If
Next lngQ
End With
End Sub

Gruß
Rudi
Anzeige
noch mehr Arrays
17.05.2010 16:06:27
Erich
Hi,
sorry für mein Gemecker wg. lngE=0 - erst lesen, dann meckern (oder dann vielleicht besser nicht...)
Hier wird die Quelltabelle nicht mehr mehrfach durch- sondern einfach in ein Array eingelesen.
Lücken gibts auch nicht - auch lngE ist ein Array geworden:

Sub Uebertrage3()
Dim arrT, arrQ, lngE() As Long, lngQ As Long, lngT As Long
arrT = Split("EUR/CHF EUR/GBP EUR/JPY")   ' Währungen
With Worksheets("YTD_per_Month")          ' Quellblatt
arrQ = .Cells(1, 1).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row, 8)
End With
ReDim lngE(UBound(arrT))
With Worksheets("Hilfstabellen")          ' Ausgabeblatt
For lngQ = 1 To UBound(arrQ)
For lngT = 0 To UBound(arrT)
If arrQ(lngQ, 2) = arrT(lngT) Then
.Cells(3 + lngE(lngT), 1 + 5 * lngT) = arrQ(lngQ, 2)
.Cells(3 + lngE(lngT), 2 + 5 * lngT) = arrQ(lngQ, 4)
.Cells(3 + lngE(lngT), 3 + 5 * lngT) = arrQ(lngQ, 6)
.Cells(3 + lngE(lngT), 4 + 5 * lngT) = arrQ(lngQ, 8)
lngE(lngT) = lngE(lngT) + 1
End If
Next lngT
Next lngQ
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: noch mehr Arrays
17.05.2010 17:39:08
Martin
Hallo Erich,
das Diagramm zeigt immer noch die leeren Zellen mit an? Die Datenquelle muss ich schon bis zum letzten Monat, dh 12 Zeilen runter ziehen oder? Oder muss ich bei den Diagrammeinstellungen was anpassen? Hab da nichts passendes gefunden... danke für deine Hilfe!
Grüße Martin
welches Diagramm?
17.05.2010 18:19:09
Erich
Hi Martin,
"das Diagramm zeigt ..."? Sorry, aber bisher kam hier kein Diagramm vor, oder irre ich mich da?
Eine kleine Beispielmappe wäre ziemlich hilfreich.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
die Krönung wäre ...
17.05.2010 17:46:50
Rudi
Hallo,
alles erst noch in ein Ausgabearray zu schreiben und das dann in die Tabelle.
Hab ich jetzt aber keine Zeit zu.
Gruß
Rudi
Anzeige
die Krönung ist ...
17.05.2010 18:21:31
Erich
Hi Rudi,
meinst du so?

Sub Uebertrage4()
Dim arrT, arrQ, lngE() As Long, lngQ As Long, lngT As Long, arrE(), lngM As Long
arrT = Split("EUR/CHF EUR/GBP EUR/JPY")   ' Währungen
With Worksheets("YTD_per_Month")          ' Quellblatt
arrQ = .Cells(1, 1).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row, 8)
End With
ReDim lngE(UBound(arrT))
ReDim arrE(1 To 4 + 5 * UBound(arrT), 1 To UBound(arrQ))
For lngQ = 1 To UBound(arrQ)
For lngT = 0 To UBound(arrT)
If arrQ(lngQ, 2) = arrT(lngT) Then
arrE(1 + 5 * lngT, 1 + lngE(lngT)) = arrQ(lngQ, 2)
arrE(2 + 5 * lngT, 1 + lngE(lngT)) = arrQ(lngQ, 4)
arrE(3 + 5 * lngT, 1 + lngE(lngT)) = arrQ(lngQ, 6)
arrE(4 + 5 * lngT, 1 + lngE(lngT)) = arrQ(lngQ, 8)
lngE(lngT) = lngE(lngT) + 1
End If
Next lngT
Next lngQ
lngM = Application.Max(lngE)
ReDim Preserve arrE(1 To 4 + 5 * UBound(arrT), 1 To lngM)
With Worksheets("Hilfstabellen")          ' Ausgabeblatt
.Cells(3, 1).Resize(UBound(arrE, 2), UBound(arrE)) = Application.Transpose(arrE)
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: die Krönung ist ...
18.05.2010 09:05:25
Martin
Guten Morgen,
leider zeigt das Diagramm auch mit Sub Übertragen4 immer noch die leeren Zeilen an. Eine Datei kann ich leider nicht hochladen da diese interne Daten sind... Muss ich denn den Datenbereich schon über alle 12 Zeilen bei jeder Währung machen oder?
Viele Grüße
Martin
IMHO Beispielmappe nötig
18.05.2010 09:37:02
Erich
Hi Martin,
dass du deine Originaldatei nicht hochladen kannst/darfst, ist klar. Das verstehe ich.
Dass du nicht eine Beispielmappe hochladen kannst verstehe ich dagegen nicht.
Interne Daten kannst du doch durch Spieldaten ersetzen oder - wenn es viele sind - die meisten Daten löschen.
Vielleicht ist dir das zu aufwändig?
Ich sehe für mich keine Möglichkeit, ohne Beispielmappe, wenigstens eine sehr genaue Beschreibung,
dich zu unterstützen. Ich setze den Thread auf "offen".
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: IMHO Beispielmappe nötig
18.05.2010 09:47:12
Martin
Ich habe jetzt mal eine "abgespeckte" Version hochgeladen: https://www.herber.de/bbs/user/69625.xls
Die Grafiken sind im Register YTD_per_Month und beziehen sich auf die Hilfstabellen
Dynamische Bereiche mit Namen
18.05.2010 17:30:15
Erich
Hi Martin,
mit dem Makro hat die Darstellung im Diagramm gar nichts mehr zu tun. Das lässt sich einfach erreichen.
In der Mappe konnte ich jetzt sehen, was die Diagramme mit den Daten zu tun haben,
wie du bisher die Datenquelle bestimmt hast.
Hier mal am Beispiel für das erste Währungspaar:
Definiere einen Namen EUR_CHF
=BEREICH.VERSCHIEBEN(Hilfstabellen!$B$2;0;0;ANZAHL2(Hilfstabellen!$B$2:$B$1000);3)
Als Datenquelle des Diagramms gibst zu dann an
statt
=Hilfstabellen!$B$2:$D$14
jetzt
=EUR_CHF
Das könntest du dir mal ansehen:
"Dynamische Bereiche in Namen" in http://www.online-excel.de/excel/singsel.php?f=62
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige