VBA Tipp: Datei-Download und -Upload mit Progressbar (FTP)

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

  • Ich möchte eine Datei von einem Internet-FTP-Server herunterladen bzw. auf einen Internet-FTP-Server hinaufladen.
  • Der Fortschritt des Downloads bzw. Uploads soll laufend über eine Progressbar (Fortschrittsanzeige) angezeigt werden.
  • Die im untenstehenden Code verwendete Progressbar kann hier im DBWiki heruntergeladen werden:
    Datei:Progressbars.zip
  • Der Zugang zu dem Internet-Verzeichnis erfolgt über das FTP-Protokoll.
  • Für den FTP-Zugang zum Server ist ein Benutzername und ein Passwort erforderlich.

Lösung

Das geht mit den folgenden API-Funktionen und VBA-Funktionen, die in einem globalen Modul hinterlegt werden.

'Quelle: http://www.dbwiki.net/
 
Option Explicit
 
 
'Konstanten
 
'für InternetReadFile
'MAX_BUFFER auf die aktuelle Internetgeschwindigkeit setzen, z.B. 3.000 kbit/s
Private Const MAX_BUFFER As Long = 3000
 
'für FtpFindFirstFile
'für Private Type WIN32_FIND_DATA
Private Const MAX_PATH  As Long = 260
 
'für Private Type WIN32_FIND_DATA
Private Type FILETIME
   dwLowDateTime    As Long
   dwHighDateTime   As Long
End Type
 
'für FtpFindFirstFile,
'für InternetFindNextFile
Private Type WIN32_FIND_DATA
   dwFileAttributes As Long
   ftCreationTime   As FILETIME
   ftLastAccessTime As FILETIME
   ftLastWriteTime  As FILETIME
   nFileSizeHigh    As Long
   nFileSizeLow     As Long
   dwReserved0      As Long
   dwReserved1      As Long
   cFileName        As String * MAX_PATH
   cAlternate       As String * 14
End Type
 
'InternetOpen (Internet öffnen)
Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0
Private Const INTERNET_OPEN_TYPE_DIRECT    As Long = 1
Private Declare Function InternetOpen Lib "wininet.dll" _
   Alias "InternetOpenA" ( _
   ByVal lpszAgent As String, _
   ByVal dwAccessType As Long, _
   ByVal lpszProxyName As String, _
   ByVal lpszProxyBypass As String, _
   ByVal dwFlags As Long) As Long
 
'InternetConnect (Verbindung zum FTP-Server aufbauen)
Private Const INTERNET_DEFAULT_FTP_PORT    As Long = 21         'Standardwert für FTP-Server (nServerPort)
Private Const INTERNET_INVALID_PORT_NUMBER As Long = 0          'alternativ für nServerPort
Private Const INTERNET_SERVICE_FTP         As Long = 1          'lService
Private Const INTERNET_FLAG_PASSIVE        As Long = &H8000000  'lFlags
Private Declare Function InternetConnect Lib "wininet.dll" _
   Alias "InternetConnectA" ( _
   ByVal hOpen As Long, _
   ByVal sServerName As String, _
   ByVal nServerPort As Integer, _
   ByVal sUsername As String, _
   ByVal sPassword As String, _
   ByVal lService As Long, _
   ByVal lFlags As Long, _
   ByVal lContext As Long) As Long
 
'FtpGetCurrentDirectory (FTP-Hauptverzeichnis holen)
Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" _
   Alias "FtpGetCurrentDirectoryA" ( _
   ByVal hConnect As Long, _
   ByVal lpszCurrentDirectory As String, _
   ByRef lpdwCurrentDirectory As Long) As Long
 
'FtpSetCurrentDirectory (zum FTP-Unterverzeichnis wechseln)
Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" _
   Alias "FtpSetCurrentDirectoryA" ( _
   ByVal hConnect As Long, _
   ByVal lpszDirectory As String) As Long
 
'FtpFindFirstFile (erste Datei im FTP-Unterverzeichnis finden)
Private Declare Function FtpFindFirstFile Lib "wininet.dll" _
   Alias "FtpFindFirstFileA" ( _
   ByVal hConnect As Long, _
   ByVal lpszSearchFile As String, _
   ByRef lpFindFileData As WIN32_FIND_DATA, _
   ByVal dwFlags As Long, _
   ByVal dwContent As Long) As Long
 
'InternetFindNextFile (nächste Datei im FTP-Unterverzeichnis finden)
Private Declare Function InternetFindNextFile Lib "wininet.dll" _
   Alias "InternetFindNextFileA" ( _
   ByVal hFind As Long, _
   ByRef lpvFindData As WIN32_FIND_DATA) As Long
 
'FtpOpenFile (Internet-Datei öffnen, schreibender oder lesender Zugriff)
Private Const GENERIC_WRITE             As Long = &H40000000
Private Const GENERIC_READ              As Long = &H80000000
Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = &H0  'Setzt FTP_TRANSFER_TYPE_BINARY als Standard
Private Const FTP_TRANSFER_TYPE_ASCII   As Long = &H1  'ASCI-Übertragung
Private Const FTP_TRANSFER_TYPE_BINARY  As Long = &H2  'Binäre Übertragung
Private Declare Function FtpOpenFile Lib "wininet.dll" _
   Alias "FtpOpenFileA" ( _
   ByVal hConnect As Long, _
   ByVal lpszFileName As String, _
   ByVal dwAccess As Long, _
   ByVal dwFlags As Long, _
   ByRef dwContext As Long) As Long
 
'InternetReadFile (Inhalt einer Internet-Datei lesen)
Private Declare Function InternetReadFile Lib "wininet.dll" ( _
   ByVal hFile As Long, _
   ByVal lpBuffer As String, _
   ByVal dwNumberOfBytesToRead As Long, _
   ByRef lpdwNumberOfBytesRead As Long) As Long
 
'InternetWriteFile (in Internet-Datei schreiben)
Private Declare Function InternetWriteFile Lib "wininet.dll" ( _
   ByVal hFile As Long, _
   ByRef lpBuffer As Byte, _
   ByVal dwNumberOfBytesToWrite As Long, _
   ByRef lpdwNumberOfBytesWritten As Long) As Long
 
'FtpDeleteFile (Internet-Datei löschen)
Private Declare Function FtpDeleteFile Lib "wininet.dll" _
   Alias "FtpDeleteFileA" ( _
   ByVal hFtpSession As Long, _
   ByVal lpszFileName As String) As Long
 
'InternetCloseHandle (Internethandle schließen)
Private Declare Function InternetCloseHandle Lib "wininet.dll" ( _
   ByVal hInet As Long) As Long
 
 
'Variablen für die Progressbar
Public CancelProgBar As Boolean
Public frmPB1        As Access.Form
Public frmPB2        As Access.Form
 
'Variablen für die Internetverbindung
Private hOpen        As Long
Private hConnection  As Long
Private hFile        As Long
Private hFind        As Long
 
 
Public Function FTPLogin(Server As String, _
                         Benutzer As String, _
                         Passwort As String, _
                         Optional RelativerOrdnerpfad As String, _
                         Optional OhneFehlerMeldung As Boolean) As Long
 
   '----------------------------------------------------------------------------------
 
   'Internetverbindung herstellen
 
   'Statusmeldung, wenn die Progressbar1 geöffnet ist
   Call Progressbar1(, "Internetverbindung wird hergestellt ...")
 
   hOpen = InternetOpen("MeineVerbindung", INTERNET_OPEN_TYPE_PRECONFIG, _
                        vbNullString, vbNullString, 0)
 
   If hOpen = 0 Then
      'Fehlermeldung
      If OhneFehlerMeldung = False Then
         MsgBox "Fehler beim Aufbau der Internetverbindung!"
      End If
      Exit Function
   End If
   '----------------------------------------------------------------------------------
 
   'Verbindung zum FTP-Server
 
   'Statusmeldung, wenn die Progressbar1 geöffnet ist
   Call Progressbar1(, "Verbindung zum FTP-Server wird hergestellt ...")
 
   hConnection = InternetConnect(hOpen, Server, INTERNET_DEFAULT_FTP_PORT, _
                                 Benutzer, Passwort, INTERNET_SERVICE_FTP, _
                                 INTERNET_FLAG_PASSIVE, 0)
 
   'wenn Verbindung zum FTP-Server nicht herstellbar
   If hConnection = 0 Then
      'Fehlermeldung
      If OhneFehlerMeldung = False Then
         MsgBox "Es konnte keine Verbindung zum FTP-Server hergestellt werden!" & _
                vbCrLf & vbCrLf & "Mögliche Ursache:" & _
                vbCrLf & "Es besteht keine Internetverbindung."
      End If
      Exit Function
   End If
   '----------------------------------------------------------------------------------
 
   'holt das aktuelle Verzeichnis
 
   Dim strOrgPfad As String
   Dim lngRoot    As Long
 
   'einen Puffer erzeugen, um das Originalverzeichnis zu speichern
   strOrgPfad = String(MAX_PATH, 0)
 
   lngRoot = FtpGetCurrentDirectory(hConnection, strOrgPfad, Len(strOrgPfad))
 
   'wenn Verbindung zum Rootverzeichnis nicht herstellbar
   If lngRoot = 0 Then
      'Fehlermeldung
      If OhneFehlerMeldung = False Then
         MsgBox "Fehler beim Zugriff auf das Hauptverzeichnis !"
      End If
      Exit Function
   End If
   '----------------------------------------------------------------------------------
 
   'setzt das aktuelle Verzeichnis auf den Unterordner
 
   Dim strOrdnerPfad       As String
   Dim lngUnterverzeichnis As Long
 
   'ggf. Slash am Ende hinzufügen, sonst Fehler
   'Am Anfang ist egal, ob Slash oder nicht
   If Right$(RelativerOrdnerpfad, 1) = "/" Then
      strOrdnerPfad = RelativerOrdnerpfad
   Else
      strOrdnerPfad = RelativerOrdnerpfad & "/"
   End If
 
   lngUnterverzeichnis = FtpSetCurrentDirectory(hConnection, strOrdnerPfad)
 
   'wenn Verbindung zum Unterverzeichnis nicht herstellbar
   If lngUnterverzeichnis = 0 Then
      'Fehlermeldung
      If OhneFehlerMeldung = False Then
         MsgBox "Fehler beim Zugriff auf das Unterverzeichnis!"
      End If
      Exit Function
   End If
   '----------------------------------------------------------------------------------
 
   'Rückgabewert
   FTPLogin = lngUnterverzeichnis
 
End Function
 
 
Private Function FTPDateiOeffnen(ByVal RemoteDateiname As String, _
                                 ByVal Modus As Long)
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   'Datei auf dem FTP-Server öffnen
   hFile = FtpOpenFile(hConnection, RemoteDateiname, _
                       Modus, FTP_TRANSFER_TYPE_UNKNOWN, 0)
 
   'Wenn die Datei nicht geöffnet werden kann
   If hFile = 0 Then
      'Fehlermeldung
      MsgBox "Fehler beim Zugriff auf die Internet-Datei!" & _
             vbCrLf & vbCrLf & "Mögliche Ursache:" & _
             vbCrLf & "Der Pfad zur Internetdatei ist ungültig."
      Exit Function
   End If
 
   FTPDateiOeffnen = hFile
 
End Function
 
 
Public Function FTPDownload(RemoteDateiname As String, _
                            PfadLokaleDatei As String, _
                            Optional Statusmeldung As String) As Boolean
 
   Dim lngDateiGroesse      As Long
   Dim strBuffer          As String
   Dim ByteAnz            As Long
   Dim strPfadRemoteDatei As String
   Dim strDateiinhalt     As String
   Dim pData              As WIN32_FIND_DATA
   Dim lngread            As Long
   Dim d                  As Integer
 
   On Error GoTo Err_FTPDownload
 
   'Dateigröße ermitteln
 
   'Einen Puffer erzeugen
   pData.cFileName = String$(MAX_PATH, 0)
 
   'Die Datei suchen
   hFind = FtpFindFirstFile(hConnection, RemoteDateiname, pData, 0, 0)
 
   'Dateigröße speichern
   lngDateiGroesse = pData.nFileSizeLow
 
   'wenn hFind geöffnet, schließen
   If hFind Then InternetCloseHandle hFind
 
   'wenn Dateigröße = 0
   If lngDateiGroesse = 0 Then
      'Fehlermeldung
      MsgBox "Die Internetdatei existiert nicht!"
      Exit Function
   End If
   '------------------------------------------------------------------------------
 
   'Datei auf dem FTP-Server öffnen
   If FTPDateiOeffnen(RemoteDateiname, GENERIC_READ) = 0 Then Exit Function
   '------------------------------------------------------------------------------
 
   'Downloadvorgang
 
   'Statusmeldung, wenn die Progressbar1 geöffnet ist
   If Len(Statusmeldung) = 0 Then
      Call Progressbar1(, RemoteDateiname & " wird heruntergeladen ...")
   Else
      Call Progressbar1(, Statusmeldung)
   End If
 
   'strBuffer mit Leerzeichen vorbelegen
   strBuffer = Space$(MAX_BUFFER * 8)
 
   'Download, solange Progressbar1 nicht geschlossen wird
   Do Until CancelProgBar
 
      'strBuffer enthält die aktuell gelesenen Daten aus der Datei
      'Len(strBuffer) = Größe des aktuellen Puffers
      'ByteAnz = Anzahl der aktuell in den Puffer eingelesenen Bytes(=Zeichen)
      lngread = InternetReadFile(hFile, strBuffer, Len(strBuffer), ByteAnz)
 
      'Der Download ist beendet, wenn ByteAnz an dieser Stelle 0 ist
      If ByteAnz = 0 Then Exit Do
 
      If lngread = 0 Then
         'Fehlermeldung
         MsgBox "Fehler beim Lesen der Internet-Datei!"
         Exit Do
      End If
 
      'Dateiinhalt = Bufferinhalt in string einlesen
      strDateiinhalt = strDateiinhalt & Left$(strBuffer, ByteAnz)
 
      'Bedienung der Progressbar
      Call Progressbar1(Len(strDateiinhalt) / lngDateiGroesse)
      frmPB1.Repaint
      DoEvents
 
   Loop
   '------------------------------------------------------------------------------
 
   'Heruntergeladene Daten in lokaler Datei speichern
 
   If CancelProgBar Then
      MsgBox "Der Download wurde abgebrochen!"
   Else
 
      'wenn Lesen erfolgreich, und der Benutzer nicht abgebrochen hat
      If lngread Then
 
         'Statusmeldung
         Call Progressbar1(, "Datei wird gespeichert ...")
 
         'lokale Datei löschen, falls vorhanden
         On Error Resume Next
         Kill PfadLokaleDatei
         On Error GoTo 0
 
         'in lokale Datei schreiben
         d = FreeFile()
         Open PfadLokaleDatei For Output As d
         Print #d, strDateiinhalt;
         Close d
 
         'Rückgabewert der Funktion
         FTPDownload = True
 
      End If
 
   End If
 
Exit_FTPDownload:
 
   'wenn hFile geöffnet, schließen
   If hFile Then InternetCloseHandle hFile
   Exit Function
 
Err_FTPDownload:
 
   'Fehlermeldung
   MsgBox "Laufzeitfehler '" & Err.Number & "':" & vbCrLf & vbLf & Err.Description
   Resume Exit_FTPDownload
 
End Function
 
 
Public Function FTPUpload(PfadLokaleDatei As String, _
                          RemoteDateiname As String, _
                          Optional Statusmeldung As String) As Boolean
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Dim arrDaten()        As Byte
   Dim lngGeschrieben    As Long
   Dim lngDateiGroesse   As Long
   Dim ub                As Long
   Dim UebertrageneBytes As Long
   Dim lngZuSchreiben    As Long
   Dim lngWrite          As Long
   Dim lngBlockGroesse   As Long
   Dim fNum              As Integer
 
   On Error GoTo Err_FTPUpload
 
   'Datei auf dem FTP-Server öffnen
   If FTPDateiOeffnen(RemoteDateiname, GENERIC_WRITE) = 0 Then Exit Function
   '------------------------------------------------------------------------------
 
   'Uploadvorgang
 
   'Statusmeldung
   If Len(Statusmeldung) = 0 Then
      Call Progressbar1(, RemoteDateiname & " wird hinaufgeladen ...")
   Else
      Call Progressbar1(, Statusmeldung)
   End If
 
 
   fNum = FreeFile()
   'Lokale Quelldatei öffnen
   Open PfadLokaleDatei For Binary Access Read As fNum
 
   'LOF = Größe einer geöffneten Datei in Bytes
   lngDateiGroesse = LOF(fNum)
 
   'Dateiinhalt in Array einlesen
   ReDim arrDaten(0 To lngDateiGroesse) As Byte
   Get #fNum, , arrDaten()
 
   'UebertrageneBytes enthält die Anzahl der bereits geschriebenen Bytes
   UebertrageneBytes = 0
 
   'Größe des Arrays, Anzahl der Bytes
   ub = UBound(arrDaten)
 
   lngBlockGroesse = MAX_BUFFER * 2
 
   'Upload, solange Progressbar1 nicht geschlossen wird
   Do Until CancelProgBar
 
      If UebertrageneBytes + lngBlockGroesse <= ub Then
         'Volle Blockgröße schreiben
         lngZuSchreiben = lngBlockGroesse
      Else
         'Rest-Bytes am Schluß, die kleiner als lngBlockGroesse sind
         lngZuSchreiben = (ub - UebertrageneBytes)
      End If
 
      'Der Upload ist beendet, wenn lngZuSchreiben an dieser Stelle 0 ist
      If lngZuSchreiben = 0 Then Exit Do
 
      'in Internetdatei schreiben
      'lngZuSchreiben: Anzahl der zu schreibenden Bytes
      'lngGeschrieben: Anzahl der geschriebenen Bytes
      lngWrite = InternetWriteFile(hFile, arrDaten(UebertrageneBytes), _
                                   lngZuSchreiben, lngGeschrieben)
 
      If lngWrite = 0 Then
         'Fehlermeldung
         MsgBox "Fehler beim Schreiben der Internet-Datei!"
         GoTo Exit_FTPUpload
      End If
 
      UebertrageneBytes = UebertrageneBytes + lngZuSchreiben
 
      'Bedienung der Progressbar1
      If CurrentProject.AllForms("WF_Progressbar1").IsLoaded Then
         Call Progressbar1(UebertrageneBytes / lngDateiGroesse)
         frmPB1.Repaint
         DoEvents
      End If
 
   Loop
 
   If CancelProgBar = True Then
      MsgBox "Der Upload wurde abgebrochen!"
   Else
      'wenn Schreiben erfolgreich, und der Benutzer nicht abgebrochen hat
      If lngWrite Then
 
         'Rückgabewert der Funktion
         FTPUpload = True
 
      End If
 
   End If
 
Exit_FTPUpload:
 
   'Datei schließen
   Close fNum
 
   'wenn hFile geöffnet, schließen
   If hFile Then InternetCloseHandle hFile
   Exit Function
 
Err_FTPUpload:
 
   'Fehlermeldung
   MsgBox "Laufzeitfehler '" & Err.Number & "':" & vbCrLf & vbLf & Err.Description
   Resume Exit_FTPUpload
 
End Function
 
 
Public Sub FTPLogout()
 
   'Progressbar1 schließen
   DoCmd.Close acForm, "WF_Progressbar1"
 
   'Progressbar2 schließen
   DoCmd.Close acForm, "WF_Progressbar2"
 
   'wenn hConnection geöffnet, schließen
   If hConnection Then InternetCloseHandle hConnection
 
   'wenn hOpen geöffnet, schließen
   If hOpen Then InternetCloseHandle hOpen
 
End Sub
 
 
Public Sub Progressbar1(Optional Fortschritt As Double = -1, _
                        Optional Titel As String, _
                        Optional AbbrechenAnzeigen As Boolean)
 
   'Progressbar steuern
 
   Dim AnzeigeWert As Long
   Dim maxBalken   As Long
 
   If CurrentProject.AllForms("WF_Progressbar1").IsLoaded Then
 
      If Fortschritt >= 0 Then
         'Der Balken ist 0,95 mm (54 Twips) kürzer als der Rahmen
         maxBalken = frmPB1.Rahmen.Width - 54
 
         'Anzuzeigender ganzzahliger Wert in Twips
         AnzeigeWert = Int(maxBalken * Fortschritt)
 
         'Übersteuerung der Progressbar abfangen
         If AnzeigeWert > maxBalken Then
            AnzeigeWert = maxBalken
         End If
 
         'Fortschritt als Balkenlänge anzeigen
         frmPB1.Balken.Width = AnzeigeWert
      End If
 
      'Caption festlegen
      If Len(Titel) = 0 Then
         frmPB1.Caption = " "
      Else
         frmPB1.Caption = Titel
      End If
 
      If AbbrechenAnzeigen Then
         'Schaltfläche_Abbrechen sichtbar schalten
         frmPB1.Schaltflaeche_Abbrechen.Visible = True
      End If
 
   End If
 
End Sub
 
 
Public Sub Progressbar2(Optional Fortschritt As Double = -1, _
                        Optional Titel As String, _
                        Optional AbbrechenAnzeigen As Boolean)
 
   'Progressbar steuern
 
   Dim AnzeigeWert         As Long
   Dim AnzeigeWertGerundet As Long
   Dim maxBalken           As Long
   Dim KlotzBreite         As Long
 
   If CurrentProject.AllForms("WF_Progressbar2").IsLoaded Then
 
      If Fortschritt >= 0 Then
         'Der Balken ist 0,95 mm (54 Twips) kürzer als der Rahmen
         maxBalken = frmPB2.Rahmen.Width - 54
 
         'Breite eines Klotzes berechnen
         KlotzBreite = maxBalken / 41
 
         'Anzuzeigender Wert in Twips
         AnzeigeWert = maxBalken * Fortschritt
 
         'Die Progressanzeige zeigt nur volle blaue Klötze an
         'Rundung +1: Rundet ab 0,1 auf 1 auf, z.B. 20,1 ergibt 21
         'Die Progressbar eilt dadurch immer um maximal 1 Klotz voraus
         AnzeigeWertGerundet = Int((AnzeigeWert / KlotzBreite) + 1) * KlotzBreite
 
         'Übersteuerung der Progressbar abfangen
         If AnzeigeWertGerundet > maxBalken Then
            AnzeigeWertGerundet = maxBalken
         End If
 
         'Fortschritt als Balkenlänge anzeigen
         frmPB2!Balken.Width = maxBalken - AnzeigeWertGerundet
 
         'Balken nach rechts verschieben
         frmPB2.Balken.Left = frmPB2.Rahmen.Left + 17 + AnzeigeWertGerundet
 
      End If
 
      'Caption festlegen
      If Len(Titel) = 0 Then
         frmPB2.Caption = " "
      Else
         frmPB2.Caption = Titel
      End If
 
      If AbbrechenAnzeigen Then
         'Schaltfläche_Abbrechen sichtbar schalten
         frmPB2.Schaltflaeche_Abbrechen.Visible = True
      End If
 
   End If
 
End Sub

Aufruf

Wahlweise entweder Download oder Upload einer Datei:

   Dim strServer          As String
   Dim strBenutzer        As String
   Dim strPasswort        As String
   Dim strRemoteDateiname As String
   Dim strPfadLokaleDatei As String
   Dim strStatusmeldung   As String
   Dim strRelRemotePath   As String
 
   strServer = "www.eine-domain.de"
   strBenutzer = "12345678"
   strPasswort = "geheim"
   strRelRemotePath = "htdocs/einunterordner/einunterunterordner"
   strRemoteDateiname = "EineDatei.pdf"
   strPfadLokaleDatei = CurrentProject.Path & "\EineDatei.pdf"
 
   'Progressbar1 öffnen
   DoCmd.OpenForm "WF_Progressbar1"
   Set frmPB1 = Forms!WF_Progressbar1
 
   'Progressbar1 Anfangswerte setzen
   Call Progressbar1(0, "", True)
   frmPB1.Repaint
   DoEvents
 
   'Login
   If FTPLogin(strServer, strBenutzer, strPasswort, strRelRemotePath) = 0 Then
      Call FTPLogout
     Exit Sub
   End If
 
   'Entweder Download der Datei
   If FTPDownload(strRemoteDateiname, strPfadLokaleDatei) = True Then
      MsgBox "Download erfolgreich"
   Else
      MsgBox "Download nicht erfolgreich"
   End If
 
'Oder Upload der Datei
'   If FTPUpload(strPfadLokaleDatei, strRemoteDateiname) = True Then
'      MsgBox "Upload erfolgreich"
'   Else
'      MsgBox "Upload nicht erfolgreich"
'   End If
 
   'Logout
   Call FTPLogout

Wikilinks

Weblinks


Der Code ist ab Access 2000 lauffähig.