Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 75511 Skopiuj do schowka Równoczesny zapis do kilku arkuszy w VBA
Autor Wiadomość
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3616 razy
Posty: 10635
Wysłany: 01-02-2024, 23:55   Równoczesny zapis do kilku arkuszy w VBA

W tym wątku chciałem poruszyć kwestię zaznaczania kilku arkuszy i zapisu danych równocześnie do kilku arkuszy za pomocą VBA.

Bezpośrednie wykonywanie tych operacji w skoroszycie przebiega nieco inaczej niż w VBA.

Dokładniejszy opis zagadnienia i przykładowy plik Excela zawierający przytoczone kody w załącznikach.

Jednoczesne wpisy w kilku arkuszach.docx
Pobierz Plik ściągnięto 70 raz(y) 33.96 KB

ZapisDoGrupy.xlsm
Pobierz Plik ściągnięto 73 raz(y) 25.1 KB

ID posta: 433231 Skopiuj do schowka
 
 
Rafał B. 
ExcelSpec



Wersja: Win Office 2021
Pomógł: 91 razy
Posty: 524
Wysłany: 03-02-2024, 12:49   

Cytat:
Gdybyśmy chcieli do utworzenia grupy wykorzystać nazwy kodowe arkuszy, to trzeba to zrobić pośrednio wywołując nazwy zakładkowe jako właściwości Name.
Set Grupa = Sheets(Array(Arkusz1.Name, Arkusz3.Name, Arkusz4.Name))

Trochę niezrozumiałe jest dla mnie używanie określenie "kodowe" w tym dokumencie. W nomenklaturze za nazwę kodową uznaje się raczej (Name), a nie Name (w "memberze" klasy Sheet jest to nazwane czytelniej jako .CodeName). Ale jeszcze kawy dziś nie piłem :mrgreen:
_________________
W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc.
ID posta: 433257 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 365
Pomógł: 537 razy
Posty: 2175
Wysłany: 03-02-2024, 13:05   

Wg mojej wiedzy jeżeli istnieją dwie nazwy tego samego arkusza (a istnieją, mogą być takie same lub różne) i są różne to nazwa kodowa to ta, której nie widać w samym arkuszu, czyli jest ona zakodowana w VBA.
ID posta: 433259 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3616 razy
Posty: 10635
Wysłany: 03-02-2024, 13:43   

Chodziło mi o to, że w konstrukcji z Array:
Kod:
Set Grupa = Sheets(Array("Arkusz1", "Arkusz3", "Arkusz4"))
muszą być używane te nazwy, które są widoczne na zakładkach (tabs) arkuszy. Jeśli obawiamy się, że użytkownik mógł je zmienić, a znamy pierwotne nazwy kodowe (Codename), które wprost zwracają odwołanie do obiektu arkusza, to możemy odczytać własność Name i tej użyć.
Gdybyśmy zapisali wprost:
Kod:
Array(Arkusz1, Arkusz2, Arkusz3)
to otrzymamy tablicę arkuszy, a nie grupę jako obiekt Sheets.
ID posta: 433262 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1293 razy
Posty: 2639
Wysłany: 03-02-2024, 13:57   

tak na marginesie:
wiem że przyzwyczajeni jesteśmy używać określeń: nazwa arkusza i kodowa nazwa arkusza.
Ale jak już ktoś chce być bardzo "purystą" (jak to mnie kiedyś wyzwał Rafał :D)
to powinno się używać określeń: Nazwa Arkusza, Nazwa Klasy arkusza ewentualnie nazwa obiektu arkusza ;-)
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 433263 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3616 razy
Posty: 10635
Wysłany: 03-02-2024, 14:57   

O terminologii to można w nieskończoność, w dużym stopniu narzuca ją Microsoft ze swoimi często nieudanymi tłumaczeniami na polski terminów angielskich. Trudno używać terminów, które są niezgodne, bo utraci się porozumienie.

Terminy powinny być przede wszystkim jednoznaczne. Jeśli jest jakiś termin ogólny np. "nazwa arkusza", który nie jest jednoznaczny, to określenia szczegółowe powinny obejmować to określenie ogólne + jakiś dodatek wyróżniający np. "kodowa". To jest dość jednoznaczne i zgodne z angielskim 'code name'. Gorzej z tą nazwą alternatywną, bo krótkie określenie "nazwa arkusza" jest niejednoznaczne. Trzeba coś dodać, ale tu nie ma jakiegoś powszechnie przyjętego określenia. Niektórzy dodają "tekstowa" (bo w VBA jest tekstem), inni "zakładkowa" (tab name), nie wiadomo jak lepiej.

Terminy "nazwa klasy", czy "nazwa klasowa" nie bardzo mi odpowiadają, bo angażują nowe pojęcie klasy, które nie każdemu musi się właściwie kojarzyć.
ID posta: 433264 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1293 razy
Posty: 2639
Wysłany: 03-02-2024, 15:16   

Maćku tu nie chodzi o terminologię. tylko zrozumienie obiektowości w programowaniu.
to są wszystko moduły klas: Arkusz1, Arkusz2 ...
gdzie Arkusz1 to nazwa klasy, a CodeName - to własność tej klasy (ReadOnly), która zwraca nazwę klasy
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 433266 Skopiuj do schowka
 
 
Rafał B. 
ExcelSpec



Wersja: Win Office 2021
Pomógł: 91 razy
Posty: 524
Wysłany: 03-02-2024, 15:18   

Maciej Gonet napisał/a:
Chodziło mi o to, że w konstrukcji z Array:...


Racja, wszystko jasne. Po prostu przeoczyłem brak cudzysłowu przy Arkusz1 etc. Na marginesie wygląda na to, że oba poniższe wywołania działają, chociaż to drugie wygląda dość "rekurencyjnie" ;)

Kod:
Set Grupa = Sheets(Array(Arkusz1.Name, Arkusz3.Name))
Set Grupa = Sheets(Array(Arkusz1.CodeName, Arkusz3.CodeName))



master_mix napisał/a:
tak na marginesie:
wiem że przyzwyczajeni jesteśmy używać określeń: nazwa arkusza i kodowa nazwa arkusza.
Ale jak już ktoś chce być bardzo "purystą" (jak to mnie kiedyś wyzwał Rafał :D)
to powinno się używać określeń: Nazwa Arkusza, Nazwa Klasy arkusza ewentualnie nazwa obiektu arkusza ;-)

Nigdy o tym nie myślałem, ale wygląda słusznie! Tym bardziej, że w oczywisty sposób tłumaczy dlaczego nazwa kodowa aka nazwa obiektu arkusza determinowana jest w czasie "compile-time", a nazwa arkusza "run-time".

Chociaż to pierwsze to też chyba bardziej jakaś referencja, bo wiemy że .codeName tez możemy zmienić na dwa sposoby.
_________________
W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc.
ID posta: 433267 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 365
Pomógł: 537 razy
Posty: 2175
Wysłany: 03-02-2024, 15:35   

Ja mogę zaproponować nazwę: "arkuszowa nazwa arkusza", widać ją w arkuszu na tzw. zakładce w odróżnieniu od "kodowa nazwa arkusza", nie zobaczymy jej w arkuszu, zobaczymy ją w VBA. Terminologia we wszystkich dziedzinach stanowi problem, najczęściej sztucznie wywołany, np. w elektrotechnice nazwa: "prądnica prądu stałego" bo to czy jest to prąd stały decyduje nie tylko prądnica ale przede wszystkim obciążenie. W przypadku Excela tak jak wcześniej napisał Maciej jeszcze dochodzi terminologia Microsoftu, jego dziwne tłumaczenia i brak konsekwencji np. MAX i MAKS w nazwach funkcji arkuszowych.
ID posta: 433268 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 3616 razy
Posty: 10635
Wysłany: 03-02-2024, 15:52   

Rafał B. napisał/a:
oba poniższe wywołania działają ...
Set Grupa = Sheets(Array(Arkusz1.CodeName, Arkusz3.CodeName))

Tylko pod warunkiem, że obie nazwy: kodowa i zakładkowa są takie same.
Kod:
Arkusz1.CodeName
jako wartość właściwości jest testem tak samo jak
Kod:
Arkusz1.Name
Jeśli oba teksty są przypadkiem identyczne, to wygląda jakby działało. Ale jeśli nie są identyczne to jest 'Subscript out of range'.
ID posta: 433269 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1293 razy
Posty: 2639
Wysłany: 03-02-2024, 16:04   

Maciej Gonet napisał/a:
Tylko pod warunkiem, że obie nazwy: kodowa i zakładkowa są takie same.

To jeszcze raz: tak naprawdę nie ma nazwy kodowej, tutaj na forum przyjęło się takie nazewnictwo i każdy użytkownik forum (prawie każdy) wie o co chodzi.
Maciej Gonet napisał/a:
Tylko pod warunkiem, że obie nazwy: kodowa i zakładkowa są takie same.

No bo tak jak mówiłem CodeName to jest własność która zwraca typ danych String
Więc jak nazwa klasy arkusza jest inna, np ark1 to :
Set Grupa = Sheets(Array(ark1.CodeName,ark3.CodeName)) jest tożsame z
Set Grupa = Sheets(Array("ark1","ark3")), a takich nazw arkuszy nie ma w skoroszycie ("nazw zakładkowych")
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 433270 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1293 razy
Posty: 2639
Wysłany: 03-02-2024, 16:11   

Tak to jest zbudowane:
moduł klasy:
Kod:
Private mName As String

Public Property Get CodeName() As String
    CodeName = TypeName(Me)
End Property

Public Property Get Name() As String
    Name = mName
End Property

Public Property Let Name(Name As String)
    mName = Name
End Property


i teraz uzyjcie tej klasy w kodzie modyfikując dowolnie nazwę klasy
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 433271 Skopiuj do schowka
 
 
Rafał B. 
ExcelSpec



Wersja: Win Office 2021
Pomógł: 91 razy
Posty: 524
Wysłany: 03-02-2024, 16:30   

Maciej Gonet napisał/a:
Rafał B. napisał/a:
oba poniższe wywołania działają ...
Set Grupa = Sheets(Array(Arkusz1.CodeName, Arkusz3.CodeName))

Tylko pod warunkiem, że obie nazwy: kodowa i zakładkowa są takie same.


Racja :oops:

Co do przykładowego odgadnięcia implementacji master_mixa brakuje jeszcze czegoś w stylu:
Kod:
Private Property Let CodeName(CodeName As String)


i jakichś czarów dla obsługi użycia tej właściwości ("hidden membera") w kodzie
Kod:
ws.[_CodeName] = "newCodeName"
_________________
W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc.
ID posta: 433272 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1293 razy
Posty: 2639
Wysłany: 03-02-2024, 16:48   

Rafał B. napisał/a:
dla obsługi użycia "hidden membera"


Nazwy klasy NIE zmienisz bo nazwa jest zdefiniowana w momencie kompilacji,
W ten sposób możesz jedynie symulować zmianę nazwy klasy ustawionej w prywatnej zmiennej , ale to już nie nazwa klasy, tylko prywatne pole byłoby.
Reasumując: NAZWY KLASY nie da się zmienić kodem

p.s.
chyba umknęło Ci
Kod:
Public Property Get CodeName() As String
    CodeName = TypeName(Me)
End Property
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 433273 Skopiuj do schowka
 
 
Rafał B. 
ExcelSpec



Wersja: Win Office 2021
Pomógł: 91 razy
Posty: 524
Wysłany: 03-02-2024, 17:08   

Być może mówisz o czymś bardziej niskopoziomowym, ja mówię o czymś takim

Kod:
Public Sub test()

    Dim ws As Worksheet
    Set ws = Arkusz1

    Debug.Print ws.CodeName ' >>  Arkusz1

    ws.[_CodeName] = "nowaNazwa"
   
    Debug.Print ws.CodeName  ' >>  nowaNazwa
   
    Debug.Print Arkusz1.CodeName  ' >>  nowaNazwa
   
End Sub


Co pokazuje, że Property Get CodeName() też zwraca jakąś zmienną wewnętrzną analogicznie do Property Get Name. Stosując analogię nazwijmy ją `mCodeName`, a w pierwszym momencie przypisuje do niej wartość stałej "Arkusz1". Ale przez ukryty `Private Property Set CodeName` wyeksponowany tylko w postaci "hidden member" (to odwołanie .[_CodeName]) można zmienić oczywiście nie stałą `Arkusz1`, ale tę zmienną wewnętrzną `mCodeName`.

No chyba że jest tu jakiś mój brak zrozumienia jak "pod maską" działa TypeName z biblioteki VBA i tutaj są jakieś czary, dlatego się nie upieram :mrgreen:
_________________
W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc.
ID posta: 433275 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona uĹźywa plikĂłw cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przegl�darce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe