vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 26 kwietnia 2025 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

Dostęp do pliku excela z aplikacji vba excel. Pytanie


otwartyotwarty rozpoczął: onekzone postów: 11



napisał: Trebor
postów: 1209


umieszczony:
26 grudnia 2010
15:57

edytowany:
26 grudnia 2010
15:58

  
Cóż nie bardzo jest o czym pisać. Generalnie chodzi o możliwość otwarcia skoroszytu przez wielu użytkowników jednocześnie.
W excelu 2007 robisz to z Recenzja - Udostępnij skoroszyt
W poprzednich wersjach Narzędzia - Udostępnij skoroszyt

Plik umieszczony np. na dysku sieciowym będzie dostępny dla wielu użytkowników. Trochę jest zachodu z odczytywaniem danych "online" zapisanych przez innych użytkowników, ale daje się na tym pracować. Mam nadzieję, że w nowych wersjach jest to jakoś udoskonalone, chociaż po menu tego nie widać.
napisał: onekzone
postów: 15


umieszczony:
26 grudnia 2010
14:07

  
Jeżeli chodzi o udostępnianie skoroszytu, arkusza (na pewno nie formularza! racja mój błąd). Mógłbyś podać przykład w jaki sposób się to robi. Bo myślałem trochę nad pewnym zastosowaniem tej metody.
Pozdrawiam.
napisał: onekzone
postów: 15


umieszczony:
26 grudnia 2010
14:02

  
Pyt: Co w przypadku jeżeli ktoś coś zarezerwował i mu się odechce?
Odp: Puki nie zostaną przesłane dane z formularza do rejestru nie będzie mógł zamawiać nowych numerów. Oznacza to, że wszystkie informacje jakie wypełniałby w rejestrze na dysku sieciowym (poza numerem rejestru) gromadzi w arkuszu (tym z którego odpalany jest formularz) na własnym dysku.
Sorry, że tak długo nie pisałem ale w Święta rzadko używam komputera. Pozdrawiam.
napisał: Trebor
postów: 1209


umieszczony:
23 grudnia 2010
20:44

  
Nie napisałem Udostępnienie formularza a udostępnienie skoroszytu. Dla mnie to dwie różne rzeczy.
Czy polecam tą metodę - cóż niezbyt, ale warto odnotować, że istnieje.

O ile dobrze zrozumiałem Twoją metodę, to co w przypadku gdy użytkownik zarezerwuje wiersze i dalej mu się "odechce" bo poczuł się np. zmęczony?
napisał: onekzone
postów: 15


umieszczony:
23 grudnia 2010
20:05

  
Witam ponownie.
Nie sądzę, że w tym projekcie będę korzystał z udostępniania formularza, cokolwiek to znaczy. Być może przy innej okazji skorzystam z takiego rozwiązania i oczywiście chętnie podzielę się z Vbamaniakami wynikami mojej pracy oraz uwagami na temat udostępniania formularza.
Moja obecna aplikacja służy usprawnieniu roboty pracownikom pewnej firmy, którzy do tej pory pracowali (w 5 -6 osób) na rejestrze exelowskim na dysku sieciowym. Jak wiadomo korzystać z takiej tabeli w danej chwili mogła tylko 1 osoba (reszta w tym czasie mogła pić kawę).
Zauważyłem 1 rzecz, że każdy mógłby pracować na oddzielnej tabeli, kłopotem był by tylko numer rejestru który składa się z kolejnego numeru porządkowego oraz roku kalendarzowego.
Jak wiadomo lata lecą szybko ale bez przesady, każdy bez tabelki jest w stanie stwierdzić, który rok dzisiaj mamy.
Pozostała więc kolejna liczba porządkowa.
Mój sposób jest taki
1.Gościu chce coś wpisać do tabelki
2.Zamawia żądaną ilość numerów (gdy chce więcej na raz uzupełnić)
a)otwiera formularz zamawiania (podaje ile numerów chce zamówić)
' elementy formularza TekstBox, SpinButton, Listbox (do wyświetlenia wyników), Przyciski Zamów, Ok, Anuluj
b)formularz łączy się z Rejestrem
-sprawdza dostępność (temat opisany na tym forum)
-otwiera Rejestr w trybie pełnym
-"zamawia" numery (zapełnia 2 pierwsze kolumny w pierwszym i kolejnym/ych wolnych wierszach[pierwsza kolumna nr rejestru,druga id zamawiającego na podstawie nazwy użytkownika]
-zamyka rejestr i zapisuje zmiany
-do pliku na dysku użytkownika przepisuje numery rejestru
c)edycja na komputerze użytkownika
d)formularz łączy się z Rejestrem w celu przepisania wprowadzonych zmian
-sprawdza dostępność (temat opisany na tym forum)
-otwiera Rejestr w trybie pełnym
-przepisanie danych z tabeli na komputerze użytkownika do Rejestru pod komórki określone na podstawie numeru rejestru
-zamyka rejestr i zapisuje zmiany
-usunięcie z tabeli na dysku użytkownika przepisanych danych

To jest cała filozofia działania tej aplikacji, oczywiście lubię bajery więc wypełnianie tabelek zrealizowałem za pomocą kolejnego formularza, żeby było ładniej. Cała aplikacja składa się z 5 formularzy użytkownika, zrealizowałem dodatkowe zadania przy okazji.
Pozdrawiam.
napisał: Trebor
postów: 1209


umieszczony:
23 grudnia 2010
16:35

edytowany:
23 grudnia 2010
16:36

  
Wtrącę swój grosik. Excel posiada możliwość udostępniania skoroszytu. W excelu 2007 z menu Recenzja - Udostępnij skoroszyt. Jednak gdy się tym jeszcze bawiłem pod excelem 2003 zauważyłem:
1. Plik bardzo szybko przybiera na wadze mimo wyłączenia historii zmian.
2. Jest problem przy zapisie danych przez różnych użytkowników do tego samego zakresu.
3. Zmiany wprowadzane przez innych użytkowników są widoczne przy zapisywaniu skoroszytu lub ponownym otwarciu skoroszytu.
4. Był jakiś problem z makrami, ale już nie pamiętam czego dotyczył.

Wagę skoroszytu można zmniejszać wyłączając i ponownie włączając i udostępnianie.

Jeśli zdecydujesz się wykorzystać Udostępnianie mam nadzieję, że podzielisz się z forumowiczami uwagami o działaniu tego wynalazku.

Hej
napisał: onekzone
postów: 15


