[VBA] Powtórz makro za pomocą ENTER


Rekomendowane odpowiedzi

Witam, stworzyłem kilka mniejszych programików w VBA, każdy ma swoją ikonkę, która otwiera odpowiednie makro. Wszystko działa.

Przydatne byłoby jednak, aby po użyciu makro, powtórzyć je klawiszem ENTER, jak inne komendy Zwcada. Niestety poleceniem otwierającym dane makro po kliknięciu ikonki jest "-vbarun" a program pyta o nazwę makra VBA. Czytałem, że da się to zrobić jedynie przez Lisp, ale nikt nie wytłumaczył tego w prosty sposób. Łącznie z ustawieniem skrótu dla ikonki.

Odnośnik do komentarza
Udostępnij na innych stronach

OK, poradziłem sobie w ten sposób:

1. Utworzyłem plik z rozszerzeniem hot.lsp a w nim:

(defun c:ZPP (/)
	(command "-VBARUN" "D:/Programy/vba/KonstruktorAP.zvb!ZP_plus.STR_ZP")
)
(command "ZPP")

2. Wciągnąłem plik hot.lsp w ZWCAD -> Narzędzia -> Wczytaj aplikacje

3. Utworzyłem też ikonkę w ZWCAD -> Narzędzia -> Dostosuj interfejs ->  i tam, gdzie wybiera się nazwę czy grafikę ikonki w polu Makro wpisałem "ZPP".

Efekt jest taki, że mogę w linii poleceń wpisać ZPP lub kliknąć w ikonkę aby wywołać makro. W celu wywołania go jeszcze raz, mogę kliknąć ENTER.

O to chodziło! Dzięki!

 

Odnośnik do komentarza
Udostępnij na innych stronach

No i pojawił się problem.

Program:

1. Otwiera UserForm

2. Z formularza można wyjść albo klikając button "Anluluj "lub "Rysuj"

3. W obydwu przypadkach się chowa UserForm.Hide, tylko w przypadku buttonu "Rysuj" każe użytkownikowi wybrać kilka punktów w modelu, po czym rysuje coś w modelu

4. Koniec. Program jest schowany i czeka na kolejne wywołanie.

Przez to, że kazał użytkownikowi wybrać punkty, po skończeniu procedury i kliknięciu ENTER Zwcad znowu pyta o nazwę makra. Co mogę z tym zrobić?

Odnośnik do komentarza
Udostępnij na innych stronach

OK, więc tak. Na początku ustawienia przycisku w ZWCAD w "Dostosuj Interfejs użytkownika"

1111.png

Jak już pisałem wcześniej mam utworzony skrót w poleceniu Makro: "ZPP". ZWCAD wie co otworzyć dzięki wspomnianemu już wcześniej lispowi wczytanego do programu:

(defun c:ZPP (/)
	(command "-VBARUN" "D:/Programy/vba/KonstruktorAP.zvb!ZP_plus.STR_ZP")
)
(command "ZPP")

Dzięki temu procesowi, ZWCAD otwierał makro z ikonki a po wykonaniu i zakończeniu prostych czynności, mogłem te makro otworzyć jeszcze raz ENTEREM.

W/w lisp otwiera mi oczywiście moduł o nazwie "ZP_plus" i procedurę "STR_ZP":

Sub STR_ZP()
frm_ZP.show
End Sub

frm_ZP jest to UserForm między innymi z buttonem o nazwie " b_draw"

Problem się pojawił, gdy moje makro wymaga od użytkownika dodatkowych czynności jak np. wskazanie punktów w modelu ZWCAD.

Private Sub b_draw_Click()

    frm_ZP.Hide
    
Dim PIERWSZY, DRUGI, TRZECI, CZWARTY As Variant
Dim Points(3) As Double
Dim Dlugosc As Integer
Dim FileToInsert As String
Dim punktyBlok(0 To 2) As Double
Dim skala, skalajednostki As Double


Dim BlockRef As ZcadBlockReference
Dim BlockAttributes As Variant

PIERWSZY = ThisDrawing.Utility.GetPoint(, "Podaj punkt P1 (początek pręta):")
DRUGI = ThisDrawing.Utility.GetPoint(PIERWSZY, "Podaj punkt P2 (koniec pręta):")
TRZECI = ThisDrawing.Utility.GetPoint(, "Podaj punkt P3 (poczatek rozkładu:")
CZWARTY = ThisDrawing.Utility.GetPoint(TRZECI, "Podaj punkt P4 (koniec rozkładu):")
    
If PIERWSZY(0) < DRUGI(0) Then
    'punkt P1 jest na lewo od P2
    Points(0) = PIERWSZY(0) - Int(txt_zakotwienie.Value) / skalajednostki
    Points(1) = PIERWSZY(1)
    Points(2) = DRUGI(0) + Int(txt_zakotwienie.Value) / skalajednostki
    Dlugosc = RoundUp(Points(2) - Points(0), Int(txt_zaokr.Value) / skalajednostki)
    Points(2) = Points(0) + Dlugosc
    Points(3) = PIERWSZY(1)
    punktyBlok(0) = (Points(0) + Points(2)) / 2 - 30 * skala: punktyBlok(1) = Points(1): punktyBlok(2) = 0
Else
    Points(0) = PIERWSZY(0) + Int(txt_zakotwienie.Value) / skalajednostki
    Points(1) = PIERWSZY(1)
    Points(2) = DRUGI(0) - Int(txt_zakotwienie.Value) / skalajednostki
    MsgBox Points(0) - Points(2)
    Dlugosc = RoundUp(Points(0) - Points(2), Int(txt_zaokr.Value) / skalajednostki)
    Points(2) = Points(0) - Dlugosc
    MsgBox Points(0) - Points(2)
    Points(3) = PIERWSZY(1)
    punktyBlok(0) = (Points(0) + Points(2)) / 2 - 30 * skala: punktyBlok(1) = Points(1): punktyBlok(2) = 0
End If

Set newlayer = ThisDrawing.Layers.Add("PRETY")
ThisDrawing.ActiveLayer = newlayer
    
Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(Points)
    ZcadPolyline.ConstantWidth = Int(cmb_srednica.Value) / WczytajSkale()(3)
  
Call ZapiszUstawienia(frm_ZP.Controls, "ZP_plus")

End Sub

Po tej procedurze moje okienko UserForm "frm_ZP" jest schowane (pierwsze linijki tekstu) i po skończeniu rysowania znajduję się już w modelu ZWCAD. Klikając ENTER w celu wywołania funkcji ZWCAD nie włącza jeszcze raz procedury o nazwie "ZP_plus" a co za tym idzie mojego UserForm, tylko pyta się o nazwę makra.

Dzięki za zaangażowanie, może uda się to szybko poprawić.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jak na moje oko (choć nie programuję na co dzień VBA) to powinno działać. Enter powinien powtórzyć ostatnią komendę czyli ZPP. Pod ikonkę w toolbarsie powinna być podpięta komenda z lispa czyli zpp.   

Sprawdź taki test. U mnie działa. Musisz tylko poprawić ścieżkę do pliku Project.zvb. Konfiguracja buttona w toolbarsie:

image.png.be0e63fbe895e16ec3bb08844ffc5852.png

 

project.lsp Project.zvb

Edytowane przez perlon
Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie