Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 3
  • 910

Poszukuję kodu VBA, który pozwoli na automatyczny zapis pliku xls na serwerze. Po otwarciu pliku w Excelu makro powinno automatycznie zapisać plik na serwerze w określonej lokalizacji i z podanymi danymi logowania na serwer.

Z góry dziękuję za odpowiedź.
Tomek.

Tomasz_Kolczyk
  • Zapytał
  • @ Tomasz_Kolczyk | 28.10.2014
    • 12
    • 0
    • 2
Komentarze (4)
Przez jaki protokół ma być zapisane? FTP? SFTP? W systemie plików na dysku sieciowym?
Skomentował : @ TRENER ALTKOM AKADEMII ,29.10.2014
Przepraszam, zapomniałem dodać. FTP
Skomentował : @ Tomasz_Kolczyk ,29.10.2014
  • 12
  • 0
  • 2

Odpowiedź (1)

  • 14

Problem podzieliłbym na dwie części: uruchomienie automatyczne makra po otwarciu pliku i załadowanie pliku na ftp.

Automatyczne uruchamianie kodu doskonale opisał Dariusz Kolasa w wątku:

https://quorum.akademiq.pl/discussion/comment/89#Comment_89

Odnośnie ftp, VBA bez dodatkowych bibliotek oferuje dwie możliwości:

  1. wywołanie narzędzia linii poleceń ftp za pomocą wygenerowanych wcześniej poleceń tekstowych,
  2. zamapowanie i wywołanie funkcji WinAPI z biblioteki wininet.dll (Win32 Internet Extensions).

Druga możliwość jest podejściem dającym większą elastyczność i kontrolę operacji ftp z poziomu kodu VBA, a nie zewnętrznego programu. Aby skorzystać z biblioteki wininet.dll i poleceń ftp WinAPI, należy zamapować funkcje ftp i wywołać je we własnym kodzie.  Typowa sekwencja to: utworzenie sesji, otwarcie połączenia, manipulacja na plikach i katalogach ftp, zamknięcie połączenia.

Mapowanie funkcji InternetOpen, InternetConnect, FtpPutFile:

Public Declare PtrSafe Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

Public Declare PtrSafe Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
(ByVal hInternetSession 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


Public Declare PtrSafe Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
(ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
      ByVal lpszRemoteFile As String, _
      ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

Wywołanie funkcji (utworzenie sesji i otwarcie połączenia ftp):

Private Sub ConnectToFtp()
    
Dim hOpen As Long, hConnection As Long, hFile As Long
Dim dwType As Long
Dim dwSeman As Long
hOpen = InternetOpen("Excel Ftp Agent", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
  If hOpen = 0 Then
    MsgBox Err.LastDllError, "InternetOpen"
  End If
  dwType = FTP_TRANSFER_TYPE_BINARY
  dwSeman = 0
  hConnection = 0
    If hConnection <> 0 Then
        InternetCloseHandle hConnection
    End If
    hConnection = InternetConnect(hOpen, "ftp.microsoft.com", INTERNET_INVALID_PORT_NUMBER, _
    "anonymous", "user@domain.com", INTERNET_SERVICE_FTP, dwSeman, 0)
    If hConnection = 0 Then
        MsgBox Err.LastDllError, "InternetConnect"
        Exit Sub
    Else
        MsgBox "Connected!", , "SimpleFtp"
    End If
End Sub

Dla wygody, w załączniku kod modułu z mapowaniem funkcji ftp (w wersji 32bit należy usunąć PtrSafe).

 

Załączniki

  • txt

    VbaWinInet.bas.txt ( 5K )
  • Odpowiedział
  • @ | 04.11.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Bardzo dziękuję za wyczerpującą odpowiedź! Zastosowałem w moim kodzie i działa. Pozdrawiam!
Skomentował : @ Tomasz_Kolczyk ,11.11.2014
  • 12
  • 0
  • 2
super odpowiedź :)
Skomentował : @ TRENER ALTKOM AKADEMII ,12.01.2015