Quantcast
Channel: VBA Code pur...
Viewing all 93 articles
Browse latest View live

Daten Spalte C nach Monat in neue Tabellenblätter aufteilen - Spezialfilter...

$
0
0
Frage: Alle Buchungen aus dem Jahre 2013 befinden sich auf einem Tabellenblatt. Das Datum steht in Spalte C. Die Daten müssen in neue Tabellenblätter aufgeteilt werden. Die Daten müssen nach Monat kopiert werden. Wie geht das?

All bookings from the year 2013 are on a worksheet. The date is in column C. The data must be divided into new worksheets. The data must be copied by month. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
Daten Spalte C nach Monat in neue Tabellenblätter aufteilen - Spezialfilter...[XLS 250 KB]

OptionExplicit
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 21.01.2014
' Purpose : Daten Spalte C Datum - Monat in Tabellenblätter aufteilen...
'--------------------------------------------------------------------------
PublicSubMain()
' Variablendeklaration
DimCriteriaSheetAsWorksheet
DimSourceSheetAsWorksheet
DimrngCriterionAsRange
DimwksNewAsWorksheet
DimwksTMPAsWorksheet
DimlngLastRowAsLong
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
' Das Bildschirmaktualisierung wird unterbrochen
.ScreenUpdating=False
' Ereignisroutinen werden deaktiviert
.EnableEvents=False
' Auslesen der momentanen Einstellung für die Berechnung
lngCalc=.Calculation
' Setzen der Berechnung auf "Manuell"
.Calculation=xlCalculationManual
' Eingabeaufforderungen und Warnmeldungen unterdrücken
.DisplayAlerts=False
EndWith
' Schleife über jeder Tabellenblatt in dieser Datei
ForEachwksTMPInThisWorkbook.Worksheets
' Wenn mehr als 1 Tabellenblatt vorhanden ist, dann...
IfwksTMP.Index>1Then
' ... lösche es
wksTMP.Delete
EndIf
NextwksTMP
' Tabellenblatt mit den Grunddaten - Name ANPASSEN
SetSourceSheet=Worksheets("2013")
' Ein Kriterientabellenblatt wird hinzugefügt
SetCriteriaSheet=Worksheets.Add
' Und an das Ende verschoben
CriteriaSheet.MoveAfter:=_
ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
' Ermittelt die letzte belegte Zeile im Quelltabellenblatt Splate C
lngLastRow=SourceSheet.Range("C"&Rows.Count).End(xlUp).Row
' Füge eine Hilfsspalte im Quelltabellenblatt vor Spalte A ein
SourceSheet.Range("A1").EntireColumn.Insert
' Setzt eine Überschrift
SourceSheet.Range("A1").Value="TEMP"
' Per Formel die Monatszahl in jede Zelle schreiben
SourceSheet.Range("A2:A"&lngLastRow).Formula="=Month(D2)"
' Dann die Kriterien ohne Doppelte ins Lriterientabellenblatt kopieren
SourceSheet.Range("A1:A"&lngLastRow).AdvancedFilter_
Action:=xlFilterCopy,_
CopyToRange:=CriteriaSheet.Range("A1"),Unique:=True
' Das erste Kriterium zuweisen
SetrngCriterion=CriteriaSheet.Range("A2")
' So lange schleifen, bis kein Kriterium mehr vorhanden ist
WhilerngCriterion.Value<>""
' Neues Tabellenblatt
SetwksNew=Worksheets.Add
' Ans Ende stellen
wksNew.MoveAfter:=_
ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
' Über Spezialfilter den jeweiligen Monat kopieren
SourceSheet.Range("A1:H"&lngLastRow).AdvancedFilter_
Action:=xlFilterCopy,_
CriteriaRange:=rngCriterion.Offset(-1).Resize(2),_
CopyToRange:=wksNew.Range("A1")
' Tabellenblatt mit Monatsnamen benennen
wksNew.Name=Format(wksNew.Range("D2").Value,"MMMM")
' Die temporäre erste Spalte löschen
wksNew.Columns("A").Delete
' Das erledigte Kriterium löschen
rngCriterion.EntireRow.Delete
' Setze die Objektvariablen auf Nothing
SetrngCriterion=Nothing
SetwksNew=Nothing
' Das nächste Kriterium zuweisen
SetrngCriterion=CriteriaSheet.Range("A2")
Wend
' Die temporäre Spalte auch im Quelltabellenblatt löschen
SourceSheet.Columns("A").Delete
' Wenn ein Kriterientabellenblatt vorhanden ist, lösche es
IfNotCriteriaSheetIsNothingThenCriteriaSheet.Delete
Fin:
' Die Applikation aufwecken
WithApplication
' Gehe zum Quelltabellenblatt nach A1
.GotoSourceSheet.Range("A1"),True
' Bildschirmaktualisierung wieder einschalten
.ScreenUpdating=True
' Ereignisroutinen werden wieder aktiviert
.EnableEvents=True
' Setzen der Berechnung auf den gemerkten Wert
.Calculation=lngCalc
' Eingabeaufforderungen und Warnmeldungen wieder zulassen
.DisplayAlerts=True
' Abbrechen Ausschneide- bzw. Kopiermodus und entfernen des Laufrahmens
.CutCopyMode=True
EndWith
' Setze die Objektvariablen auf Nothing
SetCriteriaSheet=Nothing
SetSourceSheet=Nothing
SetrngCriterion=Nothing
SetwksNew=Nothing
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

Outlook - neueste Mail mit bestimmtem Betreff - Informationen ausgeben...

$
0
0
Frage: Im Ordner Posteingang sind mehrere Mails mit dem gleichen Betreff. Von diesen Mails benötige ich die Neueste. Im folgenden Beispiel wird die Mailadresse und der Name des Absenders angezeigt. Zusätzlich noch die Empfangszeit der Mail.

In the Inbox folder are several emails with the same subject. Of these mails I need the latest. In the following example, the email address and the name of the sender is displayed. In addition the time of receipt of mail.

Hier noch eine Beispieldatei / Here's a sample file:
Outlook - neueste Mail mit bestimmtem Betreff - Informationen ausgeben...[XLS 50 KB]

OptionExplicit
' Variable um bei schon geöffnetem Outlook dieses nicht zu schliessen
DimblnTMPAsBoolean
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 09.04.2014
' Purpose : Outlook Subject mehrere gleiche neueste Infos ausgeben...
'--------------------------------------------------------------------------
PublicSubMain()
' Variablendeklaration
DimobjNameSpaceAsObject
DimobjFolderAsObject
DimobjItemAsObject
DimstrTMPAsString
DimobjAppAsObject
DimdatTimeAsDate
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Objektvariable mit Outlookapplikation belegen
SetobjApp=OffApp("Outlook")
' Wenn die Applikation vorhanden ist...
IfNotobjAppIsNothingThen
' Eine Outlook-Sitzung anlegen
' GetNamespace("MAPI") und Session sind austauschbar
SetobjNameSpace=objApp.Session'GetNamespace("MAPI")
' Konstante für Posteingang
ConstolFolderInbox=6
' Objektvariable mit Posteingang belegen
SetobjFolder=objNameSpace.GetDefaultFolder(olFolderInbox)
' Wenn Mails im Posteingang sind, dann...
IfobjFolder.Items.Count>0Then
' Temporäre Zeit vorgeben
datTime="01.01.1900 00:00:00"
' Jede Mail im Ordner Posteingang durchgehen
ForEachobjItemInobjFolder.Items
WithobjItem
' Wenn der Betreff mit "Test" beginnt und
' irgendwie weitergeht, dann...
If.SubjectLike"Test*"Then
' Wenn die Empfangszeit > der
' temporären Zeit ist, dann...
If.ReceivedTime>datTimeThen
' Setze die temporäre Zeit neu
datTime=.ReceivedTime
' Hole Informationen in Stringvariable
' Hier Mailadresse und Name des Senders
' dann noch die Empfangszeit
strTMP=.SenderEmailAddress&" / "&_
.SenderName&" / "&.ReceivedTime
EndIf
EndIf
EndWith
' Nächste Mail
NextobjItem
' Wenn die temporäre Zeit unterschiedlich ist, dann...
IfdatTime<>"01.01.1900 00:00:00"Then
' Gib die gesammelten Informationen aus
MsgBoxstrTMP
EndIf
Else
' Es sind keine Mails im Posteingang
MsgBox"There are "&objFolder.Items.Count&" message(s) in your inbox."
EndIf
Else
' Kein Outlook installiert
MsgBox"Application not installed!"
EndIf
Fin:
' Wenn die Applikation nicht offen war, schliesse sie
IfNotobjAppIsNothingThen
IfblnTMP=TrueThen
objApp.Quit
blnTMP=False
EndIf
EndIf
' Setze die Objektvariablen auf Nothing
SetobjFolder=Nothing
SetobjNameSpace=Nothing
SetobjApp=Nothing
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
PrivateFunctionOffApp(ByValstrAppAsString,_
OptionalblnVisibleAsBoolean=True)AsObject
DimobjAppAsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
blnTMP=True
IfblnVisible=TrueThen
OnErrorResumeNext
objApp.Visible=True
Err.Clear
EndIf
EndSelect
OnErrorGoTo0
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

Geschlossene Dateien - Range in Masterdatei in Zeilen auslesen...

$
0
0
Frage: Bestimmte Daten (B2:C2, B3:C3, B4:C4) aus über 200 Exceldateien in eine Masterdatei in A2 abwärts. Der Dateiname in Spalte A, der Rest in die Spalten B:G. Wie geht das?

Certain data (B2:C2, B3:C3, B4:C4) from over 200 Excel files into a master file in A2 down. The file name in column A and the rest in columns B:G. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
Geschlossene Dateien - Range in Masterdatei in Zeilen auslesen...[ZIP 300 KB]

' Variablendeklaration erforderlich
OptionExplicit
' Der Tabellenblattname in den auszulesenden Dateien
ConststrSheetQAsString="Tabelle1"
' Der Tabellenblattname in DIESER Datei (die mit dem Code)
ConststrSheetZAsString="Total"
' Dieser Bereich wird ausgelesen
ConststrRange1AsString="B2:C2"
ConststrRange2AsString="B3:C3"
ConststrRange3AsString="B4:C4"
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 24.04.2014
' Purpose : Geschlossene Dateien Range auslesen...
'--------------------------------------------------------------------------
PublicSubMain()
DimstCalcAsInteger
DimstrDirAsString
DimobjFSOAsObject
DimobjDirAsObject
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
.ScreenUpdating=False
.AskToUpdateLinks=False
.EnableEvents=False
stCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
' Der Objektvariablen objFSO das "FilesystemObject" zuweisen
SetobjFSO=CreateObject("Scripting.FileSystemObject")
' Datei im gleichen Ordner wie Auswertungsdateien
strDir=ThisWorkbook.Path&Application.PathSeparator
' Fester Ordner vorgegeben
'strDir = "C:\Temp\Test\"
strDir=IIf(Right(strDir,1)<>"\",strDir&"\",strDir)
SetobjDir=objFSO.GetFolder(strDir)
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier das Objekt (bzw. die Variable) strSheetZ
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithThisWorkbook.Worksheets(strSheetZ)
.Rows("2:"&.Rows.Count).ClearContents
'dirInfo objDir, "*.xls*", True ' Mit Unterordner
dirInfoobjDir,"*.xls*"' Ohne Unterordner
' Formeln entfernen - Werte bleiben erhalten
.UsedRange.Value=.UsedRange.Value
EndWith
Fin:
' Die Applikation aufwecken
WithApplication
.Goto(ThisWorkbook.Worksheets(strSheetZ).Range("A1")),True
.ScreenUpdating=True
.AskToUpdateLinks=True
.EnableEvents=True
.Calculation=stCalc
.DisplayAlerts=True
EndWith
' Setze die Objektvariablen auf Nothing
SetobjDir=Nothing
SetobjFSO=Nothing
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : dirInfo
' Author : Case (Ralf Stolzenburg)
' Date : 24.04.2014
' Purpose : Geschlossene Dateien - Range auslesen...
'--------------------------------------------------------------------------
' Rekursive Sub - Optional mit Unterordner
PublicSubdirInfo(ByValobjCurrentDirAsObject,ByValstrNameAsString,_
OptionalByValblnTMPAsBoolean=False)
DimobjWorkbookAsWorkbook
DimstrFormulaAsString
DimlngLastRowAsLong
DimvarTMPAsVariant
' Alle Dateien im vorgegebenen Ordner
ForEachvarTMPInobjCurrentDir.Files
' Dateiname entspricht den Vorgaben und ist nicht DIESE Datei
' Falls im gleichen Ordner und ist KEINE temporäre Datei
' Dafür die Abfrage nach der Tilde "~"
IfvarTMP.NameLikestrNameAndvarTMP.Name<>_
ThisWorkbook.NameAndLeft(varTMP.Name,1)<>"~"Then
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier strSheetZ
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithThisWorkbook.Worksheets(strSheetZ)
' Letzte Zeile bezogen auf Spalte B plus 1
lngLastRow=IIf(Len(.Cells(.Rows.Count,2)),_
.Rows.Count,.Cells(.Rows.Count,2).End(xlUp).Row)+1
' Dateiname mit Pfadangabe
'.Cells(lngLastRow, 1).Value = varTMP.Path
' Hier nur Dateiname ohne Pfadangabe
.Cells(lngLastRow,1).Value=varTMP.Name
' Werte über Formel holen, Tabellenblatt über "Const..."
' oben definiert, Range auch oben definiert.
' Formel in Spalte B:G. Datumsformat setzen
With.Range(.Cells(lngLastRow,2),.Cells(lngLastRow,3))
.NumberFormat="m/d/yyyy"
.FormulaArray="='"&Mid(varTMP.Path,1,_
InStrRev(varTMP.Path,"\"))&"["&_
Mid(varTMP.Path,InStrRev(varTMP.Path,_
"\")+1)&"]"&_
strSheetQ&"'!"&strRange1
EndWith
With.Range(.Cells(lngLastRow,4),.Cells(lngLastRow,5))
.NumberFormat="m/d/yyyy"
.FormulaArray="='"&Mid(varTMP.Path,1,_
InStrRev(varTMP.Path,"\"))&"["&_
Mid(varTMP.Path,InStrRev(varTMP.Path,_
"\")+1)&"]"&_
strSheetQ&"'!"&strRange2
EndWith
With.Range(.Cells(lngLastRow,6),.Cells(lngLastRow,7))
.NumberFormat="m/d/yyyy"
.FormulaArray="='"&Mid(varTMP.Path,1,_
InStrRev(varTMP.Path,"\"))&"["&_
Mid(varTMP.Path,InStrRev(varTMP.Path,_
"\")+1)&"]"&_
strSheetQ&"'!"&strRange3
EndWith
EndWith
EndIf
NextvarTMP
' Wenn die Variable blnTMP "True" ist (in der Sub "Main" vorgegeben)
' Dann durchsuche auch alle Unterordner
IfblnTMP=TrueThen
ForEachvarTMPInobjCurrentDir.SubFolders
dirInfovarTMP,strName,blnTMP
NextvarTMP
EndIf
' Setze die Objektvariable auf Nothing
SetobjWorkbook=Nothing
EndSub

ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen...

$
0
0
Frage: Bestimmte Dateien eines Ordners mit 7-zip (inklusive Passwort) packen. Die Dateien sind in Spalte B gelistet (mal mehr, mal weniger). Der Quellordner ist in A1 gelistet und der Zielordner für die gezippte Datei in C1. Wie geht das?

Certain files in a folder with 7-zip pack (including password). The files are listed in column B (sometimes more, sometimes less). The source folder is listed in A1 and the destination folder for the zipped file in C1. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen...[ZIP 4 MB]

Link:
7Zip...
7Zip - Download...

OptionExplicit
' API Funktion um einen Ordner anzulegen
#If Win64 Then
PrivateDeclarePtrSafeFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValstrPathAsString)AsLong
#Else
PrivateDeclareFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValstrPathAsString)AsLong
#End If
' Konstante für die KONSOLENANWENDUNG 7Zip
' Keine Installation erforderlich
' Pfad ANPASSEN!!!!!!!!
ConststrZipAsString="C:\Temp\Zip\7za.exe"
'--------------------------------------------------------------------------
' Module : Modul1
' Author : Case (Ralf Stolzenburg)
' Date : 23.08.2013
' Purpose : 7-Zip alle Dateien eines Ordners packen als 7z...
'--------------------------------------------------------------------------
PublicSubMain()
DimobjFileFolderAsObject
DimstrTMPFolderAsString
DimlngLastRowAsLong
DimstrPathQAsString
DimstrPathZAsString
DimstrArgAsString
DimobjFSOAsObject
OnErrorGoToFin
SetobjFSO=CreateObject("Scripting.FileSystemObject")
strTMPFolder=Environ$("TEMP")&_
Application.PathSeparator&"7zFiles"&_
Application.PathSeparator
' Temporärer Ordner im Tempordner anlegen
MakeSureDirectoryPathExistsstrTMPFolder
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Tabelle1 = der CodeName der Tabelle
' Im VBA-Editor der Name VOR der Klammer - Tabelle1 (Tabelle1)
' im englischen Excel in der Regel Sheet1
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithTabelle1
' Letzte Zeile in Spalte B
lngLastRow=IIf(IsEmpty(.Cells(.Rows.Count,2)),_
.Cells(.Rows.Count,2).End(xlUp).Row,.Rows.Count)
' Pfad in dem die zu packenden Dateien sind
strPathQ=.Range("A1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathQ=IIf(Right(strPathQ,1)<>"\",strPathQ&"\",strPathQ)
' Pfad in den die gepackte 7z-Datei kommt
strPathZ=.Range("C1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathZ=IIf(Right(strPathZ,1)<>"\",strPathZ&"\",strPathZ)
' Schleife über alle Einträge in Spalte B
ForlngLastRow=1TolngLastRow
FileCopystrPathQ&.Cells(lngLastRow,2).Text,_
strTMPFolder&.Cells(lngLastRow,2).Text
NextlngLastRow
' Packt den Ordner strTMPFolder als 7z-Datei im Zielordner "strPathZ"
' Mit Passwort "passwort"
strArg=strZip&" a -ppasswort "&strPathZ&"Zip.7z "&strTMPFolder
ShellAndWaitstrArg
EndWith
' Und den temporären Ordner wieder löschen
SetobjFileFolder=objFSO.GetFolder(strTMPFolder)
objFileFolder.Delete
Fin:
' Objektvariablen zurücksetzen
SetobjFileFolder=Nothing
SetobjFSO=Nothing
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : ShellAndWait
' Author : Case (Ralf Stolzenburg)
' Date : 23.08.2013
' Purpose : ShellAndWait mit ausgeblendetem Dosfenster...
'--------------------------------------------------------------------------
PrivateSubShellAndWait(ByValstrPathNameAsString)
DimWshShellAsObject
OnErrorGoToFin
SetWshShell=CreateObject("WScript.Shell")
WshShell.RunstrPathName,0,True
Fin:
SetWshShell=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

Word öffnen, Range formatiert kopieren, nicht als Tabelle...

$
0
0
Einen Range (z. B. A1:A10) nach Word kopieren. Schriftformate unverändert übernehmen. Es darf aber nicht als Tabelle eingefügt werden bzw. muss als Text umgewandelt werden.

A range (eg A1:A10) copy to Word. Font formats take over unchanged. But it must not be inserted as a table or must be converted as text.

Hier noch eine Beispieldatei / Here's a sample file:
Word öffnen, Range formatiert kopieren, nicht als Tabelle...[ZIP 20 KB]

OptionExplicit
' Konstante für Parameter Umwandlung der Tabelle in Word als Text
' Es gibt:
' Const wdSeparateByDefaultListSeparator = 3
' Const wdSeparateByCommas = 2
' Const wdSeparateByTabs = 1
ConstwdSeparateByParagraphs=0
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 14.07.2014
' Purpose : Word öffnen, Range formatiert kopieren, nicht als Tabelle...
'--------------------------------------------------------------------------
PublicSubMain()
DimstrBookmarkAsString
DimobjWDAppAsObject
DimobjWDDocAsObject
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
' Das Bildschirmaktualisierung wird unterbrochen
.ScreenUpdating=False
' Ereignisroutinen werden deaktiviert
.EnableEvents=False
' Auslesen der momentanen Einstellung für die Berechnung
lngCalc=.Calculation
' Setzen der Berechnung auf "Manuell"
.Calculation=xlCalculationManual
' Eingabeaufforderungen und Warnmeldungen unterdrücken
.DisplayAlerts=False
EndWith
' Die Wordapplikation sichtbar starten
SetobjWDApp=OffApp("Word")
' Word nicht sichtbar
'Set objApp = OffApp("Word", False)
IfNotobjWDAppIsNothingThen
' Name der Textmarke
strBookmark="Test"
' Ein neues Worddokument erstellen
SetobjWDDoc=objWDApp.Documents.Add
' Diese Zeile ist eigentlich blödsinnig, denn in einem
' neuen Dokument kann keine Textmarke / Bookmark sein
' Aber man sieht, wie auf eine Textmarke geprüft werden kann
' Und wie eine Textmarke hinzugefügt wird
IfNotobjWDDoc.Bookmarks.Exists(strBookmark)=TrueThen
objWDDoc.Bookmarks.AddName:=strBookmark
' Bereich der kopiert werden soll
Tabelle1.Range("A1:A10").Copy
' Aus dem Objektkatalog von Word im VBA-Editor (F2)
' Sub PasteExcelTable(LinkedToExcel As Boolean,
' WordFormatting As Boolean, RTF As Boolean)
objWDDoc.Bookmarks(strBookmark).Range.PasteExcelTableFalse,False,False
' Umwandlen der Tabelle zu Text
objWDDoc.Tables(1).Rows.ConvertToTextSeparator:=wdSeparateByParagraphs,_
NestedTables:=True
EndIf
EndIf
Fin:
' Objektvariablen zurücksetzen
SetobjWDDoc=Nothing
SetobjWDApp=Nothing
' Die Applikation aufwecken
WithApplication
' Bildschirmaktualisierung wieder einschalten
.ScreenUpdating=True
' Ereignisroutinen werden wieder aktiviert
.EnableEvents=True
' Setzen der Berechnung auf den gemerkten Wert
.Calculation=lngCalc
' Eingabeaufforderungen und Warnmeldungen wieder zulassen
.DisplayAlerts=True
' Abbrechen Ausschneide- bzw. Kopiermodus und entfernen des Laufrahmens
.CutCopyMode=True
EndWith
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Module3
' Procedure : OffApp
' Author : Case (Ralf Stolzenburg)
' Date : 14.07.2014
' Purpose : Start application...
'--------------------------------------------------------------------------
PrivateFunctionOffApp(ByValstrAppAsString)AsObject
DimobjAppAsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
objApp.Visible=True
IfErr.Number>0Then
MsgBoxErr.Number&" "&Err.Description
SetobjApp=Nothing
EndIf
Case0
CaseElse
MsgBoxErr.Number&" "&Err.Description
SetobjApp=Nothing
EndSelect
OnErrorGoTo0
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

Word - Dokumente mit Hyperlinks - alle nach Excel...

$
0
0
Frage: Aus vielen Worddokumenten eines Verzeichnisses sollen alle Hyperlinks nach Excel kopiert werden. Ausgabe soll sein: Spalte A Dateiname (Pfad in Kommentar), Spalte B Hyperlink wie in Word dargestellt (muss anklickbar sein), Spalte C die Hyperlinkadresse und Spalte D den angezeigten Text. Wie geht das?

From many Word documents in a directory all hyperlinks should be copied to Excel. Output should be: Column A file name (path in comment) Column B Hyperlink (must be clickable) as shown in Word, the hyperlink address in column C and column D the displayed text. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
Word - Dokumente mit Hyperlinks - alle nach Excel...[ZIP 200 KB]

OptionExplicit
DimblnTMPAsBoolean
DimobjAppAsObject
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 20.06.2013
' Purpose : Aus Worddokumenten Hyperlinks nach Excel kopieren...
'--------------------------------------------------------------------------
PublicSubMain()
' Dimensionieren der Variablen
DimobjDocumentAsObject
DimintHLinkAsInteger
DimlngLastRowAsLong
DimstrFileAsString
DimstrPathAsString
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
' Das Bildschirmaktualisierung wird unterbrochen
.ScreenUpdating=False
' Ereignisroutinen werden deaktiviert
.EnableEvents=False
' Auslesen der momentanen Einstellung für die Berechnung
lngCalc=.Calculation
' Setzen der Berechnung auf "Manuell"
.Calculation=xlCalculationManual
' Eingabeaufforderungen und Warnmeldungen unterdrücken
.DisplayAlerts=False
EndWith
' Pfad anpassen - fester Pfad vorgeben
'strPath = "C:\Temp\Word\"
' Pfad anpassen - Worddateien sind im gleichen
' Verzeichnis wie diese Exceldatei
strPath=ThisWorkbook.Path&Application.PathSeparator
' Die Wordapplikation sichtbar starten
SetobjApp=OffApp("Word")
' Word nicht sichtbar
'Set objApp = OffApp("Word", False)
IfNotobjAppIsNothingThen
strFile=Dir$(strPath&"*.doc*",vbDirectory)
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Sheet1 = der CodeName der Tabelle
' im deutschen Excel in der Regel Tabelle1
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithSheet1
' Schleife bis keine Datei mehr vorhanden
DoWhilestrFile<>""
' Worddokument öffnen und der Objektvariablen zuweisen
SetobjDocument=objApp.Documents.Open_
(strPath&strFile)
' Alle Hyperlinks durchlaufen
ForintHLink=1ToobjDocument.Hyperlinks.Count
' Letzte belegte Zeile plus 1
lngLastRow=IIf(IsEmpty(.Cells(.Rows.Count,1)),_
.Cells(.Rows.Count,1).End(xlUp).Row,.Rows.Count)+1
' Dateiname schreiben Spalte A
.Cells(lngLastRow,1).Value=strFile
' Kommentar hinzufügen Spalte A
.Cells(lngLastRow,1).AddComment
' Kommentartext schreiben Spalte A
.Cells(lngLastRow,1).Comment.TextText:=strPath
' Hyperlink schreiben Spalte B wie in Word (anklickbar)
.Cells(lngLastRow,2).Value=_
objDocument.Hyperlinks(intHLink).TextToDisplay
' Hyperlink in Excel setzen Spalte B
.Cells(lngLastRow,2).Hyperlinks.Add_
Anchor:=.Cells(lngLastRow,2),_
Address:=objDocument.Hyperlinks(intHLink).Address
' Hyperlinkadresse schreiben Spalte C
.Cells(lngLastRow,3).Value=_
objDocument.Hyperlinks(intHLink).Address
' Hyperlink in Excel setzen Spalte C
.Cells(lngLastRow,3).Hyperlinks.Add_
Anchor:=.Cells(lngLastRow,3),_
Address:=objDocument.Hyperlinks(intHLink).Address
' Angezeigter Text schreiben Spalte D
.Cells(lngLastRow,4).Value=_
objDocument.Hyperlinks(intHLink).TextToDisplay
NextintHLink
' Worddokument ohne speichern schlissen
objDocument.CloseFalse
' Die nächste Datei nehmen
strFile=Dir$()
' Setze die Objektvariable auf Nothing
SetobjDocument=Nothing
Loop
' Spalte A:C optimale Breite setzen
.Columns("A:C").AutoFit
EndWith
Else
' Application auf PC nicht vorhanden
MsgBox"Application not installed!"
EndIf
Fin:
' Wenn noch ein Worddokument offen ist - schliessen ohne speichern
IfNotobjDocumentIsNothingThenobjDocument.CloseFalse
' Wenn die Applikation noch offen ist - schliessen
' Aber nur, wenn sie nicht vorher schon offen war
IfNotobjAppIsNothingThen
IfblnTMP=TrueThen
objApp.Quit
blnTMP=False
EndIf
EndIf
' Objektvariablen leeren
SetobjDocument=Nothing
SetobjApp=Nothing
' Die Applikation aufwecken
WithApplication
' Bildschirmaktualisierung wieder einschalten
.ScreenUpdating=True
' Ereignisroutinen werden wieder aktiviert
.EnableEvents=True
' Setzen der Berechnung auf den gemerkten Wert
.Calculation=lngCalc
' Eingabeaufforderungen und Warnmeldungen wieder zulassen
.DisplayAlerts=True
' Abbrechen Ausschneide- bzw. Kopiermodus und entfernen des Laufrahmens
.CutCopyMode=True
EndWith
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : OffApp
' Author : Case (Ralf Stolzenburg)
' Date : 20.06.2013
' Purpose : Start application...
'--------------------------------------------------------------------------
PrivateFunctionOffApp(ByValstrAppAsString,_
OptionalblnVisibleAsBoolean=True)AsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
blnTMP=True
IfblnVisible=TrueThen
OnErrorResumeNext
objApp.Visible=True
Err.Clear
EndIf
EndSelect
OnErrorGoTo0
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

ADO - Tabellenblätter - Anzahl - Geschlossene Datei...

$
0
0
Frage: Aus einer geschlossenen Datei benötige ich die Anzahl der Tabellenblätter. Wie geht das?

From a closed file I need the number of worksheets. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
ADO - Tabellenblätter - Anzahl - Geschlossene Datei...[ZIP 90 KB]

OptionExplicit
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 21.06.2013
' Purpose : ADO - Tabellenblätter - Anzahl - Geschlossene Datei...
'--------------------------------------------------------------------------
PublicSubMain()
MsgBoxfncADOSheetCount(ThisWorkbook.Path&_
Application.PathSeparator&"Sheet_50.xls")
EndSub
PrivateFunctionfncADOSheetCount(ByValstrFileNameAsString)AsInteger
DimobjConnAsObject
DimobjCatAsObject
SetobjConn=CreateObject("ADODB.Connection")
WithobjConn
.CursorLocation=3' = adUseClient
IfVal(Application.Version)>=12Then
.Provider="Microsoft.ACE.OLEDB.12.0;"&_
"Extended Properties=""Excel 12.0;HDR=YES"";"&_
"Data Source="&strFileName&";"
Else
.Provider="Microsoft.Jet.OLEDB.4.0;"&_
"Extended Properties=Excel 8.0;"&_
"Data Source="&strFileName&";"
EndIf
.Open
EndWith
SetobjCat=CreateObject("ADOX.Catalog")
SetobjCat.ActiveConnection=objConn
fncADOSheetCount=objCat.Tables.Count' Anzahl Tabellenblätter
SetobjCat=Nothing
IfNotobjConnIsNothingThen
IfobjConn.State=1ThenobjConn.Close
EndIf
SetobjConn=Nothing
EndFunction

Excel - UserForm - ListBox - Inhalt nach Word - Textmarke...

$
0
0
Frage: Der komplette Inhalt einer ListBox (UserForm) soll nach Word gebracht werden. Eine Textmarke ist vorhanden. In der Beispieldatei sind zwei Möglichkeiten:
1. Ein vorhandenes Worddokument - Liste in einer Zeile mit Komma getrennt.
2. Eine Wordvorlage - Liste jeder Eintrag in eine Zeile.
Der Speicherdialog von Word wird am Schluss aufgerufen. Wie geht das?

The complete contents of a ListBox (UserForm) to be brought to Word. A bookmark is available. In the sample file are two possibilities:
1. An existing Word document - list in one line separated by commas.
2. A Word template - list each entry in a row.
The Save As dialog of Word is called at the end. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
Excel - UserForm - ListBox - Inhalt nach Word - Textmarke...[ZIP 50 KB]

Änderung um 19:45 - Beispiele mit Aufzählungszeichen. Anpassung ist nur in der Beispieldatei, nicht im Code unten!
Change at 19:45 - Examples with bullets. Adaptation is only in the sample file, not in the code below!

Hier noch eine Beispieldatei / Here's a sample file:
Excel - UserForm - ListBox - Inhalt nach Word - Textmarke...[ZIP 50 KB]

Code aus UserForm1 (doc) / Code from UserForm1 (doc):

OptionExplicit
' Name des Worddokumentes
ConststrWordDocAsString="Defects_list.doc"
' Namen der Textmarken im Worddokument
ConststrBookmark1AsString="defect"
' Konstante für den Speichern-Unter Dialog in Word
ConstwdDialogFileSaveAs=84
' Konstante für das Speicherformat
ConstwdFormatDocument97=0
' Wenn Word nicht offen ist wird diese Variable auf True
' gesetzt und Word am Ende wieder geschlossen
' War Word schon offen, beleibt es das auch
DimblnTMPAsBoolean
'--------------------------------------------------------------------------
' Module : UserForm1
' Author : Case (Ralf Stolzenburg)
' Date : 03.07.2013
' Purpose : Daten von Excel UserForm ListBox nach Word in Textmarke...
'--------------------------------------------------------------------------
PrivateSubCommandButton1_Click()
' Variablendeklaration
' Da wir mit Late Binding arbeiten, also ohne Verweise auf die
' Wordbibliothek dimensionieren wir die Wordbezogenen Variablen
' als Objekt, die dann mit Set dem entsprechenden
' Objekt zugewiesen werden
DimstrListContentAsString
DimobjBookmarkAsObject
DimobjDocumentAsObject
DimobjDialogAsObject
DimlngCountAsLong
DimobjAppAsObject
DimstrDocAsString
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' ListBox Inhalt in String mit LineFeed
' ODER Leerzeichen am Schluss schreiben
ForlngCount=0ToListBox1.ListCount-1
' Mit Leerzeichen - dann kommt das Ergebnis in eine Zeile
strListContent=strListContent&ListBox1.List(lngCount)&", "
' Mit VbLf - dann steht jeder ListBoxeintag in einer neuen Zeile
'strListContent = strListContent & ListBox1.List(lngCount) & vbLf
NextlngCount
' Letztes Zeichen entfernen WENN MIT VbLf GEARBEITET WIRD
'strListContent = Left(strListContent, Len(strListContent) - 1)
' Letzte zwei Zeichen entfernen - WENN MIT ", " GEARBEITET WIRD
strListContent=Left(strListContent,Len(strListContent)-2)
' Das Worddokument mit Pfad und Name - also bei Bedarf anpassen!!!
' Liegt im gleichen Ordner wie diese Exceldatei
strDoc=ThisWorkbook.Path&_
Application.PathSeparator&strWordDoc
' Die Wordapplikation wird mit der Funktion "OffApp" gesucht
' ODER bei Bedarf gestartet
SetobjApp=OffApp("Word")
'folgende Codezeile für Word nicht sichtbar
'Set objApp = OffApp("Word", False)
' Wenn die Word der Objektvariablen zugewiesen werden konnte dann...
IfNotobjAppIsNothingThen
' Öffne das Worddokument, zugewiesen an die Objektvariable objDocument
SetobjDocument=objApp.Documents.Open(Filename:=strDoc)
' Prüfe, ob die Textmarke vorhanden ist
IfobjDocument.Bookmarks.Exists(strBookmark1)=TrueThen
' Schreibe den Wert von B2 in die Textmarke Name
SetobjBookmark=objDocument.Bookmarks(strBookmark1).Range
' Schreibe den Inhalt der Variablen strListContent in die Textmarke
objBookmark.Text=strListContent
EndIf
' Word Speicherdialog aufrufen
SetobjDialog=objApp.Dialogs(wdDialogFileSaveAs)
WithobjDialog
' Pfad und Dateiname vorgeben
.Name=ThisWorkbook.Path&Application.PathSeparator&_
"Test_"&Format(Now,"DD_MM_YYYY_hh_mm_ss")
' Wenn auf Speichern geklickt wurde...
If.Display=-1Then
objDocument.SaveAsFilename:=.Name,_
FileFormat:=wdFormatDocument97
EndIf
' Dokument schliessen OHNE speichern
objDocument.CloseFalse
' Objektvariable leeren
SetobjDocument=Nothing
EndWith
Else
' Ausgabe, wenn die Objektvariable objApp Nothing ist...
MsgBox"Applikation nicht installiert!"
EndIf
Fin:
' UserForm schliessen
UnloadMe
' Wenn noch ein Worddokument offen ist - schliessen ohne speichern
IfNotobjDocumentIsNothingThenobjDocument.CloseFalse
' Wenn die Applikation noch offen ist - schliessen
' Aber nur, wenn sie nicht vorher schon offen war
IfNotobjAppIsNothingThen
IfblnTMP=TrueThen
objApp.Quit
blnTMP=False
EndIf
EndIf
' Objektvariablen leeren
SetobjBookmark=Nothing
SetobjDocument=Nothing
SetobjApp=Nothing
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : UserForm1
' Procedure : OffApp
' Author : Case (Ralf Stolzenburg)
' Date : 03.07.2013
' Purpose : Start application...
'--------------------------------------------------------------------------
PrivateFunctionOffApp(ByValstrAppAsString,_
OptionalblnVisibleAsBoolean=True)AsObject
DimobjAppAsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
blnTMP=True
IfblnVisible=TrueThen
OnErrorResumeNext
objApp.Visible=True
Err.Clear
EndIf
EndSelect
OnErrorGoTo0
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

' Konstanten für das Speicherformat
' Aus dem Objektkatalog in Word VBA-Editor F2
' Suchbegriff: wdFormatDocument

' Const wdFormatDocument = 0
' Const wdFormatDocument97 = 0
' Const wdFormatDocumentDefault = 16
' Const wdFormatDOSText = 4
' Const wdFormatDOSTextLineBreaks = 5
' Const wdFormatEncodedText = 7
' Const wdFormatFilteredHTML = 10
' Const wdFormatFlatXML = 19
' Const wdFormatFlatXMLMacroEnabled = 20
' Const wdFormatFlatXMLTemplate = 21
' Const wdFormatFlatXMLTemplateMacroEnabled = 22
' Const wdFormatHTML = 8
' Const wdFormatOpenDocumentText = 23
' Const wdFormatPDF = 17
' Const wdFormatRTF = 6
' Const wdFormatTemplate = 1
' Const wdFormatTemplate97 = 1
' Const wdFormatText = 2
' Const wdFormatTextLineBreaks = 3
' Const wdFormatUnicodeText = 7
' Const wdFormatWebArchive = 9
' Const wdFormatXML = 11
' Const wdFormatXMLDocument = 12
' Const wdFormatXMLDocumentMacroEnabled = 13
' Const wdFormatXMLTemplate = 14
' Const wdFormatXMLTemplateMacroEnabled = 15
' Const wdFormatXPS = 18

Code aus UserForm2 (dot) / Code from UserForm2 (dot):

OptionExplicit
' Name des Worddokumentes
ConststrWordDocAsString="Defects_list.dot"
' Namen der Textmarken im Worddokument
ConststrBookmark1AsString="defect"
' Konstante für den Speichern-Unter Dialog in Word
ConstwdDialogFileSaveAs=84
' Konstante für das Speicherformat
ConstwdFormatDocumentDefault=16
' Wenn Word nicht offen ist wird diese Variable auf True
' gesetzt und Word am Ende wieder geschlossen
' War Word schon offen, beleibt es das auch
DimblnTMPAsBoolean
'--------------------------------------------------------------------------
' Module : UserForm1
' Author : Case (Ralf Stolzenburg)
' Date : 03.07.2013
' Purpose : Daten von Excel UserForm ListBox nach Word in Textmarke...
'--------------------------------------------------------------------------
PrivateSubCommandButton1_Click()
' Variablendeklaration
' Da wir mit Late Binding arbeiten, also ohne Verweise auf die
' Wordbibliothek dimensionieren wir die Wordbezogenen Variablen
' als Objekt, die dann mit Set dem entsprechenden
' Objekt zugewiesen werden
DimstrListContentAsString
DimobjBookmarkAsObject
DimobjDocumentAsObject
DimobjDialogAsObject
DimlngCountAsLong
DimobjAppAsObject
DimstrDocAsString
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' ListBox Inhalt in String mit LineFeed
' ODER Leerzeichen am Schluss schreiben
ForlngCount=0ToListBox1.ListCount-1
' Mit Leerzeichen - dann kommt das Ergebnis in eine Zeile
'strListContent = strListContent & ListBox1.List(lngCount) & ", "
' Mit VbLf - dann steht jeder ListBoxeintag in einer neuen Zeile
strListContent=strListContent&ListBox1.List(lngCount)&vbLf
NextlngCount
' Letztes Zeichen entfernen WENN MIT VbLf GEARBEITET WIRD
strListContent=Left(strListContent,Len(strListContent)-1)
' Letzte zwei Zeichen entfernen - WENN MIT ", " GEARBEITET WIRD
'strListContent = Left(strListContent, Len(strListContent) - 2)
' Die Wordvorlage mit Pfad und Name - also bei Bedarf anpassen!!!
' Liegt im gleichen Ordner wie diese Exceldatei
strDoc=ThisWorkbook.Path&_
Application.PathSeparator&strWordDoc
' Die Wordapplikation wird mit der Funktion "OffApp" gesucht
' ODER bei Bedarf gestartet
SetobjApp=OffApp("Word")
'folgende Codezeile für Word nicht sichtbar
'Set objApp = OffApp("Word", False)
' Wenn die Word der Objektvariablen zugewiesen werden konnte dann...
IfNotobjAppIsNothingThen
' Öffne das Worddokument, zugewiesen an die Objektvariable objDocument
SetobjDocument=objApp.Documents.Add(Template:=strDoc)
' Prüfe, ob die Textmarke vorhanden ist
IfobjDocument.Bookmarks.Exists(strBookmark1)=TrueThen
' Schreibe den Wert von B2 in die Textmarke Name
SetobjBookmark=objDocument.Bookmarks(strBookmark1).Range
' Schreibe den Inhalt der Variablen strListContent in die Textmarke
objBookmark.Text=strListContent
EndIf
' Word Speicherdialog aufrufen
SetobjDialog=objApp.Dialogs(wdDialogFileSaveAs)
WithobjDialog
' Pfad und Dateiname vorgeben
.Name=ThisWorkbook.Path&Application.PathSeparator&_
"Test_"&Format(Now,"DD_MM_YYYY_hh_mm_ss")
' Wenn auf Speichern geklickt wurde...
If.Display=-1Then
objDocument.SaveAsFilename:=.Name,_
FileFormat:=wdFormatDocumentDefault
EndIf
' Dokument schliessen OHNE speichern
objDocument.CloseFalse
' Objektvariable leeren
SetobjDocument=Nothing
EndWith
Else
' Ausgabe, wenn die Objektvariable objApp Nothing ist...
MsgBox"Applikation nicht installiert!"
EndIf
Fin:
' UserForm schliessen
UnloadMe
' Wenn noch ein Worddokument offen ist - schliessen ohne speichern
IfNotobjDocumentIsNothingThenobjDocument.CloseFalse
' Wenn die Applikation noch offen ist - schliessen
' Aber nur, wenn sie nicht vorher schon offen war
IfNotobjAppIsNothingThen
IfblnTMP=TrueThen
objApp.Quit
blnTMP=False
EndIf
EndIf
' Objektvariablen leeren
SetobjBookmark=Nothing
SetobjDocument=Nothing
SetobjApp=Nothing
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : UserForm1
' Procedure : OffApp
' Author : Case (Ralf Stolzenburg)
' Date : 03.07.2013
' Purpose : Start application...
'--------------------------------------------------------------------------
PrivateFunctionOffApp(ByValstrAppAsString,_
OptionalblnVisibleAsBoolean=True)AsObject
DimobjAppAsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
blnTMP=True
IfblnVisible=TrueThen
OnErrorResumeNext
objApp.Visible=True
Err.Clear
EndIf
EndSelect
OnErrorGoTo0
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

' Konstanten für das Speicherformat
' Aus dem Objektkatalog in Word VBA-Editor F2
' Suchbegriff: wdFormatDocument

' Const wdFormatDocument = 0
' Const wdFormatDocument97 = 0
' Const wdFormatDocumentDefault = 16
' Const wdFormatDOSText = 4
' Const wdFormatDOSTextLineBreaks = 5
' Const wdFormatEncodedText = 7
' Const wdFormatFilteredHTML = 10
' Const wdFormatFlatXML = 19
' Const wdFormatFlatXMLMacroEnabled = 20
' Const wdFormatFlatXMLTemplate = 21
' Const wdFormatFlatXMLTemplateMacroEnabled = 22
' Const wdFormatHTML = 8
' Const wdFormatOpenDocumentText = 23
' Const wdFormatPDF = 17
' Const wdFormatRTF = 6
' Const wdFormatTemplate = 1
' Const wdFormatTemplate97 = 1
' Const wdFormatText = 2
' Const wdFormatTextLineBreaks = 3
' Const wdFormatUnicodeText = 7
' Const wdFormatWebArchive = 9
' Const wdFormatXML = 11
' Const wdFormatXMLDocument = 12
' Const wdFormatXMLDocumentMacroEnabled = 13
' Const wdFormatXMLTemplate = 14
' Const wdFormatXMLTemplateMacroEnabled = 15
' Const wdFormatXPS = 18

ZIP - mit 7Zip alle Dateien "7-Zip und Zip" eines Ordners entpacken...

$
0
0
Frage: Wie kann ich alle Dateien "7-Zip und Zip" eines Ordners mit dem Programm 7Zip entpacken?
Wir nutzen das Kommandozeilentool des Programmes 7Zip. Eine Installation ist nicht erforderlich.
Um mein Beispiel zu nutzen MÜSSEN Sie die Pfade anpassen! Im Modul2 ist ein Beispiel, wie eine Passwortgeschützte Datei entpackt wird. Siehe zweiten Download.

INFO: Bitte denken Sie daran, dass Sie im zweiten Download nur den Code in Modul 2 testen. Wenn Sie den Code aus Modul1 starten bleibt "7za.exe" im Hintergrund offen, da er auf die Eingabe des Passwortes wartet. Das Fenster ist aber ausgeblendet. :-)

Please remember that you only test the code in module 2 in the second download. When you start the code in Module1 remains open "7za.exe" in the background, as he waits for the input of the password. But the window is hidden. :-)

How can I extract all files "7-Zip and Zip" in a folder with the 7Zip program?
We use the command line tool of the program 7Zip. No installation is required.
To use my example you MUST adjust the paths! In Modul2 is an example of how a Password-protected file is extracted. See second download.

Hier noch eine Beispieldatei / Here's a sample file:
ZIP - mit 7Zip alle Dateien "7-Zip und Zip" eines Ordners entpacken...[ZIP 4 MB]

Hier noch eine Beispieldatei mit Passwort / Here is a sample file with a password:
ZIP - mit 7Zip eine Datei "7-Zip" mit Passwort entpacken...[ZIP 5 MB]

Link:
7Zip...
7Zip - Download...

OptionExplicit
' Konstante für die KONSOLENANWENDUNG 7Zip
' Keine Installation erforderlich
' Pfade ANPASSEN!!!!!!!!
ConststrZipAsString="C:\Temp\Zip\7za.exe"
' Pfad in dem die 7z-Dateien UND Zip-Dateien sind
ConststrPathQAsString="C:\Temp\Zip\"
' Pfad in den die 7z-Dateien UND Zip-Dateien
' gegebenenfalls entpackt werden sollen
ConststrPathZAsString="C:\Temp\Zip\Neu\"
'--------------------------------------------------------------------------
' Module : Modul1
' Author : Case (Ralf Stolzenburg)
' Date : 14.08.2013
' Purpose : 7-Zip alle Dateien (7z und Zip) eines Ordners entpacken...
'--------------------------------------------------------------------------
PublicSubMain()
DimstrFileNameAsString
DimstrArgAsString
OnErrorGoToFin
strFileName=Dir$(strPathQ&"*.*z*")
' Schleife über alle 7z- UND Zip-Dateien
DoWhilestrFileName<>""
' Entpackt alle 7z-Dateien UND Zip-Dateien in den angegebenen Ordner
strArg=strZip&" x "&strPathQ&strFileName&" -y -o"&strPathZ
' Entpackt alle 7z-Dateien UND Zip-Dateien in den aktuellen Ordner
'strArg = strZip & " e " & strPathQ & strFileName & " -y"
' Entpackt alle 7z-Dateien UND Zip-Dateien in den aktuellen Ordner -
' jede 7z-Datei in einen Ordner. Entspricht 7-Zip - Entpacken nach "*\"
' Der aktuelle Ordner (CurDir) kann auch vorher noch eingestellt werden
' -y bedeutet KEINE Nachfrage, wenn Dateien schon vorhanden sind
'strArg = strZip & " x " & strPathQ & strFileName & " -y -o*"
' Warten bis entpacken erledigt ist
ShellAndWaitstrArg
' Nächster Dateiname
strFileName=Dir$()
Loop
Fin:
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : ShellAndWait
' Author : Case (Ralf Stolzenburg)
' Date : 14.08.2013
' Purpose : ShellAndWait mit ausgeblendetem Dosfenster...
'--------------------------------------------------------------------------
PrivateSubShellAndWait(ByValstrPathNameAsString)
DimWshShellAsObject
OnErrorGoToFin
SetWshShell=CreateObject("WScript.Shell")
WshShell.RunstrPathName,0,True
Fin:
SetWshShell=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

OptionExplicit
' Konstante für die KONSOLENANWENDUNG 7Zip
' Keine Installation erforderlich
' Pfade ANPASSEN!!!!!!!!
ConststrZipAsString="C:\Temp\Zip\7za.exe"
' Pfad in den die 7z-Dateien UND Zip-Dateien
' gegebenenfalls entpackt werden sollen
ConststrPathZAsString="C:\Temp\Zip\Neu\"
'--------------------------------------------------------------------------
' Module : Modul1
' Author : Case (Ralf Stolzenburg)
' Date : 14.08.2013
' Purpose : 7-Zip alle Dateien (7z und Zip) eines Ordners entpacken...
'--------------------------------------------------------------------------
PublicSubMain_1()
DimstrFileNameAsString
DimstrArgAsString
OnErrorGoToFin
' Pfad- und Dateiname gegebenenfalls anpassen!!!!!
strFileName="C:\Temp\Zip\Kira7_Password_is_HIDE.7z"
' Eine PASSSWORTgeschützte 7Zip-Datei entpacken. Passwort ist HIDE
strArg=strZip&" e -pHIDE "&strFileName&" -y -o"&strPathZ
ShellAndWaitstrArg
Fin:
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul2
' Procedure : ShellAndWait
' Author : Case (Ralf Stolzenburg)
' Date : 14.08.2013
' Purpose : ShellAndWait mit ausgeblendetem Dosfenster...
'--------------------------------------------------------------------------
PrivateSubShellAndWait(ByValstrPathNameAsString)
DimWshShellAsObject
OnErrorGoToFin
SetWshShell=CreateObject("WScript.Shell")
WshShell.RunstrPathName,0,True
Fin:
SetWshShell=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen...

$
0
0
Frage: Bestimmte Dateien eines Ordners mit 7-zip (inklusive Passwort) packen. Die Dateien sind in Spalte B gelistet (mal mehr, mal weniger). Der Quellordner ist in A1 gelistet und der Zielordner für die gezippte Datei in C1. Wie geht das?

Certain files in a folder with 7-zip pack (including password). The files are listed in column B (sometimes more, sometimes less). The source folder is listed in A1 and the destination folder for the zipped file in C1. How does it work?

Hier noch eine Beispieldatei / Here's a sample file:
ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen...[ZIP 4 MB]

Link:
7Zip...
7Zip - Download...

OptionExplicit
' API Funktion um einen Ordner anzulegen
#If Win64 Then
PrivateDeclarePtrSafeFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValstrPathAsString)AsLong
#Else
PrivateDeclareFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValstrPathAsString)AsLong
#End If
' Konstante für die KONSOLENANWENDUNG 7Zip
' Keine Installation erforderlich
' Pfad ANPASSEN!!!!!!!!
ConststrZipAsString="C:\Temp\Zip\7za.exe"
'--------------------------------------------------------------------------
' Module : Modul1
' Author : Case (Ralf Stolzenburg)
' Date : 23.08.2013
' Purpose : 7-Zip alle Dateien eines Ordners packen als 7z...
'--------------------------------------------------------------------------
PublicSubMain()
DimobjFileFolderAsObject
DimstrTMPFolderAsString
DimlngLastRowAsLong
DimstrPathQAsString
DimstrPathZAsString
DimstrArgAsString
DimobjFSOAsObject
OnErrorGoToFin
SetobjFSO=CreateObject("Scripting.FileSystemObject")
strTMPFolder=Environ$("TEMP")&_
Application.PathSeparator&"7zFiles"&_
Application.PathSeparator
' Temporärer Ordner im Tempordner anlegen
MakeSureDirectoryPathExistsstrTMPFolder
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Tabelle1 = der CodeName der Tabelle
' Im VBA-Editor der Name VOR der Klammer - Tabelle1 (Tabelle1)
' im englischen Excel in der Regel Sheet1
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithTabelle1
' Letzte Zeile in Spalte B
lngLastRow=IIf(IsEmpty(.Cells(.Rows.Count,2)),_
.Cells(.Rows.Count,2).End(xlUp).Row,.Rows.Count)
' Pfad in dem die zu packenden Dateien sind
strPathQ=.Range("A1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathQ=IIf(Right(strPathQ,1)<>"\",strPathQ&"\",strPathQ)
' Pfad in den die gepackte 7z-Datei kommt
strPathZ=.Range("C1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathZ=IIf(Right(strPathZ,1)<>"\",strPathZ&"\",strPathZ)
' Schleife über alle Einträge in Spalte B
ForlngLastRow=1TolngLastRow
FileCopystrPathQ&.Cells(lngLastRow,2).Text,_
strTMPFolder&.Cells(lngLastRow,2).Text
NextlngLastRow
' Packt den Ordner strTMPFolder als 7z-Datei im Zielordner "strPathZ"
' Mit Passwort "passwort"
strArg=strZip&" a -ppasswort "&strPathZ&"Zip.7z "&strTMPFolder
ShellAndWaitstrArg
EndWith
' Und den temporären Ordner wieder löschen
SetobjFileFolder=objFSO.GetFolder(strTMPFolder)
objFileFolder.Delete
Fin:
' Objektvariablen zurücksetzen
SetobjFileFolder=Nothing
SetobjFSO=Nothing
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : ShellAndWait
' Author : Case (Ralf Stolzenburg)
' Date : 23.08.2013
' Purpose : ShellAndWait mit ausgeblendetem Dosfenster...
'--------------------------------------------------------------------------
PrivateSubShellAndWait(ByValstrPathNameAsString)
DimWshShellAsObject
OnErrorGoToFin
SetWshShell=CreateObject("WScript.Shell")
WshShell.RunstrPathName,0,True
Fin:
SetWshShell=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen - Update...

$
0
0
Frage: Die Dateien sollen nicht über einen temporären Ordner gepackt werden, sondern direkt. Noch einmal zur Erinnerung: Eine Installation von 7Zip ist nicht notwendig.
Man kann mit dem Kommandozeilentool arbeiten. Was mit dem Kommandozeilentool "7za.exe" erreicht werden kann, klappt auch auf eine andere Weise: Entweder installieren Sie 7Zip auf einer virtuellen Maschine, oder Sie nutzen den Windows Installer zum Auspacken der MSI-Datei. Nehmen wir an die Datei "7z922.msi" befindet sich in "C:\Temp\7z". Dort ist noch ein Unterordner mit Namen "7". Mit folgendem Befehl auf der Dos-Ebene entpacken Sie den Inhalt der MSI-Datei: "msiexec /a 7z922.msi /qb targetdir=C:\Temp\7z\7".
Suchen Sie dann nach den beiden Dateien "7z.exe und 7z.dll". Diese beiden können Sie nun auch als Kommandozeilentool nutzen. Dies gilt dann auch analog für Windows 64 Bit mit der Datei "7z922-x64.msi".

The files should not be packed on a temporary folder, but directly. Just to remind: An installation of 7Zip is not necessary.
You can use the command line tool. What can be achieved with the command line tool "7za.exe" works well in a different way: either install 7zip on a virtual machine, or use the Windows Installer to unpack the MSI file. Suppose the file "7z922.msi" is located in "C: \ Temp \ 7z". There is still a subfolder named "7". With the following command at the DOS level, you extract the contents of the MSI file: "msiexec /a 7z922.msi /qb targetdir=C:\Temp\7z\7".
Try searching for the two files "7z.exe and 7z.dll". These two you can now use it as a command line tool. This applies analogously also for Windows 64 bit with the file "7z922-x64.msi".

Hier noch eine Beispieldatei / Here's a sample file:
ZIP - mit 7Zip bestimmte Dateien eines Ordners mit Passwort packen - Update...[ZIP 4 MB]

Link:
7Zip...
7Zip - Download...
Command-Line Options - Msiexec.exe

OptionExplicit
' Konstante für die KONSOLENANWENDUNG 7Zip
' Keine Installation erforderlich
' Pfad ANPASSEN!!!!!!!!
ConststrZipAsString="C:\Temp\Zip\7za.exe"
'--------------------------------------------------------------------------
' Module : Modul1
' Author : Case (Ralf Stolzenburg)
' Date : 24.08.2013
' Purpose : 7-Zip alle Dateien eines Ordners packen als 7z...
'--------------------------------------------------------------------------
PublicSubMain()
DimlngLastRowAsLong
DimstrPathQAsString
DimstrPathZAsString
DimstrTMPAsString
DimstrArgAsString
OnErrorGoToFin
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Tabelle1 = der CodeName der Tabelle
' Im VBA-Editor der Name VOR der Klammer - Tabelle1 (Tabelle1)
' im englischen Excel in der Regel Sheet1
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithTabelle1
' Letzte Zeile in Spalte B
lngLastRow=IIf(IsEmpty(.Cells(.Rows.Count,2)),_
.Cells(.Rows.Count,2).End(xlUp).Row,.Rows.Count)
' Pfad in dem die zu packenden Dateien sind
strPathQ=.Range("A1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathQ=IIf(Right(strPathQ,1)<>"\",strPathQ&"\",strPathQ)
' Pfad in den die gepackte 7z-Datei kommt
strPathZ=.Range("C1").Text
' Backslash anhängen, wenn nicht vorhanden
strPathZ=IIf(Right(strPathZ,1)<>"\",strPathZ&"\",strPathZ)
' Schleife über alle Einträge in Spalte B
ForlngLastRow=1TolngLastRow
' Sammeln der Dateinamen inklusive Pfad und Leereichen am Schluss
strTMP=strTMP&strPathQ&.Cells(lngLastRow,2).Text&" "
NextlngLastRow
' Letztes Leerzeichen entfernen
strTMP=Left(strTMP,Len(strTMP)-1)
' Packt die Dateien der Variablen "strTMP" als 7z-Datei
' Zielordner "strPathZ" mit Passwort "passwort"
strArg=strZip&" a -ppasswort "&strPathZ&"Zip.7z "&strTMP
ShellAndWaitstrArg
EndWith
Fin:
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : ShellAndWait
' Author : Case (Ralf Stolzenburg)
' Date : 24.08.2013
' Purpose : ShellAndWait mit ausgeblendetem Dosfenster...
'--------------------------------------------------------------------------
PrivateSubShellAndWait(ByValstrPathNameAsString)
DimWshShellAsObject
OnErrorGoToFin
SetWshShell=CreateObject("WScript.Shell")
WshShell.RunstrPathName,0,True
Fin:
SetWshShell=Nothing
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

Word - UserForm - ComboBox - TextBoxen - Daten aus Excel ziehen...

$
0
0
Eine Userform in Word. Die Combobox wird mit Daten aus Excel gefüllt. Bei Auswahl eines Namens werden die Textboxen mit den zugehörigen Daten befüllt. Die Exceldatei wird zu Beginn ausgeblendet geöffnet und beendet, wenn die Userform geschlossen wird. Die Word- und Exceldatei müssen im gleichen Verzeichnis sein.

A UserForm in Word. The combo box is filled with data from Excel. When you select a name, the text boxes are filled with the corresponding data. The Excel file is opened hidden at the start and ends when the UserForm is closed. The Word and Excel file must be in the same directory.

Hier noch eine Beispieldatei / Here's a sample file:
Word - UserForm - ComboBox - TextBoxen - Daten aus Excel ziehen...[ZIP 35 KB]

' Variablendeklaration erforderlich
OptionExplicit
' Konstanten - da Late Binding also KEIN Verweis auf Excelbibliothek
ConstxlFormulas=-4123
ConstxlColumns=2
ConstxlUp=-4162
ConstxlWhole=1
'--------------------------------------------------------------------------
' Module : UserForm1
' Procedure : UserForm_Initialize
' Author : © Case (Ralf Stolzenburg)
' Date : 22.08.2015
' Purpose : Excel öffnen, Daten aus Adressliste per Find ziehen...
'--------------------------------------------------------------------------
' Variablendeklaration ausserhalb - weil auch andere Prozeduren zugreifen
DimlngLastRowAsLong
DimobjSheetAsObject
DimblnTMPAsBoolean
DimobjExelAsObject
PrivateSubUserForm_Initialize()
' Variablendeklaration
DimlngTMPAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Exceldatei ausgeblendet öffnen
SetobjExel=GetObject(ThisDocument.Path&"\AdressListe.xls")
' Zugriff auf das erste Tabellenblatt
SetobjSheet=objExel.Worksheets(1)
' Oder mit Namen
'Set objSheet = objExel.WorkSheets("Adressen")
WithobjSheet
' letzte belegte Zeile im Excelsheet in Spalte A ermitteln
lngLastRow=IIf(IsEmpty(.Cells(.Rows.Count,1)),_
.Cells(.Rows.Count,1).End(xlUp).Row,.Rows.Count)
ComboBox1.Clear
' Erster Eintrag in der Combobox
ComboBox1.AddItem("Auswahl...")
' Schleife um die Combobox zu befüllen
ForlngTMP=2TolngLastRow
ComboBox1.AddItem(.Range("A"&lngTMP))
NextlngTMP
' Combobox auf ersten Eintrag setzen
ComboBox1.ListIndex=0
EndWith
blnTMP=True
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
PrivateSubComboBox1_Change()
' Variablendeklaration
DimlngTMPAsLong
DimlngRowAsLong
OnErrorGoToFin
' Da schon beim befüllen der Combobox das Change-Event ausgeführt
' wird - hier unterbunden mit einer Boolean-Variablen
IfblnTMPThen
' Wenn nicht der erste Eintrag angezeigt wird dann...
IfComboBox1.ListIndex>0Then
' Finde in Excel die Zeile mit dem Inhalt von Combobox1
lngRow=objSheet.Range("A2:A"&lngLastRow).Find_
(ComboBox1.Value,LookIn:=xlFormulas,_
LookAt:=xlWhole,SearchOrder:=xlColumns).Row
' Befülle die Textboxen mit den korrespondierenden Werten
ForlngTMP=1To4
Me.Controls("TextBox"&lngTMP).Text=_
objSheet.Cells(lngRow,lngTMP+1).Text
NextlngTMP
Else
' Sonst also wenn Auswahl... bzw. Listindex <=0 dann Textboxen leeren
ForlngTMP=1To4
Me.Controls("TextBox"&lngTMP).Text=""
NextlngTMP
EndIf
EndIf
Fin:
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
PrivateSubCommandButton1_Click()
' Userform beenden
UnloadMe
EndSub
PrivateSubUserForm_QueryClose(CancelAsInteger,CloseModeAsInteger)
' Wenn NICHT das "x" geklickt wurde dann...
IfCloseMode<>0Then
' Excel schliessen
objExel.CloseFalse
' Objektvariable leeren
SetobjSheet=Nothing
SetobjExel=Nothing
Else
' Sonst mache nichts bzw. breche das beenden ab
Cancel=True
EndIf
EndSub

Geschlossene Dateien - Range und Summe bestimmter Zellen...

$
0
0
Geschlossene Dateien. Zellen werden über ein Array ausgelesen - inklusive Unterordner (optional). Bestimmte Zellen werden summiert. Nur Dateien die einem bestimmten Muster folgen, werden eingelesen. In diesem Beispiel - kein "eta" im Dateiname. Die Summe wird über "ExecuteExcel4Macro" realisiert.

Closed files. Cells are read on an array - including subfolders (optional). Certain cells are summed. Only files that follow a certain pattern are read. In this example - no "eta" in the File Name. The sum will be implemented via "ExecuteExcel4Macro".

Hier noch eine Beispieldatei / Here's a sample file:
Geschlossene Dateien - Range und Summe bestimmter Zellen...[ZIP 900 KB]

' Variablendeklaration erforderlich
OptionExplicit
' Der Tabellenblattname in den auszulesenden Dateien
ConststrSheetQAsString="Tabelle1"
' Der Tabellenblattname in DIESER Datei (die mit dem Code)
ConststrSheetZAsString="Werte"
' Diese Zellen werden Summiert
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : Files_Read_1
' Author : © Case (Ralf Stolzenburg)
' Date : 27.08.2015
' Purpose : Geschlossene Dateien - mehrere Zellen auslesen - Array...
'--------------------------------------------------------------------------
PublicSubMain()
' Variablendeklaration
DimblnUpdateAsBoolean
DimobjShellAsObject
DimintCalcAsInteger
DimstrDirAsString
DimobjFSOAsObject
DimobjDirAsObject
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
.ScreenUpdating=False
blnUpdate=.AskToUpdateLinks
.AskToUpdateLinks=False
.EnableEvents=False
lngCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
' Der Objektvariablen objFSO das "FilesystemObject" zuweisen
SetobjFSO=CreateObject("Scripting.FileSystemObject")
' Wenn Du einen Ordnerauswahldialog möchtest
'Set objShell = CreateObject("Shell.Application")
'Set varDir = objShell.BrowseForFolder(0, "Ordner", &H4000, 17)
'If varDir Is Nothing Then Set objShell = Nothing: Exit Sub
'strDir = varDir.Self.Path
' Datei im gleichen Ordner wie Auswertungsdateien
strDir=ThisWorkbook.Path
'strDir = "C:\Temp\Los\" ' Fester Pfad
SetobjDir=objFSO.GetFolder(strDir)
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier strSheetZ
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithThisWorkbook.Worksheets(strSheetZ)
' Inhalt von Tabelle "strSheetZ" wird ab Zeile 2 gelöscht
.Rows("2:"&.Rows.Count).ClearContents
' Mit Unterordner
dirInfoobjDir,"*.xls*",True
' Ohne Unterordner
'dirInfo objDir, "*.xls*"
' Formeln entfernen - Werte bleiben erhalten
.UsedRange.Value=.UsedRange.Value
EndWith
Fin:
' Setze die Objektvariablen auf Nothing
SetobjDir=Nothing
SetobjFSO=Nothing
' Die Applikation aufwecken
WithApplication
.ScreenUpdating=True
.AskToUpdateLinks=blnUpdate
.EnableEvents=True
.Calculation=lngCalc
.DisplayAlerts=True
EndWith
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : dirInfo
' Author : © Case (Ralf Stolzenburg)
' Date : 27.08.2015
' Purpose : Geschlossene Dateien - mehrere Zellen auslesen - Array...
'--------------------------------------------------------------------------
' Rekursive Sub mit Array - Optional mit Unterordner
PublicSubdirInfo(ByValobjCurrentDirAsObject,ByValstrNameAsString,_
OptionalByValblnTMPAsBoolean=False)
' Variablendeklaration
DimstrFormulaAsString
DimlngLastRowAsLong
DimarrCellAsVariant
DimintTMPAsInteger
DimvarTMPAsVariant
' Weitere Zellen nach gleichem Muster in das Array einfügen
arrCell=Array("A1","C1","E2","H8","I8",_
"H16","I16","H24","I24","H32","I32","C8",_
"D8","C16","D16","C24","D24","C32","D32")
' Alle Dateien im vorgegebenen Ordner
ForEachvarTMPInobjCurrentDir.Files
' Dateiname entspricht den Vorgaben und ist nicht DIESE Datei
' Falls im gleichen Ordner und ist KEINE temporäre Datei
' Dateiname mit "eta" im Namen werden NICHT eingelesen!!!!!
IfvarTMP.NameLikestrNameAndvarTMP.Name<>_
ThisWorkbook.NameAndLeft(varTMP.Name,1)<>"~"Then
IfNotvarTMP.NameLike"*eta*"Then
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier strSheetZ
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithThisWorkbook.Worksheets(strSheetZ)
' Letzte Zeile bezogen auf Spalte A plus 1
lngLastRow=IIf(Len(.Cells(.Rows.Count,1)),_
.Rows.Count,.Cells(.Rows.Count,1).End(xlUp).Row)+1
' Schleife über alle Zellen des Arrays
ForintTMP=LBound(arrCell)ToUBound(arrCell)
' Hier würde jetzt noch der Dateiname mit Pfad
' in die nächste freie Spalte geschrieben
'.Cells(lngLastRow, UBound(arrCell) + 2).Value = varTMP.Path
' Hier würde jetzt noch der Dateiname
' in die nächste freie Spalte geschrieben
'.Cells(lngLastRow, UBound(arrCell) + 2).Value = varTMP.Name
' Werte über Formel holen, Tabellenblatt über "Const..."
' oben definiert, Zelle über Array. Formel in Spalte A folgende...
strFormula="'"&Mid(varTMP.Path,1,InStrRev(varTMP.Path,"\"))&_
"["&Mid(varTMP.Path,InStrRev(varTMP.Path,"\")+1)&"]"&strSheetQ&"'!"
.Cells(lngLastRow,intTMP+1).Formula="="&strFormula&arrCell(intTMP)
NextintTMP
.Cells(lngLastRow,20).Value=ExecuteExcel4Macro(strFormula&"R18C6")+_
ExecuteExcel4Macro(strFormula&"R26C6")+_
ExecuteExcel4Macro(strFormula&"R34C6")
.Cells(lngLastRow,21).Value=ExecuteExcel4Macro(strFormula&"R21C6")+_
ExecuteExcel4Macro(strFormula&"R29C6")+_
ExecuteExcel4Macro(strFormula&"R37C6")
EndWith
EndIf
EndIf
NextvarTMP
' Wenn die Variable blnTMP "True" ist (in der Sub "Files_Read_1" vorgegeben
' Dann durchsuche auch alle Unterordner
IfblnTMP=TrueThen
ForEachvarTMPInobjCurrentDir.SubFolders
dirInfovarTMP,strName,blnTMP
NextvarTMP
EndIf
EndSub

UserForm - Datum - Filtern - als PDF speichern...

$
0
0
In Spalte A steht fortlaufend das Datum. Dies soll über eine UserForm gefiltert und als PDF gespeichert werden.

In column A continuously is the date. This should be filtered through a UserForm and saved as a PDF.

Hier noch eine Beispieldatei / Here's a sample file:
UserForm - Datum - Filtern - als PDF speichern...[XLSM 60 KB]

' Variablendeklaration erforderlich
OptionExplicit
'--------------------------------------------------------------------------
' Module : UserForm1
' Procedure : UserForm_Activate
' Author : © Case (Ralf Stolzenburg)
' Date : 04.01.2016
' Purpose : Bereich - Datum - Filtern - PDF speichern...
'--------------------------------------------------------------------------
PrivateSubUserForm_Activate()
' Tabelle1 Spalte A in Combobox schreiben
ComboBox1.List=Tabelle1.Range("A2:A"&Cells(Rows.Count,1).End(xlUp).Row).Value
' Inhalt ComboBox2 = ComboBox1
ComboBox2.List=ComboBox1.List
' Eintrag in ComboBox1 komplett markieren - ersten Eintrag anzeigen
WithComboBox1
.ListIndex=0
.SetFocus
.SelStart=0
.SelLength=Len(ComboBox1)
EndWith
' 16ten Eintrag von ComboBox2 anzeigen (Zählung beginnt bei 0)
ComboBox2.ListIndex=15
EndSub
PrivateSubCommandButton1_Click()
' Variablendeklaration
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
.ScreenUpdating=False
.EnableEvents=False
lngCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
' Wenn ComboBox1 oder 2 leer ist - Meldung ausgeben
IfMe.ComboBox1.Text=""OrMe.ComboBox2.Text=""Then
IfMe.ComboBox1.Text=""Then
MsgBox"Startdatum angeben!"
Me.ComboBox1.SetFocus
Else
MsgBox"Enddatum angeben!"
ComboBox2.SetFocus
EndIf
Else
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Tabelle1 = der CodeName der Tabelle
' Im VBA-Editor der Name VOR der Klammer - Tabelle1 (Tabelle1)
' im englischen Excel in der Regel Sheet1
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithTabelle1
' Filtern und als PDF auf dem Desktop speichern
.Range("A1").AutoFilterField:=1,_
Criteria1:=">="&CDbl(DateValue(ComboBox1)),_
Operator:=xlAnd,Criteria2:="<="&CDbl(DateValue(ComboBox2))
.ExportAsFixedFormat0,Environ("UserProfile")&_
"\Desktop\"&Left(ThisWorkbook.Name,_
(InStrRev(ThisWorkbook.Name,".")-1))&_
Format(Now,"_DD.MM.YYYY"),,,,,,False
' Wenn Autofilter und gefiltert dann alle Daten zeigen
If.AutoFilterModeAnd.FilterModeThen.ShowAllData
' Autofilter löschen
.Rows.AutoFilter
' Seitenumbruchlinien ausblenden
.DisplayAutomaticPageBreaks=False
EndWith
EndIf
Fin:
' Die Applikation aufwecken
WithApplication
.ScreenUpdating=True
.EnableEvents=True
.Calculation=lngCalc
.DisplayAlerts=True
EndWith
' Wenn die Fehlernummer NICHT 0 ist, dann gib die Fehlernummer
' und die Fehlerbeschreibung aus
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
PrivateSubComboBox2_DropButtonClick()
' Eintrag in ComboBox2 komplett markieren
WithComboBox2
.SetFocus
.SelStart=0
.SelLength=Len(ComboBox2)
EndWith
EndSub
PrivateSubCommandButton2_Click()
' UserForm entladen
UnloadMe
EndSub
PrivateSubUserForm_QueryClose(CancelAsInteger,CloseModeAsInteger)
' Schliessen über das "x" unterbinden
IfCloseMode=0ThenCancel=True
EndSub

Outlook - Ordner im Postein- und Postausgang erstellen...

$
0
0
Outlook - Ordner im Posteingang und Postausgang erstellen. Wie geht das?

Create a folder in your Inbox and Outbox - Outlook. How does it work?

OptionExplicit
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 18.01.2016
' Purpose : Outlook - Ordner unter Postein- und Postausgang erstellen...
'--------------------------------------------------------------------------
SubMain()
DimobjNewFolderAsObject
DimvarFolderAsVariant
DimobjFolderAsObject
DimobjOutAppAsObject
DimobjNameAsObject
DimblnTMPAsBoolean
OnErrorGoToFin
varFolder=Application.InputBox("Ordnername?",Type:=2)
IfNotvarFolder=FalseAndTrim(varFolder)<>""Then
SetobjOutApp=CreateObject("Outlook.Application")
SetobjName=objOutApp.GetNamespace("MAPI")
' 6 = olFolderInbox
' 4 = olFolderOutbox
OnErrorResumeNext
SetobjFolder=objName.GetDefaultFolder(6)
SetobjNewFolder=objFolder.Folders.Add(varFolder)
IfErr.Number=440ThenblnTMP=True
Err.Clear
OnErrorGoToFin
SetobjFolder=objName.GetDefaultFolder(4)
SetobjNewFolder=objFolder.Folders.Add(varFolder)
EndIf
Fin:
SelectCaseErr.Number
Case440
MsgBox"Ordner bereits vorhanden!"
Case0
CaseElse
MsgBox"Fehler: "&Err.Number&" "&Err.Description
EndSelect
SetobjNewFolder=Nothing
SetobjFolder=Nothing
SetobjName=Nothing
SetobjOutApp=Nothing
EndSub
' Nachfolgend die Elemente bzw. Konstanten von "OlDefaultFolders"
' Entnommen aus Objektkatalog (F2 im VBA-Editor) in Outlook 2010
'Const olFolderCalendar = 9
'Const olFolderConflicts = 19 (&H13)
'Const olFolderContacts = 10
'Const olFolderDeletedItems = 3
'Const olFolderDrafts = 16 (&H10)
'Const olFolderInbox = 6
'Const olFolderJournal = 11
'Const olFolderJunk = 23 (&H17)
'Const olFolderLocalFailures = 21 (&H15)
'Const olFolderManagedEmail = 29 (&H1D)
'Const olFolderNotes = 12
'Const olFolderOutbox = 4
'Const olFolderRssFeeds = 25 (&H19)
'Const olFolderSentMail = 5
'Const olFolderServerFailures = 22 (&H16)
'Const olFolderSuggestedContacts = 30 (&H1E)
'Const olFolderSyncIssues = 20 (&H14)
'Const olFolderTasks = 13
'Const olFolderToDo = 28 (&H1C)
'Const olPublicFoldersAllPublicFolders = 18 (&H12)

Unterschiedliche Textfelder in Word aus Excel befüllen...

$
0
0
Ein einfaches Beispiel - unterschiedliche Textfelder in einem Word Dokument füllen mit Daten aus Excel.

A simple example - different text fields in a Word document, fill it with data from Excel.

Hier noch eine Beispieldatei / Here's a sample file:
Unterschiedliche Textfelder in Word aus Excel befüllen...[ZIP 100 KB]

OptionExplicit
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 02.08.2016
' Purpose : Word - Datei öffnen, verschiedene Textfelder befüllen...
'--------------------------------------------------------------------------
PublicSubMain()
DimstrPathFile1AsString
DimstrPathFileAsString
DimstrBookmarkAsString
DimobjWDDocVAsObject
DimobjWDDocAsObject
DimobjWDAppAsObject
DimlngCalcAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
' Das Bildschirmaktualisierung wird unterbrochen
.ScreenUpdating=False
' Ereignisroutinen werden deaktiviert
.EnableEvents=False
' Auslesen der momentanen Einstellung für die Berechnung
lngCalc=.Calculation
' Setzen der Berechnung auf "Manuell"
.Calculation=xlCalculationManual
' Eingabeaufforderungen und Warnmeldungen unterdrücken
.DisplayAlerts=False
EndWith
' Pfad und Dateiname der WordVORLAGE. Diese ist im selben Ordner
' wie die Exceldatei mit dem Code
strPathFile1=ThisWorkbook.Path&Application.PathSeparator&_
"Textfelder_befuellen_aus_Excel.dotx"
' Pfad und Dateiname der Worddatei. Diese ist im selben Ordner
' wie die Exceldatei mit dem Code
strPathFile=ThisWorkbook.Path&Application.PathSeparator&_
"Textfelder_befuellen_aus_Excel.docx"
' Die Wordapplikation sichtbar starten
SetobjWDApp=OffApp("Word",False)
IfNotobjWDAppIsNothingThen
' Worddatei öffnen und auf Objektvariable festlegen
SetobjWDDoc=objWDApp.Documents.Open(strPathFile,,True)
' Worddatei aus Vorlage öffnen und auf Objektvariable festlegen
SetobjWDDocV=objWDApp.Documents.Add(Template:=strPathFile1)
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier das Worddokument
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithobjWDDoc
.FormFields("Text1").Result="Text1"
.TextBox1.Text="Text2"
.ContentControls(1).Range.Text="Text3"
.ContentControls(2).Range.Text="Text4"
.Shapes("Text Box 1").TextFrame.TextRange.Text="Text5"
EndWith
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier das Worddokument, das aus der Vorlage erstellt wurde
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithobjWDDocV
.FormFields("Text1").Result="Text1"
.TextBox1.Text="Text2"
.ContentControls(1).Range.Text="Text3"
.ContentControls(2).Range.Text="Text4"
.Shapes("Text Box 1").TextFrame.TextRange.Text="Text5"
EndWith
EndIf
' Die folgende Codezeile KANN raus, WENN die Datei dann z. B.
' gespeichert und geschlossen wird, also ein kompletter
' Durchgang gemacht wird
' IN UNSEREM BEISPIEL HIER NATÜRLICH NICHT!
objWDApp.Visible=True
Fin:
' Objektvariablen zurücksetzen
SetobjWDDocV=Nothing
SetobjWDDoc=Nothing
SetobjWDApp=Nothing
' Die Applikation aufwecken
WithApplication
' Bildschirmaktualisierung wieder einschalten
.ScreenUpdating=True
' Ereignisroutinen werden wieder aktiviert
.EnableEvents=True
' Setzen der Berechnung auf den gemerkten Wert
.Calculation=lngCalc
' Eingabeaufforderungen und Warnmeldungen wieder zulassen
.DisplayAlerts=True
' Abbrechen Ausschneide- bzw. Kopiermodus und entfernen des Laufrahmens
.CutCopyMode=True
EndWith
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : OffApp
' Author : Case (Ralf Stolzenburg)
' Date : 02.08.2016
' Purpose : Start application...
'--------------------------------------------------------------------------
PrivateFunctionOffApp(ByValstrAppAsString,_
OptionalblnVisibleAsBoolean=True)AsObject
DimobjAppAsObject
OnErrorResumeNext
SetobjApp=GetObject(,strApp&".Application")
SelectCaseErr.Number
Case429
Err.Clear
SetobjApp=CreateObject(strApp&".Application")
objApp.Visible=blnVisible
EndSelect
SetOffApp=objApp
SetobjApp=Nothing
EndFunction

Alle Dateien eines Ordners...

$
0
0
Alle Dateien eines Ordners (optional mit Unterordner) werden aufgelistet. Ist es keine Exceldatei wird der Dateityp in die Zelle geschrieben. Ist es eine Exceldatei - prüfen, ob ein bestimmtes Tabellenblatt vorhanden ist. Wenn das Tabellenblatt vorhanden ist - Wert aus A3 in Zelle schreiben, sonst Info in Zelle schreiben.

All files in a folder (optionally with subfolders) are listed. If it is not an excel file, the data type is written into the cell. Is it an Excel file - check if a particular spreadsheet is present. If the sheet exists, write value from A3 to cell, otherwise write info to cell.

Hier noch eine Beispieldatei / Here's a sample file:
Alle Dateien eines Ordners...[ZIP 2 MB]

OptionExplicit
' Informationsausgabe
ConststrInfo1AsString="Keine Exceldatei!"
ConststrInfo2AsString="Nicht vorhanden!"
' Tabellenblatt das geprüft werden soll
ConststrSheetAsString="Tabelle1"
' Suchmuster gegebenenfalls anpassen
ConststrEXAsString="*.*"
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 09.10.2016
' Purpose : Alle Dateien eines Ordners - Optional mit Unterordner...
'--------------------------------------------------------------------------
PublicSubMain()
DimstrDirAsString
DimobjFSOAsObject
DimobjDirAsObject
DimlngCalcAsLong
OnErrorGoToFin
WithApplication
.ScreenUpdating=False
.AskToUpdateLinks=False
.EnableEvents=False
lngCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
SetobjFSO=CreateObject("Scripting.FileSystemObject")
' Mit Ordnerauswahldialog
strDir=fncFolder("C:\")
' Datei im gleichen Ordner wie Auswertungsdateien
' strDir = ThisWorkbook.Path & "\"
' Fester Ordner vorgegeben
' strDir = "C:\Temp\Stick\"
' strDir = IIf(Right(strDir, 1) <> "\", strDir & "\", strDir)
IfstrDir<>""Then
Tabelle1.Rows("2:"&Tabelle1.Rows.Count).ClearContents
SetobjDir=objFSO.getfolder(strDir)
dirInfoobjDir,strEX,True' Mit Unterordner
' dirInfo objDir, strEX ' Ohne Unterordner
EndIf
Fin:
WithApplication
.ScreenUpdating=True
.AskToUpdateLinks=True
.EnableEvents=True
.Calculation=lngCalc
.DisplayAlerts=True
EndWith
SetobjDir=Nothing
SetobjFSO=Nothing
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
'--------------------------------------------------------------------------
' Module : Module1
' Procedure : dirInfo
' Author : Case (Ralf Stolzenburg)
' Date : 09.10.2016
' Purpose : Rekursive Funktion alle Dateien...
'--------------------------------------------------------------------------
PublicSubdirInfo(ByValobjCurrentDirAsObject,ByValstrNameAsString,_
OptionalByValblnTMPAsBoolean=False)
DimobjMappeAsObject
DimlngLastRowAsLong
DimvarTMPAsVariant
ForEachvarTMPInobjCurrentDir.Files
IfvarTMP.NameLikestrNameThen
IfvarTMP.Name<>ThisWorkbook.NameThen
IfLeft(varTMP.Name,1)<>"~"Then
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier Tabelle1 = Objektname - Name VOR der Klammer
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithTabelle1
' Letzte Zeile bezogen auf Spalte A plus 1
lngLastRow=IIf(Len(.Cells(.Rows.Count,1)),_
.Rows.Count,.Cells(.Rows.Count,1).End(xlUp).Row)+1
IfvarTMP.TypeLike"*Excel*"Then
' Hier jetzt der Code um mit der Datei etwas zu machen
' z. B. Öffnen, etwas auslesen oder was auch immer...
' Im folgenden werden nur ein paar Informationen
' im Direktfenster (VBE - STRG+G) ausgegeben
' Diese Zeilen mit Debug.Print können natürlich
' gelöscht bzw. auskommentiert werden
' Pfad- und Dateiname in Spalte A schreiben
.Cells(lngLastRow,1).Value=varTMP.Path
' Datei ausgeblendet öffnen
SetobjMappe=GetObject(varTMP.Path)
' Prüfen, ob Tabellenblatt vorhanden
IffncSheetEx(varTMP.ParentFolder.Path,varTMP.Name,strSheet)=TrueThen
With.Cells(lngLastRow,2)
.Value=objMappe.Worksheets(strSheet).Range("A3").Value
.Font.ColorIndex=3
EndWith
Else
With.Cells(lngLastRow,2)
.Value=strInfo2
.Font.ColorIndex=3
EndWith
EndIf
objMappe.CloseFalse
SetobjMappe=Nothing
' Debug.Print "Pfad: " & varTMP.ParentFolder.Path
' Debug.Print "Name: " & varTMP.Name
' Debug.Print "Erstelldatum: " & varTMP.DateCreated
' Debug.Print "Letzter Zugriff: " & varTMP.DateLastAccessed
' Debug.Print "Letzte Änderung: " & varTMP.DateLastModified
' Debug.Print "Größe in Byte: " & varTMP.Size
' Debug.Print "Type: " & varTMP.Type
' Debug.Print "Anzahl ALLE: " & varTMP.ParentFolder.Files.Count
' Debug.Print vbCrLf
Else
' Pfad- und Dateiname in Spalte A schreiben
.Cells(lngLastRow,1).Value=varTMP.Path
' Dateityp in Spalte B schreiben
.Cells(lngLastRow,2).Value=varTMP.Type
' Optional - Information1 in Spalte B schreiben
' .Cells(lngLastRow, 2).Value = strInfo1
EndIf
EndWith
EndIf
EndIf
EndIf
NextvarTMP
IfblnTMP=TrueThen
ForEachvarTMPInobjCurrentDir.SubFolders
dirInfovarTMP,strName,blnTMP
NextvarTMP
EndIf
SetobjMappe=Nothing
EndSub
' Funktion um einen Ordner auszzuwählen
PrivateFunctionfncFolder(strPathAsString)AsString
WithApplication.FileDialog(msoFileDialogFolderPicker)
.InitialFileName=strPath
.Title="Folder"
.ButtonName="Select..."
.InitialView=msoFileDialogViewList
If.Show=-1Then
strPath=.SelectedItems(1)
IfRight(strPath,1)<>"\"ThenstrPath=strPath&"\"
Else
strPath=""
EndIf
EndWith
fncFolder=strPath
EndFunction
' Funktion um das Vorhandensein von Tabellenblättern zu prüfen
' Evaluate wertet einen String aus
' ISREF ist eine Worksheet Funktion die True/False bezogen auf
' eine gültige Zellreferenz zurückliefert
PrivateFunctionfncSheetEx(ByValstrPathAsString,ByValstrFileAsString,ByValstrSheetAsString)AsBoolean
OnErrorResumeNext
fncSheetEx=Evaluate("ISREF("&"'"&strPath&"\"&"["&strFile&"]"&strSheet&"'"&"!A1)")
Err.Clear
EndFunction

Alle Dateien eines Ordners - UserForm austauschen...

$
0
0
In allen Dateien eines Ordners (ohne Unterordner) eine geänderte UserForm importieren.

In all files of a folder (without subfolder) import a changed UserForm.

Hier noch eine Beispieldatei / Here's a sample file:
Alle Dateien eines Ordners - UserForm austauschen...[ZIP 250 KB]

OptionExplicit
'--------------------------------------------------------------------------
' Module : Modul1
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 20.02.2017
' Purpose : Alle Dateien eines Ordners - UsrForm austauschen...
'--------------------------------------------------------------------------
SubMain()
' Name der Ex- bzw. Importdatei
ConststrTMPAsString="uf.frm"
DimstrFileNameAsString
DimstrPathAsString
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Bildschirmaktualisierung ausschalten
Application.ScreenUpdating=False
' Pfad anpassen!!! Im Moment der Pfad mit der Datei mit diesem Makro
strPath=ThisWorkbook.Path
' Letzten Backslash vergessen
IfRight(strPath,1)<>"\"ThenstrPath=strPath&"\"
' Datei schon/noch da, dann löschen
IfDir$(Environ$("TEMP")&"\"&strTMP)<>""Then
KillEnviron$("TEMP")&"\"&strTMP
EndIf
' UserForm aus DIESER Datei EXportieren - in TEMP-Ordner
Workbooks(ThisWorkbook.Name).VBProject.VBComponents("UserForm1").ExportEnviron$("TEMP")&"\"&strTMP
' Erste Datei im Ordner suchen
strFileName=Dir$(strPath&"*.xls*")
' Schleife über alle Dateien - OHNE Unterordner
DoWhilestrFileName<>""
' DIESE Datei wird nicht berücksichtigt
IfNotstrFileName=ThisWorkbook.NameThen
' Datei öffnen
Workbooks.OpenstrPath&strFileName
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier die eben geöffnete Datei
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithWorkbooks(strFileName)
' Alte UserForm löschen
.VBProject.VBComponents.Remove.VBProject.VBComponents("UserForm1")
' Neue Userform IMportieren
.VBProject.VBComponents.ImportEnviron$("TEMP")&"\"&strTMP
' Datei schliessen UND speichern
.CloseTrue
EndWith
EndIf
' Nächste Datei
strFileName=Dir$()
Loop
Fin:
' Datei schon/noch da, dann löschen
IfDir$(Environ$("TEMP")&"\"&strTMP)<>""Then
KillEnviron$("TEMP")&"\"&strTMP
EndIf
' Bildschirmaktualisierung einschalten
Application.ScreenUpdating=True
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Error: "&_
Err.Number&" "&Err.Description
EndSub

Range - Picture - Outlook Body...

$
0
0
Range (mit Format und Daten Gültigkeit) als Bild in Outlook Body.

Range (with format and data validity) as image in Outlook Body.

Hier noch eine Beispieldatei / Here's a sample file:
Range - Picture - Outlook Body...[ZIP 40 KB]

OptionExplicit
' Bedingte Kompilierung für 32/64 Bit
#If Win64 Then
PrivateDeclarePtrSafeFunctionSearchTreeForFileLib"imagehlp.dll"_
(ByValRootPathAsString,ByValInputPathNameAsString,_
ByValOutputPathBufferAsString)AsLong
PrivateDeclarePtrSafeFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValPfadAsString)AsLong
#Else
PrivateDeclareFunctionSearchTreeForFileLib"imagehlp.dll"_
(ByValRootPathAsString,ByValInputPathNameAsString,_
ByValOutputPathBufferAsString)AsLong
PrivateDeclareFunctionMakeSureDirectoryPathExists_
Lib"imagehlp.dll"(ByValPfadAsString)AsLong
#End If
PublicSubMain()
' Puffer für Pfad- und Dateiname festlegen
DimstrPathNameAsString*255
DimstrNameAsString
DimobjFSOAsObject
DimlngCalcAsLong
DimlngTMPAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
.AskToUpdateLinks=False
.EnableEvents=False
lngCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
' Verzeichnis im %Temp% Ordner wird erstellt
CallMakeSureDirectoryPathExists(Environ("Temp")&"\TT\")
' Bereich "B3:D7" wird als Bild kopiert
CallThisWorkbook.Worksheets("Lieferung").Range("B3:D7").CopyPicture(xlScreen,xlBitmap)
' ERST hier die Bildschirmaktualisierung ausschalten, SONST BLEIBT DAS BILD LEER!
Application.ScreenUpdating=False
' Tabellenblatt hinzufügen - dies ist dann automatisch das aktive
ThisWorkbook.Worksheets.Add
' Bild in A1 einfügen
ThisWorkbook.ActiveSheet.Paste
' Bereich als "htm-Datei" im %Temp% Ordner speichern. Dabei wird das Bild automatisch
' als PNG-Datei in einen Unterordner abgelegt
WithThisWorkbook.PublishObjects.Add(xlSourceRange,_
Environ("Temp")&"\TT\TT.htm",ActiveSheet.Name,"$A:$E",xlHtmlStatic,"TT","")
.Publish(True)
.AutoRepublish=False
EndWith
' Temporäres Tabellenblatt wieder löschen
ThisWorkbook.ActiveSheet.Delete
' Grafikdatei suchen - hat immer den Namen (hier TT) und 001.png im Namen
lngTMP=SearchTreeForFile(Environ("Temp"),"\TT\TT_*001.png",strPathName)
' Wenn gefunden...
IflngTMP<>0Then
' Den Pfad- und Dateiname auf die richtige Länge eindampfen
strPathName=Left$(strPathName,InStr(1,strPathName,vbNullChar)-1)
strName=RTrim(strPathName)
' Mail senden - mit dem Pfad- und Dateinamen der Grafikdatei
CallMail(strName)
EndIf
' Ordner im %Temp% wieder löschen
SetobjFSO=CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder(Environ("Temp")&"\TT"),True
Fin:
' Objektvariablen zurücksetzen
SetobjFSO=Nothing
' Die Applikation aufwecken
WithApplication
.ScreenUpdating=True
.AskToUpdateLinks=True
.EnableEvents=True
.Calculation=lngCalc
.DisplayAlerts=True
EndWith
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
SubMail(ByValstrTMPAsString)
DimobjOutAppAsObject
DimstrText1AsString
DimstrText2AsString
DimstrText3AsString
DimstrFileAsString
' Outlook starten - gleich mit neuer Mail - das ist die 0 - Kontakt wäre 2
SetobjOutApp=CreateObject("Outlook.Application").CreateItem(0)
' Die Variable in der richtigen Form mit dem Pfad- und Dateinamen der Grafikdatei befüllen
strFile=" <img src=""file://"&strTMP&""">"
' Texte die später im Body auftauchen sollen. Muss man so nicht machen
' Man kann auch alles mit HTML-Code im Body schreiben
strText1="Sehr geehrte Damen und Herren,"
strText2="wir benötigen nächste Woche folgende LKW's:"
WithobjOutApp
' Standardsignatur aufrufen und...
.GetInSpector.Display
' ... zwischenspeichern
strText3=.HTMLBody
' An...
.To="Mail@dd.de"
'.CC = "An@WenNoch.de
' Versteckte Empfänger...
'.BCC = "AuchNoch@AnDen.de; UndNoch@AnJene.de"
' Anhang...
'.Attachments.Add "C:\Temp\IrgendwasVonIrgendwo.xlsx"
' Betreff...
.Subject="Lieferungen "&ThisWorkbook.Worksheets("Lieferung").Range("A1").Text&"/"&Year(Date)
' Body...
.HTMLBody=strText1&"<br>"&"<br>"&strText2&"<br>"&"<br>"&strFile&strText3
' Hier wird die Mail angezeigt, sonst gleich ".Send"
.Display
'.Send
EndWith
SetobjOutApp=Nothing
EndSub

Google Maps - Strasse aus Name, PLZ und Ort ausgeben...

$
0
0
Gegeben: Name, PLZ und Stadt der Firma. In Zelle daneben: Straße schreiben.
Bitte beachten: Es gibt Einschränkungen bei der Anzahl der Abfragen in Google Maps. Informieren Sie sich bitte über ALLE Einschränkungen.

Given: name, zip code and city of the company. In cell next to it: write street. Please note: There are restrictions on the number of queries in Google Maps. Please inform yourself about ALL restrictions.

Hier noch eine Beispieldatei / Here's a sample file:
Google Maps - Strasse aus Name, PLZ und Ort ausgeben...[XLSB 25 KB]

OptionExplicit
'--------------------------------------------------------------------------
' Module : modAddress
' Procedure : Main
' Author : Case (Ralf Stolzenburg)
' Date : 23.04.2017
' Purpose : Google Maps - Strasse aus Name, PLZ und Ort ausgeben...
'--------------------------------------------------------------------------
PublicSubMain()
DimwksSheetAsWorksheet
DimobjXMLHTTPAsObject
DimstrFirmaAsString
DimvarArrAsVariant
DimobjXMLAsObject
DimstrURLAsString
DimstrPLZAsString
DimstrOrtAsString
DimlngCalcAsLong
DimlngRowAsLong
' Wenn ein Fehler auftritt gehe zu der angegebenen Sprungmarke
OnErrorGoToFin
' Die Excelapplikation wird ruhig gestellt - UNBEDINGT wieder einschalten
WithApplication
.ScreenUpdating=False
.AskToUpdateLinks=False
.EnableEvents=False
lngCalc=.Calculation
.Calculation=xlCalculationManual
.DisplayAlerts=False
EndWith
' Tabellenblattname - bei Bedarf anpassen
SetwksSheet=ThisWorkbook.Worksheets("Address")
' XMLHttpRequest Objekt = Transport von Daten über das Webprotokoll HTTP
SetobjXMLHTTP=CreateObject("MSXML2.XMLHTTP")
' Der Code bezieht sich auf ein bestimmtes Objekt
' Hier das Objekt (bzw. die Variable) wksSheet
' Alles was sich auf dieses "With" bezieht
' MUSS mit einem Punkt beginnen
WithwksSheet
' Von der ersten Zeile bis zur letzten in Spalte A
ForlngRow=1ToIIf(Len(.Cells(.Rows.Count,1)),.Rows.Count,_
.Cells(.Rows.Count,1).End(xlUp).Row)
' Firmenname - Umlaute umwandeln (ä in ae usw.)
strFirma=fncUmHTM(.Cells(lngRow,1).Text)
' Postleitzahl
strPLZ=.Cells(lngRow,2).Text
' Ort/Stadt - Umlaute umwandeln (ä in ae usw.)
strOrt=fncUmHTM(.Cells(lngRow,3).Text)
' Internetadresse zusammensetzen
strURL="http://maps.googleapis.com/maps/api/geocode/xml?address="&_
strFirma&"%20"&strPLZ&"%20"&strOrt&"&sensor=false"
' Wie gehabt With siehe oben...
WithobjXMLHTTP
' HTTP Kommando, URL angeben, False = Daten Synchron laden
.Open"GET",strURL,False
' Anfrage absenden
.Send
EndWith
' Status 200 - alles OK
IfobjXMLHTTP.Status=200Then
' Rückgabe XML
SetobjXML=CreateObject("MSXML2.DOMDocument")
WithobjXML
' Der komplette Rückgabetext
.LoadXMLobjXMLHTTP.ResponseText
' Es wurde was gefunden
If.ParseError.ErrorCode=0Then
' Text am Komma aufsplitten und Strasse ausgeben
' Wenn Strasse nicht an erster Stelle MUSS angepasst werden
wksSheet.Cells(lngRow,4).Value=_
Split(.SelectSingleNode("//formatted_address").Text,",")
' sonst Fehler in die Zelle schreiben
Else
wksSheet.Cells(lngRow,4).Value="Kein Ergebnis!"
EndIf
EndWith
Else
wksSheet.Cells(lngRow,4).Value="Fehler"
EndIf
SetobjXML=Nothing
NextlngRow
EndWith
Fin:
' Die Applikation aufwecken
WithApplication
.ScreenUpdating=True
.AskToUpdateLinks=True
.EnableEvents=True
.Calculation=lngCalc
.DisplayAlerts=True
EndWith
' Setze die Objektvariablen auf Nothing
SetwksSheet=Nothing
SetobjXML=Nothing
SetobjXMLHTTP=Nothing
' Wenn ein Fehler auftritt gib ihn aus mit Fehlernummer und Beschreibung
IfErr.Number<>0ThenMsgBox"Fehler: "&_
Err.Number&" "&Err.Description
EndSub
' Umlaute umwandeln
PrivateFunctionfncUmHTM(strTMPAsString)AsString
DimvarSAsVariant
DimvarEAsVariant
DimlngTMPAsLong
varS=Array("Ä","Ö","Ü","ä","ö","ü","ß")
varE=Array("Ae","Oe","Ue","ae","oe","ue","ss")
ForlngTMP=0ToUBound(varS)
strTMP=Replace(strTMP,varS(lngTMP),varE(lngTMP))
NextlngTMP
fncUmHTM=strTMP
EndFunction
Viewing all 93 articles
Browse latest View live