PDA

Vollständige Version anzeigen : Verweis auf "alle" Dateien!?


niceguy113
25.11.2008, 18:47
Hey,

folgendes Problem:

Ich erstelle für manche Vorlesungen, für die es keine Skripte an der Uni gibt, jeweils kurze Zusammenfassungen. Jede Vorlesung kommt dabei (um Übersicht zu bewahren) in eine Datei namens

V01.doc, V02.doc etc ...

Die Übungen kommen entsprechend in Dateien des Namens Ü01.doc, Ü02.doc, etc ...

Nun frage ich mich, ob es irgendwie möglich ist, eine Datei

V_Komplett.doc

zu erstellen, die beim Aufrufen die Inhalte aller Dateien mit den Namen V[0-9]{2}\.doc (ums mal als RegExp auszudrücken) anzeigt, sodass es leichter zu drucken ist, oder damit man dann mal alles in einer kompletten Datei hat? Die Dateinamen sollen nirgends erscheinen, weil die einzelnen Dateien bereits Überschriften in der Form "XYZ - Vorlesung 01 vom dd.mm.yyyy" enthalten und somit zur Gliederung beitragen.

Dabei sollte, falls möglich, jeweils eine Datei auf einer neuen Seite beginnen.
Analog würde ich dann nämlich auch für die Übungen vorgehen.

Danke und liebe Grüße,
Björn

peppi
25.11.2008, 19:01
Hallo,

"zu Fuß" kannst Du da mit Einfügen | Datei arbeiten.... Vielleicht hat einer unserer vba-Experten auch ein Makro zur Hand, womit man das automatisieren kann, daß die Dateien eines gesamten Ordners eingefügt werden können...

niceguy113
25.11.2008, 19:59
Danke schonmal. Ja, das wäre cool, wenn da noch was mit VBA ginge :-) Ich meine, was man "händisch" machen kann, geht ja bestimmt auch als VBA Befehl :-) Danke schonmal!!!

ebs17
25.11.2008, 20:59
was man "händisch" machen kann, geht ja bestimmt auch als VBA Befehl
Und ein Weg dazu ist die Verwendung des Makrorekorders. Dieser liefert nicht immer den besten Code, aber immerhin funktionierenden.

Einfügen Datei + Einfügen manueller Seitenwechsel liefert ...
Sub Makro1()
' Makro aufgezeichnet am 25.11.2008
'
Selection.InsertFile FileName:="XXX.doc", Range:="", _
ConfirmConversions:=False, Link:=False, Attachment:=False
Selection.InsertBreak Type:=wdPageBreak
End Sub

niceguy113
25.11.2008, 22:11
Ah ok, danke. D.h. den Code müsste ich nun sagen wir 20 mal kopieren und jedes mal den Dateinamen ändern, oder wie genau wende ich das so an, dsas er am Ende dann alle mit dem Schema V[0-9]{2}\.doc einfügt?

Danke vielmals!

peppi
25.11.2008, 22:17
Hallo Eberhard,

Deine Variante ist ja wohl nicht ernst gemeint, oder? Bevor ich dieses Makro zwanzigmal schreibe, kann ich auch die Dateien einzeln "zu Fuß" einfügen....

Ich dachte hier eher daran, daß unsere vba-Spezialisten sich zu Wort melden, um einen Code bereitzustellen, der automatisch alle Dateien eines Ordner einliest...

Sorry, aber alles geht nun wirklich nicht mit dem Makrorekorder, was ich übrigens auch gekonnt hätte, was aber eben keine Lösung ist, und ich es deshalb gar nicht erst geschrieben hatte...
<br>

niceguy113
25.11.2008, 22:32
Hey Peppi, puh, ich bin froh, dass Du es ähnlich siehst. das selbe dachte ich mir auch, wobei ich dachte, dass es ggf. auch ausbaufähig sei :-) Mir wäre halt wichtig, dass man das Makro einfach ausführen kann, die Datei aber am Ende nur druckt und nicht speichert. So hat man immer die aktuellsten Versionen aller Teildateien V01, V02 etc in einem Dokument, weil sich ja in den einzelnen Teildateien ja natürlich auch mal was ändern kann... Das wäre halt der rießige Vorteil daran!

peppi
25.11.2008, 22:39
Hallo niceguy113,

wenn Du es immer aktualisiert haben möchtest, dann verwende nicht Einfügen | Datei sondern verwende das Feld IncludeText (das erhältst Du über Einfügen | Feld und dann links "IncludeText" auswählen).

Dann könntest Du Dir eine Datei erstellen und speichern, die so viele IncludeText-Felder enthält, wie Dateien vorhanden sind, und bei jedem Öffnen dieser Datei werden die Felder mit dem Inhalt der Dateien aktualisiert... So hast Du dann ein Dokument, welches immer die aktuellen Texte enthält...

Das hätte auch den Vorteil, daß man es richtig gut formatieren könnte, und die Leute schon gleich sehen, aus welcher Datei der Text ist (also eine Überschrift über jedes Feld machen)...

Sieh es Dir einmal an. Vielleicht wäre das ja die bessere Variante?
<br>

niceguy113
25.11.2008, 22:43
Hey Peppi,

ok habs mal ausprobiert. Funktioniert soweit schon ganz gut, mit F9 hab ichs aktualisiert und den geänderten Inhalt erhalten. Einzig blöde daran ist halt, dass ich dann das ganze ca. 20 mal pro Zusammenfassung machen muss, von denen es 4 gibt. Finde ich zwar nicht ganz sooo schön, aber besser, als garnichts. Aber vllt kommt ja noch ein VB Profi :-) Müsste doch eigentlich damit gehen!!

ebs17
25.11.2008, 23:02
Autsch, von 20x kopieren erwähnte ich nichts. Die beiden Anweisungen gehören selbstverständlich in eine Schleife (ist in Access Tagesgeschäft). Hier mal eine unter Nutzung der Dir-Anweisung (FileSearch gibt es unter O2007 nicht mehr):
Sub Makro1()
Dim sPfad As String
Dim sName As String
Dim bFirst As Boolean

bFirst = False
sPfad = "E:\Forum\Doks\" ' Pfad setzen.
sName = Dir(sPfad & "V??.doc") ' Ersten Eintrag abrufen.
Do While sName <> "" ' Schleife beginnen.

If bFirst Then Selection.InsertBreak Type:=wdPageBreak
Selection.InsertFile FileName:=sPfad & sName, Range:="", _
ConfirmConversions:=False, Link:=False, Attachment:=False
bFirst = True
sName = Dir ' Nächsten Eintrag abrufen.

Loop
End Sub
Wenn sich die vier Zusammenfassungen nur durch den Dateienfilter (V??.doc) unterscheiden, kann die Sub mit Übergabeparameter versehen werden:
Sub Zusammenfassung(Filter As String)
...
sName = Dir(sPfad & Filter & ".doc")
...
End Sub

' Aufruf
Sub Aufruf()
Dim Wert
Wert = InputBox("Bitte Dateifilter eingeben" & vbCrLf & _
"z.B. V?? für V01, V02 ...", "Titel")
Call Zusammenfassung(Wert)
End Sub

ebs17
26.11.2008, 01:55
[OT]
Der wiederholte Hinweis auf die VBA-Experten beunruhigt mich. Hoffentlich zerreißen die mich nicht.

PapaSchlumpf
26.11.2008, 08:10
@Eberhard

sieht doch gut aus :top:

Und da es bekanntlich in VBA meistens mehrere Wege nach Rom geben, hier mal eine nur leicht andere Lösung (aus Word2000)

<a HREF='#Index' name='InserFiles' style=" color:#000080; background: #DFDFDF; font: italic bold;">Sub InserFiles() </a>
<span style=" color:#0000FF; background: #FFFFFF;">Dim</span> strFilePath <span style=" color:#0000FF; background: #FFFFFF;">As</span> <span style=" color:#0000FF; background: #FFFFFF;">String</span>
<span style=" color:#0000FF; background: #FFFFFF;">Dim</span> strFileName <span style=" color:#0000FF; background: #FFFFFF;">As</span> <span style=" color:#0000FF; background: #FFFFFF;">String</span>
<span style=" color:#0000FF; background: #FFFFFF;">With</span> Dialogs<span style=" color:#FF0000; background: #FFFFFF;">(</span><span style=" color:#008080; background: #FFFFFF;">wdDialogFileOpen</span><span style=" color:#FF0000; background: #FFFFFF;">)</span>
.Name = <span style=" color:#FF0000; background: #FFFFFF;">"</span>C:\Temp\V*.doc<span style=" color:#FF0000; background: #FFFFFF;">"</span> <span style=" color:#008000; background: #FFFFFF;">'Startordner + Filter "V*" </span>
<span style=" color:#0000FF; background: #FFFFFF;">If</span> .Display = -1 <span style=" color:#0000FF; background: #FFFFFF;">Then</span>
strFilePath = <span style=" color:#0000FF; background: #FFFFFF;">CurDir</span>
<span style=" color:#0000FF; background: #FFFFFF;">Else</span>
<a HREF='#Index' name='Exit' style=" color:#000080; background: #DFDFDF; font: italic bold;"> Exit Sub </a>
<span style=" color:#0000FF; background: #FFFFFF;">End</span> <span style=" color:#0000FF; background: #FFFFFF;">If</span>
<span style=" color:#0000FF; background: #FFFFFF;">End</span> <span style=" color:#0000FF; background: #FFFFFF;">With</span>
<span style=" color:#0000FF; background: #FFFFFF;">If</span> <span style=" color:#0000FF; background: #FFFFFF;">Right</span><span style=" color:#FF0000; background: #FFFFFF;">(</span>strFilePath, 1<span style=" color:#FF0000; background: #FFFFFF;">)</span> &lt;&gt; <span style=" color:#FF0000; background: #FFFFFF;">"</span>\<span style=" color:#FF0000; background: #FFFFFF;">"</span> <span style=" color:#0000FF; background: #FFFFFF;">Then</span> strFilePath = strFilePath & <span style=" color:#FF0000; background: #FFFFFF;">"</span>\<span style=" color:#FF0000; background: #FFFFFF;">"</span>
strFileName = <span style=" color:#0000FF; background: #FFFFFF;">Dir</span><span style=" color:#FF0000; background: #FFFFFF;">(</span>strFilePath & <span style=" color:#FF0000; background: #FFFFFF;">"</span>*.doc<span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">)</span>
<span style=" color:#0000FF; background: #FFFFFF;">Do</span> <span style=" color:#0000FF; background: #FFFFFF;">While</span> strFileName &lt;&gt; <span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">"</span>
<span style=" color:#0000FF; background: #FFFFFF;">If</span> strFileName <span style=" color:#0000FF; background: #FFFFFF;">Like</span> <span style=" color:#FF0000; background: #FFFFFF;">"</span>V*.doc<span style=" color:#FF0000; background: #FFFFFF;">"</span> <span style=" color:#0000FF; background: #FFFFFF;">Then</span>
Selection.InsertFile strFilePath & strFileName, <span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">"</span>, <span style=" color:#0000FF; background: #FFFFFF;">False</span>, <span style=" color:#0000FF; background: #FFFFFF;">True</span>
Selection.InsertBreak <span style=" color:#0000FF; background: #FFFFFF;">Type</span><span style=" color:#008080; background: #FFFFFF;">:=</span><span style=" color:#008080; background: #FFFFFF;">wdPageBreak</span>
<span style=" color:#0000FF; background: #FFFFFF;">End</span> <span style=" color:#0000FF; background: #FFFFFF;">If</span>
strFileName = Dir<span style=" color:#FF0000; background: #FFFFFF;">(</span><span style=" color:#FF0000; background: #FFFFFF;">)</span>
<span style=" color:#0000FF; background: #FFFFFF;">Loop</span>

<span style=" color:#000080; background: #DFDFDF; font: italic bold;">End Sub </span><hr>
'Erstellt mit PapaSchlumpfs VBA-Konverter

Gruß
PS

niceguy113
26.11.2008, 08:32
Vielen Dank Euch beiden :-) Ich werd das später direkt mal testen!!! Danke schonmal für Eure Mühen!!!

Edit: @PapaSchlumpf:

Also das hier funktioniert nun soweit schon mal ganz gut :-) Nur eine kleine Frage noch:

Ist es möglich, den Dateidialog nicht aufzurufen und direkt einen Pfad zu nutzten?? Ich habe folgendes im Code geändert:

.Name = "J:\Eigene Dateien\Studium\Skripte & Doks\WS0809\Zusammenfassungen\V*.doc" 'Startordner + Filter "V*"

aber es kam trotzdem die Frage nach den Dateien, da musste ich mich erstmal in den o.g. Ordner durchklicken und dann dort die V01.doc markieren und öffnen ...

Edit: Ok, wenn ich bei o.g. Pfad das V*.doc durch V01.doc ersetzte, dann öffnet er den entsprechenden Pfad direkt im Dateidialog (und nicht wie vorher Eigene Dateien), und ichz muss die V01.doc nur nochmal doppelt anklicken. Geht das auch auf einmal? :-)

Könnte man noch die Datei VKomplett.doc ausschließen, weil diese kann sich ja nicht selbst in sich einfügen und vor dem Einfügen erstmal alles aus der aktuellen Datei VKomplett.doc löschen (sonst erscheinen die bereits eingefügten Dateien erneut am Ende)? :-)

Und sehe ich es richtig, dass ich nun nicht jedes mal das Makro ausführen, sondern einfach immer F9 zur Aktualisierung drücken muss (Wird wohl als Feld eingefügt)?

ebs17
26.11.2008, 09:51
Könnte man noch die Datei VKomplett.doc ausschließen
Der Dateifilter muss richtig gesetzt werden:
V*.doc ... erfasst alle DOC-Dateien, die mit V beginnen (Stern steht für nichts bis alles)
V??.* ... erfasst alle Dateien, deren Name aus V und zwei nachfolgenden Ziffern besteht + alle Dateierweiterungen (pdf, xls, txt, ...)

PapaSchlumpf
26.11.2008, 10:21
hier die Variante ohne Pfadauswahl, sondern Vorgabe:

<a HREF='#Index' name='InserFiles' style=" color:#000080; background: #DFDFDF; font: italic bold;">Sub InserFiles() </a>
<span style=" color:#0000FF; background: #FFFFFF;">Dim</span> strFilePath <span style=" color:#0000FF; background: #FFFFFF;">As</span> <span style=" color:#0000FF; background: #FFFFFF;">String</span>
<span style=" color:#0000FF; background: #FFFFFF;">Dim</span> strFileName <span style=" color:#0000FF; background: #FFFFFF;">As</span> <span style=" color:#0000FF; background: #FFFFFF;">String</span>
<span style=" color:#0000FF; background: #FFFFFF;">Dim</span> strFilter <span style=" color:#0000FF; background: #FFFFFF;">As</span> <span style=" color:#0000FF; background: #FFFFFF;">String</span>
<span style=" color:#008000; background: #FFFFFF;"> ' Pfad vorgeben </span>
strFilePath = <span style=" color:#FF0000; background: #FFFFFF;">"</span>C:\Temp<span style=" color:#FF0000; background: #FFFFFF;">"</span>
<span style=" color:#008000; background: #FFFFFF;"> ' Filter vorgeben </span>
strFilter = <span style=" color:#FF0000; background: #FFFFFF;">"</span>V_*.doc<span style=" color:#FF0000; background: #FFFFFF;">"</span>
<span style=" color:#008000; background: #FFFFFF;"> 'Dokment leeren und Verknüpfungen zu Dateien neu einfügen </span>
ActiveDocument.Range.Delete
<span style=" color:#0000FF; background: #FFFFFF;">If</span> <span style=" color:#0000FF; background: #FFFFFF;">Right</span><span style=" color:#FF0000; background: #FFFFFF;">(</span>strFilePath, 1<span style=" color:#FF0000; background: #FFFFFF;">)</span> &lt;&gt; <span style=" color:#FF0000; background: #FFFFFF;">"</span>\<span style=" color:#FF0000; background: #FFFFFF;">"</span> <span style=" color:#0000FF; background: #FFFFFF;">Then</span> strFilePath = strFilePath & <span style=" color:#FF0000; background: #FFFFFF;">"</span>\<span style=" color:#FF0000; background: #FFFFFF;">"</span>
strFileName = <span style=" color:#0000FF; background: #FFFFFF;">Dir</span><span style=" color:#FF0000; background: #FFFFFF;">(</span>strFilePath & <span style=" color:#FF0000; background: #FFFFFF;">"</span>*.doc<span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">)</span>
<span style=" color:#0000FF; background: #FFFFFF;">Do</span> <span style=" color:#0000FF; background: #FFFFFF;">While</span> strFileName &lt;&gt; <span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">"</span>
<span style=" color:#0000FF; background: #FFFFFF;">If</span> strFileName <span style=" color:#0000FF; background: #FFFFFF;">Like</span> strFilter <span style=" color:#0000FF; background: #FFFFFF;">And</span> strFileName &lt;&gt; ActiveDocument.Name <span style=" color:#0000FF; background: #FFFFFF;">Then</span>
Selection.InsertFile strFilePath & strFileName, <span style=" color:#FF0000; background: #FFFFFF;">"</span><span style=" color:#FF0000; background: #FFFFFF;">"</span>, <span style=" color:#0000FF; background: #FFFFFF;">False</span>, <span style=" color:#0000FF; background: #FFFFFF;">True</span>
Selection.InsertBreak <span style=" color:#0000FF; background: #FFFFFF;">Type</span><span style=" color:#008080; background: #FFFFFF;">:=</span><span style=" color:#008080; background: #FFFFFF;">wdPageBreak</span>
<span style=" color:#0000FF; background: #FFFFFF;">End</span> <span style=" color:#0000FF; background: #FFFFFF;">If</span>
strFileName = Dir<span style=" color:#FF0000; background: #FFFFFF;">(</span><span style=" color:#FF0000; background: #FFFFFF;">)</span>
<span style=" color:#0000FF; background: #FFFFFF;">Loop</span>
<span style=" color:#000080; background: #DFDFDF; font: italic bold;">End Sub </span><hr>
'Erstellt mit PapaSchlumpfs VBA-Konverter

PS

niceguy113
26.11.2008, 13:10
Wow, klasse!!! Danke Euch beiden! Klappt nun super! :entsetzt: :mrcool: Ihr seid echte VBA Profis, wunderbar! Schönen Tag noch!!!

niceguy113
28.11.2008, 12:31
So, habs nun schon ein wenig in Gebrauch und nun iene kurze Frage:

Wären die 2 folgenden Anpsasungen noch möglich:

1) Nicht als "Feld" einfügen, denn sonst wirds hässlich, während ich noch Text darin ändere, weil er dann alles grau hinterlegt. Vllt kann mans ja einfach ohne Referenz einfügen!?

2) Was wichtiger wäre: Wenn das einzufügende Dokument komplett die Seite füllt, soll heißen, dass keine Zeile am Ende mehr hinpasst, so dürfte der Befehl, dass das nächste Dokument auf einer neuen Seite anfängt, nicht ausgeführt werden, weil sonst eine komplette leere Seite entsteht.

Vielen Dank :-) Und liebe Grüße!

PapaSchlumpf
28.11.2008, 12:44
Hi

zu 1:
Selection.InsertFile strFilePath & strFileName, "", False, False

zu 2:
das zu programmieren ist deutlich aufwändiger, als am Ende mal per Hand zu korrigieren.

PS

niceguy113
28.11.2008, 12:46
OK danke, das klappt wie immer wunderbar :-)

Zu zwei: Ok, dann lassen wir das, hätt ich mir eigentlich schon denken können, dass es schwierig ist, die Länge auszulesen und daran eine Fallunterscheidung festzumachen :-)

ebs17
28.11.2008, 13:05
Zu 2) Vergleiche Code in #10

ich hatte Seitenumbruch und Datei-Einfügen in der Reihenfolge getauscht (dann wird es einfach). Das Flag bFirst wird im ersten Schleifendurchlauf umgestellt und gestattet erst dann das Einfügen des Seitenwechsels.

Das lässt sich problemlos in den aktuellen Code übernehmen.

niceguy113
29.11.2008, 14:03
Hey Du,

also, soweit ich das ncahvollziehen kann, heißt das, dass Du (wenn bFirst = true, was beim 1. Schleifendurchgang aber nicht so ist) einen Seitenwechsel einfügst.

Aber für das, was ich machen will, müsste ich ja erst ermitteln, wie lang der zuletzt eingefügte Text ist, d.h. ob er genau auf eine Seite passt (dann bFirst = false setzten) oder ob noch Platz unten auf der gleichen Seite war (dann bFirst = true), damit er davon abhängig dann den Seitenwechsel einfügt. Jedoch weiß ich ja nicht, wie ich das bestimmen kann, das ist glaube ich hier die Schwierigkeit!

Danke und Lg!!

ebs17
29.11.2008, 15:06
Oh, da habe ich nicht richtig gelesen. Meine kleine Änderung dient dazu, dass nach dem letzten Text kein Seitenwechsel eingefügt wird.

Die Vermeidung eines Seitenwechsels innerhalb des Ges.-Dokumentes bei voller Seite wird in der Tat schwer zu beherrschen sein.

Übersichtlicher wird es sein,
- bei den Quelldokumenten darauf zu achten, dass eben die letzte Seite nicht genau voll ist und
- für Ziel- und Quelldokumente gleiche Rändereinstellungen und gleiche Drucker zu verwenden.

Wenn das Dokument als Datei weitergegeben wird, hilft dann bestimmt auch eine "Fixierung" als PDF.

ebs17
29.11.2008, 15:39
Zusatz zum Thema PDF:

Du kannst die Einzeldokumente als PDF erstellen und die Einzel-PDF´s zu einem Gesamtdokument zusammenfügen
- mittels GUI: PDFTK Builder (http://www.angusj.com/pdftkb/)
- mittels Script: pdftk (http://www.pdfhacks.com/pdftk/)

niceguy113
30.11.2008, 14:16
Ok cool danke! Das werd ich mal ausprobiern :>