Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1092to1096
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
Inhaltsverzeichnis

Excel Makro

Excel Makro
motul24
Hallo Zusammen,
leider bin ich auf dem Gebiet des VBA noch ein ziemlicher Neuling.
Habe folgendes Problem:
Ein Makro das ich geschrieben habe kopiert Daten aus einer Quelldatei in ein anderes Excel Dokument. Leider wird mir die Quelldatei täglich von der IT in folgender Form bereitgestelt: z.B. Quelldatei_2009_08_06. Somit habe ich das Problem, dass ich jeden Tag mein Makro anpassen muss, da am Folgetag die Quelldatei einen anderen Namen hat.
Frage: Gibt es eine Art Platzhalter für die Zeichenfolge _2009_08_06, so dass ich in mein Makro nicht täglich anpassen muss?
Danke und Grüße
AW: Format(Date, "YYYY_MM_DD")
07.08.2009 15:42:06
Daniel
Hi
du könntest folgens verwenden:
Dateiname = "Quelldatei_ " & Format(Date, "YYYY_MM_DD") & ".xls"
Gruß, Daniel
Datumsabhängiger Dateiname - Bitte Code posten
07.08.2009 15:44:51
NoNet
Hallo Motul,
ja, das ist lösbar. Allerdings befürchte ich, dass Du (bzgl. Deines VBA-Levels) das selbst mit Anleitung nicht hinbekommen wirst - zumal der Code per Rekorder aufgezeichnet wurde !
Sinnvoller ist es, wenn Du hier den Code posten könntest oder sogar die Mappe hochladen würdest und den Link (URL) hier postest.
Gruß, NoNet
AW: Datumsabhängiger Dateiname - Bitte Code posten
07.08.2009 19:21:44
Motul24
Hallo NoNet,
hier kommt der Code:
Sub WLQ()
Application.ScreenUpdating = False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("B9:B14,b16:b20,c9:c14,c16:c20,d9:d14,d16:d20,e9:e14,e16:e20,f9:f14,f16:f20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("B35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("k9:k11,k15:k20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("h35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("l9:l13,l15:l20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("i35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("n9:n13,n15:n20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("g35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("k22:k26,k28:k31").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("j35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("l22:l26,l28:l31").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("k35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Danke und Grüße
Anzeige
Rückfrage
07.08.2009 19:12:40
Erich
Hallo Vorname, ( zu Vornamen und Nicknames schau bitte mal in die Forums-FAQ )
wie soll das mit den Platzhaltern funktionieren?
Ich gehe mal davon aus, dass die IT die Datei immer im selben Verzeichnis bereitstellt.
In diesem Verzeichnis können keine, eine oder mehrere Dateien stehen,
die auf dein Dateinamens-Muster passen.
(Beispielsweise kann es sein, dass du an einem Tag eine Datei nicht verarbeiten konntest.
Dann ist sie am nächsten Tag noch da, und es kommt die neue Tagesdatei dazu.)
Also:
Was soll geschehen, wenn in dem Verzeichnis mehrere Dateien mit dem Namensmuster gefunden werden?
Nebenbei: Dass eure IT das Datum in den Dateinamen aufnimmt, finde ich einfach nur ordentlich und sinnvoll!
So wird das Überschreiben der Vortagesdatei(en) vermieden. Warum schreibst du dazu "Leider"?
Neben der fachlichen Frage fände ich es natürlich auch nützlich, wenn du deinen Code hier zeigtest.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Rückfrage
07.08.2009 19:43:40
Matthias
Hallo Erich,
danke für den Hinweis.
Bin neu hier und wusste nicht, dass man keine Nicknames verwenden sollte.
Hier der gewünschte Code
Sub WLQ()
Application.ScreenUpdating = False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("B9:B14,b16:b20,c9:c14,c16:c20,d9:d14,d16:d20,e9:e14,e16:e20,f9:f14,f16:f20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("B35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("k9:k11,k15:k20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("h35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("l9:l13,l15:l20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("i35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("n9:n13,n15:n20").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("g35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("k22:k26,k28:k31").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("j35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("Pegy_adhoc_600_2009_08_07.xls").Activate
Range("l22:l26,l28:l31").Select
Selection.Copy
Windows("adhoc-Reporting SWS.xls").Activate
Range("k35").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Danke und Grüße
Matthias
Anzeige
Rückfrage noch mal
07.08.2009 20:00:53
Erich
Hi Mathias,
zunächst: Deinen Usernamen motul24 kannst du ruhig beibehalten. Er ist ziemlich eindeutig,
im Gegensatz zu Matthias - davon gibt es hier viele.
(Das mit Nickname und Vorname bezieht sich auf die Nennung des Namens innerhalb des Beitrags.
Ich heiße Erich, habe wegen besserer Findbarkeit des Usernamen "Erich G.")
Deinen Code hättest du nicht noch einmal posten müssen - ich kann deine Antwort an NoNet ja auch lesen.
Wichtiger fände ich eine Antwort auf die fachliche Frage:
a)
Was soll geschehen, wenn in dem Verzeichnis mehrere Dateien mit dem Namensmuster gefunden werden?
Und gleich noch zwei Fragen:
b)
Wird die Quellmappe per Hand geöffnet?
c)
Können danach auch andere Mappen geöffnet sein, deren Name dem Namensmuster entspricht?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Rückfrage noch mal
07.08.2009 20:22:19
Matthias
Hallo Erich,
a) wird, so wie ich das Makro momentan nutze, nicht geschehen, da ich beide Exceldateien, sprich die Zieldatei und die Quellsdatei öffne (bzw. öffnen muss? oder gibt es auch ander Möglichkeit?)
b) ja wird sie
c) ja dies ist möglich
Mein Problem besteht einfach nur darin das ich, nach momentanem Stand, jeden Tag das Makro öffnen und das Datum der Quelldatei bei Windows("Pegy_adhoc_600_2009_08_07.xls").Activate ändern muss (mache ich über Bearbeiten, Ersetzen). Suche deshalb nach einer Lösung jeden Tag die Quell- und Ziedatei öffnen zu können und ohne vorher im Makro das Datum anpassen zu müssen dieses ausführen zu können.
Hoffe du kannst mit den Antworten was anfangen.
Grüße
Matthias
Anzeige
AW: Rückfrage noch mal
07.08.2009 21:05:37
Daniel
Hallo Matthias.
zunächsteinmal solltest du dein Makro so vereinfachen, daß die ganzen Selects rausfallen.
die sind unnötig und werden nur vom Recorder aufgezeichnet. im Prinzip sieht dann ein Kopiervorgang als Makro-Code so aus:
Workbooks("Mappe1.xls").Sheets("Tabelle1").Range("A1:B100").Copy
Workbooks("Mappe2.xls").Sheets("Tabelle1").Range("C4").Pastespecial xlpastevalues
der 2. Vereinfachungsschritt sieht dann so aus, dass ich für die jeweiligen Mappen und Tabellenblätter Variablen definiern kann, die 1x zuweise und dann im Code immer wieder verwende. Das sieht dann so aus.
Sub Kopieren()
Dim shZiel as Worksheet 'das ist die Variable für das Zielblatt
Dim shQuelle as Worksheet 'das ist die Variable für die Quelle
Set shZiel = Workbooks("Mappe2.xls").Sheets("Tabelle1")
Set shQuelle = Workbooks("Mappe1.xls").Sheets("Tabelle1")
shQuelle.Range("A1:B100").Copy
shZiel.Range("A4").Pastespecial xlpastevalues
shQuelle.Range("x1:y100").Copy
shZiel.Range("C4").Pastespecial xlpastevalues
shQuelle.Range("M1:N100").Copy
shZiel.Range("E4").Pastespecial xlpastevalues
Wenn sich jetzt eine Bezeichnung ändert, brauche ich sie nur am Anfang einmal zu ändern und das gilt dann für den ganzen Code.
die nächste Stufe der vereinfachung wäre jetzt folgende, da der Name immer dem aktuellen Datum entspricht, könnte man das so gestalten:
Set shQuelle = Workbooks("Pegy_adhoc_600_" & Format(Date, "YYYY_MM_DD") & ".xls").Sheets("Tabelle1")
Gruß, Daniel
ps.
- die Dateien müssen trotzdem immer geöffnet sein
- die korrekten Namen für Mappe und Tabelle musst du auch noch ergänzen (die Range-Bezeichnugen sowieso)
Anzeige
AW: Rückfrage noch mal
10.08.2009 09:33:16
Matthias
Hallo Daniel,
vielen Dank für deine hilfreichen Tips. Habe versucht die Änderungen wie oben beschrieben einzuplfegen. Leider funktioniert es noch nicht ganz. Hier mein aktueller Quelltext:
Sub WLQ()
Application.ScreenUpdating = False
Dim shZiel As Worksheet
Dim shQuelle As Worksheet
Set shZiel = Workbooks("adhoc-Reporting SWS.xls").Sheets("01.08.2009")
Set shQuelle = Workbooks("Pegy_adhoc_600_" & Format(Date, "YYYY_MM_DD") & ".xls").Sheets(" _
DatenGestern")
shQuelle.Range("b9:f20").Copy
shZiel.Range("b35").PasteSpecial xpastevalues
shQuelle.Range("k9:k11").Copy
shZiel.Range("h35").PasteSpecial xpastevalues
shQuelle.Range("k12:k16").Copy
shZiel.Range("h39").PasteSpecial xpastevalues
shQuelle.Range("k17:k18").Copy
shZiel.Range("h44").PasteSpecial xpastevalues
End Sub

Das Problem ist nun folgendes. Beim ausführen des Makros kommt die Fehlermeldung Index außerhalb des gültigen Bereiches. Der Fehler bezieht sich auf die Zeile:
Set shQuelle = Workbooks("Pegy_adhoc_600_" & Format(Date, "YYYY_MM_DD") & ".xls").Sheets("DatenGestern")
Ein weiteres Problem habe ich bzgl. dem Sheet der Quelldatei. Dieses hat ebenfalls täglich das entsprechende Datum als Sheetnamen. Form siehe oben. Gibt es dort eine ähnliche Lösung wie für die Quelldatei?
Danke und viele Grüße
Matthias
Anzeige
mal ein anderer Betreff;-))
10.08.2009 10:56:14
Erich
Hi Matthias,
ein paar Bemerkungen:
a)
Application.ScreenUpdating = False
würde ich immer erst dann einfügen bzw. aktivieren, wenn der Code getestet ist und läuft.
b)
Der Fehler "Index außerhalb des gültigen Bereichs" lässt zwei Möglichkeiten zu:
1. Die Mappe "Pegy_adhoc_600_" & Format(Date, "YYYY_MM_DD") & ".xls" ist nicht geöffnet.
2. Diese Mappe hat kein Blatt "DatenGestern"
Was davon trifft zu?
c)
Wenn es in der Quelldatei nur ein Blatt gibt, brauchst du (bzw. der Code) dessen Namen nicht.
Dann würde Worksheets(1) reichen. (Ist einfach das 1. Tabellenblatt der Mappe.)
d)
Hast du dir mal meinen Codevorschlag (vom 07.08.2009 20:17:27) angesehen?
Da steht "Worksheets(1)" auch schon drin...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: mal ein anderer Betreff;-))
10.08.2009 12:26:23
Matthias
Hallo Erich,
danke für den Hinweis. Das Problem mit Index ist somit gelöst. Hatte zum Testen eine alte Datei erwischt, bei der das Sheet noch einen anderen Namen hatte.
Brauche diesen Code, da die Quelldatei mehr als ein Tabellenblatt hat. Oder gibt es die Möglichkeit festzulegen, dass das Makro immer auf das gerade aktive zugreift?
Ein Problem besteht immer noch bzgl. der Zieldatei. Dort sind die Tabllenblätter immer mit dem Datum versehen (Format DD MM YYYY). Diese Datei enthält ebenfalls zahlreiche Tabellenblätter. Gibt es auch hierfür eine Lösung?
Besten Dank und viele Grüße
Matthias
Anzeige
AW: Blattname mit Datum
10.08.2009 13:22:44
Daniel
Hi
naja, die Funktion FORMAT und DATE kennst du jetzt ja. (zur Vertiefung auch mal in der Hilfe dazu nachlesen)
so wie du dir damit den Datei- bzw Workbooknamen zusammenbasteln kannst, kannst du auch bei Bedarf die Sheetnamen zusammenbauen.
Wenn dein Blatt jetzt z.B. den Namen hat "Daten 09-08-10" dann geht das so:
Sheets("Daten " & Format(Date, "YY-MM-DD"))
Date ist immer das aktuelle Datum und mit Format legst du fest, wie es ausgegeben wird.
dabei steht Y für Jahr, M für Monat und D für Tag (englisch halt).
die Anzahl der Wiederholungen steht dafür, wie Ausführtlich der Datumswert dargestellt wird:
M - 8
MM - 08
MMM - Aug
MMMM - August
Gruß, Daniel
AW: Blattname mit Datum
10.08.2009 15:30:51
Matthias
Hallo Daniel,
danke für deine schnelle Antwort.
Habe die Änderungen eingebaut. Dabie ist mir etwas aufgefallen. Mit der Funtkion Date funtkioniert das Makro nur, wenn die Quelldatei das aktuelle Tagesdatum im Namen trägt. Möchte ich aber zum Bsp. am Montag die Daten von letzter Woche Freitag übertagen funktioniert es hiermit nicht. Gibt es hier eine andere Möglichkeit, so dass das makro unabhängig vom Tagesdatum funtioniert?
Danke und Grüße
Matthias
Datum aus dem Dateinamen
10.08.2009 16:22:47
Erich
Hi Matthias,
hier wird jetzt das Datum, das im Quell-Dateinamen vorkommt, für die beiden Blattnamen verwendet.
Probier mal:

