78 Aufrufe
Gefragt in Tabellenkalkulation von
Bearbeitet

Hallo,

ich habe hier eine Excel, wo man beim Inputdata-Modul Daten einer SAP Liste direkt als neues Blatt einfügt.

Ich habe jedoch dieses Blatt entfernt, da das einwandfrei funktioniert.

Im Preparation-Modul ist dann ein Makro vorhanden, wodurch die Zelle J16 vom neuen Blatt in die nächste freistehende Zelle von dem Blatt ,,Summary" in die erste Tabelle ,,Gesamt" eingefügt werden soll, also Spalte M.

Dieses Makro funktioniert auch einwandfrei.

Jetzt will ich jedoch, dass z.B. die Zelle D16 vom neuen Blatt in die nächste freistehende Zelle vom Blatt ,,Summary" in die zweite Tabelle "1" kommt, auch Spalte M.

Oder Zelle E16 in die letzte freistehende Zelle von Tabelle "2".

Wenn ich das Modul richtig verstanden habe, bedeutet: For i = 1 To 15, dass nur Zeile 1-15 in Frage kommen kann.If .Cells(i, 13) = "" Then bedeutet doch, dass wenn eine Zeile von 1-15 (i) leer ist, dann soll er laut diesem Abschnitt .Cells(i, 13) = ThisWorkbook.Sheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date)).Range("J16").Value, J16 einfügen

Die 13 steht ja für Spalte M.

Nach dieser Annahme habe ich einfach i neu eingegrenzt als 16 to 30 und die Quelle geändert auf D16

Also: 

    For i = 16 To 30
    If .Cells(i, 13) = "" Then
        .Cells(i, 13) = ThisWorkbook.Sheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date)).Range("D16").Value
        Exit For
    End If
    Next i

Also ich würde gerne das erste Makro 6 mal kopieren, wo ich nur den Bereich zum überprüfen und die Quellen ändern will... Jedoch scheitert es schon nur beim Bereich angeben.

Wenn ich nur die Quelle ändere, funktioniert es.

4 Antworten

0 Punkte
0 Punkte
Beantwortet von m-o Profi (18.9k Punkte)
Bearbeitet von m-o

Hallo,

deine Beschreibung ist etwas konfus, ohne die Beispieltabelle hätte ich nicht gewusst, was du willst.

Du musst die richtigen Bereiche ansprechen. Wenn du die Daten bei der "2. Tabelle" - die aber nur ein bestimmter Bereich auf dem Tabellenblatt "Summary" ist - die Zeilen ab 16 in Spalte M prüfen lässt, ist die erste leere Zelle M16, die jedoch teil einer verbundenen Zelle ist (lass dir einfach mal die gefundene Zeile mit dem Befehl Msgbox i anzeigen).

Daher sprich besser die nur die Zeilen an, in die die Daten auch tatsächlich eingetragen werden. Also z.B.

For i = 2 To 13
      If .Cells(i, 13) = "" Then
         .Cells(i, 13) = ThisWorkbook.Sheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date)).Range("J16").Value
        Exit For
      End If
    Next i
    
    For i = 18 To 29
      If .Cells(i, 13) = "" Then
        .Cells(i, 13) = ThisWorkbook.Sheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date)).Range("D16").Value
        Exit For
      End If
    Next i

Wenn ich das richtig sehe, sollen die Daten immer dem jeweiligen Monat zugeordnet werden. Hier mal eine Alternative zur Schleife, bei der die Zahlen ggf. falschen Monaten zugeordnet werden, wenn eine Zeile leer bleibt:

Sub prep()

Dim begin As Date
Dim ende As Date
Dim amount As Double
Dim intMonat
Dim wksQuelle As Worksheet

'Monat ermitteln
intMonat = DatePart("m", due_date)

'Name des Quellarbeitsblattes festlegen
Set wksQuelle = ThisWorkbook.Worksheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date))

With ThisWorkbook.Sheets("Summary")
    .Range("M1") = DatePart("YYYY", Date)
    .Range("N1") = DatePart("YYYY", Date) - 1
    
        'add liquidity composition of the current month
    .Range("Q2") = wksQuelle.Range("C19").Value
    .Range("Q3") = wksQuelle.Range("C23").Value
    .Range("Q4") = wksQuelle.Range("C20").Value
    .Range("Q5") = wksQuelle.Range("C21").Value
    
    'Daten in Abhängigkeit vom Monat in die richtige Zeile übertragen
    'Übertrag in entsprechenden Monat im Bereich der Zeilen 2 bis 13
    .Cells(1 + intMonat, 13) = wksQuelle.Range("J16").Value
    'Übertrag in entsprechenden Monat im Bereich der Zeilen 18 bis 29
    .Cells(17 + intMonat, 13) = wksQuelle.Range("D16").Value
    'Übertrag in entsprechenden Monat im Bereich der Zeilen 34 bis 45
    .Cells(33 + intMonat, 13) = wksQuelle.Range("E16").Value
    
End With

End Sub


Gruß

M.O.

0 Punkte
Beantwortet von
Hey vielen Dank, ich habe erstmal die erste Variante genommen und es funktioniert! Blöder Fehler meinerseits mit den verbundenen Zellen...

Der zweite funktioniert auch, jedoch verstehe den nicht so ganz.
0 Punkte
Beantwortet von m-o Profi (18.9k Punkte)

Hallo,

freut, dass alles so funktioniert wie du willst.

Hier noch eine kurze Erkärung zum 2. Code:

'Monat ermitteln
intMonat = DatePart("m", due_date)

Hier wird die Zahl des Monats - also 1 für Januar, 2 für Februar etc. - ermittelt.

Hier wird das Arbeitsblatt, aus dem die Daten kopiert werden sollen, einer Variable vom Typ Worksheet zugewiesen:

'Name des Quellarbeitsblattes festlegen
Set wksQuelle = ThisWorkbook.Worksheets(DatePart("m", due_date) & "." & DatePart("YYYY", due_date))

Das dient nur der Vereinfachung, so dass man nicht immer ThisWorkbook.. schreiben muss.

Im ersten Bereich sollen die Zahlen für Januar in Zeile 2, für Februar in Zeile 3 etc. eingetragen werden.

Also wird die Einfügezeilge mit 1 + der Zahl des Monats ermittelt, was für Januar 2, für Februar 3 etc. ergibt:

 .Cells(1 + intMonat, 13) = wksQuelle.Range("J16").Value

Für die anderen Bereiche gilt das entsprechend.

Gruß

M.O.

...