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: 67920 Skopiuj do schowka Własne makro w pasku okna pisania makr
Autor Wiadomość
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 22-04-2020, 09:07   Własne makro w pasku okna pisania makr

Witajcie

Szukam, szukam i znaleźć nie mogę.

Mam np. makro Lastrow
Kod:
Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row

Wiadomo co robi.
Pisanie go za każdym razem zajmuje chwilę.

Mamy okno tam gdzie piszemy nasze makra, u góry belka z jakimiś narzędziami podstawowymi.
Jak dodać guzik/listę rozwijaną, który/a po kliknięciu doda mi do okna pisania makra ww. makro?

Są gotowe płatne rozwiązania np. VBA Code Generator - Automate Excel

Takiego kombajnu nie potrzebuję, ale kilka często powtarzających się makr dodał bym do tej belki.

Proszę o jakiś Tutoriale, krok po kroku jeśli macie takie coś.
ID posta: 386125 Skopiuj do schowka
 
 
Zbiniek 
Excel Expert



Zaproszone osoby: 2
Wersja: Win Office 2013
Pomógł: 417 razy
Posty: 2677
Wysłany: 22-04-2020, 12:06   

Może źle szukasz? :-)

Zerknij -> http://www.excelforum.pl/...vba-vt19520.htm
_________________
pozdrawiam
Zbiniek

Pisz po polsku! Jest różnica czy siedzisz w sadzie czy w sądzie. "Język polski jest ą-ę" :-)

Prawdopodobieństwo otrzymania satysfakcjonującej odpowiedzi jest proporcjonalne do właściwego sformułowania problemu (popartego załącznikiem).

Jest załącznik - jest impreza

http://rtfm.killfile.pl/
ID posta: 386140 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 22-04-2020, 14:21   

Zbiniek,
Nadal nie wiem.
Patrzyłem na temat który podałeś już kilka razy, i widzę tam tylko "VBA RC Toolkit Add-in".

Czytałem pobieżnie to co tam jest, są niby gotowe rozwiązania, ale to nadal jakieś kombajny.

No nic, jakoś ogarne.
ID posta: 386151 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 23-04-2020, 00:23   Re: Własne makro w pasku okna pisania makr

stingtanner napisał/a:

Mam np. makro Lastrow
Kod:
Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row

Jak dodać guzik/listę rozwijaną, który/a po kliknięciu doda mi do okna pisania makra ww. makro?

Masz prosty dodatek.

Uwaga:

1. File -> Options -> Trust Center -> Trust Center Setting ... -> Macro Setting -> zaznacz "Trust access to the VBA project object model" -> OK -> OK

2. projekt ma dołączoną referencję do "Microsoft Visual Basic for Applications Extensibility ...".

3. kliknij w miejscu, gdzie trzeba wstawić tekst

Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row


i wybierz z menu "Operacje VBE" pozycję Dodaj kodu "ostatni wiersz"

myAddin.xlam
Pobierz Plik ściągnięto 24 raz(y) 15.95 KB

ID posta: 386186 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 23-04-2020, 09:29   

apollo, Dzięki
Otwieram ten pliczek, wszystko działa jak opisałeś.

Ale teraz jak bym chciał dodać coś nowego, to rozumiem że trzeba kopiować co nieco, zmieniać nazwy, a w miejsce aktualnie wstawianego kodu wpisać swój.
To jeszcze chyba ogarnę, ale widzę że jak zacznę sobie tworzyć nowe rzeczy to powstanie tam ogromna ilość kodu, która później może być ciężka w ogarnięciu, gdzie co jest.

Jakoś przydało by się to posegregować.

Dodałem też Add-In z tego opisu:
https://www.automateexcel.com/vba/install-add-in

I teraz jak dobrze rozumiem, za każdym razem gdy otworzę jakikolwiek plik, lub stworzę nowy to zostanie dodany ten dodatek. Będzie też dodawany VBAProject(myAddin.xlam).

Czy taki dodatek, który z czasem urośnie w siłę, spowalnia mocno pracę jeśli chodzi o obciążenie procesora?
ID posta: 386198 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 23-04-2020, 10:22   

stingtanner napisał/a:
apollo, Dzięki
Otwieram ten pliczek, wszystko działa jak opisałeś.

Ale teraz jak bym chciał dodać coś nowego, to rozumiem że trzeba kopiować co nieco, zmieniać nazwy, a w miejsce aktualnie wstawianego kodu wpisać swój.

Nic nie rozumem z tego, co napisałeś.
Cytat:

I teraz jak dobrze rozumiem, za każdym razem gdy otworzę jakikolwiek plik, lub stworzę nowy to zostanie dodany ten dodatek. Będzie też dodawany VBAProject

Jaki plik? Dodajesz dodatek tylko raz.

Ja wstawiam 1 pozycję menu, która robi 1 rzecz. Teraz chcesz wstawić np. 3 pozycje menu, które robią 3 różne rzeczy? No to podaj te 3 nazwy menu, i napisz, co ma robić każda pozycja menu. Napiszę jeszcze raz dla 3 pozycji. Potem dodanie kolejnych pozycji to kwestia naśladowania.
ID posta: 386201 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 23-04-2020, 14:20   

Cytat:
Potem dodanie kolejnych pozycji to kwestia naśladowania.

W sumie to o to mi chodziło w moim poście

Cytat:
Jaki plik? Dodajesz dodatek tylko raz.

Tu też o to mi chodziło.

Sorki coś ciężko dzisiaj z komunikacją.

Cytat:
Napiszę jeszcze raz dla 3 pozycji

Nie chcę abyś za każdym razem pisał/dokładał to co tam będzie mi potrzebne.
Ja chcę się tego nauczyć i robić sam :)

Potrenuję to co mi dałeś teraz, zobaczę jak będzie mi szło. W razie problemów na pewno będę pisał.
ID posta: 386226 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 24-04-2020, 10:31   

apollo,
Możesz mi zrobić kod, w którym będą 2 rzeczy do wyboru z menu, może to być np. x2 lastrow.
Chciał bym zobaczyć jak dodajesz nowy element do menu, bo nie mogę sobie poradzić z tym.
ID posta: 386272 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 24-04-2020, 13:07   

stingtanner napisał/a:
apollo,
Możesz mi zrobić kod, w którym będą 2 rzeczy do wyboru z menu, może to być np. x2 lastrow.
Chciał bym zobaczyć jak dodajesz nowy element do menu, bo nie mogę sobie poradzić z tym.

W Sheet1 od wiersza 2:
- kolumna A: tekst pozycji menu
- kolumna B: nazwa makra, które zostanie uruchomione po wybraniu pozycji menu.

Żeby zobaczyć sheet1 zmień na chwilę ThisWorkbook.IsAddin na FALSE

AddinVBEMenu.xlam
Pobierz Plik ściągnięto 25 raz(y) 18.18 KB

ID posta: 386289 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 25-04-2020, 16:53   

apollo,
Dziękuję bardzo, działa :)

Mały Upgrade, aby nie musieć bawić się więcej w kodzie:
Kod:
Public Function AddMenuVBE()
Dim k As Long, myBar As Object, MenuItem As CommandBarControl
Dim wb As Workbook, ws As Worksheet
Set wb = Workbooks("AddinVBEMenu.xlam")
Set ws = wb.Sheets("Sheet1")

Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    On Error Resume Next
   
    DeleteMenuVBE
   
    Set myBar = Application.VBE.CommandBars(1).Controls.Add(msoControlPopup)
   
    With myBar
        .Caption = MenuName
        .Tag = AddinName
    End With
    ReDim MenuEvent(1 To LastRow - 1)
    For k = 1 To LastRow - 1
        Set MenuItem = myBar.Controls.Add(msoControlButton)
        Set MenuEvent(k) = New clsVBECommandHandler
        With MenuItem
            .Caption = Sheet1.Range("A" & k + 1).Value
            .OnAction = "'" & ThisWorkbook.Name & "'!" & Sheet1.Range("B" & k + 1).Value
        End With
        Set MenuEvent(k).EvtHandler = Application.VBE.Events.CommandBarEvents(MenuItem)
    Next k
End Function
ID posta: 386359 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
Wysłany: 27-04-2020, 02:12   

stingtanner, może przypasuje.

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 386418 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 29-04-2020, 07:41   

Artik,
Dziękuję za pomoc przy uruchomieniu dodatku, który podajesz w linku. Po wielu próbach i kombinacjach udało się :)

Testowałem jedno i drugie rozwiązanie, i doszedłem do kilku wniosków.
Rozwiązanie które podał apollo, jest na tą chwilę dla mnie szybsze.
Faktem jest, że trzeba troszkę więcej pracy włożyć, aby stworzyć nowy wpis w rozwijanym menu, ale właśnie to rozwijane menu robi robotę. Klikasz wybierasz i jest.

Twoja propozycja Artik, jest pod wieloma względami ciekawsza, ale znacznie wolniejsza.
Klik ikonka -> wybór grupy -> wybór makra -> dodanie. Dwa razy więcej akcji.

Aby nie być do końca krytycznym, wpadłem na pomysł :)
Może by tak połączyć te 2 rozwiązania ze sobą.

Twój Artik, sposób dodawania nowych fragmentów kodu (który jest super), z szybkim menu od apollo :)

W rozwijanym menu mielibyśmy dostęp do grup/kategorii, a w podmenu już konkretne odnośniki, które wstawiały by fragmenty kodu.
Jeśli chcieli byśmy dodać, edytować, usunąć no to wiadomo ikonka z plusikiem :)

Jak myślicie, jest takie połączenie możliwe?
ID posta: 386582 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 29-04-2020, 11:49   

apollo,
Z tego wszystkiego zapomniałem napisać, że podany przez Ciebie kod ma wadę.

Dodaj np. "Application.ScreenUpdating = False" (z załącznika), wskoczą ci 2 linie, zrób Enter pomiędzy nimi i spróbuj dodać coś innego. Nie da się.
Można dodawać tylko, gdy mamy kursor na samym końcu kodu. Można to zmienić?

AddinVBEMenu.xlam
Pobierz Plik ściągnięto 23 raz(y) 21.2 KB

ID posta: 386606 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2940 razy
Posty: 9729
Wysłany: 29-04-2020, 15:33   

Na razie odniosę się do Twojego upgrade-u.
Ktoś, kto wielokrotnie budował menu wie, że przed utworzeniem nowego należy najpierw stare usunąć. Tak więc usunięcie powinno być pierwszą czynnością po deklaracji zmiennych. Tu pokażę po tej poprawce, acz jeszcze będą zastrzeżenia do tego fragmentu
Kod:
Public Function AddMenuVBE()
    Dim k As Long, myBar As Object, MenuItem As CommandBarControl
    Dim wb As Workbook, ws As Worksheet
    Dim LastRow     As Long
   
    DeleteMenuVBE
   
    On Error Resume Next

    Set wb = Workbooks("AddinVBEMenu.xlam")
    Set ws = wb.Sheets("Sheet1")

    LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row


    Set myBar = Application.VBE.CommandBars(1).Controls.Add(msoControlPopup)
(...)
To, o czym przed chwilą powiedziałem jest tylko stylem programowania, to nie jest błąd. Niemniej, jak pierwszy raz spojrzałem na tę funkcję, to musiałem nieco poszukać, czy jest usuwanie, czy ktoś zapomniał. Teraz od razu widzę, że jest. :-)
Deklarujesz i używasz zmiennej ws. I dobrze. Ale bądź konsekwentny. W całej procedurze powinna ona występować w odpowiednich miejscach, a nie, jak jest teraz, do Sheet1 raz odwołujesz się przez zmienną, a innym razem przez nazwę kodową.
Cytat:
Kod:
    Set wb = Workbooks("AddinVBEMenu.xlam")
Nigdy w życiu!
Jak już to
Kod:
    Set wb = ThisWorkbook
Jeszcze z 10 razy zmienisz nazwę pliku, zanim zostanie wdrożony do produkcji. I co? za każdym razem będziesz poprawiał kod? A jak zapomnisz?...
Cytat:
Kod:
Set ws = wb.Sheets("Sheet1")
to to samo co
Kod:
Set ws = Sheet1


Cytat:
Kod:
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Jeśli choć dwukrotnie musisz odwołać się do obiektu, to stosuj konstrukcję With...End With
Kod:
With ws
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
Nie szkodzi, że wygląda na dłuższe. Działa szybciej. O jakąś 1 ms, czy mniej. :-) Ale w pętlach, dużych pętlach, to już ma znaczenie.
Po prostu, wyrabiać nawyki.


Co do koncepcji połączenia dwóch pomysłów.
apollo na początku myślał, że będzie Ci chodziło o kilka stałych fragmentów gry. A tu apetyt urósł pod niebo. Trzeba zmienić koncepcję. Fragmenty kodu, które chcesz wstawiać, nie przechowywać w kodzie, tylko w arkuszu. Do wstawiania użyjesz bardzo podobnej procedury do insert_code_lastRow czy insert_create_dictionary. Ale będzie tylko jedna, obsługująca wszystkie fragmenty.

Ćwicz, ćwicz. Jakby co, pytaj. Ja Ci teraz nie zbuduję nowego, bo i tak parę dni poświęciłem na ten dodatek.

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 386635 Skopiuj do schowka
 
 
stingtanner
Stały bywalec Excelforum


Wersja: Win Office 2019
Pomógł: 2 razy
Posty: 383
Wysłany: 29-04-2020, 17:03   

Artik,
Jak zawsze dziękuję za cenne rady, dużo pytam aby właśnie nabrać dobrych nawyków.

Wprowadziłem poprawki, które pokazałeś. Nie wiedziałem że mogę zastosować "Set wb = ThisWorkbook" w tym przypadku, bo skoroszyt z dodatkami za każdym razem jest ładowany do nowego skoroszytu, stąd takie a nie inne deklarowanie.
Teraz sobie uświadomiłem, że modyfikując kod dodatku wprowadzam zmiany w jego skoroszycie. Logiczne :)

Zadałem też wyżej pytanie:
Cytat:
Dodaj np. "Application.ScreenUpdating = False" (z załącznika), wskoczą ci 2 linie, zrób Enter pomiędzy nimi i spróbuj dodać coś innego. Nie da się.
Można dodawać tylko, gdy mamy kursor na samym końcu kodu. Można to zmienić?

Udało mi się samemu odpowiedzieć na to pytanie. Sposób działa, ale nie wiem czy nie ma lepszego rozwiązania.


Kod zmodyfikowałem o taką linie:
Kod:
If startLine >= myModule.CodeModule.CountOfDeclarationLines + 1 < myModule.CodeModule.CountOfDeclarationLines + 1 Then


Myślę też o modyfikacji, aby kod wstawiać w arkusz, tak jak piszesz bo chciał bym stworzyć podział na kategorie i podgrupę. Teraz zrobiłem prowizorkę.
Widzę to tak:
Operacje VBE:
Ogólne -> jakieś cosie ko kliknięciu
Kolejna kategoria -> ...
itd.
Powoli się uda :)

Cytat:
Ja Ci teraz nie zbuduję nowego, bo i tak parę dni poświęciłem na ten dodatek.

Nawet nie oczekuję tego od Ciebie. Po prostu podczas testów, chciałem się z Wami podzielić swoimi spostrzeżeniami ;-)
ID posta: 386645 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.marketingNET.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