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ę.
Błąd wykonania makra po wywołaniu z przycisku.[SOLVED]
Błąd wykonania makra po wywołaniu z przycisku.[SOLVED]
Ostatnio zmieniony czw wrz 06, 2018 8:28 am przez RapH, łącznie zmieniany 1 raz.
Apache Open Office 4.1.5
Re: Błąd wykonania makra po wywołaniu z przycisku.
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.
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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Błąd wykonania makra po wywołaniu z przycisku.
"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
- 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
Apache Open Office 4.1.5
Re: Błąd wykonania makra po wywołaniu z przycisku.
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.
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.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Błąd wykonania makra po wywołaniu z przycisku.
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ć:
I zadziałało.
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
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Re: Błąd wykonania makra po wywołaniu z przycisku.
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.Jermor pisze:I zadziałało.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Błąd wykonania makra po wywołaniu z przycisku.
Dzięki Jemor!!! Pomogłeś !!!
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 i problem rozwiązany.
... internet byłby lepszy
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 i problem rozwiązany.
... internet byłby lepszy
Apache Open Office 4.1.5