Sub WLQ3()
Dim wbk As Workbook, wksQ As Worksheet, strD As String   ' strD: Datum als Text
For Each wbk In Workbooks
If wbk.Name Like "Pegy_adhoc_600_20##_##_##.xls" Then
strD = Mid(wbk.Name, InStr(wbk.Name, "_20"), 10)
strD = Right(strD, 2) & "." & Mid(strD, 6, 2) & "." & Left(strD, 4)
Set wksQ = wbk.Worksheets(strD)                                   ' Quelle
Exit For
End If
Next wbk
If wksQ Is Nothing Then
MsgBox "Es ist keine Mappe mit dem Namen" & vbLf & vbLf & _
"Pegy_adhoc_600_20##_##_##.xls" & vbLf & vbLf & _
"geöffnet.", vbCritical, "WLQ2 - Abbruch"
Else
With Workbooks("adhoc-Reporting SWS.xls").Worksheets(strD)           ' Ziel
.Range("B35").Resize(Range("B9:F20").Rows, Range("B9:F20").Columns) _
= wksQ.Range("B9:F20").Value
.Range("H35").Resize(Range("K9:K11").Rows, 1) _
= wksQ.Range("K9:K11").Value
' usw. nacvh diesem Muster
End With
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Sorry - Korrektur
10.08.2009 17:23:43
Erich
Hi Matthias ,
in der Zeile
strD = Mid(wbk.Name, InStr(wbk.Name, "_20") , 10)
füge bitte " + 1" ein, so dass dann da steht:
strD = Mid(wbk.Name, InStr(wbk.Name, "_20") + 1, 10)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Blattname mit Datum
10.08.2009 17:05:41
Daniel
Hi
wenn du das Datum selbst eingeben willst, dann könnte das so funktioniern:
1. diesen Code irgendwo am Anfang ergänzen
Dim MeinDatum As Date
MeinDatum = CDate(InputBox("Datum?", "Titel", Format(Date, "dd.mm.yyyy")))

2. im folgenden alle "Date" durch "MeinDatum" ersetzen.
Gruß, Daniel
AW: Blattname mit Datum
10.08.2009 19:22:50
Matthias
Hallo Zusammen,
vielen Dank für eure tatkräftige Unterstützung. Dank eurer Tips bin ich dem gewünschte Ergebnis schon recht nahe. Denke nur das in einem Punkt ein Verständigungsproblem besteht.
Ich versuche es nochmals zu umschreiben.
1. Es existiert eine Quelldatei mit dem Namen Pegy_adhoc_600 + dem Datumszusatz (Form: YYYY_MM_DD). In dieser Datei gibt es ein Tabellenblatt das DatenGestern heist. Daraus ziehe ich meine Daten für die Zieldatei.
2. Die Zieldatei hat den Namen adhoc-Reporting SWS. In dieser Tabelle existiert für den Tag des Monates ein eigenes Tabellenblatt, das als Bezeichnung das Datum des Berichtages trägt z.B. 08.08.2009
3. Um das Makro nun jeden Tag, ohne manuelle Anpassungen, benutzen zu können suche ich nach einer Möglichkeit dem Makro zu sagen, das es egal was im Datei- oder Tabellennamen der Quell- und Zieldatei steht die Daten aus der offenen Quelldatei nimmt und in die ebenfalls geöffnete Zieldatei übertägt.
Sorry für die Umstände. Weis eure Hilfe sehr zu schätzen.
Wie ihr sicher merckt bin ich noch ein totaler Neuling auf diesem Gebiet. Könnt ihr mir vielleicht ein gutes Buch empfehlen, anhand dessen man VBA step by step von 0 auf lernt.
Danke und Grüße
Matthias
AW: Blattname mit Datum
10.08.2009 19:53:14
Erich
Hi Matthias,
1. sollte sich so erledigen lassen:
Ersetze im Makro WLQ3 in einer Zeile strD durch "DatenGestern", aus
Set wksQ = wbk.Worksheets(strD)
wird damit
Set wksQ = wbk.Worksheets("DatenGestern")
zu 2.: ok.
zu 3.:
"egal was im Datei- oder Tabellennamen der Quell- und Zieldatei steht" verstehe ich nicht.
Der Name der Quellmappe soll einem festen Muster mit einem Datum drin entsprechen.
Dadurch ist sie als Quellmappe erkennbar.
Der Name des Quell-Tabellenblatts soll nach 1. "DatenGestern" sein.
Die Namen der Blätter in der Zielmappe sind Datumse. Sollen die keine Bedeutung haben?
Der Text "Daten aus der offenen Quelldatei nimmt und in die ebenfalls geöffnete Zieldatei übertägt"
reicht nicht aus! Da fehlt, aus welchem und in welches Tabellenblatt übertragen werden soll.
So wie ich das bisher verstanden habe, sollen Daten aus Blatt 'DatenGestern' der Mappe
Pegy_adhoc_600_2009_08_15.xls in dier Zielmappe adhoc-Reporting SWS.xls, Blatt '15.08.2008'
übertragen werden - also in das Blatt mit dem selben Datum.
Ist dem nicht so?
Noch eine kleine Frage:
In welcher Mappe steht eigentlich der Code, um den es hier geht? In der Zielmappe?
Wenn ja, braucht der Name der Zielmappe im Code nicht vorzukommen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Blattname mit Datum
10.08.2009 21:07:38
Matthias
Hallo Erich,

