Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Tägliche logs als neues Tabellenblatt erstellen

Frage Entwicklung Batch & Shell

Mitglied: Skyemugen

Skyemugen (Level 2) - Jetzt verbinden

31.05.2012, aktualisiert 13:58 Uhr, 5737 Aufrufe, 53 Kommentare

Mahlzeit zusammen,

wenn man an die Grenzen stößt, mit einer Frage sich nicht entblößt ... oder so.

Also weg vom Vorwort und ab zum Kern:

Vorhaben
Täglich wird in einem regulären XX-Minuten-Takt ein ping-log am Server erstellt, diese sollen nun monatlich in eine Datei gepackt werden (csv oder xls[x]).

Hintergrund
Warum das Ganze kann man sich fragen ... ganz einfach, die momentane ADSL-Verbindung ist einfach unter aller Kanone für einen Betrieb im Mittelstand, allerdings gibt es keine nahe günstige Alternative, dennoch möchte ich die Verbindung im gesamten Maße aufzeichnen, denn nur zu sagen: Lief mal wieder sehr langsam, viele Verbindungsabbrüche ist als Druckmittel für eine Finanzierung des Ausbaus des Anschlusses bei der GF nun einmal etwas mager

Was bisher geschah
Bisher habe ich ganz gewöhnliche Textdateien .log erstellt, was mir aber auch nicht gefiel, daher ist der aktuelle Stand das Erstellen einer täglichen .csv Datei mittels einer batch:
01.
@echo off & setlocal 
02.
for /f "tokens=1-3 delims=." %%s in ('echo %date%') do ( 
03.
	set "Datum=%%u-%%t-%%s" 
04.
	set "Jahr=%%u" 
05.
	set "Monat=%%t" 
06.
07.
 
08.
if "%time:~0,1%" equ " " (set "Zeit=0%time:~1,4%") else (set "Zeit=%time:~0,5%") 
09.
 
10.
set "Pfad=D:\Latenz\%Jahr%\%Monat%" 
11.
if not exist "%Pfad%" md "%Pfad%" 
12.
 
13.
set "log=%Pfad%\%Datum%_ping.csv" 
14.
if not exist "%log%" echo Uhrzeit;Min [ms];Max [ms];Mit [ms];Verlust [%%]>"%log%" 
15.
 
16.
for /f "skip=3 tokens=1-12 delims=,( " %%a in ('ping /n 20 google.de^|findstr /V /B "Ping Antwort Ca."') do ( 
17.
	set "Min=%%c" & set "Max=%%f" & set "Mit=%%i" & if not defined lost set "lost=%%k" 
18.
19.
>>"%log%" echo %Zeit%;%Min:~,-2%;%Max:~,-2%;%Mit:~,-3%;%lost:~,-1%
Und so hat man jetzt Verzeichnisse voller 2012-05-31_ping.csv etc. deren Ausgabe so ausschaut:
Uhrzeit;Min [ms];Max [ms];Mit [ms];Verlust [%] 
6:00;33;34;33;0 
6:30;33;35;34;0 
7:00;34;35;34;0 
7:30;33;91;36;0 
8:00;33;56;36;0 
8:30;33;34;33;0 
9:00;34;43;34;0 
9:30;33;63;35;0 
10:00;33;52;34;0 
10:30;33;35;34;0 
11:00;34;35;34;0 
11:30;33;35;33;0 
12:00;33;48;34;0 
12:30;34;39;34;0 
13:00;33;49;33;0 
13:30;32;56;34;0 
14:00;34;277;106;0 
14:30;33;34;33;0 
15:00;34;123;39;0 
15:30;32;35;33;0 
16:00;34;35;34;0 
16:30;34;35;34;0 
17:00;33;64;37;0 
17:30;32;34;33;0 
18:00;34;35;34;0 
18:30;33;36;34;0 
19:00;33;93;37;0 
19:30;33;34;33;0 
20:00;33;34;33;0 
20:30;33;36;33;0 
21:00;33;37;33;0 
21:30;30;33;31;0 
22:00;31;37;31;0 
22:30;32;33;32;0 
23:00;31;32;31;0 
23:30;31;32;31;0
Was die Zukunft bringen wird
Das Abschaffen der einzelnen Dateien ist nun das Ziel, diese automatisiert als neues Tabellenblatt (Name des Blattes equ %Datum%) in einer monatlichen Datei hinten anzuhängen.
Ob das mit einer csv geht oder nur mit einer richtigen Excel-Datei (Office 2007 hier nutzbar), weiß ich nicht aber ich bin mir sicher, dass dies sicherlich via VBS(-inliner) lösbar ist und sich somit meiner Kenntnis entzieht ^__^

Zusammenfassung
2012-05-01_ping.csv - 2012-05-31_ping.csv => 2012-05_ping.csv mit den Tabellenblättern 2012-05-01 bis 2012-05-31

Na, dann hoffe ich mal auf eure Hilfe

Gruß,

André
53 Antworten
Mitglied: mak-xxl
31.05.2012 um 17:46 Uhr
Moin André,

ein paar Fragen:

besteht jeweils die Möglichkeit:
  • das Datum zur Uhrzeit zu speichern?
  • je Monat eine csv-Datei zu erzeugen?
  • die Excel-Datei mit einem Tabellenblatt pro Monat zu strukturieren?

Hintergrund ist, dass ein Einlesen der csv-Dateien nach Excel zwar simpel ist, die Abfrage, welche die letzte, komplett eingelesene csv ist - resp. wenn die letzte zum Einlesezeitpunkt nicht komplett war, wieviele Zeilen dann zu löschen etc. pp. ...

Liegt nur eine Datei je Monat vor, wird dieser Prozess einfacher (i.e. Datei ist komplett, wenn neuer Monat), außerdem wird die Excel-Datei übersichtlicher (nur 12 Blätter á 31 x 24|48 Einträge).

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: Skyemugen
01.06.2012 um 09:03 Uhr
Aloha Mario,

wo ist jetzt der funktionale Unterschied der Abarbeitung?

Wenn du es für einfacher hälst eine Jahres-Excel-Datei mit 12 Blättern à eine eingelesene CSV-Datei zu verarbeiten, sehe ich den Unterschied zu einer Monats-Excel-Datei mit i.d.R. 30-31 Blättern à eine eingelese CSV-Datei nicht.

Was für Zeilen willst du löschen?

Pro Monat eine CSV-Datei wäre m.M.n. total banane bei 15-30 minütigen Abfragen, wo soll ich da noch einen klaren Überblick behalten?

Timo hatte mir per PM den PRTG Network Monitor vorgeschlagen aber der ist derzeit einfach zu viel des Guten.

greetz André
Bitte warten ..
Mitglied: mak-xxl
01.06.2012 um 09:33 Uhr
Moin André,

Zitat von Skyemugen:
wo ist jetzt der funktionale Unterschied der Abarbeitung?

Wenn der Zeitpunkt des Einlesens in Excel nicht genau feststeht, sondern vom User willkürlich vorgenommen wird, kann es beispielsweise vorkommen, dass die csv-Datei eines Tages um 16:00 Uhr eingelesen wird - wenn diese also noch nicht komplett (für den Tag) ist. Ein nachfolgendes Einlesen, etwa einen Tag später, muss also zunächst feststellen, welche Zeilen des vergangenen Tages evtl. schon eingelesen wurden und muss nun
- entweder diese löschen und den Tag neu einlesen, oder
- alle nicht vorhandenen Zeilen dazulesen.

Da Du leider nichts über das Management der vorhandenen csv-Dateien (löschen, archivieren etc.) schreibst (und ebensowenig über das Einlesemanagement in Excel), halte ich es für sinnvoller, eine monatliche csv-Datei (dann inkl. Datumsfeld) zu jedem beliebigen Zeitpunkt in Excel einzulesen - alle bis dahin in der csv gesammelten Einträge sind dann in Excel vorhanden.

Wenn du es für einfacher hälst eine Jahres-Excel-Datei mit 12 Blättern à eine eingelesene CSV-Datei zu verarbeiten, sehe ich den Unterschied zu einer Monats-Excel-Datei mit i.d.R. 30-31 Blättern à eine eingelese CSV-Datei nicht.

Sollte auf der Hand liegen - sowohl beim Einlesen als auch bei der Auswertung ... Ansonsten favorisiere ich eine Jahresdatei - schon aus Gründen der Übersichtlichkeit.

Was für Zeilen willst du löschen?

Siehe oben.

Pro Monat eine CSV-Datei wäre m.M.n. total banane bei 15-30 minütigen Abfragen, wo soll ich da noch einen klaren Überblick behalten?

Ich war der Annahme, dass Du Dir den Überblick eben durch Excel verschaffen wolltest?! Und was 31 csv-Dateien gegenüber 1 csv-Datei für Vorteile haben sollen ...

Timo hatte mir per PM den PRTG Network Monitor vorgeschlagen aber der ist derzeit einfach zu viel des Guten.

Per PM kann ich auch ... Dir z.B. eine solche Excel-Lösung zusenden ...

Freundliche Grüße von der Insel - Mario
Bitte warten ..
Mitglied: Skyemugen
01.06.2012 um 09:50 Uhr
Zitat von mak-xxl:
Wenn der Zeitpunkt des Einlesens in Excel nicht genau feststeht, sondern vom User willkürlich vorgenommen wird, kann es
beispielsweise vorkommen, dass die csv-Datei eines Tages um 16:00 Uhr eingelesen wird - wenn diese also noch nicht komplett
(für den Tag) ist. Ein nachfolgendes Einlesen, etwa einen Tag später, muss also zunächst feststellen, welche Zeilen
des vergangenen Tages evtl. schon eingelesen wurden und muss nun
- entweder diese löschen und den Tag neu einlesen, oder
- alle nicht vorhandenen Zeilen dazulesen.
??? Skript? Automatisiert? Taskplaner? Wenn ich was per Hand machen will, müsste ich hier ja nicht anfragen ... P.S.: Der User bin nur ich, sonst hat hier niemand etwas mit diesen Sachen zu tun

Da Du leider nichts über das Management der vorhandenen csv-Dateien (löschen, archivieren etc.) schreibst
CSV => Excel & CSV löschen, logisch, dachte ich ...
(und ebensowenig über das Einlesemanagement in Excel)
??? Genau darum dreht sich doch der ganze Thread?

Ich war der Annahme, dass Du Dir den Überblick eben durch Excel verschaffen wolltest?! Und was 31 csv-Dateien gegenüber
1 csv-Datei für Vorteile haben sollen ...
??? Wieso 31 CSV-Dateien, die habe ich momentan, genau darum will ich monatlich ja nur EINE Excel-Datei (12 also pro Jahr, da der monatliche Überblick dann einfacher fällt, wenn alles untereinander ist, weiß ich nicht, wo der Überblick sein soll ...)

Also noch einmal: Die Vorstellung war:
Täglich wird eine CSV erstellt (geschieht bisher - geht ja nur bis 23:30), diese soll dann via Skript (VBS [?]) als neues Arbeitsblatt in die für den Monat zuständige Excel-Tabelle eingelesen und danach wird die CSV gelöscht werden.
Bei einem neuen Monat soll eine neue Excel-Datei erstellt werden.

Ich möchte aus einem einfachen Grund keine Jahresdatei: Das Vergleichen von evtl. Stoßzeiten fällt beim Herabscrollen weniger leicht als wenn ich einfach auf das nächste Blatt wechsle, da die Uhrzeiten dann alle genau dieselben Zeilen haben.

greetz André
Bitte warten ..
Mitglied: TsukiSan
02.06.2012 um 15:16 Uhr
Hallo André

nun gibst du immer so viel Hilfe beim Batchen und bei deinem eigenen kleinen Problem wirst du mit so vielen Gegenfragen und Meinungen konfrontiert.
Nun Ja, ich habe mir überlegt, dir was in VBS zu basteln. Aber gib mir etwas Zeit. Ich denke, in den nächsten Tagen kriegen wir das hin.
Also zuerst zu meinem Verständnis:
1) Ordner einlesen mit den CSV-Dateien die da irgendwie 01.xx.JJJJ bis (maximal) 31.xx.JJJJ sind
2) Eine Excel-Datei anlegen die von Tabellenblatt 1 bis maximal 31 den Namen der CSV-Datei hat, respektive nur den Datumspart
3) Alle Daten aus dieser CSV in besagtes Tabellenblatt speichern und
4) dann die eingelesene CSV-Datei löschen.

Das lässt sich alles machen in VBS und ich würde mich freuen, dir auf diesem Wege VBS etwas näher zu bringen. Beim Batchen kann ich dir das Wasser nicht reichen!

Schönen Samstag und viele Grüße

Tsuki
Bitte warten ..
Mitglied: TsukiSan
02.06.2012, aktualisiert 03.06.2012
Hallo Andre,

hier mal ein "Gerüst" in VBS. Ich denke, du solltest das nicht in deine schöne Batch integrieren!
Weil auf die Schnelle und ungetestet, bitte teste das mal und wir müssen noch ein Finetuning machen! Aber vielleicht kommst du auf die ein oder andere Sacher selber.
Viele Grüße
Tsuki
01.
Dim Ordner, Pfad, DateiFilter 
02.
Dim Dateiliste 
03.
Dim FSO 
04.
Dim ObjXls 
05.
Dim Trennzeichen 
06.
 
07.
Trennzeichen = ";" 
08.
DateiFilter = "CSV" 
09.
 
10.
Set FSO = CreateObject("Scripting.FileSystemObject") 
11.
 
12.
OrdnerAuswaehlen 
13.
msgbox Pfad 
14.
 
15.
DateienEinlesen(Pfad) 
16.
 
17.
Private Sub OrdnerAuswaehlen() 
18.
 
19.
AuswahlTitel = "Bitte Ordner auswählen" 
20.
StartOrdner = "17" 
21.
Set Auswahl = CreateObject("Shell.Application").BrowseForFolder(0,AuswahlTitel,16,StartOrdner) 
22.
If TypeName(Auswahl) = "Nothing" Then 
23.
    MsgBox "Abbruch gewählt!" 
24.
    WScript.Quit 
25.
Else 
26.
    Set Ordner = Auswahl.Self 
27.
    Pfad = Ordner.Path 
28.
End If 
29.
 
30.
End Sub 
31.
 
32.
Private Sub DateienEinlesen(SuchOrdner) 
33.
	Set Ordner = FSO.getfolder(SuchOrdner) 
34.
	For Each file In ordner.files 
35.
		Pfadangabe =File.path 
36.
		If LCase(Right(Pfadangabe,3)) = LCase(DateiFilter) Then 
37.
			SuchDateien = SuchDateien & Pfadangabe & vbcrlf 
38.
		End If 
39.
	Next 
40.
	Set ObjXls = CreateObject("Excel.Application") 
41.
	objXLS.Workbooks.Add 
42.
	objXLS.Visible = False 
43.
		a = Split(SuchDateien, vbcrlf) 
44.
		For i = 0 to (Ubound(a) - 1) 
45.
			b = Split(a(i),"\") 
46.
			objXLS.Sheets.Add 
47.
    			objXLS.Sheets("Tabelle" & i + 1).Select 
48.
    			TempName = Left(b(UBound(b)), 10) 
49.
                		ObjXls.Sheets("Tabelle" & i + 1).Name = TempName 
50.
            			ObjXls.Sheets(TempName).Select 
51.
			Set MeineDatei = FSO.OpenTextFile(a(i), 1) 
52.
			MeineDaten = Split(MeineDatei.ReadAll,vbcrlf) 
53.
			For j = 0 to Ubound(MeineDaten) 
54.
				c = Split(MeineDaten(j), Trennzeichen) 
55.
                			For k = 0 To (UBound(c)) 
56.
               			 On Error Resume Next 
57.
                    				Zeile = Chr(65 + k) & (j + 1) 
58.
                                			ObjXls.Range(Zeile).Value = c(k) 
59.
                			Next 
60.
			Next 
61.
			MeineDatei.Close 
62.
		Next 
63.
	ObjXLS.ActiveWorkbook.SaveAs Pfad & "\Test.xls" 
64.
    	ObjXLS.ActiveWorkbook.Close 
65.
	 
66.
	Msgbox SuchDateien 
67.
End Sub
Bitte warten ..
Mitglied: TsukiSan
02.06.2012 um 18:02 Uhr
....achso, André!

ob das mit Office 2007 funktioniert, das weiss ich überhaupt nicht! Aber bis Office 2003 sollte sich was tun.

Gruss
Tsuki
Bitte warten ..
Mitglied: bastla
03.06.2012, aktualisiert 04.06.2012
Hallo Tsuki!

Eine (vermutlich performantere und jedenfalls in Office 2007 funktionierende) Alternative für die Zeilen 53 bis 60 könnte etwa so aussehen:
01.
Sp = UBound(Split(MeineDaten(0), Trennzeichen)) + 1 'Spaltenanzahl vorweg ermitteln 
02.
For j = 0 To UBound(MeineDaten) 
03.
    ObjXls.Cells(j + 1, "A").Resize(1, Sp).Value = Split(MeineDaten(j), Trennzeichen) 'Datensatz ab Spalte A in Zeile j + 1 eintragen 
04.
Next
Grüße
bastla

[Edit] Sollte jetzt über VBS verwendbar sein [/Edit]
Bitte warten ..
Mitglied: TsukiSan
03.06.2012 um 23:48 Uhr
Hallo bastla,

danke für den Tipp! Da wird sich André sicher drüber freuen

Ich habe kein Office über dem 2003-er hinaus und bin mir nicht sicher, ob meine Idee mit 2007 überhaupt geht. Scheint sie aber doch

Schöne Woche und viele Grüße

Tsuki

Ps.: In meiner Idee oben muss noch einiges gemacht werden, damit es sauber funktioniert. Vielleicht hat André ja Lust gemeinsam dazu
Bitte warten ..
Mitglied: bastla
04.06.2012 um 00:02 Uhr
Hallo Tsuki!
In meiner Idee oben muss noch einiges gemacht werden
... wobei allerdings zu unterscheiden wäre, oe es um ein Aufarbeiten kompletter "Monats"-Ordner (wie in Deinem aktuellen Ansatz) gehen soll (dann würde ich noch an eine Sortierung der Tabellenblätter auf Basis der Dateinamen - ev auch gleich vorweg - denken) oder ob in weiterer Folge (jeweils per Taskplaner zB um 23:40 aufgerufen - damit würden Marios Bedenken hinsichtlich nicht kompletter Daten wegfallen) nur die Datei des aktuellen Tages der (bereits existierenden) Excel-Datei hinzuzufügen wäre ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
04.06.2012 um 07:46 Uhr
Hallo bastla,

genau! Diese Fragen sollte uns Andre beantorten, wei er's gern hätte
Bei mir wird noch nicht sortiert und nicht gelöscht und auch erst einmal nur eine Test.xls erstellt. Mein bisschen Schnipsel da oben zeigt erst einmal nur den Weg des möglichen. Deswegen, noch jede Menge Finetuning. Und da Andre es ja ganz alleine später betreiben möchte, können wir's gern massgeschneitert schreiben

Aber warten wir erst einmal seine Meinungen dazu ab.

Vielen Dank und viele Grüße

Tsuki
Bitte warten ..
Mitglied: Skyemugen
04.06.2012, aktualisiert um 08:24 Uhr
Aloha ihr beiden und Danke für eure Anteilnahme der Thematik

nach einem ziemlich PC-armen Wochenende, stehe ich jetzt erst einmal vor euren Kommentaren, hehe.

Werde es im Laufe des Tages durchtesten, derzeit habe ich wichtige Konstruktionen auf dem Tisch immer wieder Montags ...

Auf bastlas wobei einzugehen: Da ich anfangs kein Komplettpaket à la VBS dachte, sondern an eine Aufarbeitung, hätte ursprünglich diese Aufarbeitung um 23:50 als 2. Task stattgefunden (daher verstand ich auch nie, was Mario mit wegfallen von Daten etc. meinte).

Aber wie gesagt: Das Gerüst dort oben werde ich heute mal testen und mein Feedback geben.

Bis dahin ... hoffen wir mal, dass der Montag auf Arbeit weniger wolkig als das Wetter wird

greetz André
Bitte warten ..
Mitglied: 76109
04.06.2012, aktualisiert 05.06.2012
Hallo @All!

@André
Und wenn Du schon beim testen bist, dann hier noch eine Variante, die automatisiert den Ping absetzt und das Ergebnis direkt in die Excel-Tabelle einträgt.

Ablauf:
Ping absetzen
Cmd-Ausgabe einlesen und auswerten
Gegebenenfalls Ordner Jahr erstellen
Gegebenenfalls Ordner Monat erstellen
Gegebenenfalls ein Sheet pro Tag hinzufügen

Dieses Skript erstellt pro Monat eine neue Excelmappe mit einem Schreib-Passwort, d.h. die Excelmappe erhält einen Schreibschutz und kann auch während einer Taskausführung schreibgeschützt zur Ansicht geöffnet werden.

Was allerdings noch fehlt, ist der einmalige Datenimport der vorangegangenen Monate und Tage in einer Ruhephase

01.
    Option Explicit 
02.
 
03.
    Const PathStart = "D:\Latenz" 
04.
 
05.
    Const CmdPrompt = "ping /n 20 google.de" 
06.
 
07.
    Const ExcelMappe = "Ping.xls" 
08.
 
09.
    Const ExcelHeader = "Uhrzeit,Min [ms],Max [ms],Mit [ms],Verlust [%]" 
10.
 
11.
    Const ErrMsg1 = "Pfad nicht gefunden:" 
12.
    Const ErrMsg2 = "Excel-Datei nicht gefunden:" 
13.
 
14.
    Const xlUp = -4162 
15.
    Const xlRight = -4152 
16.
    Const xlCenter = -4108 
17.
    
18.
 
19.
    Dim objShell, objExec, objRegExp, objMatches, objFso, objExcelApp, objExcelSheet, arrValues 
20.
    Dim strDate, strTime, strYear, strMonth, strDay, strStdOut, strPathYear, strPathMonth 
21.
    Dim strPathExcelMappe, intNextLine, intNewSheets 
22.
     
23.
    Set objShell = CreateObject("WScript.Shell")        'Object Shell 
24.
     
25.
    strTime = FormatDateTime(Time, vbShortTime)         'Format HH:MM 
26.
     
27.
    Set objExec = objShell.Exec(CmdPrompt)              'Ping ausführen 
28.
     
29.
    strStdOut = LCase(objExec.StdOut.ReadAll)           'Cmd-Ausgabe einlesen 
30.
     
31.
    strYear = Year(Date)                                'Format YYYY 
32.
    strMonth = Right("0" & Month(Date), 2)              'Format MM 
33.
    strDay = CStr(Day(Date))                            'Format #D) 
34.
     
35.
    strDate = strYear & "-" & strMonth & "-" & Right("0" & strDay, 2)     'Format YYYY-MM-DD 
36.
     
37.
    Set objRegExp = New RegExp                          'Object Regular-Expression 
38.
     
39.
    With objRegExp 
40.
       .Global = False                                  'Mehrmaliges Vorkommen = False 
41.
       .IgnoreCase = True                               'Klein/Großschreibung ignorieren 
42.
       .Pattern = "verloren =[^\(]*\((\d+)[^=]*= (\d+)[^=]*= (\d+)[^=]*= (\d+)"  'Filter (Verlust,Min,Max,Mittel) 
43.
    End With 
44.
     
45.
    arrValues = Array(strTime, "n/v", "n/v", "n/v", "n/v")  'Verbindungsfehler (Zeit,Min,Max,Mittel,Verlust) 
46.
     
47.
    Set objMatches = objRegExp.Execute(strStdOut)       'Cmd-Ausgabe filtern 
48.
     
49.
    If objMatches.Count Then                            'Test Filtern erfolgreich 
50.
        With objMatches(0).SubMatches 
51.
            If .Count = 4 Then                          'Test ob alle Werte vorhanden sind 
52.
                arrValues = Array(strTime, .Item(1), .Item(2), .Item(3), .Item(0))  'Werte (Zeit,Min,Max,Mittel,Verlust) 
53.
            End If 
54.
        End With 
55.
    End If 
56.
     
57.
    strPathYear = PathStart & "\" & strYear                 'Path "D:\Latenz\Jahr" 
58.
    strPathMonth = strPathYear & "\" & strMonth             'Path "D:\Latenz\Jahr\Monat" 
59.
    strPathExcelMappe = strPathMonth & "\" & ExcelMappe     'Path "D:\Latenz\Jahr\Monat\ExcelMappe" 
60.
     
61.
    Set objFso = CreateObject("Scripting.FileSystemObject") 'Object Dateioperationen 
62.
 
63.
    If objFso.FolderExists(PathStart) Then                  'Test ob der PathStart existiert 
64.
        If objFso.FolderExists(strPathYear) = False Then    'Test ob der Pfad mit Jahr nicht existiert 
65.
            objFso.CreateFolder strPathYear                 'Pfad mit Jahr erstellen 
66.
        End If 
67.
         
68.
        Set objExcelApp = CreateObject("Excel.Application") 'Object ExcelApplication 
69.
         
70.
        If objFso.FolderExists(strPathMonth) Then           'Test ob der Pfad mit Monat existiert 
71.
            If objFso.FileExists(strPathExcelMappe) Then    'Test ob Excel-Datei vorhanden ist 
72.
                With objExcelApp.Workbooks.Open(strPathExcelMappe, , , , , "Write") 'Excel-Datei öffnen (Schreibberechtigt) 
73.
                    Set objExcelSheet = Nothing             'Object Excel-Sheet = Nothing 
74.
                     
75.
                    On Error Resume Next                    'Fehlerbehandlung Aus 
76.
                    Set objExcelSheet = .Sheets(strDay)     'Object Excel-Sheet = Monat? 
77.
                    On Error GoTo 0                         'Fehlerbehandlung Ein 
78.
                     
79.
                    If objExcelSheet Is Nothing Then        'Test Excel-Sheet Monat existiert nicht 
80.
                        Set objExcelSheet = .Sheets.Add(, .Sheets(.Sheets.Count)) 
81.
                        Call SheetInit(objExcelSheet, strDay, arrValues) 
82.
                    Else    'Wenn Sheet (Tag) bereits existiert 
83.
                        With objExcelSheet 
84.
                            intNextLine = .Cells(.Rows.Count, "A").End(xlUp).Row + 1  'Nächste freie Zeile 
85.
                           .Cells(intNextLine, "A").Resize(1, 5).Value = arrValues    'Werte einfügen 
86.
                        End With 
87.
                    End If 
88.
                         
89.
                   .Close True  'Excel-Mappe speichern und schließen 
90.
                End With 
91.
             
92.
            Else 
93.
                MsgBox ErrMsg2 & vbCr & vbCr & strPathExcelMappe, vbExclamation, "Fehler..." 
94.
            End If 
95.
       Else 
96.
            objFso.CreateFolder strPathMonth                        'Pfad mit Monat erstellen 
97.
             
98.
            With objExcelApp 
99.
                intNewSheets = .SheetsInNewWorkbook                 'Option Anzahl Sheets sichern 
100.
               .SheetsInNewWorkbook = 1                             'Option Anzahl Sheets = 1 
101.
 
102.
                With .Workbooks.Add                                 'Neue Excel-Mappe erstellen 
103.
                    Call SheetInit(.Sheets(1), strDay, arrValues) 
104.
                   .SaveAs strPathExcelMappe, , , "Write"           'Excel-Mappe mit Schreibkennwort speichern 
105.
                   .Close False                                     'Excel-Mappe schließen 
106.
                End With 
107.
             
108.
               .SheetsInNewWorkbook = intNewSheets                  'Option Anzahl Sheets wiederherstellen 
109.
            End With 
110.
        End If 
111.
         
112.
        objExcelApp.Quit                                        'Excel-Application schließen 
113.
    Else 
114.
        MsgBox ErrMsg1 & vbCr & vbCr & PathStart, vbExclamation, "Fehler..." 
115.
    End If 
116.
 
117.
 
118.
Private Sub SheetInit(ByRef Sheet, ByRef SheetName, ByRef Values) 
119.
    With Sheet                                      'Sheet("TabelleX") 
120.
       .Name = SheetName                            'Sheet-Name = Tag X 
121.
       .Range("A:E").HorizontalAlignment = xlRight  'Spalten rechtsbündig 
122.
         
123.
        With .Range("A1").Resize(1, 5)              'Zell-Bereich A1:E1 festlegen 
124.
            .Value = Split(ExcelHeader, ",")        'Überschrift einfügen 
125.
            .Font.Bold = True                       'Fett-Schrift festlegen 
126.
            .HorizontalAlignment = xlCenter         'Überschrift zentrieren 
127.
        End With 
128.
                 
129.
       .Range("A2").Resize(1, 5).Value = Values     'Werte in Zeile 2 einfügen 
130.
    End With 
131.
End Sub
Gruß Dieter

[edit] Code insoweit geändert, dass beim Erstellen einer neuen Arbeitsmappe nur 1 Sheet vorhanden ist. [/edit]
Bitte warten ..
Mitglied: Skyemugen
04.06.2012 um 09:34 Uhr
Aloha erneut, ob den Edit einer liest, Doppelpost komm in meine Arme *fg*

sooo ... mit TsukiSans Ausfühung habe ich momentan eine .xls (Excel meckert rum:
Sie versuchen eine Datei zu öffnen 'Test.xls' deren Format von der in den Dateierweiterung abweicht ... bla bla bla nicht beschädig bla bla usw.) die wie folgt aufgebaut ist:

2012-06-04Tabelle 52012-06-01Tabelle 62012-06-02Tabelle 72012-06-03
mit den richtigen Inhalten bisher in den Datums-Tabellenblättern.

Für den letzten Monat, mit 31 Dateien sah es dann so aus:
Tabelle 322824- bis -0804Tabelle 332925- bis -0501312622 - bis - 0602Tabelle 312723- bis -0703

bastlas Vorschlag endete mit einem Typen unverträglich 'Cells'

greetz André

P.S.: Frühstück
Bitte warten ..
Mitglied: bastla
04.06.2012 um 10:46 Uhr
Hallo Skye!

Da ja über VBS gestartet wird (ich aber gleich direkt in Excel getestet habe), fehlt (das für alle Excel-Objekte benötigte) "ObjXls." vorweg (ließe sich auch mit einem "With" pauschal erledigen) - ich ergänze das mal oben ...

Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
04.06.2012, aktualisiert um 12:15 Uhr
Aloha Dieter,

na, das sieht doch schon einmal klasse aus, das Einzige hierbei ist, jede neue Standard-Datei enthält ja drei Tabellen, sodass er zwar den ersten Eintrag in Tabelle 1 setzt, allerdings wenn ich das Datum für morgen einstelle, um einen fortlaufenden Test zu haben, dann kommt diese ans Ende
4Tabelle 2Tabelle 35

Auch bei dieser erstellten .xls kommt die Ansage Sie versuchen eine Datei zu öffnen 'Ping.xls' deren Format von der in den Dateierweiterung abweicht ... bla bla bla nicht beschädig bla bla usw.) Excel ist wohl empfindlich von nicht selbst erstellten Dateien

Sonst funktioniert es bisher prima.

@bastla, ja funktioniert jetzt

greetz André
Bitte warten ..
Mitglied: 76109
04.06.2012 um 12:41 Uhr
Hallo André!

Sorry, von einer bereits erstellten Standard-Datei bin ich nicht ausgegangen. Mein Plan war, für jeden Monat eine Neue Arbeitsmappe automatisiert zu erstellen und für jeden Tag (Tabellennamen 1 ,2 ,3 ... 31) ein neues Sheet zu erstellen...

Leider habe ich jetzt auch keine Zeit, da ich gleich zur Arbeit muss und erst sehr spät (hundemüde) nach Hause komme, aber vielleicht kann sich ja bastla ein wenig damit beschäftigen?

Gruß Dieter
Bitte warten ..
Mitglied: Skyemugen
04.06.2012 um 13:42 Uhr
Zitat von 76109:
Sorry, von einer bereits erstellten Standard-Datei bin ich nicht ausgegangen

Ist auch nicht die Rede. Es wird eine neue erstellt, diese enthält standardmäßig dennoch die ausgefüllte Tabelle des ersten Tages sowie Tabelle 2 und Tabelle 3

greetz André
Bitte warten ..
Mitglied: TsukiSan
04.06.2012 um 14:01 Uhr
sowie Tabelle 2 und Tabelle 3
Hallo Andre,

nur ganz kurz: Die lassen sich noch rauslöschen, diese Standarttabellen.
Zu den Meldungen, die du da immer bekommst, dass könnte wohl damit zusammenhängen, dass die Exceldateien ab 2007 auf .xlsx enden. Das kann ich aber nicht testen und sollte aber auch nicht stören

@Dieter,

ich glaube wir haben denselben Job nur mit dem Unterschied, dass ich das Haus morgens schon hundemüde verlasse

Bis später und Gruss

Tsuki
Bitte warten ..
Mitglied: 76109
05.06.2012, aktualisiert um 00:46 Uhr
Hallo André!

Heute Mittag stand ich wegen Zeitmangel wohl etwas auf dem Schlauch und ist mir erst auf der Fahrt zur Arbeit eingefallen, was Du eigentlich gemeint hast. Bei mir ist diese Option seit ewigen Zeiten auf 1 Sheet in Neuer Arbeitsmappe eingestellt, von daher habe ich nicht mehr daran gedacht, dass diese Option standardmäßig auf 3 gesetzt ist.

Habe im obigen Skript eine entsprechende Änderung vorgenommen. D.h. aktuelle Einstellung sichern, auf 1 Sheet einstellen und nach dem Erstellen der neuen Arbeitsmappe wieder auf die vorherige Einstellung zurücksetzen.

Was den Formatierungsfehler angeht, habe ich leider keinen blassen Schimmer, woran das liegen könnte. Meine Excel-Version ist schon ein bisschen älter, aber Tsukis Vorschlag (*.xlsx-Format) könntest Du ja mal testen, also 'Const ExcelMappe = Ping.xls' entsprechend anpassen?


@Tsuki
ich glaube wir haben denselben Job nur mit dem Unterschied,
dass ich das Haus morgens schon hundemüde verlasse
Hundemüde zur Arbeit, ist bei mir erst nächste Woche wieder dran, wenn mich mein Wecker gegen 03:45 Uhr aus meinem heißgeliebten Tiefschlaf holt

Gruß und gute Nacht

Dieter
Bitte warten ..
Mitglied: Skyemugen
05.06.2012, aktualisiert um 09:10 Uhr
Aloha Dieter,

in der Tat klappt es mit .xlsx ohne Fehlermeldung, allerdings bin ich erst einmal reingefallen da Ping.xlsx noch nicht existiert hat, aber der Ordner 06 bereits existiert, wurde nach deinem Code keine neue Datei angelegt (das würde ja nur geschehen, wenn der Monats-Ordner noch nicht existiert) und ich bekam logischerweise eine Fehlermeldung.

Naja, Ordner umbenannt und getestet Sieht bisher gut aus, auch bei einem neuen Tag.

Mal schauen, ob TsukiSan noch Lust und Geduld hat, seinen Code zu optimieren [Danke für die Arbeit bisher], dann könnte ich die alten Dateien ebenso verarbeiten. ^__^

Auf jeden Fall Danke, Dieter, auch für das umfangreiche Kommentieren der Codezeilen.

greetz André
Bitte warten ..
Mitglied: TsukiSan
05.06.2012 um 10:36 Uhr
Hallo Andre,

mir persönlich gefällt Dieter seine Variante am besten!

Ich mache meine "Baustelle" soweit fertig, dass du deine anderen Daten noch exportiert bekommst nach Excel.
heisst:
1) Exceldateiname einen Monatsnamen geben, aufgrund des Datums der Dateien
(sind deine Dateien für jeden Monat in einem separaten Ordner?)
2) unnötige Tabellen nachher rauslöschen
3) die Tabellenblätter sortieren
4) alte CSV-Dateien löschen

ich weiss nur nicht, ob ich heute noch dazu komme. Aber ich mache dir das!

Falls ich einen Punkt vergessen habe, bitte melde dich

Viele Grüße

Tsuki
Bitte warten ..
Mitglied: Skyemugen
05.06.2012 um 10:53 Uhr
Zitat von TsukiSan:
(sind deine Dateien für jeden Monat in einem separaten Ordner?)
Um das mal mit einer oben angegebenen Batchzeile zu beantworten:
01.
set "Pfad=D:\Latenz\%Jahr%\%Monat%"

Die bisherigen Dateien liegen im jeweiligen Monats-Ordner.

Gut, mit einer Monatsdatei ist das eigentlich Überfluss geworden ...

So, mit diesem Gedankengang habe ich schnell mal das Skript von Dieter angepasst, sodass jetzt im Jahresordner eine Monats-Exceldatei entsteht, sprich z.B. D:\Latenz\2012\06_Ping.xlsx

greetz André
Bitte warten ..
Mitglied: 76109
05.06.2012 um 11:46 Uhr
Hallo André, Hallo Tsuki!

Toll, da tut sich was

Und von mir bekommst Du bei Gelegenheit noch eine Win-Ping-Variante mit Statistik-Auswertung, also ohne das lästige Dos-Fenster

Gruß Dieter
Bitte warten ..
Mitglied: bastla
05.06.2012, aktualisiert um 12:51 Uhr
@Dieter
ohne das lästige Dos-Fenster
Damit ich auch noch etwas beitrage: http://blogs.technet.com/b/heyscriptingguy/archive/2004/09/14/why-doesn ...

Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
05.06.2012 um 15:56 Uhr
Aloha Dieter,

hm wie es manchmal so kommt ... ich sitze natürlich lustig an einer XP-Kiste und teste ...

Tja und wie man dann so am Server ist, merkt man, dass gar kein Office dort logischerweise installiert ist *pfeif* - gut, denke ich: Lässte es auf dem 2000er TS laufen, tja läuft auch aber alle Werte sind immer n/v (wenn ich manuell im cmd pinge, bekomme ich die ganz normale Ausgabe).

Ist es möglich, dass etwas im Code unter dem 2000er Server gar nicht lauffähig ist? Wenn ja, muss ich wohl doch extra Office-Paket auf unseren 2003 R2 installieren *hrmpf*.

greetz André
Bitte warten ..
Mitglied: TsukiSan
05.06.2012, aktualisiert um 16:42 Uhr
Hallo Andre,

ich sehe, du kämpfst gerade mit anderen Sachen

Ich habe gute als auch interessante Nachrichten für dich.
die Guten zuerst:
Um deine schon erstellten CVS-Dateien nach Excel zu exportieren, habe ich meine "Baustelle" von oben etwas erweitert und auch kommentiert.
Allerdings sind mir 2 Sachen aufgefallen, die ich momentan noch nicht erklären kann. Eventuell helfen uns bastla und Dieter dabei, auf eine Lösung zu kommen. Interessiert mich jetzt auch!
1) Das "Moven" der Tabellen funktioniert mit dem Befehl:
Sheets("Tabelle3").Move Before:=Sheets(1)
unter VBS nicht, aber unter VB6 z.Bsp.
2) Tabellen werden zwar mit IsNumeric erkannt, aber mit
Sheets("Tabelle3").Select
ActiveWindow.SelectedSheets.Delete
z.Bsp.: nicht gelöscht. Sind weiter da und es gibt keinerlei Meldungen.

Hier der aktuelle Script. Bitte mal drüberschauen und die Fehler finden:
01.
Dim Ordner, Pfad, DateiFilter 
02.
Dim Dateiliste, MeineDateiNamen 
03.
Dim FSO 
04.
Dim ObjXls 
05.
Dim Trennzeichen 
06.
 
07.
Trennzeichen = ";" 
08.
DateiFilter = "CSV" 
09.
 
10.
Set FSO = CreateObject("Scripting.FileSystemObject") 
11.
 
12.
OrdnerAuswaehlen 'Aufruf des Auswahlfensters, welches den Ordner auswählt 
13.
MsgBox "Script startet nach Klick auf OK!" 
14.
 
15.
DateienEinlesen (Pfad) ' Alle Dateien im ausgewählten Pfad einlesen (sollten CSV-Dateien sein!) 
16.
 
17.
 
18.
Private Sub OrdnerAuswaehlen() 'In dieser Sub wird das Auswahlfenster für den Ordner aufgerufen 
19.
 
20.
AuswahlTitel = "Bitte Ordner auswählen" 
21.
StartOrdner = "17" 
22.
Set Auswahl = CreateObject("Shell.Application").BrowseForFolder(0, AuswahlTitel, 16, StartOrdner) 
23.
If TypeName(Auswahl) = "Nothing" Then 
24.
    MsgBox "Abbruch gewählt!" 
25.
    Wscript.Quit 
26.
Else 
27.
    Set Ordner = Auswahl.Self 
28.
    Pfad = Ordner.Path 
29.
End If 
30.
 
31.
End Sub 
32.
 
33.
Private Sub DateienEinlesen(SuchOrdner) ' Hier werden die Dateien eingelesen, die sich im Ordner befinden 
34.
    Set Ordner = FSO.getfolder(SuchOrdner) 
35.
    For Each File In Ordner.Files 
36.
        Pfadangabe = File.Path 
37.
        If LCase(Right(Pfadangabe, 3)) = LCase(DateiFilter) Then 'nur CSV-Dateien werden berücksichtigt 
38.
            SuchDateien = SuchDateien & Pfadangabe & vbCrLf 
39.
        End If 
40.
    Next 
41.
    Set ObjXls = CreateObject("Excel.Application") ' Hier wird ObjXls als Excel-Objekt deklariert 
42.
    ObjXls.Workbooks.Add 'Hier wird eine neue Exceldatei geöffnet. 
43.
    ObjXls.Visible = False 'Damit man die noch nicht sieht, macht man sie unsichtbar 
44.
        a = Split(SuchDateien, vbCrLf) ' Hier die eingelesenen Dateien in ein Array "splitten" 
45.
        For i = 0 To (UBound(a) - 1) 
46.
            b = Split(a(i), "\") 
47.
            ObjXls.Sheets.Add 
48.
                ObjXls.Sheets("Tabelle" & i + 1).Select ' Hier das Tabellenblatt auswählen 
49.
                tempName = Left(b(UBound(b)), 10) ' Und hier den Namen des Tabellenblattes setzen. Bsp.:2012-05-01 und der Rest wird ignoriert vom Dateinamen 
50.
                MeineDateiNamen = MeineDateiNamen & tempName & vbCrLf 'Brauchen wir zum Sortieren der Tabellen 
51.
                        ObjXls.Sheets("Tabelle" & i + 1).Name = tempName 'Hier Tabellenblatt benennen 
52.
                        ObjXls.Sheets(tempName).Select 
53.
            Set MeineDatei = FSO.OpenTextFile(a(i), 1) 'Hier die Datei öffnen, mit den Daten 
54.
            MeineDaten = Split(MeineDatei.ReadAll, vbCrLf) 'Hier alle Daten der Datei in ein Array schreiben (zeilenweise) 
55.
            For j = 0 To UBound(MeineDaten) 
56.
                c = Split(MeineDaten(j), Trennzeichen) 'Und hier die einzelnen Zeilen nochmals splitten in ein Array 
57.
                            For k = 0 To (UBound(c)) 'Die jetzt gesplitteten einzelnen Werte in die entsprechenden Zeilen der Exceldatei schreiben 
58.
                         On Error Resume Next 
59.
                                    Zeile = Chr(65 + k) & (j + 1) 'Hier benutze ich Character, damit ich in einer Schleife mit Zahlen arbeiten kann. 
60.
                                            ObjXls.Range(Zeile).Value = c(k) 'Heisst: 65=A ; 66=B; 67=C usw., also aus dem ASCII-Code genommen. 
61.
                            Next 
62.
            Next 
63.
            MeineDatei.Close 'Datei schliessen, sobald sie komplett exportiert worden ist. 
64.
        Next 
65.
    DateiMonatsName = Split(b(UBound(b)), "-") 'Hier ermitteln, um welchen Monat es sich handelt. Bsp.: 2012-05-01 -> da ist die 05 interessant und die wird rausgefiltert 
66.
    XlsDateiName = MonthName(DateiMonatsName(1)) & "_" & DateiMonatsName(0) 'und hier ermittle ich den Monatsnamen, also Mai in dem Beispiel 
67.
    ObjXls.ActiveWorkbook.SaveAs Pfad & "\" & XlsDateiName & ".xls" 'Hier die Daten abspeichern in der Exceldatei 
68.
    'Jetzt müssen wir sortieren. Warum das Excel bis 2003 das nicht automatisch macht, weiss ich nicht! 
69.
    temp = Split(MeineDateiNamen, vbCrLf) 
70.
    ObjXls.Sheets(temp(0)).Select 
71.
    ObjXls.Sheets(temp(0)).Move Before:=ObjXls.Sheets(1) 'IN VB6 funktioniert das, in VBS meckert der Compiler. Wie anders??? 
72.
    For i = 1 To ObjXls.Sheets.Count 
73.
        tempName = ObjXls.Sheets(i).Name 
74.
        tempName = Left(tempName, 1) 
75.
        tempName = tempName * 1 
76.
        If Not IsNumeric(tempName) Then 'Hier sollten die überflüssigen Tabellen gelöscht werden! 
77.
            t = ObjXls.Sheets(i).Name   ' Warum das auch nicht geht, habe ich noch nicht ergründet. 
78.
            ObjXls.Sheets(t).Select 
79.
            ObjXls.SelectedSheets.Delete 
80.
        End If 
81.
        ObjXls.Sheets(temp(i)).Select 
82.
        ObjXls.Sheets(temp(i)).Move After:=ObjXls.Sheets(i) 
83.
    Next 
84.
    ObjXls.ActiveWorkbook.Close 'Und hier die erstellte Exceldatei schliessen. 
85.
     
86.
    MsgBox MeineDateiNamen 'Fertig! 
87.
End Sub 
88.
 
89.
 
So long,

Tsuki

Ps.: wir kriegen das hier schon geschaukelt
Bitte warten ..
Mitglied: TsukiSan
05.06.2012, aktualisiert um 16:47 Uhr
@Andre,

was sehr hilfreich ist, ist das Notpad++
Da wird es übersichtlicher, wenn man die .VBS-Datei damit öffnet

Gruss
Tsuki

[Frau-Mit-Nur-Einer-Brust]
Wenn du möchtest, kompiliere ich dir die VB6-Version als asuzuführende exe-Datei. Damit kannst du zumindest erst einmal deine alten Dateien einlesen.
Das Löschen der bereits eingelesenen Dateien kommt noch. Dieses Feature hebe ich mir auf bis zum Schluss, bis ales andere funktioniert.
Weil gelöscht ist schnell
[/Frau-Mit-Nur-Einer-Brust]

Ps.: Frau-Mit-Nur-Einer-Brust = EDIT
Bitte warten ..
Mitglied: bastla
05.06.2012, aktualisiert um 17:04 Uhr
Hallo Tsuki!

Versuche es mal so
    ObjXls.Sheets(temp(0)).Move ObjXls.ActiveWorkbook.Sheets(1)
bzw so
        ObjXls.Sheets(temp(i)).Move ,ObjXls.ActiveVorkbook.Sheets(i)
Das jeweilige "Select" davor sollte übrigens nicht nötig sein ...
[Edit] steht jetzt unten [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
05.06.2012, aktualisiert um 17:07 Uhr
@bastla,

auf dich ist Verlass
Funktioniert, mit einer ganz kleinen Anpassung
ObjXls.Sheets(temp(0)).Move ,ObjXls.ActiveWorkbook.Sheets(1)
und
ObjXls.Sheets(temp(i)).Move ,ObjXls.ActiveWorkbook.Sheets(i + 1)
und das -Select benötigt man tatsächlich nicht.

Wie du das immer machst

Wie bekommen wir die überflüssigen Tabellen gelöscht?
Zeilen 78 und 79 tangieren dieses Programm peripher

Danke und viele Grüße

Tsuki

hier nochmal als VBS:
01.
Dim Ordner, Pfad, DateiFilter 
02.
Dim Dateiliste, MeineDateiNamen 
03.
Dim FSO 
04.
Dim ObjXls 
05.
Dim Trennzeichen 
06.
 
07.
Trennzeichen = ";" 
08.
DateiFilter = "CSV" 
09.
 
10.
Set FSO = CreateObject("Scripting.FileSystemObject") 
11.
 
12.
OrdnerAuswaehlen 'Aufruf des Auswahlfensters, welches den Ordner auswählt 
13.
MsgBox "Script startet nach Klick auf OK!" 
14.
 
15.
DateienEinlesen (Pfad) ' Alle Dateien im ausgewählten Pfad einlesen (sollten CSV-Dateien sein!) 
16.
 
17.
 
18.
Private Sub OrdnerAuswaehlen() 'In dieser Sub wird das Auswahlfenster für den Ordner aufgerufen 
19.
 
20.
AuswahlTitel = "Bitte Ordner auswählen" 
21.
StartOrdner = "17" 
22.
Set Auswahl = CreateObject("Shell.Application").BrowseForFolder(0, AuswahlTitel, 16, StartOrdner) 
23.
If TypeName(Auswahl) = "Nothing" Then 
24.
    MsgBox "Abbruch gewählt!" 
25.
    Wscript.Quit 
26.
Else 
27.
    Set Ordner = Auswahl.Self 
28.
    Pfad = Ordner.Path 
29.
End If 
30.
 
31.
End Sub 
32.
 
33.
Private Sub DateienEinlesen(SuchOrdner) ' Hier werden die Dateien eingelesen, die sich im Ordner befinden 
34.
    Set Ordner = FSO.getfolder(SuchOrdner) 
35.
    For Each File In Ordner.Files 
36.
        Pfadangabe = File.Path 
37.
        If LCase(Right(Pfadangabe, 3)) = LCase(DateiFilter) Then 'nur CSV-Dateien werden berücksichtigt 
38.
            SuchDateien = SuchDateien & Pfadangabe & vbCrLf 
39.
        End If 
40.
    Next 
41.
    Set ObjXls = CreateObject("Excel.Application") ' Hier wird ObjXls als Excel-Objekt deklariert 
42.
    ObjXls.Workbooks.Add 'Hier wird eine neue Exceldatei geöffnet. 
43.
    ObjXls.Visible = False 'Damit man die noch nicht sieht, macht man sie unsichtbar 
44.
        a = Split(SuchDateien, vbCrLf) ' Hier die eingelesenen Dateien in ein Array "splitten" 
45.
        For i = 0 To (UBound(a) - 1) 
46.
            b = Split(a(i), "\") 
47.
            ObjXls.Sheets.Add 
48.
                ObjXls.Sheets("Tabelle" & i + 1).Select ' Hier das Tabellenblatt auswählen 
49.
                tempName = Left(b(UBound(b)), 10) ' Und hier den Namen des Tabellenblattes setzen. Bsp.:2012-05-01 und der Rest wird ignoriert vom Dateinamen 
50.
                MeineDateiNamen = MeineDateiNamen & tempName & vbCrLf 'Brauchen wir zum Sortieren der Tabellen 
51.
                        ObjXls.Sheets("Tabelle" & i + 1).Name = tempName 'Hier Tabellenblatt benennen 
52.
                        ObjXls.Sheets(tempName).Select 
53.
            Set MeineDatei = FSO.OpenTextFile(a(i), 1) 'Hier die Datei öffnen, mit den Daten 
54.
            MeineDaten = Split(MeineDatei.ReadAll, vbCrLf) 'Hier alle Daten der Datei in ein Array schreiben (zeilenweise) 
55.
            For j = 0 To UBound(MeineDaten) 
56.
                c = Split(MeineDaten(j), Trennzeichen) 'Und hier die einzelnen Zeilen nochmals splitten in ein Array 
57.
                            For k = 0 To (UBound(c)) 'Die jetzt gesplitteten einzelnen Werte in die entsprechenden Zeilen der Exceldatei schreiben 
58.
                         On Error Resume Next 
59.
                                    Zeile = Chr(65 + k) & (j + 1) 'Hier benutze ich Character, damit ich in einer Schleife mit Zahlen arbeiten kann. 
60.
                                            ObjXls.Range(Zeile).Value = c(k) 'Heisst: 65=A ; 66=B; 67=C usw., also aus dem ASCII-Code genommen. 
61.
                            Next 
62.
            Next 
63.
            MeineDatei.Close 'Datei schliessen, sobald sie komplett exportiert worden ist. 
64.
        Next 
65.
    DateiMonatsName = Split(b(UBound(b)), "-") 'Hier ermitteln, um welchen Monat es sich handelt. Bsp.: 2012-05-01 -> da ist die 05 interessant und die wird rausgefiltert 
66.
    XlsDateiName = MonthName(DateiMonatsName(1)) & "_" & DateiMonatsName(0) 'und hier ermittle ich den Monatsnamen, also Mai in dem Beispiel 
67.
    ObjXls.ActiveWorkbook.SaveAs Pfad & "\" & XlsDateiName & ".xls" 'Hier die Daten abspeichern in der Exceldatei 
68.
    'Jetzt müssen wir sortieren. Warum das Excel bis 2003 das nicht automatisch macht, weiss ich nicht! 
69.
    temp = Split(MeineDateiNamen, vbCrLf) 
70.
	'IN VB6 funktioniert das, in VBS meckert der Compiler. Wie anders??? 
71.
    ObjXls.Sheets(temp(0)).Move ,ObjXls.ActiveWorkbook.Sheets(1) 
72.
	For i = 1 To ObjXls.Sheets.Count 
73.
        tempName = ObjXls.Sheets(i).Name 
74.
        tempName = Left(tempName, 1) 
75.
        tempName = tempName * 1 
76.
        If Not IsNumeric(tempName) Then 'Hier sollten die überflüssigen Tabellen gelöscht werden! 
77.
            t = ObjXls.Sheets(i).Name 
78.
            ObjXls.Sheets(i).Delete 
79.
        End If 
80.
		ObjXls.Sheets(temp(i)).Move ,ObjXls.ActiveWorkbook.Sheets(i + 1) 
81.
    Next 
82.
    ObjXls.ActiveWorkbook.Close 'Und hier die erstellte Exceldatei schliessen. 
83.
     
84.
    MsgBox MeineDateiNamen 'Fertig! 
85.
End Sub
Gruss
Tsuki

[Edit]
allerbesten Dank an bastla!
ich habe es angepasst und noch etwas abgeändert. Jetzt tut er's, also sortieren und überflüssige Tabellen löschen. Es nervt zwar etwas, dass man da noch 3 oder 4 Mal OK drücken muss, aber ich denke, dass ist für Andre im Moment akzeptabel

Das löschen der CSV-Dateien erst, wenn soweit der Export funktioniert, wie ihn Andre haben möchte.
/Edit]
Bitte warten ..
Mitglied: bastla
05.06.2012, aktualisiert um 17:11 Uhr
Hallo Tsuki!

Das Tabellen-Löschen würde ich nicht unbedingt während des Sortierens machen - daher nachträglich etwa so:
01.
    For Each Sheet In ObjXls.Sheets 
02.
        If Not IsNumeric(Sheet.Name) Then Sheet.Delete 
03.
    Next
Noch ein Hinweis: Mit
ObjXls.ActiveWorkbook.SaveAs Pfad & "\" & XlsDateiName 'Hier die Daten abspeichern in der Exceldatei
- also ohne Angabe des Dateityps - wird automatisch im Standard-Excel-Format (.xls oder .xlsx) gespeichert ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
05.06.2012 um 17:11 Uhr
@bastla,

ich weiss, aber er macht's in einem Rutsch gleich mit und jetzt funktioniert es. Habe es getestet und oben korrigiert.
Schau doch bitte nochmal drüber.

Allerbesten Dank an dich!!!!!!

Gruss
Tsuki
Bitte warten ..
Mitglied: TsukiSan
05.06.2012, aktualisiert um 17:23 Uhr
@ bastla,

was ich noch erwähnen wollte - und warum ich in Zeile 74
tempName = tempName * 1
gesetzt habe ist folgender Grund:
Der Compiler interpretiert
01.
    For Each Sheet In ObjXls.Sheets 
02.
        If Not IsNumeric(Sheet.Name) Then Sheet.Delete 
03.
    Next
alles als Strings, da die Dinger mit "" eingelesen werden.
Mit meiner Variante lese ich den ersten linken String aus und multipliziere ihn mit 1. Wenn es kein Buchstabe ist, dann wird da eine Ziffer draus, also numerisch

Aber das ist sicher nichts Neues für dich.

Soweit macht Andres Frage riesen Spass

Gruss
Tsuki
Bitte warten ..
Mitglied: bastla
05.06.2012, aktualisiert um 18:13 Uhr
Hallo Tsuki!
tempName = tempName * 1
ist aber nicht nötig, weil ja "IsNumeric()" dafür gedacht ist, Strings zu prüfen ...

Mein Ansatz war etwas verkürzt (es soll ja nur das erste Zeichen des Namens geprüft werden), daher:
01.
    For Each Sheet In ObjXls.Sheets 
02.
        If Not IsNumeric(Left(Sheet.Name,1)) Then Sheet.Delete 
03.
    Next
BTW: Ich sehe in Deinem Code keinen Sortier-Algorithmus - soferne also nicht die Dateien in der richtigen Reihenfolge erstellt (was bei den Originaldateien aber eigentlich der Fall sein müsste) und daher ohnehin so eingelesen wurden, wird die Reihenfolge der Tabellenblätter nicht stimmen ...

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
05.06.2012, aktualisiert um 17:57 Uhr
Hallo bastla,

das IsNumeric behandelt ohne diese Zeile 74 alles als einen String bei mir und somit nicht als numerisch. Nur dieser kleine Trick half mir dabei.
WinXp Eng SP3 und Office 2000 Prof, bzw. Office 2003 SP1.
Warum er das macht, weiss ich nicht. In VB6 getestet liest er es auch als String ein und es kümmert "ihn" nicht, ob 2 eine Ziffer oder T ein Buchstabe ist. Ist für "ihn" hier alles gleich, nämlich nichtnumerisch. Naja, man kann das aber so abfangen Mit dem Multiplizieren schiesst man endgültig irgendwleche Gänsefüsschen ab

Einen Sortieralgorithmus gibt es in meinem Code nicht. Das ist richtig. Bisher werden die Dateien in der Reihenfolge eingelesen, wie es ### zur Verfügung stellt. Wenn da die Reihenfolge nicht mehr stimmt, weil eventuell nach Datum oder sonst etwas sortiert wird, dann müssten wir dem ganzen noch einen Bubblesort spendieren. Ich glaube, dass müssen wir aber gar nicht.
Mit dem bisherigen Code und dem Sortieren in den Zeilen 70 bis 81 funktioniert es bei mir prächtig. Ich kann nur kein Office 2007 testen, weil "No Have"

Es ist immer wieder schön, was man hier alles dazulernt. Danke bastla, danke Dieter!

Mal sehen, was bei Andre rauskommt.

Gruss
Tsuki

[Edit]
### hat die wunderschöne Seite wieder zensiert Ich wollte ja Whinntoofff nicht schreiben
[/Edit]
Bitte warten ..
Mitglied: TsukiSan
05.06.2012 um 18:00 Uhr
Hallo Andre,

ich weiss nicht, wie ich morgen Zeit habe. Hier der code,
der folgendes macht:
1) Ordner auswählen
2) Alle dort befindlichen CVS-Dateien einlesen
3) alles was relevant ist nach Excel exportieren (ab 2007 ungetestet!)
4) Überflüssige Tabellen löschen (muss man ggf. mit OK bestätigen)
5) Dann alles soweit sortieren im neuen Excelblatt
6) alle CSV-Dateien gnadenlos löschen( hier bitte Obacht!)

Gruss
Tsuki
01.
Dim Ordner, Pfad, DateiFilter 
02.
Dim Dateiliste, MeineDateiNamen 
03.
Dim FSO, SuchDateien 
04.
Dim ObjXls 
05.
Dim Trennzeichen 
06.
 
07.
Trennzeichen = ";" 
08.
DateiFilter = "CSV" 
09.
 
10.
Set FSO = CreateObject("Scripting.FileSystemObject") 
11.
 
12.
OrdnerAuswaehlen 'Aufruf des Auswahlfensters, welches den Ordner auswählt 
13.
MsgBox "Script startet nach Klick auf OK!" 
14.
 
15.
DateienEinlesen (Pfad) ' Alle Dateien im ausgewählten Pfad einlesen (sollten CSV-Dateien sein!) 
16.
 
17.
Set FSO = Nothing 
18.
 
19.
Private Sub OrdnerAuswaehlen() 'In dieser Sub wird das Auswahlfenster für den Ordner aufgerufen 
20.
 
21.
AuswahlTitel = "Bitte Ordner auswählen" 
22.
StartOrdner = "17" 
23.
Set Auswahl = CreateObject("Shell.Application").BrowseForFolder(0, AuswahlTitel, 16, StartOrdner) 
24.
If TypeName(Auswahl) = "Nothing" Then 
25.
    MsgBox "Abbruch gewählt!" 
26.
    Wscript.Quit 
27.
Else 
28.
    Set Ordner = Auswahl.Self 
29.
    Pfad = Ordner.Path 
30.
End If 
31.
 
32.
End Sub 
33.
 
34.
Private Sub DateienEinlesen(SuchOrdner) ' Hier werden die Dateien eingelesen, die sich im Ordner befinden 
35.
    Set Ordner = FSO.getfolder(SuchOrdner) 
36.
    For Each File In Ordner.Files 
37.
        Pfadangabe = File.Path 
38.
        If LCase(Right(Pfadangabe, 3)) = LCase(DateiFilter) Then 'nur CSV-Dateien werden berücksichtigt 
39.
            SuchDateien = SuchDateien & Pfadangabe & vbCrLf 
40.
        End If 
41.
    Next 
42.
    Set ObjXls = CreateObject("Excel.Application") ' Hier wird ObjXls als Excel-Objekt deklariert 
43.
    ObjXls.Workbooks.Add 'Hier wird eine neue Exceldatei geöffnet. 
44.
    ObjXls.Visible = False 'Damit man die noch nicht sieht, macht man sie unsichtbar 
45.
        a = Split(SuchDateien, vbCrLf) ' Hier die eingelesenen Dateien in ein Array "splitten" 
46.
        For i = 0 To (UBound(a) - 1) 
47.
            b = Split(a(i), "\") 
48.
            ObjXls.Sheets.Add 
49.
                ObjXls.Sheets("Tabelle" & i + 1).Select ' Hier das Tabellenblatt auswählen 
50.
                tempName = Left(b(UBound(b)), 10) ' Und hier den Namen des Tabellenblattes setzen. Bsp.:2012-05-01 und der Rest wird ignoriert vom Dateinamen 
51.
                MeineDateiNamen = MeineDateiNamen & tempName & vbCrLf 'Brauchen wir zum Sortieren der Tabellen 
52.
                        ObjXls.Sheets("Tabelle" & i + 1).Name = tempName 'Hier Tabellenblatt benennen 
53.
                        ObjXls.Sheets(tempName).Select 
54.
            Set MeineDatei = FSO.OpenTextFile(a(i), 1) 'Hier die Datei öffnen, mit den Daten 
55.
            MeineDaten = Split(MeineDatei.ReadAll, vbCrLf) 'Hier alle Daten der Datei in ein Array schreiben (zeilenweise) 
56.
            For j = 0 To UBound(MeineDaten) 
57.
                c = Split(MeineDaten(j), Trennzeichen) 'Und hier die einzelnen Zeilen nochmals splitten in ein Array 
58.
                            For k = 0 To (UBound(c)) 'Die jetzt gesplitteten einzelnen Werte in die entsprechenden Zeilen der Exceldatei schreiben 
59.
                         On Error Resume Next 
60.
                                    Zeile = Chr(65 + k) & (j + 1) 'Hier benutze ich Character, damit ich in einer Schleife mit Zahlen arbeiten kann. 
61.
                                            ObjXls.Range(Zeile).Value = c(k) 'Heisst: 65=A ; 66=B; 67=C usw., also aus dem ASCII-Code genommen. 
62.
                            Next 
63.
            Next 
64.
            MeineDatei.Close 'Datei schliessen, sobald sie komplett exportiert worden ist. 
65.
        Next 
66.
    DateiMonatsName = Split(b(UBound(b)), "-") 'Hier ermitteln, um welchen Monat es sich handelt. Bsp.: 2012-05-01 -> da ist die 05 interessant und die wird rausgefiltert 
67.
    XlsDateiName = MonthName(DateiMonatsName(1)) & "_" & DateiMonatsName(0) 'und hier ermittle ich den Monatsnamen, also Mai in dem Beispiel 
68.
    ObjXls.ActiveWorkbook.SaveAs Pfad & "\" & XlsDateiName & ".xls" 'Hier die Daten abspeichern in der Exceldatei 
69.
    'Jetzt müssen wir sortieren. Warum das Excel bis 2003 das nicht automatisch macht, weiss ich nicht! 
70.
    temp = Split(MeineDateiNamen, vbCrLf) 
71.
    ObjXls.Sheets(temp(0)).Move ,ObjXls.ActiveWorkbook.Sheets(1) 
72.
	For i = 1 To ObjXls.Sheets.Count 
73.
        tempName = ObjXls.Sheets(i).Name 
74.
        tempName = Left(tempName, 1) 
75.
        tempName = tempName * 1 
76.
        If Not IsNumeric(tempName) Then 'Hier sollten die überflüssigen Tabellen gelöscht werden! 
77.
            t = ObjXls.Sheets(i).Name 
78.
            ObjXls.Sheets(i).Delete 
79.
        End If 
80.
		ObjXls.Sheets(temp(i)).Move ,ObjXls.ActiveWorkbook.Sheets(i + 1) 
81.
    Next 
82.
    ObjXls.ActiveWorkbook.Close 'Und hier die erstellte Exceldatei schliessen. 
83.
     
84.
	DateienLoeschen 'Hier das Löschen aufrufen 
85.
    MsgBox "Aufgaben ausgeführt!" 
86.
	 
87.
End Sub 
88.
 
89.
Private Sub DateienLoeschen() 
90.
a = Split(SuchDateien,vbcrlf) 
91.
For i = 0 to(Ubound(a)-1) 
92.
	FSO.deleteFile (a(i)) 
93.
Next 
94.
End Sub
Bitte warten ..
Mitglied: 76109
06.06.2012, aktualisiert um 09:55 Uhr
Hallo Sky!

Test mal mit diesem Skript, ob Du eine Ping-Antwort erhälst:
01.
    Option Explicit 
02.
 
03.
    Const PingCount = 10 
04.
 
05.
 
06.
    Dim objWin, objExec, objPing, arrReply, intMin, intMax, intMit, intLost, i 
07.
     
08.
    Redim arrReply(PingCount - 1)	     
09.
 
10.
    Set objWin = GetObject("winmgmts:{impersonationLevel=impersonate}") 
11.
     
12.
    intLost = 0 
13.
     
14.
    For i = 0 To PingCount - 1 
15.
        Set objExec = objWin.ExecQuery("select * from Win32_PingStatus where address = 'google.de'") 
16.
         
17.
        For Each objPing In objExec 
18.
            If objPing.StatusCode = 0 Then 
19.
                arrReply(i) = objPing.ResponseTime 
20.
            Else 
21.
                arrReply(i) = 0 
22.
                intLost = intLost + 1 
23.
            End If 
24.
        Next 
25.
    Next 
26.
 
27.
    If intLost = PingCount Then 
28.
        MsgBox "Keine Antwort!" 
29.
    Else 
30.
        MsgBox "Antworten = " & PingCount - intLost & ", Verloren = " & intLost 
31.
    End If
wobei eine MsgBox zu testzwecken eine entsprechende Meldung ausgibt

@All
Ihr wart in der Zwischenzeit ja ganz schön fleißig

Gruß Dieter
Bitte warten ..
Mitglied: Skyemugen
06.06.2012 um 10:12 Uhr
Aloha ihr drei,

@Tsuki ich nutze Proton das genügt mir.

Ihr könnt euch Zeit lassen, zum Basteln, ich bin erst einmal krank geschrieben - Verdacht auf Blinddarmentzündung, daher komme ich sowieso nicht zum Testen unter Realbedingungen ...

greetz André

P.S.:@Dieter, mein Nickname hat nichts mit dem Himmel zu tun
Bitte warten ..
Mitglied: TsukiSan
06.06.2012 um 11:06 Uhr
Hallo Andre,

na erst einmal gute Besserung!

Proton geht natürlich auch. Wenn man's nur mit dem Notepad aufmacht, sieht's nicht so schön aus.

@Dieter,

danke, danke! Wir waren alle fleissig Nur das Ergebnis zählt.

Gruss und gute Besserung,

Tsuki
Bitte warten ..
Mitglied: 76109
06.06.2012 um 12:38 Uhr
Hallo André!

Auch von mir gute Besserung!

Blindarmentzündung, tut das weh?

P.S.:@Dieter, mein Nickname hat nichts mit dem Himmel zu tun
Aber, Du hast doch Flügel

@Tsuki
danke, danke! Wir waren alle fleissig Nur das Ergebnis zählt.
Jepp, da gebe ich Dir vollkommen Recht

Gruß Dieter
Bitte warten ..
Mitglied: bastla
06.06.2012 um 18:02 Uhr
Hallo Skye!

Auf dass sich der Verdacht nicht bestätigen möge ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
07.06.2012, aktualisiert um 23:12 Uhr
Hallo André!

Hier - wie versprochen - die Win-Ping-Version:
01.
    Option Explicit 
02.
 
03.
    Const PingCount = 20    'Anzahl Pings 
04.
 
05.
    Const PathStart = "D:\Latenz" 
06.
 
07.
    Const ExcelMappe = "_Ping.xlsx" 
08.
 
09.
    Const ExcelHeader = "Uhrzeit,Min [ms],Max [ms],Mit [ms],Verlust [%]" 
10.
 
11.
    Const ErrMsg1 = "Pfad nicht gefunden:" 
12.
 
13.
    Const xlUp = -4162 
14.
    Const xlRight = -4152 
15.
    Const xlCenter = -4108 
16.
    
17.
 
18.
    Dim objWin, objExec, objPing, objFso, objExcelApp, objExcelSheet, arrReply, arrValues 
19.
    Dim strDate, strTime, strYear, strMonth, strDay, strStdOut, strPathYear, strPathMonth 
20.
    Dim strPathExcelMappe, intNewSheets, intNextLine, intMin, intMax, intMit, intLost, i 
21.
     
22.
    ReDim arrReply(PingCount - 1)                           'Array-Größe für Antwort entspricht Ping-Anzahl 
23.
     
24.
    strTime = FormatDateTime(Time, vbShortTime)             'Format HH:MM 
25.
     
26.
    Set objWin = GetObject("winmgmts:{impersonationLevel=impersonate}") 'Object Win-System 
27.
     
28.
    intLost = 0                                             'Init Zähler Verloren = 0 
29.
     
30.
    For i = 0 To PingCount - 1                              'Schleife entsprechend Ping-Anzahl 
31.
        Set objExec = objWin.ExecQuery("Select * From Win32_PingStatus Where Address = 'google.de'") 'Ping senden 
32.
         
33.
        For Each objPing In objExec                         'Ping-Object-Zuweisung 
34.
            If objPing.StatusCode = 0 Then                  'Test Ping-Status (0 = OK) 
35.
                arrReply(i) = objPing.ResponseTime          'Zeitwert in Array sichern 
36.
            Else                                            'Verloren 
37.
                arrReply(i) = 0                             'Zeitwert 0 in Array sichern 
38.
                intLost = intLost + 1                       'Zähler Verloren + 1 
39.
            End If 
40.
        Next 
41.
    Next                                                    'Nächsten Ping senden 
42.
  
43.
    strYear = Year(Date)                                    'Format YYYY 
44.
    strMonth = Right("0" & Month(Date), 2)                  'Format MM 
45.
    strDay = CStr(Day(Date))                                'Format #D) 
46.
     
47.
    strDate = strYear & "-" & strMonth & "-" & Right("0" & strDay, 2)   'Format YYYY-MM-DD 
48.
     
49.
    strPathYear = PathStart & "\" & strYear                 'Path "D:\Latenz\Jahr" 
50.
    strPathExcelMappe = strPathYear & "\" & strMonth & ExcelMappe   'Path "D:\Latenz\Jahr\Monat_ExcelMappe" 
51.
     
52.
    Set objFso = CreateObject("Scripting.FileSystemObject") 'Object Dateioperationen 
53.
 
54.
    If objFso.FolderExists(PathStart) Then                  'Test ob der PathStart existiert 
55.
        If objFso.FolderExists(strPathYear) = False Then    'Test ob der Pfad mit Jahr nicht existiert 
56.
            objFso.CreateFolder strPathYear                 'Pfad mit Jahr erstellen 
57.
        End If 
58.
         
59.
        Set objExcelApp = CreateObject("Excel.Application") 'Object ExcelApplication 
60.
         
61.
        If intLost = PingCount Then                         'Test ob alle Pings Verloren sind 
62.
            arrValues = Array(strTime, "n/v", "n/v", "n/v", "n/v")  'Verbindungsfehler (Zeit,Min,Max,Mittel,Verlust) 
63.
        Else 
64.
            With objExcelApp.WorksheetFunction              'Excel Berechnungs-Funktionen nutzen 
65.
                If intLost = 0 Then                         'Test Verloren = 0 (Array ohne 0-Werte) 
66.
                    intMin = .Small(arrReply, 1)            'Min-Wert = Kleinster Wert in Array 
67.
                Else                                        'Wenn Verloren > 0 (Array mit 0-Werte) 
68.
                    intMin = .Small(arrReply, 2)            'Min-Wert = 2. Kleinster Wert in Array 
69.
                    intLost = Round(intLost / PingCount * 100, 0)   'Verlust in Prozent (auf/abgerundet) 
70.
                End If 
71.
                 
72.
                intMax = .Max(arrReply)                     'Max-Wert 
73.
                intMit = Round(.Average(arrReply), 0)       'Mittelwert (auf/abgerundet) 
74.
            End With 
75.
            arrValues = Array(strTime, intMin, intMax, intMit, intLost)  'Werte (Zeit,Min,Max,Mittel,Verlust) 
76.
        End If 
77.
    
78.
        If objFso.FileExists(strPathExcelMappe) Then        'Test ob Excel-Datei vorhanden ist 
79.
            With objExcelApp.Workbooks.Open(strPathExcelMappe, , , , , "Write") 'Excel-Datei öffnen (Schreibberechtigt) 
80.
                Set objExcelSheet = Nothing                 'Object Excel-Sheet = Nothing 
81.
                     
82.
                On Error Resume Next                        'Fehlerbehandlung Aus 
83.
                Set objExcelSheet = .Sheets(strDay)         'Object Excel-Sheet = Tag? 
84.
                On Error GoTo 0                             'Fehlerbehandlung Ein 
85.
                     
86.
                If objExcelSheet Is Nothing Then            'Test Excel-Sheet Tag existiert nicht 
87.
                    Set objExcelSheet = .Sheets.Add(, .Sheets(.Sheets.Count)) 
88.
                    Call SheetInit(objExcelSheet, strDay, arrValues) 
89.
                Else    'Wenn Sheet (Tag) bereits existiert 
90.
                    With objExcelSheet 
91.
                        intNextLine = .Cells(.Rows.Count, "A").End(xlUp).Row + 1  'Nächste freie Zeile 
92.
                       .Cells(intNextLine, "A").Resize(1, 5).Value = arrValues    'Werte einfügen 
93.
                    End With 
94.
                End If 
95.
               .Close True  'Excel-Mappe speichern und schließen 
96.
            End With 
97.
        Else 
98.
            With objExcelApp 
99.
                intNewSheets = .SheetsInNewWorkbook                 'Option Anzahl Sheets sichern 
100.
               .SheetsInNewWorkbook = 1                             'Option Anzahl Sheets = 1 
101.
 
102.
                With .Workbooks.Add                                 'Neue Excel-Mappe erstellen 
103.
                    Call SheetInit(.Sheets(1), strDay, arrValues) 
104.
                   .SaveAs strPathExcelMappe, , , "Write"           'Excel-Mappe mit Schreibkennwort speichern 
105.
                   .Close False                                     'Excel-Mappe schließen 
106.
                End With 
107.
             
108.
               .SheetsInNewWorkbook = intNewSheets                  'Option Anzahl Sheets wiederherstellen 
109.
            End With 
110.
        End If 
111.
         
112.
        objExcelApp.Quit                                            'Excel-Application schließen 
113.
    Else 
114.
        MsgBox ErrMsg1 & vbCr & vbCr & PathStart, vbExclamation, "Fehler..." 
115.
    End If 
116.
 
117.
 
118.
    Private Sub SheetInit(ByRef Sheet, ByRef SheetName, ByRef Values) 
119.
        With Sheet                                          'Sheet("TabelleX") 
120.
           .Name = SheetName                                'Sheet-Name = Tag X 
121.
           .Range("A:E").HorizontalAlignment = xlRight      'Spalten rechtsbündig 
122.
             
123.
            With .Range("A1").Resize(1, 5)                  'Zell-Bereich A1:E1 festlegen 
124.
                .Value = Split(ExcelHeader, ",")            'Überschrift einfügen 
125.
                .Font.Bold = True                           'Fett-Schrift festlegen 
126.
                .HorizontalAlignment = xlCenter             'Überschrift zentrieren 
127.
            End With 
128.
                     
129.
           .Range("A2").Resize(1, 5).Value = Values         'Werte in Zeile 2 einfügen 
130.
        End With 
131.
    End Sub
wobei, Deine Anpassung (alle Mappen im Jahres-Ordner) ebenfalls berücksichtigt wurde

Gruß Dieter


PS.
Falls Dir die Ping-Folge zu schnell sein sollte, dann kannst Du in der Ping-Schleife noch diese Codezeile einfügen
01.
WScript.Sleep 500  'Pause in Millisekunden
Und falls sich jemand wundert, warum die Antiviren-Software trotz akueller Updates mit der Meldung 'Datenbanken und Programm-Module veraltet' nervt, dann liegt das daran, dass Ihr - wie ich - vergessen habt, nach dem Testen das Datum wieder richtig einzustellen
Bitte warten ..
Mitglied: Skyemugen
09.06.2012 um 08:19 Uhr
Zitat von bastla:
Auf dass sich der Verdacht nicht bestätigen möge ...

Aloha bastla,

glücklicherweise scheint es, als habe sich der Verdacht nicht bestätigt, dennoch ist die Ursache unklar und die Symptome nicht weg ... also noch eine Weile krankgeschrieben => das Testen der Lösungen zieht sich also noch ;)

Gruß an alle und Danke für die Genesungswünsche,

André
Bitte warten ..
Mitglied: Skyemugen
19.06.2012 um 14:19 Uhr
Aloha zusammen,

*sigh* der Tisch ist voll, so voll ... ich hoffe, ich komme noch diese Woche dazu, das Thema hier abzuschließen, momentan hab' ich nicht einmal die Luft, mich hier überhaupt groß anzumelden am Tag ^__^

und ich hoffe, die Infektion bekommt keinen erneuten Rückfall ...

greetz André
Bitte warten ..
Mitglied: Skyemugen
21.06.2012 um 18:44 Uhr
Multiposts ftw, ich hasse das Jahr 2012 - bin wieder krank geschrieben ... und versucht mal einer in der Urlaubszeit kurzfristig einen Termin for Sono zu kriegen, haha ~.~
Bitte warten ..
Mitglied: Skyemugen
02.07.2012 um 11:13 Uhr
Soooo also, nu gehen wir doch mal ran an den Speck:

Dieters letzte Ausführung bringt auf dem TS2000 leider folgendes:
Zeile:	33 
Zeichen:	9 
Fehler: 0x80041010 
Code:	80041010 
Quelle:		(null)
Er mag also das For Each nicht(?)

greetz André
Bitte warten ..
Mitglied: 76109
02.07.2012 um 11:57 Uhr
Hallo André!

Teste mal mit diesem Skript, ob Du eine entsprechende Fehlermeldung bekommst:
01.
    Option Explicit 
02.
 
03.
    Const PingCount = 10 
04.
 
05.
 
06.
    Dim objWin, objExec, objPing, arrReply, intMin, intMax, intMit, intLost, i 
07.
     
08.
    ReDim arrReply(PingCount - 1) 
09.
 
10.
    On Error Resume Next 
11.
    Set objWin = Nothing 
12.
    Set objWin = GetObject("winmgmts:{impersonationLevel=impersonate}") 
13.
     
14.
    If objWin Is Nothing Then 
15.
        MsgBox "Objekterstellung (objWin) nicht möglich!":  WScript.Quit 1 
16.
    End If 
17.
     
18.
    intLost = 0 
19.
        
20.
    For i = 0 To PingCount - 1 
21.
        Set objExec = Nothing 
22.
        Set objExec = objWin.ExecQuery("select * from Win32_PingStatus where address = 'google.de'") 
23.
         
24.
        If objExec Is Nothing Then 
25.
            MsgBox "Objekterstellung (objExec) nicht möglich!":  WScript.Quit 1 
26.
        End If 
27.
         
28.
        For Each objPing In objExec 
29.
            If objPing.StatusCode = 0 Then 
30.
                arrReply(i) = objPing.ResponseTime 
31.
            Else 
32.
                arrReply(i) = 0 
33.
                intLost = intLost + 1 
34.
            End If 
35.
        Next 
36.
    Next 
37.
 
38.
    If intLost = PingCount Then 
39.
        MsgBox "Keine Antwort!" 
40.
    Else 
41.
        MsgBox "Antworten = " & PingCount - intLost & ", Verloren = " & intLost 
42.
    End If
Gruß Dieter
Bitte warten ..
Mitglied: Skyemugen
02.07.2012 um 12:13 Uhr
Aloha Dieter,

Antworten = 10, Verloren = 0

greetz André
Bitte warten ..
Mitglied: 76109
02.07.2012 um 13:27 Uhr
Hallo André!

Muss gestehen, dass ich dieses Ergebnis eigentlich nicht erwartet habe, zumal ich zum anderen Skript keinen Unterschied feststellen kann.

Und was passiert, wenn Du mal die Codezeile 'On Error Resume Next' mit einem Kommentarzeichen (') auskommentierst?

Gruß Dieter
Bitte warten ..
Mitglied: Skyemugen
02.07.2012 um 13:41 Uhr
Zitat von 76109:
Und was passiert, wenn Du mal die Codezeile 'On Error Resume Next' mit einem Kommentarzeichen (') auskommentierst?

Macht null Komma gar keinen Unterschied
Bitte warten ..
Mitglied: 76109
02.07.2012 um 13:45 Uhr
Hallo nochmal!

Also, ich habe diesen Code (didi1954 schreibt am 07.06.2012 um 10:34:41 Uhr) nochmal bei mir getestet und der funktioniert einwandfrei?

Gruß Dieter
Bitte warten ..
Mitglied: Skyemugen
02.07.2012 um 13:59 Uhr
... hm, dann hat unser TS doch einen weg, die Vermutung hatte ich eh schon länger ...
Bitte warten ..
Mitglied: 76109
02.07.2012, aktualisiert um 14:14 Uhr
Hallo André!

... hm, dann hat unser TS doch einen weg, die Vermutung hatte ich eh schon länger ...
Das kann ich leider nicht beurteilen

Du könntest den ganzen Code-Block auch einfach mal austauschen, eventuell hat sich da irgendetwas eingeschlichen, was da nicht hingehört? Das hatte ich auch schonmal

Gruß Dieter

PS. Gegebenenfalls auch mal woanders (Zuhause?) testen...
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Netzwerkgrundlagen
IPsec - .conf und .secret erstellen aus Gruppe und User (16)

Frage von MaxMLe zum Thema Netzwerkgrundlagen ...

RedHat, CentOS, Fedora
gelöst Erstellen von Desktopverknüpfungen und Anpassung der Taskleiste (2)

Frage von honeybee zum Thema RedHat, CentOS, Fedora ...

Vmware
ESXI Template erstellen (2)

Frage von Phill93 zum Thema Vmware ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...