Kategorie szkoleń | Egzaminy | Kontakt
  • 4
  • 1
  • 223

W skoroszycie Excela wykorzystuję zdarzenie zamknięcia skoroszytu do automatycznego zrobienia kopii pliku w archiwum.

Wszystko chodziło fajnie do chwili, kiedy zmieniłem uprawnienia do foldera z Full na Zapis i Odczyt tj. pliki można zapisywać we wskazanym folderze, lecz nie można dokonywać w nich jakichkolwiek zmian ani usuwać.

Testując rozwiązanie modelowe Ctrl+V działało poprawnie jednak wiersz VBA:

ActiveWorkbook.SaveAs ("\\Public\Archiwum\Arch_" & FILE_NAME), WriteResPassword:="xxxx", ReadOnlyRecommended:=True

Powoduje jedynie we wskazanej lokalizacji "rezerwację" nazwy i tworzy plik danego typu bez danych tj. Rozmiar pliku wynosi 0 KB. :-(

Skoroszyt, którego kopia jest archiwizowana ma kilka arkuszy i ponad 1,6 MB danych.

Czy jest możliwość wykorzystania innego mechanizmu tak, aby proces zaczynał się od stworzenia obiektu z pełna zawartością, a następnie następowało jego zapisanie we wskazanej lokalizacji?

A może trzeba w specjalny sposób skonfigurować uprawnienia userów do wskazanego folderu, aby to rozwiązanie zadziałało?

Będę wdzięczny za wszelkie podpowiedzi. :-)

Artur_Kloszewski
  • Zapytał
  • @ Artur_Kloszewski | 10.03.2015
    • 0
    • 1
    • 1

Odpowiedzi (4)

  • 12

Odpowiedź na pytanie dotyczące tworzenia obiektu skoroszytu z pełną zawartością, a następnie zapisanie we wskazanej lokalizacji. Taką funkcjonalność można zrealizować, np. korzystając z funkcji SaveCopyAs (zamiast SaveAs) oraz obiektu FileSystem z metodą FileCopy:

Sub test()
Dim copy$, source$, target$

With ThisWorkbook
If .Saved Then
    copy = .FullName & "c"
    .SaveCopyAs copy
    source = copy
    target = "D:\tmp\" & .Name    
    Debug.Print source, target
    FileSystem.FileCopy source, target
    FileSystem.Kill copy
End If
End With

End Sub

 

  • Odpowiedział
  • @ | 12.03.2015
  • TRENER ALTKOM AKADEMII
Komentarze
W dalszym ciągu testowałem proponowane rozwiązanie z różnymi modyfikacjami i wygląda na to, że:


1.

polecenie FileCopy nie kopiuje pliku z Atrybutami pliku źródłowego (copy), a w folderze docelowym plik jest z pełnym dostępem (w testach plik z Attr ReadOnly po skopiowaniu był Full!)


2.

polecenie Kill pobiera uprawnienia z atrybutów folderu docelowego tj z target, a nie z pliku copy, co przy ograniczeniu uprawnień "wywala" makro i nie kasuje pliku kopii,




Rozwiązania stwierdzonych problemów:


Ad 1.

Wykorzystanie funkcji CopyFileA z Kernel32.dll zamiast FileCopy


Private Declare Function CopyFile Lib "Kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long


Ta funkcja robi kopie pliku z atrybutami, które ma plik copy




Ad. 2.

Zdefiniowanie funkcji usuwania FnDeleteFile i wywołanie przez CALL zamiast Kill


Function FnDeleteFile(strFileName)
Set fso = CreateObject("Scripting.FileSystemObject")

fso.DeleteFile (strFileName)
End Function


Funkcja usuwa plik copy biorąc pod uwagę jego atrybuty, a nie uprawnienia usera zdefiniowane w folderze docelowym target




Pozdrawiam Artur
Skomentował : @ Artur_Kloszewski ,19.03.2015
  • 0
  • 1
  • 1
  • 0

Dziękuję za projekt.

Zmieniłem kod źródłowy na bazie Pana odpowiedzi.

Działa poprawnie do chwili zmiany uprawnień na folderze docelowym - na zapis i odczyt.

Po zmianie uprawień kopiuje pliki, ale "wywala się" na Kill tj. komunikuje Run Time Error 53.

Problem związany jest ze zmianą uprawnień na Target.

W linii z Kill jest kopia lokalizacji i nazwy pliku z linii SaveCopyAs.

Czy jest na to jakiś patent?

Artur_Kloszewski
  • Odpowiedział
  • @ Artur_Kloszewski | 16.03.2015
    • 0
    • 1
    • 1
  • 0

W dalszym ciągu testowałem FileCopy. Wygląda na to, że polecenie nie kopiuje pliku z Atrybutami pliku źródłowego, a nadaje mu takie uprawnienia, jakie mają userzy w folderze docelowym.

 

Artur_Kloszewski
  • Odpowiedział
  • @ Artur_Kloszewski | 19.03.2015
    • 0
    • 1
    • 1
  • 0

W dalszym ciągu testowałem proponowane rozwiązanie z różnymi modyfikacjami i wygląda na to, że:

1.

Polecenie FileCopy nie kopiuje pliku z Atrybutami pliku źródłowego (copy), a w folderze docelowym plik jest z pełnym dostępem (w testach plik z Attr ReadOnly po skopiowaniu był Full!).

2.

Polecenie Kill pobiera uprawnienia z atrybutów folderu docelowego tj z target, a nie z pliku copy, co przy ograniczeniu uprawnień "wywala" makro i nie kasuje pliku kopii,

 

Rozwiązania stwierdzonych problemów:

Ad 1.

Wykorzystanie funkcji CopyFileA z Kernel32.dll zamiast FileCopy:

Private Declare Function CopyFile Lib "Kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

Ta funkcja robi kopie pliku z atrybutami, które ma plik copy.

 

Ad. 2.

Zdefiniowanie funkcji usuwania FnDeleteFile i wywołanie przez CALL zamiast Kill:

Function FnDeleteFile(strFileName)
       Set fso = CreateObject("Scripting.FileSystemObject")

       fso.DeleteFile (strFileName)
End Function

Funkcja usuwa plik copy, biorąc pod uwagę jego atrybuty, a nie uprawnienia usera zdefiniowane w folderze docelowym target.

Pozdrawiam.
Artur.

Artur_Kloszewski
  • Odpowiedział
  • @ Artur_Kloszewski | 19.03.2015
    • 0
    • 1
    • 1