umieszczony:
23 grudnia 2010
14:30

  
Witam.
Dzięki wielkie za programik. O to chodziło.
Jeżeli chodzi o informacje w komentarzu to nie zawsze jest prawdą, że pierwsze otwarcie jest pełne, a kolejne są do odczytu oraz, że gdy pierwsza osoba zamknie plik to ta będąca w trybie do odczytu jest przełączana na pełny dostęp (wymaga to ponownego otwarcia pliku.
Sytuacja, że pierwsza osoba otwiera w trybie pełnym, a kolejne w trybie do odczytu ma miejsce podczas zwykłego otwarcia pliku, można natomiast wymusić otwarcie pliku w trybie tylko do odczytu nawet gdy plik nie jest zajęty (opcja ReadOnly = True).
Ja w mojej aplikacji używam takiej opcji, by użytkownik miał możliwość podglądu rejestru bez blokowania go innym użytkownikom.
Program zamieszczony reaguje tylko na pełne otwarcie pliku, i za to jestem bardzo wdzięczny.
Dziękuję za pomoc i chyba ten wątek można zamknąć (o ile nikt nie ma nic do dodania), pozdrawiam.
napisał: ml
postów: 23


umieszczony:
23 grudnia 2010
12:14

  
Zakładam, że chodzi o coś takiego:
1. Kowalski w Warszawie otwiera ten plik jako pierwszy i on wtedy ma go do edycji
2. Nowakowski w Krakowie w tym samym czasie otwiera ten plik i w jego instancji (w jego excelu, czyli na jego komputerze) otwiera się do odczytu: więc jeżeli jemu otworzy się do odczytu to wiadomo że ktoś go ma otwartego do edycji
3. Lewandowska w Lublinie w tym samym czasie co Kowalski i Nowakowski otwiera ten plik i znowu w jego instancji (w jego excelu, czyli na jego komputerze) otwiera się do odczytu: więc jeżeli jemu otworzy się do odczytu to wiadomo że ktoś go ma otwartego do edycji, niezależnie od tego ile już osób ma go otwartych do odczytu.

ReadOnly sprawdza ci stan aktualny otwieranego plik przez danego użytkownika w danej instancji, a każda kolejna osoba otwierająca ten plik zawsze ma go do odczytu (dopóki ta pierwsza go nie zamknie).

Jeżeli nadal to nie jest to co chcesz wtedy w sieci jest program sprawdzający czy plik jest otwarty:

Option Explicit

'===========================================
'http://www.xcelfiles.com/IsFileOpenVBA.htm
'===========================================

Sub TestVBA()
'// Just change the file to test here
Const strFileToOpen As String = "C:\aaa.xls"

    If IsFileOpen(strFileToOpen) Then
        MsgBox strFileToOpen & " is already Open" & _
            vbCrLf & "By " & LastUser(strFileToOpen), vbInformation, "File in Use"
    Else
        MsgBox strFileToOpen & " is not open", vbInformation
    End If
End Sub

Function IsFileOpen(strFullPathFileName As String) As Boolean
'// VBA version to check if File is Open
'// We can use this for ANY FILE not just Excel!
'// Ivan F Moala
'// http://www.xcelfiles.com
Dim hdlFile As Long

    '// Error is generated if you try
    '// opening a File for ReadWrite lock >> MUST BE OPEN!
    On Error GoTo FileIsOpen:
    hdlFile = FreeFile
    Open strFullPathFileName For Random Access Read Write Lock Read Write As hdlFile
    IsFileOpen = False
    Close hdlFile
    Exit Function
FileIsOpen:
    '// Someone has it open!
    IsFileOpen = True
    Close hdlFile
End Function

Private Function LastUser(strPath As String) As String
'// Code by Helen from http://www.visualbasicforum.com/index.php?s=
'// This routine gets the Username of the File In Use
'// Credit goes to Helen for code & Mark for the idea
'// Insomniac for xl97 inStrRev
'// Amendment 25th June 2004 by IFM
'// : Name changes will show old setting
'// : you need to get the Len of the Name stored just before
'// : the double Padded Nullstrings
Dim strXl As String
Dim strFlag1 As String, strflag2 As String
Dim i As Integer, j As Integer
Dim hdlFile As Long
Dim lNameLen As Byte


strFlag1 = Chr(0) & Chr(0)
strflag2 = Chr(32) & Chr(32)

hdlFile = FreeFile
Open strPath For Binary As #hdlFile
    strXl = Space(LOF(hdlFile))
    Get 1, , strXl
Close #hdlFile

j = InStr(1, strXl, strflag2)

#If Not VBA6 Then
    '// Xl97
    For i = j - 1 To 1 Step -1
        If Mid(strXl, i, 1) = Chr(0) Then
          Exit For
        End If
    Next
    i = i + 1
#Else
    '// Xl2000+
    i = InStrRev(strXl, strFlag1, j) + Len(strFlag1)
#End If

'// IFM
lNameLen = Asc(Mid(strXl, i - 3, 1))
LastUser = Mid(strXl, i, lNameLen)

End Function

napisał: onekzone
postów: 15


umieszczony:
23 grudnia 2010
10:35

  
Dzięki za podpowiedź, ale zależy mi bardziej na sprawdzeniu czy plik excela jest otwarty w trybie do edycji. Nie ma sensu sprawdzanie czy plik jest otwarty w trybie do odczytu gdyż "czytać" może w tym samym czasie więcej użytkowników.
Wiem, że na pewno da się to sprawdzić jednym poleceniem ale nie wiem jakie to polecenie w języku vba.
Zazwyczaj w słyszałem get albo ifopen, ale te polecenia sprawdzają arkusze otwarte na komputerze użytkownika. Chodzi mi o wysłanie zapytania do pliku rejestru (czy jest wolny? w trybie do edycji) jeżeli tak to otworzenie pliku, a jeżeli nie to ponowienie próby za jakiś czas.
Jak ktoś ma jakiś pomysł to wielka prośba o podpowiedź.
Pozdrawiam.
napisał: ml
postów: 23


umieszczony:
23 grudnia 2010
09:11

  
Propozycja sprawdzania czy plik otwierany przez kolejną osobę otwiera się w trybie do odczytu, tzn.

Sub subPlikDoOdczytu()

' trzeba wylaczyc komunikaty oraz odswiezanie ekranu
' bo jezeli druga osoba otwiera juz otwarty plik
' to excel nas o tym powiadamia
' a nie chcemy zeby uzytkownik to widzial
Application.ScreenUpdating = False  ' wylaczenie odswiezania

Application.DisplayAlerts = False ' wylaczenie komunikatow
Workbooks.Open Filename:="D:\Zeszyt1.xls"
Application.DisplayAlerts = True ' wlaczenie komunikatow

' jezeli ten sam plik jest otwierany
' przez druga osobe to otwiera sie w trybie do odczytu
If Workbooks("Zeszyt1").ReadOnly Then
  MsgBox "Otwórz za 5 min."
  Workbooks("Zeszyt1.xls").Close SaveChanges:=False
End If

Application.ScreenUpdating = True ' wlaczenie odswiezania

End Sub

napisał: onekzone
postów: 15


umieszczony:
22 grudnia 2010
21:20

  
Witam.
Znowu zawracam dupsko ale nie ważne.
Pracuje nad aplikacją umożliwiającą dostęp do rejestru (tabela excel), przez kilku użytkowników w sieci w "tym samym" czasie. Każdy użytkownik będzie się komunikował z rejestrem (tabela excelowska na dysku sieciowym) poprzez formularz użytkownika na swoim dysku (aplikacja vba excel).
To działanie ogranicza czas dostępu do rejestru tylko i wyłącznie do paru sekund (otwarcie, zamówienie wierszów tabelki,wpisanie w tabelke identyfikatora użytkownika,zamknięcie pliku i zapisanie zmian) i później po wypełnieniu reszty tabeli na dysku użytkownika (otwarcie, przesłanie zmian, zamknięcie). Czasy otwarcia i zamknięcia są bardzo krutkie ale może zdarzyć cię taka sytuacja, że czasy zapisu dwóch użytkowników nałożą się na siebie i jeden z użytkowników otworzy rejestr w trybie tylko do odczytu i aplikacja wyrzuci błąd. Takiej sytuacji wolałbym uniknąć. Moje pytanie w związku z tym jest następujące:
Jakiej funkcji użyć do sprawdzenia czy plik jest aktualnie otwarty w trybie zapisu przez dowolnego użytkownika?
Uważam że w takiej sytuacji należy ustawić jakąś zwłokę czasową i spróbować ponownie.
Z góry dzięki i pozdrawiam.


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z