"So wie ich das bisher verstanden habe, sollen Daten aus Blatt 'DatenGestern' der Mappe
Pegy_adhoc_600_2009_08_15.xls in dier Zielmappe adhoc-Reporting SWS.xls, Blatt '15.08.2008'
übertragen werden - also in das Blatt mit dem selben Datum."

Das ist so fast richtig. Nur eine kleiner Zusatz. Die Mappe Pegy_adhoc_600_2009_08_15 hat zwar das Datum vom 15. enthält aber Daten vom 14. Grund: es handelt sich um eine SQL-Abfrage, die um 1 Uhr nachts angestoßen wird. Es ist also so, dass z.B. Daten aus der Mappe Pegy_adhoc_600_2009_08_15 in die Mappe adhoc-Reporting SWS.xls, Blatt '14.08.2009' übertagen werden sollen.
"Der Text "Daten aus der offenen Quelldatei nimmt und in die ebenfalls geöffnete Zieldatei übertägt
reicht nicht aus! Da fehlt, aus welchem und in welches Tabellenblatt übertragen werden soll."

Die Daten sollen aus dem Tabellenblatt DatenGestern der Mappe Pegy_adhoc_600_2009_08_15 in das Tabllenblatt 14.08.2009 der Mappe adhoc-Reporting SWS.xls übertagen werden.
"egal was im Datei- oder Tabellennamen der Quell- und Zieldatei steht" verstehe ich nicht."
Damit meine ich, dass das Makro auch funktionieren soll, wenn die Quelldatein nicht Pegy_adhoc_ usw. heisen sondern zum Besipiel SQL XYZ und die Zieldatei nicht adhoc-Reporting usw. sondern Tagesreport SWS. Was ich meine ist, ob es eine Möglichkeit gibt dem Makro zu sagen es soll was auch immer in den Dateinamen oder Reitern steht die Zahlen von A nach B übertagen.
Sorry für die vielen Umstände. Danke und Grüße
Matthias
AW: Blattname mit Datum
11.08.2009 00:58:31
Erich
Hi Matthias,
nehmen wir an, du hast in Excel geöffnet:
- eine Mappe SQL.XYZ - mehrere Blätter mit beliebigen Namen
- eine Mappe Bericht.xls - pro Tag ein Blatt mit dem Tagesdatum
- eine Mappe Manna.xls - den Speiseplan der Betriebskantine, pro Tag ein Blatt mit dem Tagesdatum
"es soll was auch immer in den Dateinamen oder Reitern steht die Zahlen von A nach B übertragen."
Was ist A, was ist B?
Woran soll ein Makro erkennen, von wo nach wo Daten zu übertragen wären?
Es ist nicht so recht klar, wohin du willst.
Wenn Mappen- und Blattnamen "egal" sein sollen, kann man weder ein Datum
aus einem Quellmappennamen extrahieren noch Daten in ein Blatt schreiben,
dessen Name ein (un!)bestimmtes Datum ist.
Weiter oben schreibst du aber:
"Es ist also so, dass z.B. Daten aus der Mappe Pegy_adhoc_600_2009_08_15 in die
Mappe adhoc-Reporting SWS.xls, Blatt '14.08.2009' übertagen werden sollen."
Ja - wat den nu? ;-))
Das mit dem Vortag ist hier erledigt:

Option Explicit
Sub WLQ4()
Dim wbk As Workbook, wksQ As Worksheet, strD As String   ' strD: Datum als Text
For Each wbk In Workbooks
If wbk.Name Like "Pegy_adhoc_600_20##_##_##.xls" Then
strD = Mid(wbk.Name, InStr(wbk.Name, "_20") + 1, 10)
strD = Right(strD, 2) & "." & Mid(strD, 6, 2) & "." & Left(strD, 4)
strD = Format(CDate(strD) - 1, "DD.MM.YYYY")       ' Vortag
Set wksQ = wbk.Worksheets("DatenGestern")                         ' Quelle
Exit For
End If
Next wbk
If wksQ Is Nothing Then
MsgBox "Es ist keine Mappe mit dem Namen" & vbLf & vbLf & _
"Pegy_adhoc_600_20##_##_##.xls" & vbLf & vbLf & _
"geöffnet.", vbCritical, "WLQ4 - Abbruch"
Else
With Workbooks("adhoc-Reporting SWS.xls").Worksheets(strD)           ' Ziel
.Range("B35").Resize(Range("B9:F20").Rows, Range("B9:F20").Columns) _
= wksQ.Range("B9:F20").Value
.Range("H35").Resize(Range("K9:K11").Rows, 1) _
= wksQ.Range("K9:K11").Value
' usw. nach diesem Muster
End With
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Blattname mit Datum
13.08.2009 20:53:02
Matthias
Hallo Erich,
sorry für die späte Antowrt.
Als Zieldatei wollte ich schon immer die Datei adhoc-Reporting SWS.xls haben. Nur will ich mich nicht auf ein Tabellenblatt festlegen. Es soll praktisch egal sein, wie das Tabellenblatt in der Datei heist. Das makro soll die Zahlen dort in das gerade aktive Sheet kopieren.
Bai der Quelldatei ist es ein wenih anderst. Dort suche ich nach einer Lösung, bei der das Makro immer ins Tabellenbaltt DatenGestern geht. Unabhängig davon ob die Datei Pegy_adhoc_600_2009_03_25 oder _09_28 o.ä. heist. Möchte mich hier praktisch unabhängig vom Datum machen. Daher auch meine Frage in einer der ersten Beiträge ob es so etwas wie Platzhalter gibt. So dass es egal ist was hinter dem ..._600_ kommt.
Werde aber deinen Quelltext auf jeden Fall probieren, da dieser auf jeden Fall eine enorme Verbesserung sein wird.
Danke und Grüße
Matthias
Datum spielt keine Rolle
13.08.2009 21:15:57
Erich
Hi Matthias,
im Code unten werden die erste gefundene (offene) Mappe mit "Pegy_adhoc_600_....xls" als Quellmappe,
das Blatt "DatenGestern" als Quellblatt,
"adhoc-Reporting SWS.xls" als Zielmappe
und das darin derzeit aktive Blatt als Zielblatt verwendet.
Noch mal eine Frage: In welcher Mappe steht das Makro, um das es hier geht?
Und: Welche Mappe ist zum Ausführungszeitpunkt aktiv?

