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

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

  • Ich möchte eine Datei von einem Internet-Server herunterladen bzw. auf einen Internet-Server hinaufladen. Der Fortschritt des Downloads bzw. Uploads soll laufend über eine Progressbar angezeigt werden.
  • Die im untenstehenden Code verwendete Progressbar (Fortschrittsanzeige) kann hier 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.

'Variablen für die Progressbar
Public p_bolProgressbarAbbrechen 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
 
'Konstanten
 
'für InternetReadFile
'MAX_BUFFER auf die aktuelle Internetgeschwindigkeit setzen, z.B. 4500 (Bit pro Sekunde)
Private Const MAX_BUFFER As Long = 4500
 
'für FtpFindFirstFile
'für Private Type WIN32_FIND_DATA
Private Const MAX_PATH = 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 = 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 = 21      'Standardwert für FTP-Server (nServerPort)
Private Const INTERNET_INVALID_PORT_NUMBER = 0    'alternativ für nServerPort
Private Const INTERNET_SERVICE_FTP = 1            'lService
Private Const INTERNET_FLAG_PASSIVE = &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 Boolean
 
'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_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FTP_TRANSFER_TYPE_UNKNOWN = &H0  'Setzt FTP_TRANSFER_TYPE_BINARY als Standard
Private Const FTP_TRANSFER_TYPE_ASCII = &H1    'ASCI-Übertragung
Private Const FTP_TRANSFER_TYPE_BINARY = &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 Integer
 
'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 Integer
 
'FtpDeleteFile (Internet-Datei löschen)
Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" ( _
                         ByVal hFtpSession As Long, _
                         ByVal lpszFileName As String _
                         ) As Boolean
 
'InternetCloseHandle (Internethandle schließen)
Private Declare Function InternetCloseHandle Lib "wininet.dll" ( _
                         ByVal hInet As Long _
                         ) As Integer
 
 
Public Function FTPLogin(ByVal Server As String, _
                         ByVal Benutzer As String, _
                         ByVal Passwort As String, _
                         Optional ByVal RelativerOrdnerpfad As String = vbNullString, _
                         Optional ByVal FehlermeldungAus As Boolean = False _
                         ) As Long
 
 'Internetverbindung herstellen
 
 'Statusmeldung
 Call Progressbar1(, "Internetverbindung wird hergestellt ...")
 
 hOpen = InternetOpen("MeineVerbindung", INTERNET_OPEN_TYPE_PRECONFIG, _
                          vbNullString, vbNullString, 0)
 
 If hOpen = 0 Then
   'Fehlermeldung
   If FehlermeldungAus = False Then
     MsgBox "Fehler beim Aufbau der Internetverbindung!"
   End If
   Exit Function
 End If
 '----------------------------------------------------------------------------------
 
 'Verbindung zum FTP-Server
 
 'Statusmeldung
 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
   MsgBox "Es konnte keine Verbindung zum FTP-Server hergestellt werden!" _
          & vbCrLf & vbCrLf & "Mögliche Ursache:" _
          & vbCrLf & "Es besteht keine Internetverbindung."
   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
   MsgBox "Fehler beim Zugriff auf das Hauptverzeichnis !"
   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
 Call FTPLogout
   'Fehlermeldung
   MsgBox "Fehler beim Zugriff auf das Unterverzeichnis !"
   Exit Function
 End If
 '----------------------------------------------------------------------------------
 
 'Rückgabewert
 FTPLogin = lngUnterverzeichnis
 
End Function
 
 
Private Function FTPDateiÖffnen(ByVal RemoteDateiname As String, _
                                ByVal Modus As Long)
 
 '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
 
 FTPDateiÖffnen = hFile
 
End Function
 
 
Public Function FTPDownload(ByVal RemoteDateiname As String, _
                            ByVal PfadLokaleDatei As String, _
                            Optional ByVal Statusmeldung As String = vbNullString _
                            ) As Boolean
 
 'Quelle: http://www.dbwiki.net/ 
 
 Dim lngDateigröße 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
 lngDateigröße = pData.nFileSizeLow
 
 'wenn hFind geöffnet, schließen
 If hFind Then
   InternetCloseHandle hFind
 End If
 
 'wenn Dateigröße = 0
 If lngDateigröße = 0 Then
   'Fehlermeldung
   MsgBox "Die Internetdatei existiert nicht!"
   Exit Function
 End If
'------------------------------------------------------------------------------
 
 'Datei auf dem FTP-Server öffnen
 If FTPDateiÖffnen(RemoteDateiname, GENERIC_READ) = 0 Then
   Exit Function
 End If
'------------------------------------------------------------------------------
 
 'Downloadvorgang
 
 'Statusmeldung
 If Statusmeldung = vbNullString 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 While p_bolProgressbarAbbrechen = False
 
   '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
   End If
 
   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) / lngDateigröße)
   frmPB1.Repaint
   DoEvents
 
 Loop
'------------------------------------------------------------------------------
 
 'Heruntergeladene Daten in lokaler Datei speichern
 
 If p_bolProgressbarAbbrechen = True 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
 End If
 Exit Function
 
Err_FTPDownload:
 
 'Fehlermeldung
 MsgBox "Laufzeitfehler '" & Err.Number & "':" & vbCrLf & vbLf & Err.Description
 Resume Exit_FTPDownload
 
End Function
 
 
Public Function FTPUpload(ByVal PfadLokaleDatei As String, _
                          ByVal RemoteDateiname As String, _
                          Optional ByVal Statusmeldung As String = vbNullString _
                          ) As Boolean
 
 'Quelle: http://www.dbwiki.net/  
 
 Dim arrDaten() As Byte
 Dim lngGeschrieben As Long
 Dim lngDateigröße As Long
 Dim ub As Long
 Dim ÜbertrageneBytes As Long
 Dim lngZuSchreiben As Long
 Dim lngWrite As Long
 Dim lngBlockgröße As Long
 
 On Error GoTo Err_FTPUpload
 
 'Datei auf dem FTP-Server öffnen
 If FTPDateiÖffnen(RemoteDateiname, GENERIC_WRITE) = 0 Then
   Exit Function
 End If
'------------------------------------------------------------------------------
 
 'Uploadvorgang
 
 'Statusmeldung
 If Statusmeldung = vbNullString Then
   Call Progressbar1(, RemoteDateiname & " wird hinaufgeladen ...")
 Else
   Call Progressbar1(, Statusmeldung)
 End If
 
 'Lokale Quelldatei öffnen
 Open PfadLokaleDatei For Binary Access Read As #1
 
 'LOF = Größe einer geöffneten Datei in Bytes
 lngDateigröße = LOF(1)
 
 'Dateiinhalt in Array einlesen
 ReDim arrDaten(0 To lngDateigröße) As Byte
 Get #1, , arrDaten()
 
 'ÜbertrageneBytes enthält die Anzahl der bereits geschriebenen Bytes
 ÜbertrageneBytes = 0
 
 'Größe des Arrays, Anzahl der Bytes
 ub = UBound(arrDaten)
 
 lngBlockgröße = MAX_BUFFER * 2
 
 'Upload, solange Progressbar1 nicht geschlossen wird
 Do While p_bolProgressbarAbbrechen = False
 
   If ÜbertrageneBytes + lngBlockgröße <= ub Then
     'Volle Blockgröße schreiben
     lngZuSchreiben = lngBlockgröße
   Else
     'Rest-Bytes am Schluß, die kleiner als lngBlockgröße sind
     lngZuSchreiben = (ub - ÜbertrageneBytes)
   End If
 
   'Der Upload ist beendet, wenn lngZuSchreiben an dieser Stelle 0 ist
   If lngZuSchreiben = 0 Then
     Exit Do
   End If
 
   'in Internetdatei schreiben
   'lngZuSchreiben: Anzahl der zu schreibenden Bytes
   'lngGeschrieben: Anzahl der geschriebenen Bytes
   lngWrite = InternetWriteFile(hFile, arrDaten(ÜbertrageneBytes), _
                                lngZuSchreiben, lngGeschrieben)
 
   If lngWrite = 0 Then
     'Fehlermeldung
     MsgBox "Fehler beim Schreiben der Internet-Datei!"
     GoTo Exit_FTPUpload
     Exit Function
   End If
 
   ÜbertrageneBytes = ÜbertrageneBytes + lngZuSchreiben
 
   'Bedienung der Progressbar1
   If CurrentProject.AllForms("WF_Progressbar1").IsLoaded Then
     Call Progressbar1(ÜbertrageneBytes / lngDateigröße)
     frmPB1.Repaint
     DoEvents
   End If
 
 Loop
 
 If p_bolProgressbarAbbrechen = 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 #1
 
 'wenn hFile geöffnet, schließen
 If hFile Then
   InternetCloseHandle hFile
 End If
 
 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"
 If Not frmPB1 Is Nothing Then
   Set frmPB1 = Nothing
 End If
 
 'Progressbar2 schließen
 DoCmd.Close acForm, "WF_Progressbar2"
 If Not frmPB2 Is Nothing Then
   Set frmPB2 = Nothing
 End If
 
 'wenn hConnection geöffnet, schließen
 If hConnection Then
   InternetCloseHandle hConnection
 End If
 
 'wenn hOpen geöffnet, schließen
 If hOpen Then
   InternetCloseHandle hOpen
 End If
 
End Sub
 
 
Public Sub Progressbar1(Optional Fortschritt As Double = -1, _
                        Optional Titel As String, _
                        Optional AbbrechenAnzeigen As Boolean = False)
 
 'Progressbar steuern
 
 Dim anzeigewert As Long
 Dim maxbalken As Long
 
 If CurrentProject.AllForms("WF_Progressbar1").IsLoaded = True 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 Titel = vbNullString Then
     frmPB1.Caption = " "
   Else
     frmPB1.Caption = Titel
   End If
 
   If AbbrechenAnzeigen = True Then
     'Schaltfläche_Abbrechen sichtbar schalten
     frmPB1!Schaltfläche_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 = False)
 
 'Progressbar steuern
 
 Dim anzeigewert As Long
 Dim anzeigewertgerundet As Long
 Dim maxbalken As Long
 Dim klotzbreite As Long
 
 If CurrentProject.AllForms("WF_Progressbar2").IsLoaded = True 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 Titel = vbNullString Then
     frmPB2.Caption = " "
   Else
     frmPB2.Caption = Titel
   End If
 
   If AbbrechenAnzeigen = True Then
     'Schaltfläche_Abbrechen sichtbar schalten
     frmPB2!Schaltfläche_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 strRelativerPfadRemoteordner As String
 
 strServer = "www.meine-domain.de"
 strBenutzer = "12345678"
 strPasswort = "geheim"
 strRelativerPfadRemoteordner = "htdocs/meinunterordner/meinunterunterordner"
 strRemoteDateiname = "MeineDatei.pdf"
 strPfadLokaleDatei = CurrentProject.Path & "\MeineDatei.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, strRelativerPfadRemoteordner) = 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

Wiki-Links

Web-Links


Der Code ist ab Access 2000 lauffähig.