[VBA] Powtórz makro za pomocą ENTER


Recommended Posts

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.

Link to comment
Share on other sites

Może wystarczy command :

(defun c:nazwa_makra (/)
	(command "-VBARUN" "nazwa_makra")
)
(command "nazwa_makra")

Takie coś podpiąć pod toolbarsa i będzie powtarzalne po enterze

Tak na marginesie w wersji EN jest literówka :)

image.png.101b98fec7c0709a5cf1fd44b59cd5d4.png

Edited by perlon
Link to comment
Share on other sites

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!

 

Link to comment
Share on other sites

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ć?

Link to comment
Share on other sites

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ć.

 

Link to comment
Share on other sites

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

Edited by perlon
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share