Option Explicit
Sub WLQ5()
Dim wbk As Workbook, wksQ As Worksheet
For Each wbk In Workbooks
If wbk.Name Like "Pegy_adhoc_600_*.xls" Then
Set wksQ = wbk.Worksheets("DatenGestern")                      ' Quelle
Exit For
End If
Next wbk
If wksQ Is Nothing Then
MsgBox "Es ist keine Mappe mit dem Namen" & vbLf & vbLf & _
"Pegy_adhoc_600_....xls" & vbLf & vbLf & _
"geöffnet.", vbCritical, "WLQ4 - Abbruch"
Else
With Workbooks("adhoc-Reporting SWS.xls").ActiveSheet             ' Ziel
.Range("B35").Resize(Range("B9:F20").Rows, Range("B9:F20").Columns) _
= wksQ.Range("B9:F20").Value
.Range("H35").Resize(Range("K9:K11").Rows, 1) _
= wksQ.Range("K9:K11").Value
' usw. nach diesem Muster
End With
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Codevorschlag
07.08.2009 20:17:27
Erich
Hi Matthias,
hier mal eine Möglichkeit, wie man das lösen könnte - im Vorgriff auf deine Antworten auf die Fragen.
Das Makro sucht in der Liste der geöffneten Arbeitsmappen die erste, die dem Namensmuster entspricht.
Umstellt habe ich auch die vielen Select, Copy und PasteSpecial an ein paar Beispielen.
Da stehen jetzt nur noch einfache Zuweisungen:

Option Explicit
Sub WLQ2()
Dim wbk As Workbook, wksQ As Worksheet
For Each wbk In Workbooks
If wbk.Name Like "Pegy_adhoc_600_20##_##_##.xls" Then
Set wksQ = wbk.Worksheets(1)                                      ' Quelle
Exit For
End If
Next wbk
If wksQ Is Nothing Then
MsgBox "Es ist keine Mappe mit dem Namen" & vbLf & vbLf & _
"Pegy_adhoc_600_20##_##_##.xls" & vbLf & vbLf & _
"geöffnet.", vbCritical, "WLQ2 - Abbruch"
Else
With Workbooks("adhoc-Reporting SWS.xls").Worksheets(1)              ' Ziel
.Range("B35").Resize(Range("B9:F14").Rows, Range("B9:F14").Columns) _
= wksQ.Range("B9:F14").Value
.Range("B42").Resize(Range("B16:F20").Rows, Range("B16:F20").Columns) _
= wksQ.Range("B16:F20").Value
.Range("H35").Resize(Range("K9:K11").Rows, 1) _
= wksQ.Range("K9:K11").Value
.Range("H41").Resize(Range("K15:K20").Rows, 1) _
= wksQ.Range("K15:K20").Value
' usw. nacvh diesem Muster
End With
End If
End Sub
Du kannst es ja mal anschauen und testen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige