Schleife für Ausgabe einer bestimmten Zelle

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Schleife für Ausgabe einer bestimmten Zelle

    Hallo liebe Forenmitglieder,

    ich habe noch nicht so viel Erfahrung mit VBA und ein kleines Datenproblem.
    Ich habe (ab Spalte B) 900 Spalten und ca. 900 Zeilen. Jede Spalte repräsentiert eine Zeitreihe von Werten, wobei Spalte A Datumsangaben enthält. Das Problem ist nun, dass die Zeitreihen teilweise nicht immer Werte enthalten und es sehr viele Zellen mit "#N/A N/A" gibt.

    Das Makro soll nun so lange durch jede Zelle der jeweiligen Spalte gehen bis ein Zahlenwert erreicht ist und mir das dazugehörige Datum in die erste Zeile der jeweiligen Spalte schreiben.

    Aufgebaut ist die Tabelle so:

    Datum // 1. Wert // 2. Wert//.....usw. (bis Spalte 900)

    01.01.2007 //#N/A N/A// #N/A N/A//
    02.01.2007// #N/A N/A// 99,87
    . . .
    . . .
    . . .
    . . .
    (usw)

    Wobei die Tabelle in Zeile 2 beginnt. Er soll nun jetzt durch die Spalte " Wert1" gehen, bis ein Zahlenwert auftaucht und mir das dazugehörige Datum (aus Spalte A) in die 1. Zeile (also über "1.Wert") schreiben.Anschließend dann in die 2. Spalte springen. Bei der 2. Spalte müsste (im obigen Fall) also über der Überschrift "2.Wert" korrekterweise 02.01.2007 stehen.

    Hoffe das ist soweit verständlich. Ich habe es schon mit einer Do-While Schleife probiert, bekomme es aber nicht ganz hin.

    Vielen Dank schon mal.

    Hier noch mein Code, an dem ich mich versucht habe.


    Sub Filtern()

    Dim Bond_Bid As Worksheet
    Dim Bond_BidF As Worksheet

    Dim DateiName As String

    DateiName = Application.ThisWorkbook.Name

    Set Bond_Bid = Workbooks(DateiName).Worksheets("Bond_Bid")
    Set Bond_BidF = Workbooks(DateiName).Worksheets("Bond_BidF")

    Application.Calculation = xlCalculationManual


    i = 5

    j = 3
    Do While Bond_Bid.Cells(i, j) <> "#N/A N/A"
    i = i + 1
    j = j + 1
    Loop


    Bond_Bid.Cells(3, 3) = Bond_Bid.Cells(i, j - 1)
    Application.Calculation = xlCalculationAutomatic



    End Sub

    Mir ist klar, dass er hier nur in der ersten Spalte sucht. Das Makro soll jedoch über alle Spalten hinweg gehen.
    Zudem: Wie kann ich ihm in folgender Zeile sagen, dass er die Schleife bis zum ersten Zahlenwert laufen lässt?:

    Do While Bond_Bid.Cells(i, j) <> "#N/A N/A" -> Er zeigt mir hier einen Fehler an.


    Gruß, Soilworker

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Soilworker“ ()

    Danke erstmal.

    Er gibt mir jedoch einen Laufzeitfehler an: Typenkonflikt.
    Hier der Code inkl. Übertragen des Datums in die 2.Zeile


    For i = 5 To 900 'rows
    For j = 3 To Columns.Count 'columns
    If Bond_Bid.Cells(i, j).Value <> "#N/A N/A" Then
    Bond_Bid.Cells(3, j) = Bond_Bid.Cells(i, j - 1)
    Exit For 'innere Schleife abbrechen -> Nächste Zeile
    End If
    Next
    Next

    Laufzeitfehler 13 bei der Zeile: If Bond_Bid.Cells(i, j).Value <> "#N/A N/A" Then. was kann das sein?
    Laufzeitfehler 13 ist Typenunverträglichkeit.
    Ich nehme mal an, Bond_Bid ist ein gültiges Worksheet-Objekt. Das ist natürlich Voraussetzung.

    Möglicherweise ist die Zelle komisch formatiert (z.B als "Währung").
    Geh mal mit dem Debugger an die Stelle und schau dir Bond_Bid.Cells(i, j) an, ob .Value überhaupt existiert und was drin steht.

    Ansonsten kannst du ggf. gegen Bond_Bid.Cells(i, j - 1).Text prüfen.
    Das ist aber der Text, den du tatsächlich siehst.
    Wenn die Zelle zu schmal formatiert ist, um den Wert anzuzeigen kommt hier Schrott raus.
    Bei Währungen kannst du gegen .Value2 prüfen

    Wenn deine Zellen tatsächlich völlig unterschiedlich formatiert sind, dann musst du gegen Bond_Bid.Cells(i, j - 1), also gegen das Range-Objekt an sich prüfen, dann sucht sich Excel einen passenden Wert raus.
    Ist nicht ganz sauber, aber unter Umständen die gefahrlose Möglichkeit.

    Visual Basic-Quellcode

    1. If CStr(Bond_Bid.Cells(i, j)) <> "#N/A N/A" Then
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --