MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 13.09.2017, 12:58   #1
Harlad123
Neuer Benutzer
Neuer Benutzer
Standard VBA - Eigene Funktion mit FileSystemObject als Parameter

Guten Tag zusammen,

ich habe ein Problem beim erstellen einer eigenen Funktion in VBA. Der Einfangsparameter meiner eigenen Funktion is vom Typ eine Datei. Ich bekomme nicht raus, wie ich im Konstruktor der Funktion den Typ des Eingangsparameters richtig angebe.

Der Ausschnitt aus dem Code wie er aktuell ist:
Code:

For monatstag_int = 1 To 31

    Dim myObj As Object
    Set myObj = CreateObject("Scripting.FileSystemObject")
    Dim verzeichnisRohdaten As Object
    Set verzeichnisRohdaten = myObj.GetFolder(verzeichnisDerRohdaten)
    
    For Each file In verzeichnisRohdaten.Files
        Dim dateiname As String
        dateiname = file.Name
        Dim tagesKennung_string As String
        tagesKennung_string = Mid(dateiname, 7, 2)
        Dim tagesKennung_int As Integer
        tagesKennung_int = CInt(tagesKennung_string)
        Dim tagesKennung_stringOhneNull As Integer
        tagesKennung_stringOhneNull = CStr(tagesKennung_int)

        If tagesKennung_int = monatstag_int Then
            ' Öffnen der aktuellen Rohdaten-Datei
            Workbooks.Open (file)
            ' Markieren und löschen der gesamten Spalte E
            ' Spalte E ist eine leere Spalte die nicht gebraucht wird
            Columns("E:E").Select
            Selection.Delete Shift:=xlToLeft
            ' Markieren des gesamten Zellenbereiches mit Daten
            ' Der Datenbereich ist von Zelle A2 bis Zelle E2017
            Dim zellenbereich As Range
            Set zellenbereich = Worksheets(1).Range("A:E")
            zellenbereich.Select
            [...]

            End If
        
              
    Next

Next monatstag_int
Nun finde ich die Anweisung in der If-Schleife unpraktisch lang und das Programm wird dadurch unübersichtlich. Daher möchte ich den Teil aus der If-Schleife in eine eigene Funktion schreiben damit ich dann in der If-Schleife nur die Funktion aufrufen muss.

Das Problem dabei ist nun, wie man im Konstruktor der Funktion den Eingangsparameter als File deklariert.

Mein Versuch:
Code:

Sub blabla ()
For monatstag_int = 1 To 31

    Dim myObj As Object
    Set myObj = CreateObject("Scripting.FileSystemObject")
    Dim verzeichnisRohdaten As Object
    Set verzeichnisRohdaten = myObj.GetFolder(verzeichnisDerRohdaten)
    
    For Each file In verzeichnisRohdaten.Files
        Dim dateiname As String
        dateiname = file.Name
        Dim tagesKennung_string As String
        tagesKennung_string = Mid(dateiname, 7, 2)
        Dim tagesKennung_int As Integer
        tagesKennung_int = CInt(tagesKennung_string)
        Dim tagesKennung_stringOhneNull As Integer
        tagesKennung_stringOhneNull = CStr(tagesKennung_int)

        If tagesKennung_int = monatstag_int Then
            Durchlauf(datei = file)
        End If
        
    Next

Next monatstag_int

End Sub


Function Durchlauf(datei As Object)

            ' Öffnen der aktuellen Rohdaten-Datei
            Workbooks.Open (file)
            ' Markieren und löschen der gesamten Spalte E
            ' Spalte E ist eine leere Spalte die nicht gebraucht wird
            Columns("E:E").Select
            Selection.Delete Shift:=xlToLeft
            ' Markieren des gesamten Zellenbereiches mit Daten
            ' Der Datenbereich ist von Zelle A2 bis Zelle E2017
            Dim zellenbereich As Range
            Set zellenbereich = Worksheets(1).Range("A:E")
            zellenbereich.Select
            [...]

End Function

Wäre super wenn jemand helfen kann. Habe schon lange gesucht ob irgendwo erklärt ist wie man ein File als Eingangsparameter definieren kann.

Danke schonmal
Harlad123 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.09.2017, 13:18   #2
EarlFred
MOF Guru
MOF Guru
Standard

Hallo,

Zitat:

Nun finde ich die Anweisung in der If-Schleife unpraktisch lang und das Programm wird dadurch unübersichtlich.

das liegt vor allem daran, dass Du die Variablen da deklariert hast, wo sie dir beim Schreiben des Programms grad in den Sinn gekommen sind. Zudem hast Du viel zu viele Variable, die nur Zwischenschritte aufnehmen und danach sofort ihren Sinn verlieren.

Du kannst Deine Anweisungen auch sinnvoll zusammenlegen.

So könnte das gleiche Skelett aussehen:
Code:

Option Explicit
Sub test()

Dim objFSO As Object
Dim fFile As Object


Set objFSO = CreateObject("Scripting.FileSystemObject")

'For monatstag_int = 1 To 31 ''Sicher??

  For Each fFile In objFSO.GetFolder(verzeichnisDerRohdaten).Files
    tagesKennung_stringOhneNull = Format(Mid(fFile.Name, 7, 2), "0")

        If tagesKennung_int = monatstag_int Then
            With Workbooks.Open(fFile.Name)
                .Worksheets(.....).Columns("E:E").Delete Shift:=xlToLeft
                '.Worksheets(1).Range("A:E")....
                '[...]

            End With
        End If
    
    Next fFile

'Next monatstag_int

End Sub
Du lässt zuerst eine Schleife von 1 bis 31 laufen und prüfst danach alle Dateien im Ordner. also ebenfalls 31 Mal. Und wenn die Zahl beim ersten mal nicht passt, dann vielleicht beim 25. Mal. Das erscheint nicht sinnvoll.

Ich würde versuchen, die Dateien nur einmal zu prüfen und dann entscheiden, was zu tun ist. Nach welchen Regeln das passieren muss, weißt allerdings nur Du.

Wenn Du Teile in andere Subs auslagern willst, würde ich auch nicht das FileSystemObject übergeben, sondern in diesem Fall den Dateinamen:
Code:

Option Explicit
Sub test()

Dim objFSO As Object
Dim fFile As Object


Set objFSO = CreateObject("Scripting.FileSystemObject")

'For monatstag_int = 1 To 31 ''Sicher??

  For Each fFile In objFSO.GetFolder(verzeichnisDerRohdaten).Files
    tagesKennung_stringOhneNull = Format(Mid(fFile.Name, 7, 2), "0")

        If tagesKennung_int = monatstag_int Then
          Call tuWas(fFile.Name)
        End If
    
    Next fFile

'Next monatstag_int

End Sub


Sub tuWas(strFileName As String)
  With Workbooks.Open(strFileName)
    .Worksheets(1).Columns("E:E").Delete Shift:=xlToLeft
    'Worksheets(1).Range("A:E")....
    '[...]

  End With
End Sub
Grüße
EarlFred

Geändert von EarlFred (13.09.2017 um 13:49 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.