Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1044to1048
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

.xls-Dateien auslesen

.xls-Dateien auslesen
06.02.2009 21:05:48
Horst
Hallo Excel-Freaks!
Folgende Problemstellung:
Ich habe mehrere .xls-Dateien, die jeweils miteinander verknüpft sind und deren Verknüpfungen sich beim Öffnen automatisch aktualisieren. Besteht die Möglichkeit eine Art "Meta.xls" zu gestalten, wo beispielsweise ein VBA-Makro drin läuft, dass die miteinander verknüpften .xls-Dateien aktualisiert, ohne dass man sie jedes Mal manuell öffnen muss?
Ein alternativer Lösungsansatz für mein Problem wäre, dass ein "Meta.xls" jeweils die letzte Zeile von zB. Projekt1.xls, Projekt2.xls und Projekt3.xls ausliest und bei einer anderen .xls-Datei, zB. Ergebnis.xls als jeweils letzte Zeile anfügt. Ich könnte mir vorstellen, dass sowas evtl. mit einem geeigneten VBA-Code umsetzbar wäre. Die Frage ist nur 'wie'? ;-))
Besten Dank im voraus für Eure Anregungen!

29
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: .xls-Dateien auslesen
06.02.2009 21:15:00
Josef
Hallo Horst,
geht beides.
Zum Öffnen der Dateien:
Liegen die Dateien alle im selben Verzeichnis?
Gibt es Unterordner?
Sollen alle Dateien im Verzeichnis geöfnet werden?
Muss beim aktualisieren eine bestimmte reihenfolge eingehalten werden?
Zum Auslesen der Werte:
Sind alle Dateien gleich aufgebaut?
Aus welcher Tabelle soll gelesen werden?
Welche Zelle(n) soll(en) ausgelesen werden?
Wie sollen die Werte dargestellt werden?
Gruß Sepp

AW: .xls-Dateien auslesen
06.02.2009 21:56:00
Horst
Hallo Sepp,
Alle Dateien liegen im selben Verzeichnis (auf einem Netzwerklaufwerk), Unterordner gibt es keine, allerdings unterscheiden sich die Dateien grundlegend in ihrem Aufbau, die eine Datei hat zB. 59 Spalten und aktuell 1500 Zeilen, die andere hat 7 verschieden aufgebaute Registerblätter, von denen jeweils die letzte Zeile (Datum.Wert.Wert.Wert usw.) eines bestimmten Bereiches ausgelesen und in eine dritte Datei geschrieben werden soll. Jeden Tag kommen neue Daten, sodass sich der Datensatz dieser dritten .xls täglich um eine Zeile erweitert.
Die Reihenfolge der Aktualisierung ist egal und hat keinen Einfluss auf das Ergebnis. Optimalerweise sollte beim Aktualisieren keine der Dateien geöffnet werden.
Zusammenfassend gibt es zwei Möglichkeiten:
A.) Eine Meta.xls, welche die Verknüpfungen der anderen drei Dateien aktualisiert, ohne sie zu öffnen. Quasi mittels VBA-Prozedur die manuelle Aktion ersetzt, jede der drei Dateien zu öffnen und F9 zu drücken (Berechnungsmodus: Manuell)
B.) Eine Meta.xls, welche jeweils die letzte Zeile von zwei .xls-Dateien ausliest und an die bestehende Tabelle (159 Spalten) einer dritten .xls anfügt (ebenfalls als letzte Zeile)
Ich denke, aufgrund des unterschiedlichen Aufbaus der drei .xls ist die Variante A jene, die leichter zu generalisieren und damit auch einfacher umzusetzen ist.
Besten Dank für deine Hilfe!
Anzeige
AW: .xls-Dateien auslesen
06.02.2009 22:33:00
Josef
Hallo Horst,
aktualisieren ohne Öffnen geht nicht. Das Öffnen braucht man aber nicht zu sehen.
Probier's mal aus.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub metaActualize()
    Dim objWB As Workbook
    Dim strPath As String, strFile As String
    Dim intIndex As Integer
    
    On Error GoTo ErrExit
    GMS
    
    strPath = "E:\Office\Excel\Forum" 'Pfad anpassen
    
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    
    strFile = Dir(strPath & "*.xls*")
    
    Do While strFile <> ""
        
        If isOpen(strFile) Then
            Set objWB = Workbooks(strFile)
        Else
            Set objWB = Workbooks.Open(strPath & strFile)
        End If
        
        intIndex = intIndex + 1
        
        Application.Calculate
        
        objWB.Close True
        
        strFile = Dir
    Loop
    
    MsgBox "Es wurden " & CStr(intIndex) & " Dateien aktualisiert", vbInformation, "Hinweis"
    
    ErrExit:
    If Err.Number <> 0 Then MsgBox "Feher: " & Err.Number & vbLf & vbLf & _
        Err.Description, vbExclamation, "Fehler"
    GMS True
    Set objWB = Nothing
End Sub

Private Function isOpen(FileName As String) As Boolean
    Dim objWB As Workbook
    
    For Each objWB In Application.Workbooks
        If objWB.Name = FileName Then
            isOpen = True
            Exit For
        End If
    Next
    
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        If Modus And lngCalc = 0 Then lngCalc = -4105
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub

Gruß Sepp

Anzeige
AW: .xls-Dateien auslesen
06.02.2009 23:16:00
Horst
Hallo Sepp,
etwas rechenintensiv, scheint aber grundsätzlich ganz gut zu funktionieren. Optimalerweise sollte die VBA-Prozedur nach der Aktualisierung noch sämtliche Zeilen der Datei "Ergebnis.xls" (= eine der zu aktualisierenden Dateien) bis zum aktuellen Systemdatum (Datum steht in Spalte FF der Ergebnis.xls) in eine neue Textdatei (zB. train.txt) schreiben. Die Zeile (eine einzige), die nach dem aktuellen Systemdatum noch in der Ergebnis.xls steht, sollte in eine test.txt geschrieben werden (wieder in denselben Ordner, wo die .xls drin sind)
Besten Dank für deine Hilfe!
AW: .xls-Dateien auslesen
07.02.2009 00:36:00
Josef
Hallo Horst,
beachte die Kommentare im Code. Da musst du evtl. anpassungen vornehmen.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub metaActualize()
    Dim objWB As Workbook
    Dim strPath As String, strFile As String, strTxtFile As String, strTmp As String, strSep As String
    Dim intIndex As Integer, lngRow As Long, lngLastCol As Long, lngN As Long, lngM As Long
    Dim arrVal As Variant
    
    On Error GoTo ErrExit
    GMS
    
    strPath = "E:\Office\Excel\Forum" 'Pfad anpassen
    
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    
    strFile = Dir(strPath & "*.xls")
    
    Do While strFile <> ""
        
        If isOpen(strFile) Then
            Set objWB = Workbooks(strFile)
        Else
            Set objWB = Workbooks.Open(strPath & strFile)
        End If
        
        intIndex = intIndex + 1
        
        Application.Calculate
        
        objWB.Close True
        
        strFile = Dir
    Loop
    
    'Textdateien
    strSep = ";" 'Trennzeichenfür txt-Dateien
    strFile = strPath & "ergebnis.xls"
    Set objWB = Workbooks.Open(strFile)
    
    With objWB.Sheets(1) 'hier Tabellenname - anpassen!
        lngLastCol = .Columns("GA").Column 'letzte benutzte/auszulesende Spalte - anpassen!
        lngRow = Application.Match(Clng(Date), Columns("FF"), 0)
        
        arrVal = .Range(.Cells(1, 1), .Cells(lngRow, lngLastCol))
        
        strTxtFile = strPath & "train.txt"
        
        Open strTxtFile For Output As #1
        For lngN = 1 To lngRow
            strTmp = ""
            For lngM = 1 To lngLastCol
                strTmp = strTmp & arrVal(lngN, lngM) & strSep
            Next
            strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
            Print #1, strTmp
        Next
        Close #1
        
        arrVal = .Range(.Cells(lngRow + 1, 1), .Cells(lngRow + 1, lngLastCol))
        strTmp = ""
        
        For lngM = 1 To lngLastCol
            strTmp = strTmp & arrVal(1, lngM) & strSep
        Next
        
        strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
        
        strTxtFile = strPath & "test.txt"
        
        Open strTxtFile For Output As #1
        Print #1, strTmp
        Close #1
        
    End With
    
    objWB.Close False
    
    MsgBox "Es wurden " & CStr(intIndex) & " Dateien aktualisiert", vbInformation, "Hinweis"
    
    ErrExit:
    If Err.Number <> 0 Then MsgBox "Feher: " & Err.Number & vbLf & vbLf & _
        Err.Description, vbExclamation, "Fehler"
    GMS True
    Set objWB = Nothing
End Sub

Private Function isOpen(FileName As String) As Boolean
    Dim objWB As Workbook
    
    For Each objWB In Application.Workbooks
        If objWB.Name = FileName Then
            isOpen = True
            Exit For
        End If
    Next
    
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        If Modus And lngCalc = 0 Then lngCalc = -4105
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub

Gruß Sepp

Anzeige
AW: .xls-Dateien auslesen
07.02.2009 11:15:52
Horst
Hallo Sepp,
das Problem mit der VBA-Prozedur ist, dass sie sehr lange benötigt. Ich hab sie vor über 20 Minuten gestartet und ich blicke noch immer auf die Excel-Sanduhr ;-)) Die CPU-Auslastung ist gerademal bei 1%. Kann man irgendwelche Befehle im VBA-Code rausnehmen/ergänzen/vereinfachen, dass die Aktualisierung zügig läuft? Soll im Prinzip nur das Öffnen und den F9-Tastendruck ersetzen sowie die Ergebnis.xls vor und nach dem Systemdatum in zwei .txt's teilen.
Gruß, Horst
AW: .xls-Dateien auslesen
07.02.2009 11:23:00
Josef
Hallo Horst,
genau das macht der Code!
Gruß Sepp

Anzeige
AW: .xls-Dateien auslesen
07.02.2009 12:11:00
Horst
Hallo Horst,
kann man im Code einbauen, dass jede Datei nach dem Aktualisieren gespeichert wird? Evtl. könnte man Zeit sparen, wenn man die Dateien in einer bestimmten Reihenfolge aktualisiert (jeweils immer nur eine) und nach dem Aktualisierungsprozess speichert.
Gruß, Horst
AW: .xls-Dateien auslesen
07.02.2009 12:13:00
Josef
Hallo Horst,
es wird immer nur eine Datei aktualisiert (nacheinander) und die Dateien werden gespeichert.
Gruß Sepp

AW: .xls-Dateien auslesen
07.02.2009 12:51:28
Horst
Hallo Sepp,
Ich hab' grad folgendes probiert: Auch wenn außer der "META.xls" keine andere Datei im angegebenen Verzeichnis ist, kommt beim Starten der VBA-Prozedur die Sanduhr. Wie ist das zu erklären?
Wie könnte man eine bestimmte Aktualisierungs-Reihenfolge im Code berücksichtigen, zB. zuerst Datei A, dann erst B.xls?
Eine Sache hätte ich noch: Die Ergebnis.xls sollte sich täglich Daten von einem FTP-Server und auch von anderen .xls-Dateien holen und speichern. Am nächsten Tag sollte das Ergebnis des Updatevorgangs in eine neue Zeile darunter geschrieben werden usw. Wie lässt es sich umsetzen, dass die letzte Zeile aktualisiert und gespeichert und immer an der Ergebnis.xls angefügt wird, sozusagen ein sich durch die Aktualisierung ständig erweiternder Datensatz entsteht?
Gruß, Horst
Anzeige
AW: .xls-Dateien auslesen
07.02.2009 13:49:45
Josef
Hallo Horst,
warum es bei dir so lange dauert weiß ich nicht.
Beim Testen mit 14 Dateien und einer riesigen "ergebnis.xls", die erstellte "train.txt" hat über 72MB!, dauert es bei mir nur ein paar Sekunden.
Hängt wohl mit deinen Daten zusammen.
Zum Update der "ergebnis.xls" eröffnest du am besten einen neuen Threat, weiles sich ja um ein neues Problem handelt.
Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 13:01:00
Horst
Hallo Sepp!
ich muss dich zum letzten VBA-Skript nochwas fragen: Es funktioniert jetzt soweit gut, allerdings gibt's Probleme beim Erstellen der .txt-Dateien. Ich bekomme die Meldung: "Fehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht." Ich denke, dass ich im VBA-Code noch was anpassen muss? strpath ist korrekt , Tabellenname ist Base, Datumsspalte FF, letzte auszulesende Spalte FG. Anbei der Code:
Option Explicit
Sub metaActualize()
Dim objWB As Workbook
Dim strPath As String, strFile As String, strTxtFile As String, strTmp As String, strSep As String
Dim intIndex As Integer, lngRow As Long, lngLastCol As Long, lngN As Long, lngM As Long
Dim arrVal As Variant
On Error GoTo ErrExit
GMS
strPath = "C:\Dokumente und Einstellungen\User\Desktop\LOADMINM" 'Pfad anpassen
If Right(strPath, 1) "\" Then strPath = strPath & "\"
strFile = Dir(strPath & "*.xls")
Do While strFile ""
If isOpen(strFile) Then
Set objWB = Workbooks(strFile)
Else
Set objWB = Workbooks.Open(strPath & strFile)
End If
intIndex = intIndex + 1
Application.Calculate
objWB.Close True
strFile = Dir
Loop
'Textdateien
strSep = ";" 'Trennzeichenfür txt-Dateien
strFile = strPath & "Ergebnis.xls"
Set objWB = Workbooks.Open(strFile)
With objWB.Base 'hier Tabellenname - anpassen!
lngLastCol = .Columns("FG").Column 'letzte benutzte/auszulesende Spalte - anpassen!
lngRow = Application.Match(CLng(Date), Columns("FF"), 0)
arrVal = .Range(.Cells(1, 1), .Cells(lngRow, lngLastCol))
strTxtFile = strPath & "train.txt"
Open strTxtFile For Output As #1
For lngN = 1 To lngRow
strTmp = ""
For lngM = 1 To lngLastCol
strTmp = strTmp & arrVal(lngN, lngM) & strSep
Next
strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
Print #1, strTmp
Next
Close #1
arrVal = .Range(.Cells(lngRow + 1, 1), .Cells(lngRow + 1, lngLastCol))
strTmp = ""
For lngM = 1 To lngLastCol
strTmp = strTmp & arrVal(1, lngM) & strSep
Next
strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
strTxtFile = strPath & "test.txt"
Open strTxtFile For Output As #1
Print #1, strTmp
Close #1
End With
objWB.Close False
MsgBox "Es wurden " & CStr(intIndex) & " Dateien aktualisiert", vbInformation, "Hinweis"
ErrExit:
If Err.Number 0 Then MsgBox "Feher: " & Err.Number & vbLf & vbLf & _
Err.Description, vbExclamation, "Fehler"
GMS True
Set objWB = Nothing
End Sub



Private Function isOpen(FileName As String) As Boolean
Dim objWB As Workbook
For Each objWB In Application.Workbooks
If objWB.Name = FileName Then
isOpen = True
Exit For
End If
Next
End Function



Public Sub GMS(Optional ByVal Modus As Boolean = False)
Static lngCalc As Long
With Application
.ScreenUpdating = Modus
.EnableEvents = Modus
.DisplayAlerts = Modus
.EnableCancelKey = IIf(Modus, 1, 0)
If Not Modus Then lngCalc = .Calculation
If Modus And lngCalc = 0 Then lngCalc = -4105
.Calculation = IIf(Modus, lngCalc, -4135)
.Cursor = IIf(Modus, -4143, 2)
End With
End Sub


Anzeige
AW: .xls-Dateien auslesen
08.02.2009 13:34:00
Josef
Hallo Horst,
du musst den Tabellennamen so angeben.

With objWB.Sheets("Base") 'hier Tabellenname - anpassen!


Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 14:17:39
Horst
Hallo Sepp,
den Tabellennamen nimmt er jetzt, allerdings bekomme ich die Meldung: "Feher 13: Typen unverträglich"
?
Option Explicit
Sub metaActualize()
Dim objWB As Workbook
Dim strPath As String, strFile As String, strTxtFile As String, strTmp As String, strSep As String
Dim intIndex As Integer, lngRow As Long, lngLastCol As Long, lngN As Long, lngM As Long
Dim arrVal As Variant
On Error GoTo ErrExit
GMS
strPath = "C:\Dokumente und Einstellungen\User\Desktop\LOADMINM" 'Pfad anpassen
If Right(strPath, 1) "\" Then strPath = strPath & "\"
strFile = Dir(strPath & "*.xls")
Do While strFile ""
If isOpen(strFile) Then
Set objWB = Workbooks(strFile)
Else
Set objWB = Workbooks.Open(strPath & strFile)
End If
intIndex = intIndex + 1
Application.Calculate
objWB.Close True
strFile = Dir
Loop
'Textdateien
strSep = ";" 'Trennzeichenfür txt-Dateien
strFile = strPath & "Ergebnis.xls"
Set objWB = Workbooks.Open(strFile)
With objWB.Sheets("Base") 'hier Tabellenname - anpassen!
lngLastCol = .Columns("FF").Column 'letzte benutzte/auszulesende Spalte - anpassen!
lngRow = Application.Match(CLng(Date), Columns("FG"), 0)
arrVal = .Range(.Cells(1, 1), .Cells(lngRow, lngLastCol))
strTxtFile = strPath & "train.txt"
Open strTxtFile For Output As #1
For lngN = 1 To lngRow
strTmp = ""
For lngM = 1 To lngLastCol
strTmp = strTmp & arrVal(lngN, lngM) & strSep
Next
strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
Print #1, strTmp
Next
Close #1
arrVal = .Range(.Cells(lngRow + 1, 1), .Cells(lngRow + 1, lngLastCol))
strTmp = ""
For lngM = 1 To lngLastCol
strTmp = strTmp & arrVal(1, lngM) & strSep
Next
strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
strTxtFile = strPath & "test.txt"
Open strTxtFile For Output As #1
Print #1, strTmp
Close #1
End With
objWB.Close False
MsgBox "Es wurden " & CStr(intIndex) & " Dateien aktualisiert", vbInformation, "Hinweis"
ErrExit:
If Err.Number 0 Then MsgBox "Feher: " & Err.Number & vbLf & vbLf & _
Err.Description, vbExclamation, "Fehler"
GMS True
Set objWB = Nothing
End Sub



Private Function isOpen(FileName As String) As Boolean
Dim objWB As Workbook
For Each objWB In Application.Workbooks
If objWB.Name = FileName Then
isOpen = True
Exit For
End If
Next
End Function



Public Sub GMS(Optional ByVal Modus As Boolean = False)
Static lngCalc As Long
With Application
.ScreenUpdating = Modus
.EnableEvents = Modus
.DisplayAlerts = Modus
.EnableCancelKey = IIf(Modus, 1, 0)
If Not Modus Then lngCalc = .Calculation
If Modus And lngCalc = 0 Then lngCalc = -4105
.Calculation = IIf(Modus, lngCalc, -4135)
.Cursor = IIf(Modus, -4143, 2)
End With
End Sub


Anzeige
AW: .xls-Dateien auslesen
08.02.2009 14:33:00
Josef
Hallo Horst,
da fehlt noch ein Punkt

lngRow = Application.Match(CLng(Date), .Columns("FG"), 0)


Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 14:46:59
Horst
Der Fehler kommt trotzdem noch! Waran könnt's liegen?
AW: .xls-Dateien auslesen
08.02.2009 14:57:00
Josef
Hallo Horst,
ich glaube du hast die Spalten vertauscht.
letzte Spalte FG und du hast FF angegeben.
in der nächsten Zeile genau verkehrt. FG statt FF.
Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 15:36:00
Horst
Hallo Sepp!
also, die "test.txt" enthält jetzt Daten. Allerdings bekomme ich diesen "Feher 13" nur weg, wenn ich bei lngRow = Application.Match(CLng(Date), .Columns("FF")) die ",0" weglasse. Die .txt's sollten zudem Tabulator als Trennzeichen beinhalten (statt ;) Wie gebe ich das an?
Dank' dir!
Anzeige
AW: .xls-Dateien auslesen
08.02.2009 17:49:31
Josef
Hallo Horst,
in welcher Form steht dasDatum in FF?
Die 0 gibt an, das eine genaue Übereinstimmung gefunden werden soll, wenn in deiner Tabelle nicht jedes Datum fortlaufend vorhanden ist, dann lass sie weg, es wird dann der nächstkleibere Wert gefunden.
Das Trennzeichen gibst du mit der Variablen strSep an, ersetze das angegebene ";" duch vbTab (ohne ""), steht auch im Kommentar.
Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 18:23:57
Horst
Eigentlich liegt das Datum in fortlaufender Form vor. Dennoch funktioniert das Skript bei mir nur, wenn ich die 0 weglasse. Ich habe jetzt den Output der .txt's nochmal kontrolliert, es sind keine Datumswerte ausgelassen worden (es sind auch keine doppelt drin). Insofern scheint der VBA Code ganz gut zu funktionieren. Abschließend hätte ich noch gerne gewusst, wie man am Ende des VBA-Codes angibt, dass nach erfolgreicher Aktualisierung ein Programm automatisch gestartet wird , z.B. Notepad.
Wie gestalte man eine Schaltfläche mit dem Text "Prozedur starten", die bei Anklicken das Makro startet?
Für das letzte Problem, die automatische Erweiterung einer Tabelle um eine von einer externen .xls eingelesenen Zeile, eröffne ich jetzt einen neuen Beitrag. Würde mich freuen, wenn du mir abschließend auch da noch den ein oder anderen Tipp geben könntest.
Besten Dank für alles!
Horst
Anzeige
AW: .xls-Dateien auslesen
08.02.2009 18:24:05
Horst
Eigentlich liegt das Datum in fortlaufender Form vor. Dennoch funktioniert das Skript bei mir nur, wenn ich die 0 weglasse. Ich habe jetzt den Output der .txt's nochmal kontrolliert, es sind keine Datumswerte ausgelassen worden (es sind auch keine doppelt drin). Insofern scheint der VBA Code ganz gut zu funktionieren. Abschließend hätte ich noch gerne gewusst, wie man am Ende des VBA-Codes angibt, dass nach erfolgreicher Aktualisierung ein Programm automatisch gestartet wird , z.B. Notepad.
Wie gestalte man eine Schaltfläche mit dem Text "Prozedur starten", die bei Anklicken das Makro startet?
Für das letzte Problem, die automatische Erweiterung einer Tabelle um eine von einer externen .xls eingelesenen Zeile, eröffne ich jetzt einen neuen Beitrag. Würde mich freuen, wenn du mir abschließend auch da noch den ein oder anderen Tipp geben könntest.
Besten Dank für alles!
Horst
AW: .xls-Dateien auslesen
08.02.2009 20:21:44
Josef
Hallo Horst,
auch das geht, habe eine Abfrage eingebaut.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long

Sub metaActualize()
    Dim objWB As Workbook
    Dim strPath As String, strFile As String, strTxtFile As String, strTmp As String, strSep As String
    Dim intIndex As Integer, lngRow As Long, lngLastCol As Long, lngN As Long, lngM As Long
    Dim arrVal As Variant
    
    On Error GoTo ErrExit
    GMS
    
    strPath = "E:\Office\Excel\Forum" 'Pfad anpassen
    
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    
    strFile = Dir(strPath & "*.xls")
    
    Do While strFile <> ""
        
        If isOpen(strFile) Then
            Set objWB = Workbooks(strFile)
        Else
            Set objWB = Workbooks.Open(strPath & strFile)
        End If
        
        intIndex = intIndex + 1
        
        Application.Calculate
        
        objWB.Close True
        
        strFile = Dir
    Loop
    
    'Textdateien
    strSep = vbTab 'Trennzeichenfür txt-Dateien
    strFile = strPath & "ergebnis.xls"
    Set objWB = Workbooks.Open(strFile)
    
    With objWB.Sheets("Base") 'hier Tabellenname - anpassen!
        lngLastCol = .Columns("FG").Column 'letzte benutzte/auszulesende Spalte - anpassen!
        lngRow = Application.Match(Clng(Date), .Columns("FF"))
        
        arrVal = .Range(.Cells(1, 1), .Cells(lngRow, lngLastCol))
        
        strTxtFile = strPath & "train.txt"
        
        Open strTxtFile For Output As #1
        For lngN = 1 To lngRow
            strTmp = ""
            For lngM = 1 To lngLastCol
                strTmp = strTmp & arrVal(lngN, lngM) & strSep
            Next
            strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
            Print #1, strTmp
        Next
        Close #1
        
        arrVal = .Range(.Cells(lngRow + 1, 1), .Cells(lngRow + 1, lngLastCol))
        strTmp = ""
        
        For lngM = 1 To lngLastCol
            strTmp = strTmp & arrVal(1, lngM) & strSep
        Next
        
        strTmp = Left(strTmp, Len(strTmp) - Len(strSep))
        
        strTxtFile = strPath & "test.txt"
        
        Open strTxtFile For Output As #1
        Print #1, strTmp
        Close #1
        
    End With
    
    objWB.Close False
    
    MsgBox "Es wurden " & CStr(intIndex) & " Dateien aktualisiert", vbInformation, "Hinweis"
    
    If MsgBox("Soll die Datei" & vbLf & vbLf & vbTab & strTxtFile & vbLf & vbLf & _
        "geöffnet werden?", vbYesNo, "Datei öffnen") = vbYes Then
        
        ShellExecute 0, "Open", strTxtFile, "", "", 1
        
    End If
    ErrExit:
    If Err.Number <> 0 Then MsgBox "Feher: " & Err.Number & vbLf & vbLf & _
        Err.Description, vbExclamation, "Fehler"
    GMS True
    Set objWB = Nothing
End Sub

Private Function isOpen(FileName As String) As Boolean
    Dim objWB As Workbook
    
    For Each objWB In Application.Workbooks
        If objWB.Name = FileName Then
            isOpen = True
            Exit For
        End If
    Next
    
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        If Modus And lngCalc = 0 Then lngCalc = -4105
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub

Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 20:59:00
Horst
Hallo Sepp,
funktioniert perfekt! Was das Öffnen eines Programms betrifft, hatte ich einfach vor, nach erfolgreichem Ausführen der VBA-Prozedur SPSS (ein Statistikprogramm) zu starten, wo die erzeugten Textdateien weiterverarbeitet werden. Also lediglich am Ende des Codes einen Befehl einzubauen, der mir das Anklicken des Programm-Icons ersetzt (so wie wenn ich manuell unter Start/Programme/ ein Programm startet würde ...) Wie mache ich das?
Zudem hätte ich gerne, dass das Makro beim Öffnen automatisch ausgeführt wird bzw. über Anklicken einer User Form startet.
Besten Dank, Horst
AW: .xls-Dateien auslesen
08.02.2009 21:15:00
Josef
Hallo Horst,
setze statt dem Code mit der MsgBox diese Zeile ein.
Shell "C:\DeinPfad\DeinProgramm.exe " & strTxtFile, vbNormalFocus

Sollte so funktionieren, ausser dein Programm verlangt eine andere Übergabe des Dateinamens.
Zum Starten des Makros:
Füge eine Schaltfläche aus der Formular-Symbolleiste ein, Rechtsklick > Makro zuweisen.
Gruß Sepp

AW: .xls-Dateien auslesen
08.02.2009 22:27:00
Horst
Hallo Sepp,
Die Sache mit
Shell "C:\DeinPfad\DeinProgramm.exe " & strTxtFile, vbNormalFocus
funktioniert sehr gut, wenn es sich um eine .exe Datei handelt. Wie muss ich den Code ändern, damit er auch mit einer Verknüpfung funktioniert? Es soll sich eine mit einer .exe Datei verknüpfte Datei öffnen (Vorteil: in der verknüpften Datei sind schon einige Einstellungen gespeichert). In diesem Fall sieht das so aus:
Shell "C:\Dokumente und Einstellungen\User\Desktop\database_org.sav"
Der Befehl soll nur den Doppelklick auf die Verknüpfung ersetzen.
Besten Dank, Horst
AW: .xls-Dateien auslesen
08.02.2009 23:55:00
Josef
Hallo Horst,
probier es doch genau so aus.
Gruß Sepp

AW: .xls-Dateien auslesen
09.02.2009 13:22:21
Horst
Hallo Sepp,
so wie's da steht funktioniert's zwar nicht, ich hab aber die Verknüpfung an eine batch-Datei gekoppelt und jetzt läuft es einwandfrei! Nochmals Danke!
Einen neuen Beitrag hab' ich übrigens unter "externe .xls einlesen" laufen. Bisher gibt es noch keine Meldungen dazu. Womöglich ist es den Leuten zu kompliziert ;-)) Sofern es dein Zeitbudget erlaubt, wäre es toll, wenn du mir auch hier noch ein paar Tipps geben könntest.
Gruß, Horst
AW: .xls-Dateien auslesen
08.02.2009 15:24:00
Horst
Hallo Sepp,
hab' grad folgendes ausprobiert:
wenn ich statt:
lngRow = Application.Match(CLng(Date), .Columns("FG"), 0)
lngRow = Application.Match(CLng(Date), .Columns("FG"))
angebe, dann werden die .txt's erstellt. Allerdings sind dann keine Werte in der test.txt enthalten. Welche Funktion hat die ",0" und wie kann ich Tabulator als Trennzeichen definieren?
AW: .xls-Dateien auslesen
08.02.2009 15:25:06
Horst
Hallo Sepp,
hab' grad folgendes ausprobiert:
wenn ich statt:
lngRow = Application.Match(CLng(Date), .Columns("FG"), 0)
lngRow = Application.Match(CLng(Date), .Columns("FG"))
angebe, dann werden die .txt's erstellt. Allerdings sind dann keine Werte in der test.txt enthalten. Welche Funktion hat die ",0" und wie kann ich Tabulator als Trennzeichen definieren?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige