ID tematu: 75511
 |
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
|
|
|
 |
|
|
|
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 |
_________________ 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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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.
jako wartość właściwości jest testem tak samo jak
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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
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
|
|
|
 |
|
|
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
|
|
|
 |
|
|
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 |
_________________ 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
|
|
|
 |
|
|
|
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
|
|
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
|