goodbytes
Goto Top

VBA (Word 2003) - Problemchen beim Ersetzen von Zeichen in allen Dateien eines Ordners

Hallo,
ich muss bei etlichen Dateien in einem Ordner mehrere Zeichenketten ersetzen. Da ich es in sehr vielen Ordnern machen muss (immer andere zu ersetzende Zeichenketten) möchte ich dies möglichst per Makro pro Ordner machen.

Folgendes Makro läuft ja schon halbwegs:

Sub ZeichenErsetzen()

    Dim Verz As String
    Dim DName1 As String
    Dim DName2 As String
    Dim Alt As String
    Dim Neu As String
    
    Verz = InputBox("Bitte den kompletten Pfad zu dem zu durchsuchenden Ordner eingeben." & Chr(13) & Chr(10) & Chr(10) & "z.B.: C:\Test\", "Pfadangabe...")  
    Alt = InputBox(Chr(10) & "Bitte die zu ersetzende Zeichenkette eingeben...", "Alte Zeichenkette...")  
    Neu = InputBox(Chr(10) & "Bitte die neue Zeichenkette eingeben...", "Neue Zeichenkette...")  
      
    DName1 = Dir(Verz & "*.htm")  
    
    If DName1 <> "" Then  
        Ersetzen1 Verz, DName1, Alt, Neu
    End If
    
    Do While (DName1 <> "")  
        DName1 = Dir()
        If DName1 <> "" Then  
            Ersetzen1 Verz, DName1, Alt, Neu
        End If
    Loop
    
    DName2 = Dir(Verz & "*.rtf")  
    
    If DName2 <> "" Then  
        Ersetzen2 Verz, DName2, Alt, Neu
    End If
    
    Do While (DName2 <> "")  
        DName2 = Dir()
        If DName2 <> "" Then  
            Ersetzen2 Verz, DName2, Alt, Neu
        End If
    Loop
    
End Sub
 
Sub Ersetzen1(Verz As String, DName1 As String, Alt As String, Neu As String)

    Documents.Open (Verz & DName1)
    With Documents(DName1)
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
            With Selection.Find
                .Text = Alt
                .Replacement.Text = Neu
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
        Selection.Find.Execute Replace:=wdReplaceAll
        ActiveDocument.Save
        ActiveDocument.Close
    End With
    
End Sub

Sub Ersetzen2(Verz As String, DName2 As String, Alt As String, Neu As String)

    Documents.Open (Verz & DName2)
    With Documents(DName2)
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
            With Selection.Find
                .Text = Alt
                .Replacement.Text = Neu
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
        Selection.Find.Execute Replace:=wdReplaceAll
        ActiveDocument.Save
        ActiveDocument.Close
    End With
    
End Sub
Wie man sieht sind es verschiedene Dateitypen. Ích denke mal, dass diese Lösung noch nicht optimal ist.

1. Wenn ich den Pfad leer lasse (weil ich die makrobestückte Datei mit in den zu bearbeitenden Ordner gesteckt habe) versucht er auch gleich noch alle möglichen anderen Dateien zu durchforsten ("Eigene Dateien"). Seltsam. Mit kompletten Pfad gehts dann aber.

2. Den Code zweimal zu machen, nur weil es zwei Dateitypen sind (könnten ja auch mal mehr sein) ist auch sehr unschön. Könnte man das nicht irgendwie eleganter lösen?

3. In diesem Fall muss ich das Makro 4 Mal laufen lassen, da 4 Zeichenketten ersetzt werden müssten. Wäre es da nicht effektiver alle Dialog-Abfragen gleich in einer Maske zu machen (incl. Pfad)? Da komme ich aber mit der InputBox nicht weiter, oder?

4. Eigentlich sind auch noch txt-Dateien dabei. Ich hatte als Dateityp einfach *.* genommen. Allerdings hat Word aus den Zeichen in den Textdateien nur noch Hyroglyphen gemacht.

Oder wäre es günstiger das Ganze gleich mit vbs zu machen? Aber würden dann die ursprünglichen Textformatierungen erhalten bleiben?

Vielleicht kann mir da jemand Tipps geben?

Torsten

Content-Key: 123995

Url: https://administrator.de/contentid/123995

Printed on: April 20, 2024 at 00:04 o'clock

Member: TsukiSan
TsukiSan Sep 02, 2009 at 07:27:39 (UTC)
Goto Top
Hallo TorstenB,

ich denke mit vbs bekommen wir das hin. Mit VBA sicher auch, aber da mache ich zu wenig mit.
in VBS könnte es - rein als Gedanke! - grob so aussehen:
Dim FilterStr , PfadStr
Dim Alt, Neu
FilterStr = "*.*"  
Dim MyText(1000), X
X = 0

Set objWord = CreateObject("Word.Application")  


PfadStr = inputbox("Bitte den kompletten Pfad zu dem zu durchsuchenden Ordner eingeben.","Pfadangabe...","C:\Test\")  
Alt = inputbox("Bitte die zu ersetzende Zeichenkette eingeben...", "Alte Zeichenkette...", "altes")   
Neu = inputbox("Bitte die neue Zeichenkette eingeben...", "Neue Zeichenkette...", "neues")   

msgbox "Befehl wird ausgeführt! Bitte warten!",,"Mit Word...."  
objWord.FileSearch.FileName = FilterStr
objWord.FileSearch.LookIn = PfadStr
objWord.FileSearch.SearchSubfolders = False
objWord.FileSearch.Execute

objWord.Visible = False


For Each objFile in objWord.FileSearch.FoundFiles	

Msgbox objFile


	Set FSO = CreateObject("Scripting.FileSystemObject")  
	Set MyDatei = FSO.OpenTextFile(objFile, 1)

Do Until MyDatei.AtEndOfStream 

	MyText(X) = MyDatei.ReadLine
	MyText(X) = Replace(MyText(X), Alt, Neu)    
Loop

MyDatei.close

	PfadNeu = objFile & ".bak"  
	Set FSO = CreateObject("Scripting.FileSystemObject")  
	Set MyDatei1 = FSO.CreateTextFile(PfadNeu, TRUE)
	MyDatei1.Close
	Set MyDatei1 = FSO.OpenTextFile(PfadNeu, 8)
	for I = 0 to X
		if not MyText(I) = "" then MyDatei1.WriteLine (MyText(I))  
	next
	MyDatei1.Close
	
	X = 0
Next


msgbox "Ferddich..."  


Set objword = nothing
Set MyDatei = nothing
Set FSO = nothing

[Edit] Habe mal den Code noch so geändert, daß die gleichen Dateien mit dem Anhang ".bak" abgespeichert werden, damit du testen kannst, was passiert. Bitte posten, was es noch zu beachten gibt/was nicht funktioniert!
Danke!
[Edit]
Hier nutzen wir Word dazu, um nach Dateien zu suchen. Mit der "Replace"-Methode erstzen wir ALT gegen NEU.
Was jetzt noch geschrieben werden muss ist, daß die einzelnen (NEUEN) Zeilen gespeichert werden und anschließend wieder in deine Datei kommen. Wir hatten gestern einen ähnlichen Beitrag (Ersetzen/neu erstellen von Werten in einer INI-Datei mittels VBS), aber der hilft bei dir nur bedingt.

Soweit erst mal von mir. Muss schon wieder..... hetz

Gruß
Tsuki
Member: goodbytes
goodbytes Sep 02, 2009 at 12:37:59 (UTC)
Goto Top
Hallo Tsuki,
vielen Dank erstmal für die schnelle Antwort!

Das Skript scheint auch erst einmal über die ersten drei Dateien zu laufen (je eine htm, rtf und txt). Die Kopie (bak) macht es leider nicht sauber (stehen dann nur Rester drin), ist aber auch nicht nötig, da ich die Dateien in der Testphase ohnehin immer wieder frisch reinkopiere.

Wenn die ersten drei Dateien durchlaufen wurden kommt eine Fehlermeldung bezüglich der Zeile 45, Zeichen 30, "Ungültiger Prozeduraufruf oder ungültiges Argument, Code 800A0005.

Torsten
Member: TsukiSan
TsukiSan Sep 03, 2009 at 01:38:20 (UTC)
Goto Top
Hallo TorstenB

Sorry, habe jetzt mal etwas getestet und
folgende Sachen müssen in meinem Script
erst mal geändert werden, damit es prinzipiell
funktioniert:
1) In Zeile 04 bitte die "1000" auf "100000" erhöhen

2)Nach Zeile 34 muss eingefügt werden
	X = X + 1

3)In Zeile 45 anstelle von "If Not...." das ganze
so schreiben, damit auch Leerzeilen einfach
mit übernommen werden
	MyDatei1.WriteLine (MyText(I))

4) vor Zeile 56 noch folgendes einfügen
	objword.quit

So, jetzt hätten wir das ganze mit 3
"Hauptschönheitsfehlern" laufen face-wink

Schönheit 1)
- es geht nur mit reinen Textdateien!
Bei Dateien wie WORD, EXCEL, MP3, EXE etc.
wird auf diese Art und Weise was (zumindest)
am Header "reduziert" und die neue Datei ist
nicht mehr lesbar
Schönheit 2)
- Das ganze ist begrenzt auf eine maximale
Zeilenanzahl (original Datei) von 100001
Schönheit 3)
- Wird das Script "langsam" genug ausgeführt,
werden die neu erstellten ".bak"- Dateien
mitverarbeitet und das ganze entwickelt sich
zu einer "never-ending-story" face-wink

Also müssen wir mal weiterüberlegen, was zu
machen ist.

Gegenfrage: Sind deine zu ändernden Dateien reine
Textdateien?

Bis später

Gruß
Member: TsukiSan
TsukiSan Sep 03, 2009 at 06:08:12 (UTC)
Goto Top
So, da bin ich kurz wieder,

Habe mal den Script soweit geschrieben (in VBS), daß er zumindest bei Dateien funktioniert, welche reinen Text beinhalten.
Binär-Dateien, etc. funktionieren damit nicht. Da stimmen die Zeilenumbrüche etc. nicht!!!!
Dim FilterStr , PfadStr
Dim PfadStrNeu, DateiNameNeu
Dim Alt, Neu
Dim MyText()
Dim  X
Dim ZMAx

FilterStr = "*.*"  
X = 0
ZMax = 0


Set objWord = CreateObject("Word.Application")  
Set FSO = CreateObject("Scripting.FileSystemObject")  



PfadStr = inputbox("Bitte den kompletten Pfad zu dem zu durchsuchenden Ordner eingeben.","Pfadangabe...","C:\Test\")  
PfadStrNeu = PfadStr & "Test\"  
on error resume next
FSO.CreateFolder(PfadStrNeu)

Alt = inputbox("Bitte die zu ersetzende Zeichenkette eingeben...", "Alte Zeichenkette...", "altes")   
Neu = inputbox("Bitte die neue Zeichenkette eingeben...", "Neue Zeichenkette...", "neues")   

msgbox "Befehl wird ausgeführt! Bitte warten!",,"Mit Word...."  
objWord.FileSearch.FileName = FilterStr
objWord.FileSearch.LookIn = PfadStr
objWord.FileSearch.SearchSubfolders = False
objWord.FileSearch.Execute

objWord.Visible = False

FN = ""  
FNR = ""  

For Each objFile in objWord.FileSearch.FoundFiles	
	
	WScript.Echo "Oeffne Datei: " & ObjFile  

'Jetzt holen wir uns nur den Dateinamen raus	  
	FN = ""  
	FNR = ""  
	IFN = ""  
	IFNR = ""  
	for IFN = len(Objfile) to 0 Step -1
		FNTemp = mid (Objfile,IFN,1)
			If Not FNTemp = "\" then FN = FN & FNTemp  
			If FNTemp = "\" Then IFN = 0  
	next
'Hier wieder richtig rum drehen ;-)  
	for IFNR = len(FN) to 1 Step -1
		FNTempR = mid (FN,IFNR,1)
			FNR = FNR & FNTempR
	next

	
	ZMAx = 0
	Set MyDatei = FSO.OpenTextFile(objFile, 1)

'Zum bestimmen der maximalen Zeilenzahl in der einzulesenden Datei  
Do Until MyDatei.AtEndOfStream 
	TempText = MyDatei.ReadLine
	ZMAx = Zmax + 1 
Loop
MyDatei.close	
	
	WScript.Echo "Anzahl Zeilen: " & ZMAx  
	ReDim MyText(ZMax)


	Set MyDatei = FSO.OpenTextFile(objFile, 1)
Do Until MyDatei.AtEndOfStream 

	MyText(X) = MyDatei.ReadLine
	'WScript.Echo "Zeile " & X & ": Suche nach:'" & Alt & "' und ersetze durch:'" & Neu  
	MyText(X) = Replace(MyText(X), Alt, Neu)  
	X = X + 1  
Loop
	
MyDatei.close
	

	PfadNeu = PfadStrNeu & FNR ' & ".bak"  
	WScript.Echo "Daten werden nach " & PfadNeu & " geschrieben."  

	Set MyDatei1 = FSO.CreateTextFile(PfadNeu, TRUE)
	MyDatei1.Close
	Set MyDatei1 = FSO.OpenTextFile(PfadNeu, 8)
	for I = 0 to X
		MyDatei1.WriteLine (MyText(I))
	next
	MyDatei1.Close
	
	X = 0
Next


msgbox "Ferddich..."  

objword.quit

Set objword = nothing
Set MyDatei = nothing
Set FSO = nothing

Hinweis: diesen Code-Schnipsel in eine Textdatei einfügen und als "Test.vbs" umbennen. Dann am besten aus der Kommandozeile ausführen, damit es nicht so viele "Klicks" gibt face-wink

Wenn die neue Test.vbs also unter C:\ abliegt dann
Eingabe Kommandozeile :

CScript C:\Test.vbs

Bitte posten, was man verbessern/ändern kann (Gibt immer was!)

Gruß
Tsuki
Mitglied: 76109
76109 Sep 04, 2009 at 17:43:09 (UTC)
Goto Top
Hallo zusammen!

Hier eine Alternative mit Dateitypen-Auswahl (*.vbs) face-smile
Option Explicit

Const TitelOrdner = "Ordner-Pfadangabe"  
Const TitelTypen = "Datei-Typen"  
Const TitelSuchen = "Suchen"  
Const TitelErsetzen = "Ersetzen"  
Const TitelAktion = "Suchen und Ersetzen"  

Const MsgOrdner = "Bitte den Ordner-Pfad angeben: z.B. C:\Test"  
Const MsgTypen = "Bitte Dateitypen angeben: z.B. * oder rtf,html,..."  
Const MsgSuchen = "Bitte Zeichenkette angeben: Suchen nach..."  
Const MsgErsetzen = "Bitte Zeichenkette angeben: Ersetzen durch..."  

Const MsgAktion = "Soll der Ersetzenvorgang jetzt gestartet werden?  "  
Const MsgFertig = "Der Ersetzenvorgang ist abgeschlossen!."  

Const MsgFehler = "Die Eingaben sind unvollständig!"  

Dim Ordner, Typen, Suchen, Ersetzen, Fso, File, xFile, Extension, Text, i
    
Ordner = InputBox(MsgOrdner, TitelOrdner):  Typen = InputBox(MsgTypen, TitelTypen)
Suchen = InputBox(MsgSuchen, TitelSuchen):  Ersetzen = InputBox(MsgErsetzen, TitelErsetzen)
      
Set Fso = CreateObject("Scripting.FileSystemObject")  
    
If Fso.FolderExists(Ordner) = False Or Typen = "" Or Suchen = "" Then  
    MsgBox MsgFehler, vbExclamation, "Fehler":  WScript.Quit (1)  
End If
    
If MsgBox(MsgAktion & vbCr & vbCr & "Ordner:" & vbTab & " " & Ordner & vbCr & vbCr & _  
     "Typen:" & vbTab & " " & Typen & vbCr & vbCr & "Suchen:" & vbTab & " " & Suchen & vbCr & vbCr & _  
     "Ersetzen:" & vbTab & " " & Ersetzen, vbInformation Or vbOKCancel, TitelAktion) <> vbOK Then WScript.Quit (0)  
    
Typen = Split(Typen, ",")  
    
For Each File In Fso.GetFolder(Ordner).Files
    Extension = LCase(Fso.GetExtensionName(File.Name))
    For i = 0 To UBound(Typen)
        If Trim(Typen(0)) = "*" Then  
            If Extension = "txt" Or Extension = "rtf" Or Extension = "html" Then i = True: Exit For  
        Else
            If LCase(Trim(Typen(i))) = Extension Then i = True: Exit For
        End If
    Next
    
    If i = True Then
        Set xFile = Fso.OpenTextFile(File.Path)
        Text = Replace(xFile.ReadAll, Suchen, Ersetzen, 1, -1, vbTextCompare)
        Fso.CreateTextFile(File.Path).Write Text:  xFile.Close
    End If
Next

MsgBox MsgFertig, vbInformation, "Meldung":  WScript.Quit (0)  

Auch dieses VB-Script gilt nur für Textdateien und es werden keine Sicherungskopien angelegt.

Das Script kann direkt z.B. per Doppelklick gestartet werden.

Eingaben:
1. InpuBox: Ordner-Pfad - z.B. C:\Test
2. InpuBox: Datei-Typen - z.B. txt, rtf, htm, ... oder * (alle Dateien)
3. InpuBox: Text Suchen - z.B. Das ist ein Suchtext
4. InpuBox: Text Ersetzen - z.B. Das ist der neue Text

Ausgaben:
1. MsgBox: Fehlermeldung bei Eingabefehler
2. MsgBox: Frage ob der Vorgang ausgeführt werden soll? (OK/Abbrechen) und Anzeige der Eingaben zur Kontrolle
3. MsgBox: Meldung das der Vorgang abgeschlossen ist.

Probiers mal aus.

Gruß Dieter

[edit] Änderung bei Dateitypen "*" nur *.txt und *.rtf und *.html [\edit]
Member: goodbytes
goodbytes Sep 08, 2009 at 10:43:39 (UTC)
Goto Top
Hallo Tsuki und Dieter,
sorry, dass ich mich erst jetzt melden kann. Ich hatte nur so viel um die Ohren, dass ich einfach nicht zum Testen kam.

Tsuki, deine vbs-Datei verschiebt die Dateien in den Unterordner, tauscht aber die Zeichen leider nicht aus. Bei der txt-Datei setzt das Skript wischen jedes Zeichen ein "Nullzeichen" (also ich meine damit jetzt nicht die Ziffer Null).

Bei Dieter bekomme ich vom WSH in der Zeile 45:

Fso.CreateTextFile(File.Path).Write Text:  xFile.Close

einen Laufzeifehler: "Ungültiger Prozeduraufruf oder ungültiges Argument" wenn ich alle Typen bearbeiten will und als Dateityp * oder txt nehme. Die vbs entleert dabei die txt-Datei komplett.

Wenn ich einen genauen Daiteityp festlege, z.B. rtf, macht er es. Allerdings wirds dann mit den in der rtf-Datei enthaltenen Formatierungen schwierig, da gerade beim Ersetzen mehrerer voneinander getrennter Wörter nicht gefunden wird. Da hat Word mit dem vba wohl Vorteile. Bei html dürfte es wohl dann die gleichen Probleme geben.

Viele Grüße!

Torsten
Mitglied: 76109
76109 Sep 08, 2009 at 11:51:39 (UTC)
Goto Top
Hallo TorstenB!

Sorry, bei mir funktionierts, daher kann ich das nicht ganz nachvollziehen.

Das die Txt-Datei die Größe Null hat, heißt das der Schreibbefehl "Write Text" nicht ausgeführt wird, wieso auch immer?

In welcher Größenordnung bewegen sich Deine Dateien?

Funktionieren die RTF-Dateien mit dem Script von TsukiSan?

Hast Du das Script direkt gestartet?

Gruß Dieter
Member: goodbytes
goodbytes Sep 08, 2009 at 13:10:38 (UTC)
Goto Top
Hallo,
habs eben nochmal mit Tsuki`s Script probiert. Das Problem bei rtf- und html-Dateien sind tatsächlich die Formatierungsanweisungen in den Dateien. Bei nur einem zu ersetzenden Begriff gehts aber.

Außer bei der wirklich reinen txt. Da hab ich wie gesagt diese Nullzeichen drin bzw. es geht gar nicht.

Mal eine dumme Frage: Wenn man ohnehin ein Wordobjekt dazu benutzt, kann man nicht auch irgendwie die vba-Anweisungen zum ausführen übergeben?

Dann hätte man mit allen Dateien, mit denen Word umgehen kann, auch keine Probleme bei den Formatierungen (wie z.B. rtf und html).

Ich meine, im Word-Makro siehts ja so aus:

Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "i.A. Torsten Bank"  
        .Replacement.Text = "Alles Kacke !!!"  
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

Ach so, die Dateien sind nicht groß, nur im Kilobyte-Bereich.

Torsten
Mitglied: 76109
76109 Sep 08, 2009 at 13:41:45 (UTC)
Goto Top
Hallo TorstenB!

Wohl doch nicht so einfach, wie ich mir das vorgestellt hatteface-smile

Die Textdateien, die Du mit meinem Script getestet hast, wurden die auch mit Word
erstellt bzw. werden die Text-Dateien im Notepad korrekt dargestellt?

Ich teste mal in Word (2002) und schau mal, was dabei rauskommt.

Gruß Dieter
Member: TsukiSan
TsukiSan Sep 08, 2009 at 14:10:59 (UTC)
Goto Top
Hi @ all

ja, bei mir funktioniert es mit Textdateien (auch wenn diese im HTML-Format vorliegen) und mit nur jeweils einem Such-/Erstzenwort. Warum ich Word benutzt habe ist einfach zu erklären:
Damit kann man unter anderem nach Dateien suchen. Ich denke mal, dass man so eventuell auch auf eine VBA-Lösung kommen kann. Allerdings habe ich mit VBA nicht viel am Hut. Aber die Befehle und die "umstände" sollten ähnlich vbs sein. War so meine Idee. Sorry!

Falls ihr beiden was neues habt/rausfindet, dann bitte posten!
Ich lerne gern mit.

Gruß
Tsuki!

Ps.: Bei mir hatte es funktioniert mit WinXP Prof_ENG und Office2000Prof. Ich hatte/habe immer mal wieder Scripte, bei denen das eine ausgeklammerte Wort in einen "KNOW_HOW"-Schutz umgewandelt werden müssen. Da funktioniert es face-confused-alt
Mitglied: 76109
76109 Sep 08, 2009 at 17:30:43 (UTC)
Goto Top
@TsukiSan

Welche Suchfunktion letztendlich verwendet wird, ist eigentlich wurscht. Beide funktionieren in VBS und VBA.

Mein Script kann z.B. in ein VBA-Modul kopiert werden, wobei allerdings in der Zeile 19 ein "Sub Irgendwas" und in der Zeile nach 49 ein "End Sub" stehen muss. Ausserdem müssten dann noch "WScript.Quit (1)" durch "Exit Sub" ersetzt werden und "WScript.Quit (0)" am Ende ganz entfallen. Im Anschluss wird der Debugger gestartet <Menu Debugger><Kompilern von Projekt> und solange kein Fehler angezeigt wird, ist alles gut. WScript.Quit (0) wäre z.B. ein Fehler (nicht kompatibel).

In VBA können die DIM-Variablen explizit definiert werden z.B. Dim i As Integer, Fso As Object usw.

Es ist also relativ einfach in VBA einen Code zu entwerfen und mit dem Debugger Schrittweise zu testen und dann in eine Textdatei zu kopieren und diverse kleine Änderungen vorzunehmen.

@torstenb

Hmh, ich stehe ein wenig auf dem Schlauchface-smile . Wenn ich in Word (2002) eine RTF- oder TXT-Datei erstelle und mit meinem Script bearbeite, dann funktioniert das Leider. Besitzt Du einen Hex-Editor? Wenn nicht kannst Du Dir hier einen runterladen (Freeware):
http://www.chip.de/downloads/Hex-Editor-MX_30351843.html

Dann schau mal in den Dateien ob z.B. das Wort "Das" im Format: 44 61 73 oder 00 44 00 61 00 73 vorhanden ist

Gruß Dieter
Member: goodbytes
goodbytes Sep 09, 2009 at 08:15:16 (UTC)
Goto Top
@76109

ich hab jetzt zum Testen die Originaldateien mal über Bord geworfen (auch die txt war mit Word 2003 erstellt).
Irgendwas war an der anders. Wenn ich nun bei deinem Script als Dateityp txt angebe klappt es. face-smile
Bei Angabe rtf oder html auch (allerdings nur mit einem zu ersetzenden Begriff).

Wenn ich nun alle Dateitypen behandeln möchte (also mit *) bekomme ich wieder den oben angegebenen Laufzeitfehler und die txt-Datei ist wieder leer (die rtf und html unberührt).

Ach so, das Wort "Das" hat den Wert 646173.

@tsuki

Mit deinem Script klappt jetzt alles, eben auch mit der Einschränkung des einem zu ersetzenden Begriffs bei rtf und html.

Noch eine kurze Erklärung wozu ich das eigentlich brauche. Meist muss man ja eigentlich nur was einfachen in txt-Dateien ersetzen. In meinem Fall sind es aber diese drei Dateitypen, da es sich um Outlook-Signaturen handelt. Je nach eingesetztem E-Mail-Format (eben nur txt, rtf oder html) wird eine andere Datei verwendet.

Also habe ich in dem "Signatures"-Ordner pro Signatur drei Dateien. Da bei uns immer zwei Unterschriften notwendig sind (mit verschiedenen Vorgesetzten) wird das gleich sehr viel. Der Mitarbeiter mit den meisten Signaturen hat sieben Stück, also 21 Dateien. Und dann müssen bei festgelegten Änderungen die Signaturen von rund 50 Usern angepasst werden... face-sad

Torsten

PS: Auf jeden Fall jetzt schonmal ein ganz dickes Dankeschön an euch für die Hilfe !!! face-smile
Mitglied: 76109
76109 Sep 09, 2009 at 10:24:07 (UTC)
Goto Top
Hallo zusammen!

Zitat von @goodbytes:
Wenn ich nun alle Dateitypen behandeln möchte (also mit *) bekomme ich
wieder den oben angegebenen Laufzeitfehler und die txt-Datei ist wieder leer (die rtf
und html unberührt).
Das ist aber seltsamface-smile

Es sei denn, es gibt eventuell ein Missverständnis mit der Eingabe der Dateitypen?

Bisher:
"*" = *.* (alle Dateitypen)
"txt" = *.txt
"txt, rtf" = *.txt und *.rtf
"txt, rtf, html" = *.txt und *.rtf und *.html

Im Code jetzt geändert:
"*" = *.txt und *.rtf und *.html
"txt" = *.txt
"txt, rtf" = *.txt und *.rtf
"txt, rtf, html" = *.txt und *.rtf und *.html


Gruß Dieter
Member: goodbytes
goodbytes Sep 09, 2009 at 14:38:42 (UTC)
Goto Top
Hallo Dieter,

also, wenn ich nur "*" eingebe kommt der Fehler, allerdings erfolgt das Ersetzen bei rtf und html (zumindest bei einem Begriff) erfolgreich, die txt ist leer.

Mit "*.*", also wie man es normalerweise angibt, kommt der Fehler nicht, aber es findet auch keinerlei Ersetzung in einer der Dateien statt.

Aber mal noch eine andere Frage. Vielleicht stand da schon mal jemand vor so einem kleinen Problem. Es geht auch wieder um Ersetzen, nur etwas anders.

es handelt sich hier um eine html-Datei von meiner ziemlich einfach gestrickten Website für einen Frame mit Thumbnails.
Es kommen ab und zu sehr viele Bilder auf einmal dazu, welche ich als zusätzliche Zeilen einfügen muss. Ich kopiere immer die letzten zwei Zeilen so oft, wie ich neue Bilder habe manchmal gleich so 150 Stück). Kann ich da irgendwie mit einer vbs die Nummerierungen auf einen Rutsch fortlaufend ersetzen z.B. 009.htm und 009.jpg in 010.htm und 010.jpg usw., oder dass sich das Script gleich die Anzahl der neuen jpg`s aus einem definierten Verzeichnis ausliest (dann würde auch das Kopieren am Anfang entfallen)?

Das würde viel Arbeit ersparen (statt mühevoller Tipparbeit immer). Das ganze muss ich ja für zwei im Aufbau identische Frames machen.

Hier die immer gleich aufgebauten zwei Zeilen:

...
<p align="center">  
<a href="pages/Linus/001.htm" target="Hauptframe"><img border="0" src="thumbnails/Linus/001.jpg" width="56" height="75"></p>  
<p align="center">  
<a href="pages/Linus/002.htm" target="Hauptframe"><img border="0" src="thumbnails/Linus/002.jpg" width="56" height="75"></p>  
<p align="center">  
<a href="pages/Linus/003.htm" target="Hauptframe"><img border="0" src="thumbnails/Linus/003.jpg" width="56" height="75"></p>  
...

Torsten
Mitglied: 76109
76109 Sep 09, 2009 at 15:49:21 (UTC)
Goto Top
Hallo Torsten!

Es wird auf Gleich getestet D.h. Wenn(Input = "*";Dann *.txt und *.rtf und *.html akzeptieren;Sonst überspringen). Alle Dateien bei denen die Dateierweiterung (nach dem Punkt) übereinstimmt wird bearbeitet. Siehe Code Zeile 37 <Variable Extension = Dateierweiterung.

Dein Html-Kopieren wäre auch einfach zu realisieren, aber scheinbar funktioniert ja schon ein einfaches Ersetzen mit den vorherigen Dateien nicht.Und ich habe keine Ahnung wieso? Bei mir funktionierts problemlos. Du könntest mal ein Stück Text aus einer Textdatei in code-Tags setzen.

In Code-Zeile 48 habe ich die Replace-Anweisung erweitert. D.h. Textvergleich ohne Unterscheidung zwischen Groß/Kleinschreibung.

Gruß Dieter
Member: goodbytes
goodbytes Oct 03, 2009 at 11:24:18 (UTC)
Goto Top
Hallo Dieter,
sorry, dass ich erst jetzt Zeit zum Antworten finde.

Das Ersetzen klappt ja jetzt im Prinzip auch. Es dürfen halt nur keine Leerzeichen enthalten sein. Da dies aber bei mir der Fall war gab es da Probleme. Hab`s jetzt aber nach und nach so fertigbekommen.

Das Erzeugen der HTML-Dateien mit den entsprechenden Nummerierungen gemäss der in einem bestimmten Verzeichnis vorhandenen JPG-Dateien würde mich dennoch interessieren. Die Nummierierung der JPG`s stellt ja hierbei kein Problem dar. Wie könnte ich es am besten hinbekommen? Das würde viel Zeit sparen.

Gruß Torsten
Mitglied: 76109
76109 Oct 08, 2009 at 10:12:44 (UTC)
Goto Top
Hallo TorstenB!

Sorry, Im Moment habe ich wenig Zeitface-smile

Das mit den Leerzeichen habe ich nicht so ganz verstanden. Gib mal ein Beispiel.

Die HTML-Dateien müssen leider noch ein paar Tage wartenface-wink

Gruß Dieter
Member: goodbytes
goodbytes Oct 12, 2009 at 11:05:08 (UTC)
Goto Top
Hallo Dieter,
ich komme auch leider erst heute zum Antworten; hab momentan auch 'ne Menge um die Ohren.

Wenn eine Zeichenkette wie z. B.:
Dies soll ersetzt werden
genommen wird macht er es nicht. Wenn ich dagegen nur nach:
Dies
suche ersetzt das Skript es.

Gruß Torsten
Mitglied: 76109
76109 Oct 12, 2009 at 12:05:52 (UTC)
Goto Top
Hallo TorstenB!

Sorry, aber das kann ich absolut nicht nachvollziehen. Bei mir funktioniert's und vom Script her müsste es auch funktionieren. Bleibt die Frage, ob die Leerzeichen auch wirklich Leerzeichen (20h) sind. Ich denke, irgendetwas stimmt mit Deinen Dateien nicht.

Gruß Dieter
Member: goodbytes
goodbytes Oct 13, 2009 at 13:02:43 (UTC)
Goto Top
Hallo Dieter,
ich werd noch mal in Ruhe schauen was mit den Dateien los ist.
Vielen Dank auf jeden Fall erstmal für deine tolle Hilfe !!! face-smile

Wenn du mal bei Gelegenheit ein bissl Zeit hast, kannst du mir da vielleicht einen Tipp geben wie ich es auf der Grundlage des jetzigen Skripts mit meinen HTML-Dateien anfangen könnte? Da es dort eine einfache Nummerierung ist stoße ich zumindest nicht auf das Problem mit den Leerzeichen.

Gruß Torsten
Mitglied: 76109
76109 Oct 14, 2009 at 06:33:13 (UTC)
Goto Top
Hallo Torsten!

Die Variante, die Bilder aus einem Verzeichnis einzulesen erscheint mir sinnvoller. Was mir aber noch nicht so ganz klar ist, wie die Bilder in dem Verzeichnis vorliegen. D.h. wenn, wie in Deinem Beispiel schon 3 Bilder definiert sind, befinden sich diese Bilder auch in diesem Verzeichnis und die neuen Bilder haben schon eine fortlaufender Nummer oder haben sie noch keine Nummer und sollen automatisch in eine fortlaufende Nummer erhalten, wobei das erste eingelesene Bild, dass noch noch keine Nummer hat eine fortlaufende Nummer erhalten soll?

Gruß Dieter
Member: goodbytes
goodbytes Oct 15, 2009 at 08:52:49 (UTC)
Goto Top
Hallo Dieter,
ich war gestern unterwegs und kann deshalb erst heute antworten.

Meine Website ist folgendermaßen aufgebaut (hier als Beispiel mit dem einen Unterordner "Linus", es gibt noch einen zweiten Unterordner neben diesem; es):

.\images\Linus\001.jpg <--- Hier füge ich die fertigen neuen Bilder hinzu mit fortlaufender Nummerierung.
.\thumbnails\Linus\001.jpg <--- Hier füge ich genau wie bei images die Miniaturansichten hinzu.
.\pages\Linus\001.htm <--- Hier gibt es pro Bild eine Website, welche dann im rechten Frame erscheint.

Die Struktur ist sehr einfach aufgebaut, reicht mir ja auch so hin. Ich kopiere praktisch die fertig bearbeiteten Bilder jeweils in den entsprechenden Ordner, nachdem ich sie umbenannt habe (wenn das letzte Bild vorher die Nummer 421.jpg hatte hat das erste von den neuen Bildern jetzt die 422.jpg. Zu jedem großen Bild gibt es natürlich ein kleines Bild mit dem gleichen Dateinamen. In beiden Ordnern ist also immer die gleiche Anzahl von Dateien.

Nach dem Reinkopieren der Bilder fehlen praktisch nur noch dei dazugehörigen HTML-Dateien in dem Ordner "pages" (als Dateiname immer die selbe Nummer wie die JPG`s).

Ich muss mir nun eine der schon vorhandenen HTML-Dateien nehmen (z.B. die 421.htm und die so oft kopieren wie die Anzahl der neuen Bilder ist, dann entsprechend umbenennen in die 422.htm und in der Datei alle Zahlenfolgen "421" mit "422" ersetzen, damit die HTML-Datei das richtige Bild einbindet).

Damit die Dateien im thumbnails-Ordner im rechten Frame der Website angezeigt werden muss ich nun noch für jede neue HTML-Datei im Ordner "pages" zwei neue Zeilen in die für den Frame zuständige HTML-Datei direkt im Root-Verzeichnis ("left.html") erzeugen. Die erste Zeile ist immer nur:
<p align="center">  
(Ist eigentlich Quatsch; es reicht ja wenn ich es einmal am Anfang schreibe und nur zum Schluss mit "</p> beende. Werde ich jetzt auch so machen; also ist es nur noch eine Zeile.)

Jede Zeile für ein Thumbnail sieht jetzt praktisch so wie in diesem Beispiel aus:
<a href="pages/Linus/057.htm" target="Hauptframe"><img border="0" src="thumbnails/Linus/057.jpg" width="60" height="75"><br><br>  
wenn nach dem letzten
<br><br>
also eine Leerzeile kommt ab da müssen die neuen Zeilen rein.

Zum Schluss muss ich dann noch jeweils die tatsächliche Höhe und Breite der jeweiligen Miniaturansicht anpassen, da sie nicht immer gleich sind.
... width="56" height="75" ...  
Diesen Schritt wird man wohl kaum automatisieren können.

Puh, hoffentlich habe ich es halbwegs so geschrieben, dass man es auch verstehen kann...

Gruß Torsten
Mitglied: 76109
76109 Oct 15, 2009 at 09:23:12 (UTC)
Goto Top
Hallo Torsten!

Erstmal Danke für die umfangreiche Infoface-smile

Ob und wie man die Bildergröße in VBS ermitteln kann, muss ich erst mal austesten.

Gruß Dieter
Member: goodbytes
goodbytes Oct 15, 2009 at 09:39:05 (UTC)
Goto Top
Hallo Dieter,
aha, meinst du so was würde auch gehen? Das wäre ja ein Ding...
Dann glaube ich schon langsam du kannst zaubern... face-wink

Ich hab die verbleibende einzige Zeile pro Thumbnail in der "left.htm" in meinem letzten Kommentar noch mal mit eingefügt. Es gibt übrigens noch eine "right.htm" im Root-Verzeichnis für den rechten Frame mit Thumbnails, da es wie schon angedeutet noch einen zweiten Unterordner neben "Linus gibt, welcher "Andreas" heißt (ich habe zwei kleine Söhne). Die großen Bilder sind dann also in der Mitte zu sehen. Ich würde, wenn ich Bilder in beiden Ordnern hinzugefügt habe ein Skript also zweimal drüberlaufen lassen.

Nur der Vollständigkeit halber...

Gruß Torsten
Mitglied: 76109
76109 Oct 15, 2009 at 10:33:17 (UTC)
Goto Top
Hallo Torsten!

Nö, zaubern kann ich beim besten Willen nichtface-smile

Frage: Was passiert, wenn keine Größenangaben gemacht werden?
Wird das Bild dann nicht in seiner Originalgröße angezeigt?

Gruß Dieter
Member: goodbytes
goodbytes Oct 15, 2009 at 14:03:22 (UTC)
Goto Top
Hallo Dieter,
eigentlich natürlich schon, aber die Bilder unterscheiden sich dummerweise schon etwas in der Größe. Das hatte sich am Anfang irgendwie so ergeben.

Ich müsste dann höchstens alle, die jetzt auf der Website sind durchgehen und auf eine einheitliche Breite bringen. Wäre vielleicht wirklich besser. Ja, das mach ich dann so. Dann lasse ich die Größenangabe weg.

Ich kann dir ja mal irgendwie den Link zukommen lassen, dass du dir ein Bild davon machen kannst. Hier möchte ich ihn aber natürlich jetzt nicht reinsetzen.

Gruß Torsten
Mitglied: 76109
76109 Oct 15, 2009 at 15:11:27 (UTC)
Goto Top
Hallo Torsten!

Also, über Windows Bildaten auszulesen ist recht komplex und sehr aufwendig, aber ich habe gerade eine einfachere Möglichkeitkeit gefunden, die Bildgröße direkt aus der Bild-Datei in Pixel auszulesen. Unabhängig davon ob Du das jetzt noch benötigst oder nicht, werde ich es trotzdem mal als Funktion zusammenbasteln, damit sich die googelei auch gelohnt hatface-smile

Gruß Dieter

PS. Den Link kannst Du auch per Nachricht im Admin-Postfach hinterlegen.
Member: goodbytes
goodbytes Oct 15, 2009 at 20:54:22 (UTC)
Goto Top
Hallo Dieter,
hab dir eben den Link zugeschickt.

Die Thumbnail-Größen habe ich eben alle angepasst; somit ist jetzt auch in der "left.htm" bzw. "right.htm" keine Größenangabe mehr nötig.

Nur diese eine Zeile pro Bild:
<a href="pages/Linus/001.htm" target="Hauptframe"><img border="0" src="thumbnails/Linus/001.jpg"><br><br>  

Aber interessant ist es natürlich trotzdem, wie man per Skript in einem Rutsch die Pixelgrößen auslesen und diese Angaben weiterverwenden kann...

Gruß Torsten
Mitglied: 76109
76109 Oct 15, 2009 at 22:02:04 (UTC)
Goto Top
Hallo Torsten!

Eine Funktion zum auslesen der Pixelgrößen habe ich hingekriegt. Der Code hat bei zahlreichen Tests einwandfrei funktioniert. Von daher werde ich den Code dann auch so mit einbinden, das er jederzeit mit minimalem Aufwand aktiviert werden kann. Seperat dazu geht auch ein Script, das ganze Ordner ausliest und die Pixelgrößen in eine Log schreibt. Oder wie auch immer?

Deinen Link werde ich mir jetzt im Anschluß noch anschauen, damit ich mal ein besseres Bild von dem ganzen bekommeface-smile

Gruß Dieter
Member: goodbytes
goodbytes Oct 16, 2009 at 05:38:36 (UTC)
Goto Top
Hallo Dieter,
das wäre ja super, wenn das mit den HTML-Dateien klappen würde. Das würde mir dann jedes Mal viel Arbeit beim Aktuallisieren der Website sparen. face-smile

Ich habe mir übrigens doch noch mal die drei Dateitypen zwecks Ersetzen mit dem Editor genauer angeschaut. Bei den txt`s stand auch alles korrekt hintereinander (auch mit Leerzeichen). Da klappte es ja auch.

Probleme gab es dann ja nur bei den rtf und html. Als ich sie mir mit dem Editor anschaute kam mir das blanke Grausen was Word beim Erstellen so angestellt hatte! Da konnte es auch nicht gehen... face-sad

Es hat die zu ersetztenden Abschnitte in diesen beiden Dateitypen komplett auseinandergerupft und unsinnigerweise mit unendlich viel Formatierungen dazwischen "garniert". Vielleicht kam dieser Unsinn zustande, weil die Ursprungsdateien mit Word aus Outlook heraus erstellt wurden.

Als ich nun endlich mal eine saubere html und rtf erstellt habe lief es absolut sauber durch. face-smile
Ist nur am Anfang durch den Pfad mit Leerzeichen gestolpert.

Geht also 100%-ig !!! Ich bin begeistert !!! Es lag also doch definitiv an meinen Dateien. Hätte eigentlich auch schon mal eher mit dem Editor reinschauen können. face-sad

Also vielen vielen Dank für diese saubere Lösung !!!

Gruß Torsten
Mitglied: 76109
76109 Oct 16, 2009 at 20:47:29 (UTC)
Goto Top
Hallo Torsten!

Wußt ich's doch, dass Deine Dateien Schrott sind face-smile

Den Vorschlag, die Dateien mal im normalen Text- und Hex-Editor anzusehen, hatte ich aber auch schon mal vorgeschlagen?

Das andere ist in Arbeit.

Ein schönes WE

Gruß Dieter
Mitglied: 76109
76109 Oct 18, 2009 at 11:48:34 (UTC)
Goto Top
Hallo Torsten!

Wenn ich richtig liege, dann müsste die Ordnerstruktur so aussehen:

..\Home\Left- und Right.Htm und andere

..\Home\Pages\Name

..\Home\Thumbnails\Name

..\Home\Images\Name

Ist das so richtig?

Gruß Dieter
Member: goodbytes
goodbytes Oct 19, 2009 at 16:47:04 (UTC)
Goto Top
Hallo Dieter,
ja, du hast natürlich recht; ich hätte wirklich eher genauer in die Dateien reinschauen sollen. Sorry, Asche auf mein Haupt ... face-sad

Mit der Ordnerstruktur hast du so recht. Die left- und right.htm liegen direkt im root-Verzeichnis der Website. Der Rest genau so in den Unterordnern mit den Vornamen der beiden Kleinen.

Gruß Torsten
Mitglied: 76109
76109 Oct 19, 2009 at 17:46:06 (UTC)
Goto Top
Hallo Torsten!

Mhm, was machst Du eigentlich mit der vielen Zeit, die Du durch das Script einsparstface-smile. Mit ca 260 Bilder pro Name, also insgesamt 1040 Thumbnails- und Image-Bilder ), hat's bei mir knapp 5 Sekunden gedauert, die Pages-, Left- und Right.Htm's zu erstellen?

Die Vorlage-Dateien müsstest Du per Mail an Deine Web-Mail-Adresse bereits erhalten habenface-wink


back-to-topFunktion des Scripts "CreateHtmFiles.vbs"
- Als Ausgangsbasis werden die Bilder in dem Ordner <Thumbnails> herangezogen
- Die Reihenfolge ist auf die Bildnummer gerichtet.
- Die Bild-Nummern müssen nicht fortlaufend sein. Fehlt z.B. 002.jpg, dann wird eben 1,3,4.. gezählt
- Die Bildnummern können auch 4 oder 5-stellig sein oder sonst eine beliebige sortierbare Bezeichnung haben
- Anhand der Bilder werden die Htm-Dateien Pages Nummer.htm, die Left.htm und Right.htm erstellt/überschrieben
- Zusätzlich zu allen Pfadangaben werden in den Htm's auch die Bildgrößen mit eingefügt (Images u. Thumbnails)


back-to-topDer Ablauf:
- Kopiere Deinen Home-Ordner in einen Test-Ordner
- Füge im Home-Ordner das Script "CreateHtmFiles.vbs" und die Vorlage-Dateien (*.ht) ein.
- Starte das Script
- Siehe und staune, sofern alles rundläuft?

Kopiere den Quelltext und speichere ihn z.B. unter CreateHtmFiles.vbs im Home-Ordner ab:
Option Explicit

Const Name1 = "andreas"                 'Left  
Const Name2 = "linus"                   'Right  

Const HtmLeft = "left.Ht"  
Const HtmRight = "right.Ht"  
Const HtmPages = "pages.Ht"  

Const FdPages = "pages\"                'Unterordner  
Const FdImages = "images\"  
Const FdThumbnails = "thumbnails\"  

Const adVarChar = 200                   'Konstanten für ADO-Recordset  
Const adFldIsNullable = 32

Const Msg1 = "Die Erstellung der Htm-Dateien ist abgeschlossen."  

Const Err1 = "Die Ordnerstruktur ist fehlerhaft!"  
Const Err2 = "Htm-Vorlage (*.ht) nicht gefunden!"  
Const Err3 = "Die Image-Datei existiert nicht: "  

'*.ht = [Var $1 = Bild-Nr]  [Var $2 = Name]  [Var $3 = Width]  [Var $4 = Height]  

Dim Fso, JpgRec, P0, P1, P2, P3, TP, F1, F2, F3, TF, i

'Main Beg  
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    P0 = Fso.GetParentFolderName(WScript.ScriptFullName) & "\"  

    P1 = P0 & FdPages:  P2 = P0 & FdImages:  P3 = P0 & FdThumbnails
    
    TP = Array(P1, Name1, P1, Name2, P2, Name1, P2, Name2, P3, Name1, P3, Name2)
    
    For i = 0 To UBound(TP) Step 2
        If Fso.FolderExists(TP(i) & TP(i + 1)) = False Then MsgBox Err1, vbExclamation, "Fehler":  WScript.Quit  
    Next
    
    TF = Array(HtmLeft, HtmRight, HtmPages)
    
    For i = 0 To UBound(TF)
        If Fso.FileExists(P0 & TF(i)) = False Then MsgBox Err2, vbExclamation, "Fehler":  WScript.Quit  
    Next
    
    Call InitHtmFiles(Name1):  Call InitHtmFiles(Name2)
    
    MsgBox Msg1, vbInformation, "Meldung":  WScript.Quit  

'Main End  


Private Sub InitHtmFiles(ByRef User)
    Dim File, Text, Jpg, jpgNum, jpgInf
    
    On Error Resume Next
    
    Fso.DeleteFile (P1 & User & "\*.htm")  
    
    On Error GoTo 0
    
    Set File = Fso.OpenTextFile(P0 & HtmPages):  Text = File.ReadAll:  File.Close
    
    Call OpenJpgRec
    
    For Each Jpg In Fso.GetFolder(P3 & User).Files
        If LCase(Right(Jpg.Name, 4)) = ".jpg" Then  
            jpgNum = Fso.GetBaseName(Jpg.Name)
            jpgInf = GetJpgInfo(Jpg.Path)
            Call WriteJpgRec(jpgNum, User, jpgInf(0), jpgInf(1))
            Call CreatePagesFile(jpgNum, User, Text)
        End If
    Next
    
    If User = Name1 Then
        Call CreateControlFile(P0 & HtmLeft)
    ElseIf User = Name2 Then
        Call CreateControlFile(P0 & HtmRight)
    End If
End Sub
    
Private Sub CreatePagesFile(ByRef jpgNum, ByRef User, ByRef Text)
    Dim File, PathP, PathI, TextP, jpgInf
    
    PathP = P1 & User & "\" & jpgNum & ".htm"  
    
    PathI = P2 & User & "\" & jpgNum & ".jpg"  
    
    If Fso.FileExists(PathI) = False Then MsgBox Err3 & PathI, vbExclamation, "Fehler":  WScript.Quit  
    
    jpgInf = GetJpgInfo(PathI)
            
    TextP = GetVarText(Text, jpgNum, User, jpgInf(0), jpgInf(1))
    
    Set File = Fso.CreateTextFile(PathP):  File.Write TextP:  File.Close
End Sub

Private Sub CreateControlFile(ByRef Path)
    Dim File, Text, Line
    
    Set File = Fso.OpenTextFile(Path):  Text = Split(File.ReadAll, "#?#"):  File.Close  
    
    If UBound(Text) = 2 Then
        Set File = Fso.CreateTextFile(Path & "m"):  File.Write Text(0)  
        
        With JpgRec
           .Sort = "Num"  
           .MoveFirst
            Do Until .EOF
                Line = GetVarText(Text(1), .Fields(0), .Fields(1), .Fields(2), .Fields(3))
                File.WriteLine Line
               .MoveNext
            Loop
        End With
        
        File.Write Text(2)
    End If
    
    JpgRec.Close:  File.Close
End Sub

Private Sub OpenJpgRec()
    Set JpgRec = CreateObject("ADOR.Recordset")  
    With JpgRec.Fields
        .Append "Num", adVarChar, 32, adFldIsNullable  
        .Append "User", adVarChar, 32, adFldIsNullable  
        .Append "Width", adVarChar, 16, adFldIsNullable  
        .Append "Height", adVarChar, 16, adFldIsNullable  
         JpgRec.Open
    End With
End Sub

Private Sub WriteJpgRec(ByRef jpgNum, ByRef User, ByVal jpgWidth, ByVal jpgHeight)
    With JpgRec
        .AddNew
        .Fields("Num") = jpgNum  
        .Fields("User") = User  
        .Fields("Width") = jpgWidth  
        .Fields("Height") = jpgHeight  
        .Update
    End With
End Sub

Private Function GetJpgInfo(ByRef Path)
    Dim File, c, s, jpgWidth, jpgHeight
    
    Set File = Fso.OpenTextFile(Path)
  
    GetJpgInfo = Array("", "")  
    
    If File.Read(2) = Chr(&HFF) & Chr(&HD8) Then
        Do While File.Read(1) = Chr(&HFF)
            c = Asc(File.Read(1))
            
            s = File.Read(Asc(File.Read(1)) * 256 + Asc(File.Read(1)) - 2)
            
            If c = &HC0 Or c = &HC2 Then
                jpgWidth = Asc(Mid(s, 4, 1)) * 256 + Asc(Mid(s, 5, 1))
                jpgHeight = Asc(Mid(s, 2, 1)) * 256 + Asc(Mid(s, 3, 1))
                GetJpgInfo = Array(jpgWidth, jpgHeight):  Exit Do
            End If
        Loop
    End If
    File.Close
End Function

Private Function GetVarText(ByRef Text, ByVal s1, ByVal s2, ByVal s3, ByVal s4)
    Dim Arg, i
    
    GetVarText = Text:  Arg = Array(0, s1, s2, s3, s4)
    
    For i = 1 To UBound(Arg)
        GetVarText = Replace(GetVarText, "$" & (i), Arg(i))  
    Next
End Function


back-to-topNoch eine Anmerkung zu den Vorlage-Dateien (*.ht):
Das sind normale Htm-Dateien, in denen an verschiedenen Stellen eine Variable steht. In diesem Fall sind es die Variablen "$1", "$2", "$3" und "$4" und werden durch einen Namen, eine Bildnummer und der Bildgröße Width und Height ersetzt.

Gruß Dieter

[edit] Letzte Änderung 21.10.2009 13:30 Die GetJpgInfo-Funktion optimiert [/edit]
Mitglied: 76109
76109 Oct 20, 2009 at 10:11:00 (UTC)
Goto Top
Hallo!

Die Bildgröße auszulesen, würde auch so gehen. Allerdings ist diese Methode um ein vielfaches langsamer.

    Set Shell = CreateObject("Shell.Application")  
Die Prozedur ab Zeile 54 würde dann so aussehen:
Private Sub InitHtmFiles(ByRef User)
    Dim File, Path, Text, Jpg, JpgNum, jpgWidth, jpgHeight
    
    On Error Resume Next
    
    Fso.DeleteFile (P1 & User & "\*.htm")  
    
    On Error GoTo 0
    
    Set File = Fso.OpenTextFile(P0 & HtmPages):  Text = File.ReadAll:  File.Close
    
    Call OpenJpgRec
    
    Path = P3 & User
    
    For Each Jpg In Shell.Namespace(Path).Items
        If LCase(Right(Jpg.Name, 4)) = ".jpg" Then  
            JpgNum = Fso.GetBaseName(Jpg.Name)
            jpgWidth = Split(Shell.Namespace(Path).GetDetailsOf(Jpg, 27))(0)
            jpgHeight = Split(Shell.Namespace(Path).GetDetailsOf(Jpg, 28))(0)
            Call WriteJpgRec(JpgNum, User, jpgWidth, jpgHeight)
            Call CreatePagesFile(JpgNum, User, Text)
        End If
    Next
    
    If User = Name1 Then
        Call CreateControlFile(P0 & HtmLeft)
    ElseIf User = Name2 Then
        Call CreateControlFile(P0 & HtmRight)
    End If
End Sub
Und die Funktion <GetJpgInfo> würde ganz entfallen

Gruß Dieter
Member: goodbytes
goodbytes Oct 20, 2009 at 17:01:48 (UTC)
Goto Top
Hallo Dieter,
also das klappt ja echt perfekt (und auch sehr schnell) Habs mit dem (noch) aktuellen Stand der Website probiert) face-smile

Du hast recht - es ist ja Wahnsinn was ich mit dem Script an Zeit spare. Ich denke ich werde die gewonnene Zeit meinen Beiden kleinen Jung`s zugute kommen lassen (um die Beiden geht`s ja schließlich auf meiner Website). Die freuen sich, wenn Papa mal abends mehr Zeit hat um mit Bausteinen Burgen zu bauen usw. face-smile

Ich finde es auch gut, dass mich das Script (logischerweise) "angemeckert" hat, dass die Datei "062.jpg" gefehlt hat. Da vom Thumbnails-Ordner ausgegangen wird, wo eine Datei "062.jpg" existierte, im Ordner "images" aber versehentlich nicht, lief das Script auf einen Fehler. Aber so bekommt man es wenigstens auch mit.

Die Bildgröße hab ich den ht-Dateien erstmal vorläufig rausgenommen, da ich alle Thumbnails in der Größe angepasst habe. Kann aber sein, dass ich die Website mal irgendwie umkrempel und dann mit Sicherheit diese Funktion benötige.

Dein letztes Posting zwecks der Bildgröße werde ich morgen mal einfügen.

Momentan möchte ich dir aber erstmal ganz ganz ganz dick Danke !!! sagen für deine Mühe !!! face-smile
Hast du mächtig gut gebastelt.

Einen schönen Abend wünsch ich dir noch!

Gruß Torsten
Mitglied: 76109
76109 Oct 20, 2009 at 17:14:07 (UTC)
Goto Top
Hallo TorstenB!

Yep, habe ich doch gern getan - aber nur - damit Du mehr Zeit für Deine Kinder und Deine Frau aufbringst.

Den letzten Code-Schnipsel würde ich NICHT einfügen. Er ist zwar kürzer und vielleicht auch hübscher, aber er ist viel viel viel langsamer, als der im Hauptscript.
Den Code habe ich eigentlich nur der Vollständigkeit halber gepostet, um zu zeigen, wie es auch geht.

Na, dann noch viel Spaßface-smile

Gruß Dieter

PS Das Hauptscript wurde geändert. GetJpgInfo-Funktion optimiert
Member: goodbytes
goodbytes Oct 21, 2009 at 13:59:31 (UTC)
Goto Top
Hallo Dieter,
ich hab gestern abend schon mal einen ganzen Schwung Bilder bearbeitet und dann heute mit deinem Script die htm's erzeugt (hab die Änderung im Script mit reingenommen). Einfach Klasse, was das für Zeit spart. Vor allem kann ich jetzt auch in der Nummerierung dazwischen schnell mal Bilder einfügen, da die htm`s ja ohnehin neu erzeugt werden.

Vielen vielen Dank nochmal !!! face-smile

Gruß Torsten
Mitglied: 76109
76109 Oct 21, 2009 at 14:13:21 (UTC)
Goto Top
Hallo Torsten!

Zitat von @goodbytes:
Vor allem kann ich jetzt auch in der Nummerierung dazwischen schnell mal Bilder einfügen, da die htm`s ja ohnehin neu erzeugt werden.
Ja, da kann man mal sehen, dass ich ein weinig mitgedacht habeface-wink

Freut mich, dass Du zufrieden bistface-smile

Gruß Dieter