Strona 1 z 1

Błąd wykonania makra po wywołaniu z przycisku.[SOLVED]

: czw sie 16, 2018 9:10 am
autor: RapH
Witam szanownych forumowiczów.

Mam pewien problem.
Podczas wywołania z przycisku oryginalnych makr z bibliotek makr OpenOffice

-Makra OpenOffice.Tools.Misc.ProtectSheets
-Makra OpenOffice.Tools.Misc.UnprotectSheets

wywala mi błąd " nie znaleziono właściwości lub metody: Count".
Jeśli jednak uruchamiam te makra myszką z pozycji edytora działanie przebiega pomyślnie.
Jaka jest różnica w sposobie wywołania i dlaczego nie chce działać z przycisku.
Proszę o wsparcie. Z góry dziękuję.

Re: Błąd wykonania makra po wywołaniu z przycisku.

: pn wrz 03, 2018 1:25 pm
autor: Jan_J
Tzw. "makro" tak naprawdę jest podprogramem, czyli nazwanym opisem pewnego złożonego działania. W dobrze zaprojektowanym podprogramie jego kod opisuje podejmowaną czynność, zaś przedmiot tej czynności jest przekazywany jako tzw. argument (albo parametr realny) wywołania.
Widocznie (i naprawdę również), w przypadku obu sposobów uruchamiania do podprogramu przekazywane są inne argumenty.

Pomyśleć logicznie: zabezpieczyć arkusze w skoroszycie -- W KTÓRYM?
z przycisku -- w bieżącym, tym który jest w bieżącym oknie
z edytora -- ???
no właśnie, taka decyzja projektowa zostałą podjęta, takie są różnice w realizacji wywołań.

Napisałem wyjaśnienie uproszczonym językiem, ale sądzę, że poprawnie oddaje to co się dzieje.

Re: Błąd wykonania makra po wywołaniu z przycisku.

: wt wrz 04, 2018 8:46 am
autor: RapH
"Pomyśleć logicznie: zabezpieczyć arkusze w skoroszycie -- W KTÓRYM?"
- nie wiem czy dobrze rozumiem ale chyba chodzi o podane konkretnego skoroszytu ewentualnie konkretnych arkuszy w skoroszycie.
Nie wiem niestety jak mam to zrobić.
Czy mógłbym prosić o rozwiązanie bezpośrednio w kodzie ?

(*skrypt oryginalny*)

Sub ProtectSheets(Optional oSheets as Object)
Dim i as Integer
Dim oDocSheets as Object
If IsMissing(oSheets) Then
oDocSheets = StarDesktop.CurrentFrame.Controller.Model.Sheets
Else
Set oDocSheets = oSheets
End If

For i = 0 To oDocSheets.Count-1
oDocSheets(i).Protect("")
Next i
MsgBox("Protected!!!")
End Sub

Re: Błąd wykonania makra po wywołaniu z przycisku.

: wt wrz 04, 2018 4:10 pm
autor: Jan_J
pomyśleć logicznie -- to element snucia narracji, a nie uderzenie w rozmówcę
zabezpieczyć akusze -- zdaje się jest to celem w.w. przykładu

chodziło mi o to, że przy niektórych sposobach uruchamiania makra z bieżącego kontekstu jasno wynika, co to jest "bieżący dokument", a przy innych jest to niejasne albo niemożliwe do ustalenia. Przynajmniej metodą, której używa się powszechnie.

Re: Błąd wykonania makra po wywołaniu z przycisku.

: śr wrz 05, 2018 9:04 pm
autor: Jermor
Ja także zauważyłem ten efekt. Nie jestem super biegły w makrach ale wydaje mi się, że rozwiązałem ten problem następująco.
Dodałem do pliku dwa makra "chron" i "niechron" i te makra podpiąłem pod przyciski. Mają taką postać:

Kod: Zaznacz cały

sub chron
GlobalScope.BasicLibraries.Loadlibrary("Tools")
ProtectSheets
end sub
Sub niechron
GlobalScope.basicLibraries.LoadLibrary("Tools")
UnprotectSheets
end Sub
I zadziałało.

Re: Błąd wykonania makra po wywołaniu z przycisku.

: śr wrz 05, 2018 10:46 pm
autor: Jan_J
Jermor pisze:I zadziałało.
Bo wywołując je z makra osadzonego w dokumencie mamy ustawioną zmienną ThisComponent, z której (zapewne) korzysta makro biblioteczne. Tak samo jest kiedy wywołujemy je przez menu w oknie z otwartym dokumentem. Zaś bezpośrednio z edytora już nie; możemy mieć otwartych fafnoście *innych* okien z dokumentami, gdzie fafnoście >= 0; który z nich byłby `bieżący`? już najbardziej kod skryptu, ale on nie jest arkuszem i nie ma jego właściwości.

Re: Błąd wykonania makra po wywołaniu z przycisku.

: czw wrz 06, 2018 8:26 am
autor: RapH
Dzięki Jemor!!! Pomogłeś !!!
:D
Ja też sobie poradziłem jakoś wcześniej używając i modyfikując inne makro biblioteczne i działa nieźle:

Sub ProtectCurrentSheets_ON()
Dim oDocument as Object
Dim sDocType as String
Dim iResult as Integer
Dim oSheets as Object
Dim i as Integer
Dim bDoProtect as Boolean
oDocument = StarDesktop.ActiveFrame.Controller.Model
sDocType = GetDocumentType(oDocument)
If sDocType = "scalc" Then
oSheets = oDocument.Sheets
bDoProtect = False
For i = 0 To oSheets.Count-1
If Not oSheets(i).IsProtected Then
bDoProtect = True
End If
Next i
If bDoProtect Then
iResult = Msgbox( "NA PEWNO CHCESZ ZABEZPIECZYĆ DOKUMENT",35, GetProductName())
If iResult = 6 Then
ProtectSheets(oDocument.Sheets)
End If
End If
End If
End Sub

Widać (podobnie jak u ciecie) że funkcja "ProtectSheets(oDocument.Sheets)" jest wywoływana tylko z odpowiednimi argumentami, pewnie dlatego działa. Podobnie dla odbezpieczenia z tą różnicą "If oSheets(i).IsProtected Then" + wywołanie " UnprotectSheets(oDocument.Sheets)"

Szkoda że nie wszyscy którzy mogli by pomóc od ręki rozwiązać problem nie chcą tego zrobić, jakieś enigmatycznie podpowiedzi nie wiem dla jakiego efektu, a czasem wystarczą 4 linie kodu :D i problem rozwiązany.
... internet byłby lepszy :fist: