Tar.gz mit vb entpacken um csv Datein einzulesen

Ja aber dann sollte es glaube auch unter VB funktionieren!
Aber selbst wenn dann würden deine Daten unter C:\Windows
liegen und das wollen wir ja nicht oder ?

genau:

Ganz einfach :smile:

Private Declare Function SetCurrentDirectory _
Lib „kernel32“ Alias „SetCurrentDirectoryA“ _
(ByVal lpPathName As String) As Long

irgendwie klappt das nicht, Excel scheint das nicht als neue Function zu erkennen!

Hier mal mein momentaner code
es ist erstmal der testcode, verbessern kann man da sicher noch einiges, aber erstmal soll er laufen!

Diese Sub kopiert die Daten die größer als 180kB sind von pfad nach pfad\cop , dann werden die tar.gz mit gunzip entpackt

Private Sub CommandButton1\_Click()
pfad = Cells(1, 2)
Columns("E:h").ClearContents
If Not Dir(pfad & "cop\*.\*") = "" Then Kill (pfad & "cop\*.\*")
datei\_tar\_gz = Dir(pfad & "\*.tar.gz")
Cells(1, 5) = "Name"
Cells(1, 6) = "Name ohne gz"
Cells(1, 7) = "Größe"
Do
 größe = VBA.FileLen(pfad + datei\_tar\_gz)
 If größe \> 180000 Then
 anzahl = anzahl + 1
 datei\_tar = Left(datei\_tar\_gz, Len(datei\_tar\_gz) - 3)
 Worksheets(1).Cells(anzahl + 1, 7) = größe
 Worksheets(1).Cells(anzahl + 1, 6) = datei\_tar
 Worksheets(1).Cells(anzahl + 1, 5) = datei\_tar\_gz
 FileCopy pfad & datei\_tar\_gz, pfad & "cop\" & datei\_tar\_gz
 befehl = "gunzip " & pfad & "cop\" & datei\_tar\_gz
 Shell (befehl)
 End If
 datei\_tar\_gz = Dir
Loop Until datei\_tar\_gz = ""
Cells(1, 8) = anzahl

bis hierher klappt es wunderbar!
zum Testen hab ich das Programm hier getrennt! (der erste Teil läuft ne weile!)

Sub ddd()
anzahl = Cells(1, 8)
pfad = Cells(1, 2) & "cop\"
'SetCurrentDirectory (pfad) 'der Befehle geht noch nicht
For x = 1 To anzahl
 datei\_tar = Worksheets(1).Cells(x + 1, 6)
 datei\_tar\_gz = Worksheets(1).Cells(x + 1, 5)
 befehl = "tar xf " & datei\_tar --------hier ist wohl der Fehler
 Shell (befehl)
Next
End Sub

Gruß Zondan

Hi Zondan,

probiers mal so:

Sub tt()
Dim pfad As String
ChDrive „C“
ChDir „c:\ziel“
pfad = „c:\quelle“
S = Shell("c:\programm\tar.exe -xf " & pfad & „daten.tar“,
vbMaximizedFocus)
End Sub

Hi,
funktioniert leider nicht, wobei wenn ich im dos Fenster:

C:\ziel>tar.exe -xt e:\mess\datei.tar

eingebe werden die Daten richtig nach c:\ziel\ entpackt!

funktioniert leider nicht, wobei wenn ich im dos Fenster:

C:\ziel>tar.exe -xt e:\mess\datei.tar

eingebe werden die Daten richtig nach c:\ziel\ entpackt!

Hallo Zondan,

welcher Pfad wird angezeigt und welcher steht in C:\tar.txt ?

Sub Dostest()
Dim S
Close
Open „C:\tar.bat“ For Output As #1
Print #1, „dir *.xyz > c:\tar.txt“
Close
S = Shell(„C:\tar.bat“)
End Sub

Sub vbatest()
MsgBox CurDir
End Sub

Gruß
Reinhard

Hallo Zondan,

Excel-Vba von 2000 hat zwar Elemente von VB 6.0, sage bitte nicht VB wenn du Excel-Vba meinst.

Benutze unbedingt Optin Explicit (im Editor Extras–Optionen–Variablendeklaration erforderlich)

Für Dritte ist es leichter Fehler zu finden die sie auch sehen können.

pfad = Cells(1, 2)

ist deshalb zum Testen sehr schlecht, viel besser ist es so:

pfad = „H:\test“

Wenn die Prozedur dann mal läuft kannst du dann ja wieder Zellwrte verwursten.

Private Declare Function SetCurrentDirectory _
Lib „kernel32“ Alias „SetCurrentDirectoryA“ _
(ByVal lpPathName As String) As Long

irgendwie klappt das nicht, Excel scheint das nicht als neue
Function zu erkennen!

Funktioniert problemlos unter XL2000, siehe nachstehenden Code.

Hier mal mein momentaner code

Den schauen ich mir erst an wenn du das von mir o.g. getan hast und den verbesserten Code erneut postest.

es ist erstmal der testcode, verbessern kann man da sicher
noch einiges, aber erstmal soll er laufen!

Richtig, deshalb Option Explicit und direkte pfadangabe um unnötige Fehler und Zeitverlust dadurch zu vermeiden.

Gruß
Reinhard

Option Explicit

Private Declare Function SetCurrentDirectory _
Lib „kernel32“ Alias „SetCurrentDirectoryA“ _
(ByVal lpPathName As String) As Long

Sub tt()
Dim Pfad As String, Merker As String
Merker = CurDir
If Dir(„c:\temp2/nul“) = „“ Then MkDir „c:\temp2“
Pfad = „C:\temp2“
SetCurrentDirectory (Pfad)
MsgBox CurDir
ChDrive Left(Merker, 1)
ChDir Merker
MsgBox CurDir
End Sub

Hallo Zondan,

Hi Zondan,

probiers mal so:

Sub tt()
Dim pfad As String
ChDrive „C“
ChDir „c:\ziel“
pfad = „c:\quelle“
S = Shell("c:\programm\tar.exe -xf " & pfad & „daten.tar“,
vbMaximizedFocus)
End Sub

Hi,
funktioniert leider nicht, wobei wenn ich im dos Fenster:

C:\ziel>tar.exe -xt e:\mess\datei.tar

Kann auch nicht gehen!
Schau dir das doch mal genau an!
Es wird die Datei tar.exe aus dem Ordner c:\Ziel aufgerufen.
In Reinhard sein Demo, versucht er sie aber aus c:\Programm" aufzurufen!
Du musst den Pfad zur Tar.exe schon richtig angeben!
Aber dann hast du immernoch das Problem, das dann die Daten nach dem Verzeichnis entpackt werden!

eingebe werden die Daten richtig nach c:\ziel\ entpackt!

MfG Alex

Hallo

irgendwie klappt das nicht, Excel scheint das nicht als neue
Function zu erkennen!

Du musst auch die API bekannt machen!
Deswegen oben

Option explicit '

rein.



> Hier mal mein momentaner code  
> es ist erstmal der testcode, verbessern kann man da sicher  
> noch einiges, aber erstmal soll er laufen!  
>   
> Diese Sub kopiert die Daten die größer als 180kB sind von pfad  
> nach pfad\cop , dann werden die tar.gz mit gunzip entpackt  
>   
>   
> 
>     
> Private Sub CommandButton1\_Click()
> pfad = Cells(1, 2)
> Columns("E:h").ClearContents
> If Not Dir(pfad & "cop\*.\*") = "" Then Kill (pfad & "cop\*.\*")
> datei\_tar\_gz = Dir(pfad & "\*.tar.gz")
> Cells(1, 5) = "Name"
> Cells(1, 6) = "Name ohne gz"
> Cells(1, 7) = "Größe"
> Do
> größe = VBA.FileLen(pfad + datei\_tar\_gz)
> If größe \> 180000 Then
> anzahl = anzahl + 1
> datei\_tar = Left(datei\_tar\_gz, Len(datei\_tar\_gz) - 3)
> Worksheets(1).Cells(anzahl + 1, 7) = größe
> Worksheets(1).Cells(anzahl + 1, 6) = datei\_tar
> Worksheets(1).Cells(anzahl + 1, 5) = datei\_tar\_gz
> FileCopy pfad & datei\_tar\_gz, pfad & "cop\" &
> datei\_tar\_gz
> befehl = "gunzip " & pfad & "cop\" & datei\_tar\_gz
> Shell (befehl)
> End If
> datei\_tar\_gz = Dir
> Loop Until datei\_tar\_gz = ""
> Cells(1, 8) = anzahl
> 
>   
> bis hierher klappt es wunderbar!  
> zum Testen hab ich das Programm hier getrennt! (der erste Teil  
> läuft ne weile!)




> Sub ddd()
> anzahl = Cells(1, 8)
> pfad = Cells(1, 2) & "cop\"
> 'SetCurrentDirectory (pfad) 'der Befehle geht noch nicht
> For x = 1 To anzahl
> datei\_tar = Worksheets(1).Cells(x + 1, 6)
> datei\_tar\_gz = Worksheets(1).Cells(x + 1, 5)
> befehl = "tar xf " & datei\_tar --------hier ist wohl
> der Fehler
> Shell (befehl)
> Next
> End Sub

SetCurrentDirectory ist eine API und du musst du erst wie oben beschrieben bekannt machen! Desweiteren fällt mir bei der Zuweisung an Befehl folgendes auf!

Werden Parameter nicht mit - vornweg aufgerufen?
Schreibe mal lieber tar.exe anstatt nur tar
Welcher Wert steht denn in datei\_tar drinnen! 
Bevor du das shell Kommando ausführst, so lasse dir den Befehl mal anzeigen , via Msgbox befehl. Was steht denn da drinnen?
Passt dann die Anzeige?

MfG Alex

C:\ziel>tar.exe -xt e:\mess\datei.tar

eingebe werden die Daten richtig nach c:\ziel\ entpackt!

Hallo Zondan,

fiel mir vorhin schon auf, „>“ ist ein Umlenkungszeichen für Dos.
Von daher kann ich ga nicht glauben daß dein befehl, so wie er dasteht funktioniert hat.

Bei Aufruf in Dos von:

tar.exe -xt e:\mess\datei.tar > c:\tar.txt

wird das Ergebnis, naja eher der Rückgabewert oder beschreibung des Vorgangs, dieses Programmaufrufs in die datei c:\tar.txt geschrieben.

„>>“ anstatt „>“ bedeutet Anhängen des Eintrags.

Umgelenkt/umgeleitet wird dabei die Bildschirmanzeige.
Dummerweise kann man dies wohl nicht in jedem Fall nutzen um in der Txt-datei nachzuschauen was denn Dos in den kurz aufblitzenden Fenster n angezeigt hätte.

Wenn ich den Dosbefehl benutze
xcopy a.txt b.txt > Kopier.txt
müßte m.W. in der kopier.txt stehen

xcopy a.txt b.txt
und
Datei nicht gefunden

In deinem Fall wurde Kopier.txt bzw. tra.txt zwar angelegt, blieb aber leider leer.

Was ich damit letztllich auch erfragen möchte, bist du dir völlig sicher daß dieser Dosbefehl:

C:\ziel>tar.exe -xt e:\mess\datei.tar

in genau dieser Schreibweise funktioniert hat?

Und was genau meinst mit Dos-Fenster wo du das eingibst?

Start–Ausführen–befehl sicher nicht.

Rufst du über Start–Ausführen die cmd.exe auf?

Wenn dem so sein sollte, könnte ja durch die cmd.exe ein ganz anderes Verzeichnis das aktuelle sein als bisher angenommen.

Irgendwie kann es doch gar nicht sein daß man 2008 noch an irgendwelchen Pfaden scheitert *grübel*

Andererseits, ich halte mich bei der namensvergabe für dateien verzeichnisse nahezu immer noch an die alte 8.3 Regel.

Sicher, Office/Windows kennt inzwischen lange Dateinamen usw., aber halt nicht zu 100,000 %, sondern halt paar Pöngs weniger, das bedeutet, zwangsläufig gibt es deshalb Ärger, egal namenslänge oder Sonderzeichen wie Leerzeichen im Namen o.ä. Also vermeide ich das mir noch unnötigen Ärger aufzuhalsen.

Und ein gut durchdachtes Ordnersystem benötigt keine langen Dateinamen wie

Bild das ich machte als ich von A > B fuhr während Deutschland gegen Polen 2:3 gewann und anschließend der Himmel voller *** war.jpg

-)) Ich kanns halt nicht abschütteln, wenn jmd. hier nachfragt daß diese Datei z.B. nicht gefunden wird, so ist mein erster Augenmerk augenblicklich auf > : ? *

Gruß
Reinhard

Juhu, danke, das funktioniert schon mal!

Sub Dostest() ' klappt!!!!!!!!
Dim S
ChDrive "C"
ChDir "c:\ziel"
Close
Open "C:\tar.bat" For Output As #1
Print #1, "tar xf " & pfad & datei.tar
Close
S = Shell("C:\tar.bat")
End Sub

die Datei.tar von Pfad wird nach c:\ziel entpackt!
den Rest der batch werde ich hoffentlich selber hinbekommen, batch Dateien selber schreiben ist schon ein paar Jahre her!

das hat mir auch geholfen!!!

Sub vbatest()
MsgBox CurDir
End Sub

endlich weiß ich wo Excel grad arbeitet!

Hi,
da die tar.exe in c:\windows liegt muß man den pfad dahin nicht angegeben, da es da eine path Anweisung für gibt (kA ob die heute noch in der autoexec.bat drin steht) auf jeden fall schaut Dos erst im aktuellen Verzeichnis und dann in den Verzeichnissen, die mit path angegeben wurden nach der .exe Datei und führt sie dann aus!
(zumindest, wenn ich das aus learning by doing so richtig gelernt habe)

PS: path steht zumindest unter Vista nicht mehr in der autoexec, aber es geht trotzdem!

C:\ziel>tar.exe -xt e:\mess\datei.tar

Danke für die ausführliche Erklärung, aber das war mir schon klar, ich hab in diesem Fall die komplette Zeile aus dem Dos-Fenster (damit meine ich immer Start -> Ausführen -> cmd, hoffe das ist so richtig!) abgeschrieben, da immer weider die Frage kam wo ich den das schreiben würde!

nach meinem kurzen Test unterstütz tar die Umlenkung mit „>“ nicht, klappt das nicht nur bei reinen Dos Befehlen?

ok, das hab ich jetzt auch lauffähig bekommen!

Option Explicit

Private Declare Function SetCurrentDirectory _
Lib „kernel32“ Alias „SetCurrentDirectoryA“ _
(ByVal lpPathName As String) As Long

Sub tt()
Dim Pfad As String, Merker As String
Merker = CurDir
If Dir(„c:\temp2/nul“) = „“ Then MkDir „c:\temp2“
Pfad = „C:\temp2“
SetCurrentDirectory (Pfad)
MsgBox CurDir
ChDrive Left(Merker, 1)
ChDir Merker
MsgBox CurDir
End Sub

option explicit verwende ich meist erst, wenn ich aus der Testphase raus bin, da ich beim umschrieben sonst dauern schauen muß als was ich die Variable deklariert hab!
zur Kontrolle verwende ich (bei den max 20 Zeilen Code die solche Test meist haben) das Lokal Fenster, da stehen dann alle verwendeten Variablen der Sub/Funktion aufgelistet drin, mit ihrem Inhalt und dem Typ (so spart man sich das anlegen von Überwachungsausdrücken)

Also „option explicit“ steht bei mir später über jedem Code, nur halt am Anfang nicht!

Den vollständigen Code schreib ich dann rein, wenn er hoffentlich demnächst läuft! (oder wenn ich noch Hilfe benötige)

Hi,

Sub vbatest()
MsgBox CurDir
End Sub

endlich weiß ich wo Excel grad arbeitet!

und wenn Du den Pfad mal ‚verbiegen‘ möchtest …

/t/vb6-pfadprobleme/4627133/2

Gruß Rainer

Hi,

wegen option explicit siehe anderer Post, (oder kurz, wird von mir normalerweise erst nach der Testphase eingefügt)

Werden Parameter nicht mit - vornweg aufgerufen?

also unter dos war das egal, im jetzt laufenden Programm geht es auch ohne

Schreibe mal lieber tar.exe anstatt nur tar

sucht dos nicht eh nur nach .exe .bat (und anderen ausführbaren) Dateien? in meinen alten Dos zeiten hab ich nie .exe schreiben müssen.

Welcher Wert steht denn in datei_tar drinnen!

datei_tar=„dateiname.tar“
(in datei_tar_gz steht "dateiname.tar.gz)

Bevor du das shell Kommando ausführst, so lasse dir den Befehl
mal anzeigen , via Msgbox befehl. Was steht denn da drinnen?

das seh ich schon im logal Fenster, da ich mit Einzelschritt durchgehe (bei größeren Programmen setz ich dann Stopmarken)

So, jetzt hab ich hoffentlich alles beantwortet, ich bedanke mich hiermit nochmals für eure nette Hilfe!
Jetzt versuch ich erstmal selber wieder etwas weiter zu kommen!
Den fertigen Code werde ich dann auch noch hier reinstellen!

fertiges Programm
da die Shell erst beendet sein muß, bevor Excel-VBa weitermachen darf, hab ich noch die zusätzliche Funktion wait gebraucht die ich auf http://www.thescarms.com/vbasic/wait.aspx gefunden und angepasst habe
Kommentierung ist noch nicht ganz fertig, aber dazu komm ich heut nicht mehr!

Option Explicit
Private Sub CommandButton1\_Click()
Dim pfad As String ' pfad zu den tar Dateien
Dim datei\_tar\_gz As String ' Dateiname.tar.gz
Dim datei\_tar As String ' Dateinmae.tar
Dim anzahl As Integer ' Anzahl der Dateien
Dim x As Integer ' Hilfvariable für Schleifen
Dim s As Long
pfad = Cells(1, 2) ' ="E:\messreihen\tar\" wird später als Übergabewert beim funktionsaufruf übergeben
Columns("E:h").ClearContents 'Ausgabezellen löschen -\> Datenfeld leider ungünstig, da variable anzahl der dateien
Cells(1, 5) = "Name" ' Überschriften für Tabelle
Cells(1, 6) = "Name ohne gz"
If Not Dir(pfad & "cop\*.\*") = "" Then Kill (pfad & "cop\*.\*") 'alte Datein aus dem copy Verzeichnis löschenlöschen
If Not Dir(pfad & "test\*.\*") = "" Then Kill (pfad & "test\*.\*") 'alte Datein aus dem test Verzeichnis löschen
datei\_tar\_gz = Dir(pfad & "\*.tar.gz") 'Vorlesen des ersten Dateinnamens
SetCurrentDirectory (pfad & "test\") 'Ausgabepfad auf test\ legen
Do
 If VBA.FileLen(pfad & datei\_tar\_gz) \> 180000 Then ' Nur Dateien, die größer als 180kB sind kopieren (gibt übertragunsfehler)
 Application.StatusBar = anzahl
 anzahl = anzahl + 1
 datei\_tar = Left(datei\_tar\_gz, Len(datei\_tar\_gz) - 3)
 Worksheets(1).Cells(anzahl + 1, 6) = datei\_tar
 Worksheets(1).Cells(anzahl + 1, 5) = datei\_tar\_gz
 FileCopy pfad & datei\_tar\_gz, pfad & "cop\" & datei\_tar\_gz ' zu bearbeitende Datein nach cop\ kopieren
 s = Shell("gunzip " & pfad & "cop\" & datei\_tar\_gz) 'Dateien entpacken
 Wait (s)
 s = Shell("tar xf " & pfad & "cop\" & datei\_tar)
 Wait (s)
 End If
 datei\_tar\_gz = Dir
Loop Until datei\_tar\_gz = ""
Cells(1, 8) = anzahl 'Anzahl der tar Datein merken, später auch als Übergabe
Kill (pfad & "cop\*.\*")
Columns("E:G").Select
Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'Datein nach Name sortieren, Name ist JJMMDDHHMMSS.tar.gz
Application.StatusBar = ""
End Sub

Public Function FolderExists(ByVal sFolder As String) As Boolean
 Dim fs As Object, MyNewWb As Variant
 Set fs = CreateObject("Scripting.FileSystemObject")
 If fs.FolderExists(sFolder) Then FolderExists = True
End Function

Function Fileexists(fname) As Boolean
 If Dir(fname) "" Then \_
 Fileexists = True \_
 Else Fileexists = False
End Function

Function Wait(ByRef lPid)
 Dim SYNCHRONIZE As Long
 Dim INFINITE As Integer ' Wait forever
 Dim lHnd As Long
 Dim lRet As Long
 If lPid 0 Then
 lHnd = OpenProcess(SYNCHRONIZE, 0, lPid) 'Get a handle to the shelled process.
 If lHnd 0 Then 'If successful, wait for the application to end and close the handle.
 lRet = WaitForSingleObject(lHnd, INFINITE)
 CloseHandle (lHnd)
 End If
 End If
End Function

und das in einem Modul

Option Explicit
Declare Function SetCurrentDirectory \_
 Lib "kernel32" Alias "SetCurrentDirectoryA" \_
 (ByVal lpPathName As String) As Long

Declare Function OpenProcess Lib "kernel32" ( \_
 ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, \_
 ByVal dwProcessId As Long) As Long

Declare Function WaitForSingleObject Lib "kernel32" ( \_
 ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Declare Function CloseHandle Lib "kernel32" ( \_
 ByVal hObject As Long) As Long

Hallo Zodan,

nur noch eine kleine Anmerkung zu deinem Tool, was mir beim ueberfliegen auf die schnelle aufgefallen ist!

Du liest den Pfad ja aus einer Zelle aus!
Was ist wenn dort der Pfad ohne dem \ endet?
Genauso ist es wenn du den Pfad ermittelst. Handelt es sich um ein Root Directory, so fehlt dir am ende immer der !
Wohin das führt weisst du?
Am besten ist es du ermittelst den Pfad mit Hilfe von IIF :wink:

Dann faellt mir noch auf das du die 180KB via >180000 abfragst.
Du weisst aber schon das 1 KB = 1024 Bytes sind?
Hierfür würde ich eine Konstante anlegen!

Private Const MaxLen as long = 180 \*1024

Und nun einfach die Konstante abfragen!
Dann führst du die Shell Anweisung aus. Schaust aber nicht ob sie auch erfolgreich gestartet wurde. Hier wuerde ich vorher überprüfen ob s >0 ist :smile:

Zu der Function FolderExists. Naja da schiesst du mit Spatzen auf Kanonen! Einfach On Error Resume Next hingesetzt. Versuchen ins Directory zu wechseln. Erfolgreich = Directory existiert, nicht erfolgreich -> Directory existiert nicht! Das kannst du mit einem Einzeiler machen :wink:
Bei Bedarf kannst du natuierlich auch wieder in das ursprungsverzeichnis wechseln. Dann sind es aber 3 Zeilen die du schreiben musst :wink:
Alternativ wenn es den Befehl getAttr unter VBA wie unter Vb gibt dann mache dich dem zu nutzen :smile: Ist einfacher und Bedarf nur 1 Zeile :wink:

Zu Der Function FileExists. Ein prüfen mittels Dir ist nicht gut!
Auch hier wuerde ich die Variante mit GetAttr vorziehen

Public Function FileExists(Path As String) As Boolean
On Error Resume Next
 Const NotFile = vbDirectory Or vbVolume
 FileExists = (GetAttr(Path) And NotFile) = 0
On Error GoTo 0
End Function

Zu dem Modul. Die API’s würde ich als public declarieren!

MfG Alex

OT Wieviel Byte sind 1 KB ?

Du weisst aber schon das 1 KB = 1024 Bytes sind?

Hallo Alex,

1 KB sind 10^3 Bytes, also 1000 Bytes !

Keine Ahnung woher du die 1024 hast, noch garnicht nie gehört die Zahl *lüch* :smile:

Okay, 1024 kenn ich schon, aber dies ist kein Scherz, 1 KB sind nunmal eindeutig klar als 1000 Bytes festgelegt.

Gruß
Reinhard

OT Parameter XLGuess bei Sort
Hallo Zondan,

schreib mal bitte

Columns(„E:G“).Select
Selection.Sort Key1:=Range(„E2“), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom

so:

Columns(„E:G“).Sort Key1:=Range(„E2“), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom

Äußerst selten muß man Select benutzen, zu 99% brauch man’s nicht

Jetzt zu dem was ich eigentlich schreiben wollte. Ich traue MS und dem XLGuess nicht. Wie viele andere auch käme ich nicht auf den Gedanken, weil zu Schreibfehleranfällig, einen Sortbefehl manuell zu schreiben.

Wenn ich einen brauche, zeichne ich ihn mir mit dem makrorekorder ruckzuck mal auf mit nem beliebigen Bereich und ändere dann die Codezeile für meine Bedürfnisse ab.

Leider wird dabei, egal ob ich bei der Sortierung angebe „mit Überschrift“ oder „ohne Überschrift“ bei Header ein XLGuess eingetragen. Dies korrigiere ich grundsätzlich immer zu XLNo oder XLYes. Dies ist mir irgendwie sicherer obwohl ich noch niemals irgendwo las daß XLGuess zu fehlern führt, aber ich denke mir, sicher ist sicher, warum unnötiges Risiko eingehen.

Und grad die Aussage:

„übernimmt Microsoft Excel die Entscheidung, ob eine Überschrift vorhanden ist und falls vorhanden, wo sie sich befindet“

macht mich sehr unsicher. Was ist wenn Excel die Überschrift in Zeile 4711 vermutet?

Nachstehend was die Excel2000 Vba-Hilfe zu Sort und dessen Parameter Header sagt, damit auch die VBler nachvollziehen können was ich meine mit XLGuess.
(höhere Excelversionen bieten das gleiche Bild bei Sort, sie haben nur ca. 2 Parameter mehr)

Gruß
Reinhard

Ausdruck.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod)

Header Variant optional. Legt fest, ob die erste Zeile Überschriften enthält oder nicht. Zulässig ist eine der folgenden xlGuess-Konstanten: xlGuess, xlNo oder xlYes. Mit xlYes enthält die erste Zeile Überschriften (die nicht sortiert werden). Mit xlNo gibt es keine Überschriften (der gesamte Bereich wird sortiert). Mit xlGuess übernimmt Microsoft Excel die Entscheidung, ob eine Überschrift vorhanden ist und falls vorhanden, wo sie sich befindet. Die Standardkonstante ist xlNo. Verwenden Sie dieses Argument beim Sortieren von PivotTable-Berichten

Hallo Reinhard,

1 KB sind 10^3 Bytes, also 1000 Bytes !

Falsch! Schau alleine mal. Du kaufst dir eine HD die 250 GB hat.
Lasse dir mal die Bytes anzeigen!
Rechne dazu wiefolgt.

1 GB = 1024 MB
1 MB = 1024 KB
1 KB = 1024 Byte

Rechne nun einmal mit den 1024 und einmal mit 1000. Lasse Dir dann mal die Daten im Explorer anzeigen. Was stellst du fest?

Falls du mir dann immernoch nicht glauben solltest, dann schaue maöl bei Wiki lang :wink:

http://de.wikipedia.org/wiki/Byte

Auch hier wird es erklärt

Mal ein kleiner Auszug aus Wiki :wink:

In der elektronischen Datenverarbeitung nennt sich die kleinstmögliche Speichereinheit Bit. Ein Bit kann zwei mögliche Zustände annehmen, die meist als „Null“ und „Eins“ bezeichnet werden.

Acht solcher Bits werden zu einer Einheit – sozusagen einem Datenpäckchen – zusammengefasst und allgemein Byte genannt. Die offizielle **ISO-konforme** Bezeichnung lautet dagegen Oktett: 1 Oktett = 1 Byte = 8 Bit.

Das Byte ist die Standardeinheit, um Speicherkapazitäten oder Datenmengen zu bezeichnen. Dazu gehören Dateigrößen, die Kapazität von permanenten Speichermedien (Festplatten, CDs, DVDs, Disketten, USB-Massenspeichergeräte usw.) und die Kapazität von vielen flüchtigen Speichern (z. B. Arbeitsspeicher (RAM)). Übertragungsraten (z. B. die maximale Geschwindigkeit eines Internet-Anschlusses) gibt man dagegen üblicherweise auf der Basis von Bits an.

 Verwendung der SI-Präfixe [Bearbeiten]

Die Adressierung von Speichermengen ist im Allgemeinen binär organisiert. Die SI-Präfixe werden daher sehr häufig als Binärpräfixe verwendet (auf Basis von Zweierpotenzen, mit Einheitenfaktor 1024 [2 hoch 10] statt 1000):

 \* 1 Kilobyte (kB) = 1024 Byte, 1 Megabyte (MB) = 1024 Kilobyte = 1024 · 1024 Byte = 1048576 Byte usw.

Diese binäre Verwendung der SI-Präfixe wurde 1986 von der IEEE auch offiziell definiert, jedoch einige Jahre später wieder zurückgenommen (siehe nächster Abschnitt).

In einigen Kontexten werden die SI-Präfixe analog in ihrer Bedeutung im SI-System als Dezimalpräfixe verwendet, was zu nominal größeren Zahlenwerten führt:

 \* 1 Kilobyte (kB) = 1000 Byte, 1 Megabyte (MB) = 1000 Kilobyte = 1000 · 1000 Byte = 1000000
 \* Beispiele: Datenübertragungsraten; Speicherkapazität von Festplatten, DVD-Rohlingen usw.

Bei Datenspeichern ist die Art der Verwendung unterschiedlich, und es kommen auch Mischformen vor (z. B. die Kapazität einer 3,5″–Diskette: 1,44 MB = 1440 KB = 1440 x 1024 Byte). Bei Datenübertragungsraten werden die SI-Präfixe immer dezimal verwendet (Sekunde ist SI-Einheit der Zeit):

 \* 1 Kilobit/Sekunde (kbit/s) = 1000 Bit/Sekunde (bit/s) = 125 Byte/Sekunde (B/s)
 \* 1 Kilobyte/Sekunde (kB/s) = 1000 Byte/Sekunde (B/s)

Manchmal wird auch unterschieden zwischen:

 \* 1 KB = 1024 Byte
 \* 1 kB = 1000 Byte

Beispiel

Eine Festplatte wird mit 640 GB verkauft (dezimale Bedeutung = 640'000'000'000 Bytes realer Speicherplatz). Das sind umgerechnet 596,05 GiB (binäre Bedeutung), also die Menge an Speicherplatz, wie er vom Betriebssystem angezeigt wird.

Zur Umrechnung müssen die Bytes nach dezimaler Bedeutung (640GB)

durch eine Einheit innerhalb der gleichen Größenordnung, hier Giga in der binären Bedeutung geteilt werden (1 GiB),

also: \dfrac{640GB} {1GiB} = \dfrac{640\*1000\*1000\*1000} {1024\*1024\*1024} = \dfrac{640'000'000'000} {1'073'741'824} = 596,05GiB

Es wird also statt 100 % des Speicherplatzes wie Betriebssysteme rechnen (binäre Bedeutung) der um 7,37 % höhere Zahlenwert (dezimale Bedeutung) angegeben, was sich marketingstrategisch besser verkauft, faktisch jedoch nicht falsch ist, sondern nur eine andere Form der Berechnung darstellt, weil es bei der Angabe von Speicherplatz keinen Standard gibt.

 **Vergleich Dezimal- und Binärpräfixe** 

Für höherwertige Präfixe ist die willkürliche Differenzierung hinsichtlich Dezimal- und Binärpräfixen zunehmend mit Schwierigkeiten verbunden, da der Unterschied zwischen Präfixen dezimaler und binärer Bedeutung immer größer wird und daher nicht mehr vernachlässigt werden kann. So beträgt der Unterschied zwischen KB und KiB erst 2,4 %, der von TB und TiB hingegen bereits 10 %.

**Standardisierung** 

Das für die SI-Präfixe zuständige Internationale Büro für Maß und Gewicht (BIPM) **rät von der binären Verwendung der SI-Präfixe ausdrücklich ab** und empfiehlt für die Bezeichnung von Zweierpotenzen die Binärpräfixe gemäß IEC 60027–2.[4]

**In der IT-Praxis und in Forschung und Lehre haben sich die neuen Binärpräfixe bisher nicht durchsetzen können. Die SI-Präfixe werden daher weiterhin als Binärpräfixe** und im Ausnahmefall als Dezimalpräfixe verwendet.

Kapazitätsangaben bei Speichermedien 

Die Hersteller von **Festplatten und DVD-Rohlingen verwenden die SI-Präfixe standardkonform** , um die Kapazität ihrer Produkte anzugeben. Daraus ergibt sich beispielsweise das Problem, dass ein mit „4,7 GB“ gekennzeichneter DVD-Rohling vom Betriebssystem mit dem formal unterschiedlichen Wert von „4,38 GiB“ oder eine mit „500 GB“ spezifizierte Festplatte mit dem scheinbar deutlich kleineren Wert von „466 GiB“ erkannt wird.

Steht alles so auf Wiki *zwinker* Auch habe ich damals in der Berufsschule und auch auf der Weiterbildung gelernt das der Faktor 1024 ist und nicht 1000!

Die 1000 zaehlt, im allgemeinen bei der Umrechnung von Kilo in eine Normale Grösse. Aber halt nicht in der IT TEchnik und da wiederrum bei Daten! Bei einer Umnrechnung von Bits pro Sekunde , die in Kbits angeben sind, da kommen dann wiederrum nur die 1000 ins Spiel :wink:

Keine Ahnung woher du die 1024 hast, noch garnicht nie gehört
die Zahl *lüch* :smile:

Jetzt schon, oder kannst du mir die Aussagen wiederlegen?

Okay, 1024 kenn ich schon, aber dies ist kein Scherz, 1 KB
sind nunmal eindeutig klar als 1000 Bytes festgelegt.

Ist fast richtig, haettest du hinzugefuegt das die nicht in der IT Technik und dort bei Daten Volumen ist!

5 KW sind 5000 Watt, das streite ich garnicht ab :wink:

MfG Alex

Hi,

Äußerst selten muß man Select benutzen, zu 99% brauch man’s
nicht

das ist mir auch aufgefallen, aber ich hab´s wie du einfach mit makrorekorder aufgezeichnet und erst später kontrolliert!
Mir ging´s erstmal drum, dass es läuft!

XLNo oder XLYes.

werd ich dann auch noch ändern!

Danke!

Hi,

Du liest den Pfad ja aus einer Zelle aus!

ja, wie irgendow geschrieben, wird das ganze später in ein fertiges Programm eingebunden, in dem wird dann auch der Pfad eingelesen kontrolliert und mit \ versehen!

Am besten ist es du ermittelst den Pfad mit Hilfe von IIF :wink:

nach IIF werd ich später mal schauen!

Du weisst aber schon das 1 KB = 1024 Bytes sind?
Hierfür würde ich eine Konstante anlegen!

die Grenze ist willkürlich von mir gesetzt worden, den genauen wert muß ich erst noch austesten!

Dann führst du die Shell Anweisung aus. Schaust aber nicht ob
sie auch erfolgreich gestartet wurde. Hier wuerde ich vorher
überprüfen ob s >0 ist :smile:

ok, werd ich mir aus anschauen!

Zu der Function FolderExists. Naja da schiesst du mit Spatzen auf Kanonen!

die hab ich irgendwo aus dem Netz, mit on error resume next hab ich das auch schon gemacht, aber dann kann ich den Fehler ja nicht auswerten! und eventuelle Programmierfehler finden!
(fehlende Dateien sollen später angezeigt werden!

Alternativ wenn es den Befehl getAttr unter VBA wie unter Vb
gibt dann mache dich dem zu nutzen :smile: Ist einfacher und Bedarf
nur 1 Zeile :wink:

auch mal anschau!

Zu Der Function FileExists. Ein prüfen mittels Dir ist nicht
gut!
Auch hier wuerde ich die Variante mit GetAttr vorziehen

ja das dir hat mir auch nicht gefallen, auch nachschau!

Zu dem Modul. Die API’s würde ich als public declarieren!

ok!

Danke!!!