Hallo Zusammen,
ich habe mal wieder ein Thema das etwas kniffliger ist und ich bin auch nicht sicher ob es machbar ist. Ich würde es gerne per VBA lösen.
Ich habe eine Tabelle Gesamt_mit_Forecast in dieser Tabelle stehen in Spalte A ID und ich möchte nun das eine Zeile unter die ID eingefügt wird, wenn die ID auch in der Liste Master_VNB vorhanden ist. und es soll der entsprechende Euro wert in den korrekten Monat eingetragen werden. ich habe diese jetzt mal Händisch mit ROT eingefügt, so hätte ich es eben gerne per VBA, vielleicht hat Jemand etwas ähnliches bereits gemacht und kann mir Anregungen geben?
Vielen Dank
https://www.ms-office-forum.net/forum/sh...ost2063341
nachgeholt :-) Danke für den Hinweis in der Regel stelle ich nur in einem Forum ein, da es aber dringend ist :-)
Hallo,
da ich glaube, die Beiträge im anderen Office-Forum helfen Dir so richtig nicht weiter, hier ein Versuch, ob ich Deine Bitte richtig verstanden habe.
Die Konstanten am Anfang musst Du bei Änderung der Datenstruktur (die in der Tat überarbeitungswürdig ist, vermutlich aber nicht von Dir zu vertreten ist
), ggfls. anpassen.
Code:
Sub Ergaenzung()
Const QuellIDSpalte = 32 'Spalte STID in Quelle
Const FirstDat = 123 'erste Spalte mit Datum in Quelle
Dim Quelle As Object, Ziel As Object, erg As Variant
Dim QZeile As Long, QSpalte As Long, STID As String, ZZeile As Long, MyDiff As Long
Set Quelle = ThisWorkbook.Sheets("Master_VNB")
Set Ziel = ThisWorkbook.Sheets("Gesamt_mit_Forecast")
With Quelle
MyDiff = DateDiff("m", Ziel.Cells(1, 3), .Cells(1, FirstDat))
For QZeile = 2 To .Cells(Rows.Count, QuellIDSpalte).End(xlUp).Row
STID = .Cells(QZeile, QuellIDSpalte)
Set erg = Ziel.Range("A:A").Find(what:=STID, lookat:=xlWhole)
If Not (erg Is Nothing) Then 'ID auch in Ziel
ZZeile = erg.Row + 1
If Ziel.Cells(ZZeile, 1) <> STID Then 'ggfls. Zeile einfügen
Ziel.Rows(ZZeile).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Ziel.Cells(ZZeile, 1) = STID
End If
QSpalte = FirstDat
Do
If Val(.Cells(QZeile, QSpalte)) > 0 Then 'wert vorhanden
Ziel.Cells(ZZeile, QSpalte - FirstDat + 3 + MyDiff) = Quelle.Cells(QZeile, QSpalte)
End If
QSpalte = QSpalte + 1
Loop Until IsEmpty(.Cells(1, QSpalte))
End If
Next QZeile
End With
End Sub
Tausend Dank, in der Test Datei macht er schon einmal genau das was ich suche, was ich vergessen habe, es kann sein das die ID in der Liste Master_VNB auch mal leer sein kann, kann man diese einfach überspringen und mit der nächsten weiter machen? und vielleicht noch wichtig, das in der Quelldatei keine Werte sondern Formeln stehen, kann dies Probleme machen?
Hallo,
die lere ID wird durch Ersatz der einen Zeile im Code abgefangen
If Not (erg Is Nothing) And STID <> "" Then 'ID auch in Ziel und nicht leer
Das andere (Formel) macht keine Probleme.
Gruß der ALteDresdner
ok, kann es daran liegen das die ID´s in der Quelle Liste mehrfach vorkommen können?
Hallo,
dort werden dann die Werte>0 des letzten EIntrags hingeschrieben. Leere Spalten werden übergangen.
Mit anderen Worten: Es werden nacheinander die EInträge abgearbeitet. Ist in einem späteren EIntrag ein Wert >0 vorhandn, überschreibt er einen evtl. früher dort schon hingeschriebenen Wert. Wenn es da eine andere Mimik geben soll, müsstest Du sagen wie.
Oh es wäre toll wenn jede Spalte mit ID und wert eingefügt wird, aber ich weiß nicht ob das machbar ist? wenn also eine ID 3 mal vorkommt, sollen 3 Spalten mit den entsprechenden Werten eingetragen werden, wenn nur einmal dann nur eine... :-D