Problem z makrem wstawiającym wartości i druk po każdej !!!

Makropolecenia i funkcje w języku Basic
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: rafal_sosz »

Witam wszystkich,

Potrzebuję pomocy w być może prostej sprawie o której poniżej, ale na wstępie mała prośba by odpowiedź na posta wysłać też mailowo na
adres rafal_sosz@interia.pl, ponieważ nie wszędzie mam możliwość sprawdzenia forum a maila tak.

Nie do końca wykonuje się nagrane makro.

Wstępnie dodam że pożądany efekt działania makra to:
1) ma wstawić w daną komórkę np $c$2 liczbę 1
następuje polecenie wydruku (zdefiniowanego wydrukiem arkusza)
w dalszej linii makro cofa się do powyższej komórki

dalej

2) ma wstawić w tą samą komórkę liczbę 2
następuje polecenie wydruku (zdefiniowanego wydrukiem arkusza)
w dalszej linii makro cofa się do powyższej komórki

dalej

3) ma wstawić w tą samą komórkę liczbę 3
następuje polecenie wydruku (zdefiniowanego wydrukiem arkusza)
w dalszej linii makro cofa się do powyższej komórki

itd... ma wstawiać i drukować arkusz po zmienianej wartości w komórce $c$2


EFEKT - na drukarce leżą 3 kartki papieru i na każdej wartość wpisana
kolejno 1, 2, 3


----------------------------------------------------------------------------------------------------------
Jest mi to niezmiernie potrzebne do szybkiego drukowania list obecności dla
ok 100os (czyli będzie wstawiał wartości od 1 do 100)

Nigdy nie miałem do czynienia z VB, dlatego próby zmian w kodzie nie
wychodzą niestety :(
Załączam takie działanie jak wyżej (3 punkty) podczas nagrania makro:
Po wykonaniu makra drukuje tylko 1 pierwszą stronę z wartością 1 :( !!

z góry dzięki za pomoc!

Kod: Zaznacz cały

REM  *****  BASIC  *****


sub druk1
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = "1"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Printer"
args3(0).Value = "Canon iP1700"

dispatcher.executeDispatch(document, ".uno:Printer", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Copies"
args4(0).Value = 1
args4(1).Name = "Collate"
args4(1).Value = true

dispatcher.executeDispatch(document, ".uno:Print", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$C$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "StringName"
args6(0).Value = "2"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args6())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())

rem ----------------------------------------------------------------------
dim args8(1) as new com.sun.star.beans.PropertyValue
args8(0).Name = "Copies"
args8(0).Value = 1
args8(1).Name = "Collate"
args8(1).Value = true

dispatcher.executeDispatch(document, ".uno:Print", "", 0, args8())

rem ----------------------------------------------------------------------
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$C$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())

rem ----------------------------------------------------------------------
dim args10(0) as new com.sun.star.beans.PropertyValue
args10(0).Name = "StringName"
args10(0).Value = "3"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args10())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())

rem ----------------------------------------------------------------------
dim args12(1) as new com.sun.star.beans.PropertyValue
args12(0).Name = "Copies"
args12(0).Value = 1
args12(1).Name = "Collate"
args12(1).Value = true

dispatcher.executeDispatch(document, ".uno:Print", "", 0, args12())

rem ----------------------------------------------------------------------
dim args13(1) as new com.sun.star.beans.PropertyValue
args13(0).Name = "By"
args13(0).Value = 1
args13(1).Name = "Sel"
args13(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args13())


end sub
===========================================================================

--
Ostatnio zmieniony ndz lut 28, 2010 1:12 am przez quest-88, łącznie zmieniany 1 raz.
Powód: Dodanie BBCode
OpenOffice 3.0 na Windows Vista
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: Jan_J »

Po pierwsze, zamiast nagrywać makro, użyj pętli

Kod: Zaznacz cały

for i = 1 to 100
  przygotuj arkusz z wartością i
  wydrukuj arkusz
next i
Procedurę drukowania zakresu dostaniesz np. w nieocenionym AndrewMacro A. Pitonyaka, w rozdziale 6.24.
Zatem

Kod: Zaznacz cały

sub test()

rem pracujemy na bieżącym skoroszycie
doc = thisComponent

rem usuwamy istniejące zakresy wydruku z dokumentu
For i = 0 to doc.Sheets.Count() - 1
    ark = doc.Sheets.getByIndex(i)
    ark.setPrintareas(array())
next i

rem ustalamy co ma być drukowane
dim wydruk(0) as new com.sun.star.table.CellRangeAddress
wydruk(0).startColumn = 0
wydruk(0).startRow = 0
wydruk(0).endColumn = 10
wydruk(0).endRow = 10

rem pracujemy na aktywnym arkuszu tego skoroszytu
ark = doc.currentController.getActiveSheet
ark.setPrintAreas(Wydruk())

rem liczba powtórzeń
n = 10

rem b2 na tym arkuszu -- nadajemy wartości i drukujemy w pętli
kom = ark.getCellByPosition(1,1)
for i = 1 to n
  kom.setValue(i)
  doc.Print(Array())
  wait(2000)       ' żeby wysłanie do drukarki zdążyło przed następną zmianą
next i

end sub
Testowałem, działa out of the box.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: rafal_sosz »

Przede wszystkim dzięki za chęć udzielenia pomocy!
Po wklejeniu kodu, wykonuje pętle n razy ale do druku idzie niestety jedna trona,
(efekt taki jak w makro, które nagrałem)

a mi chodzi o to by bo każdej wykonanej pętli generował polecenie druku.
pozdrawiam i skromnie liczę na dalszą pomoc :)
Rafał
OpenOffice 3.0 na Windows Vista
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: Jan_J »

Toż powinno drukować. W pętli powtarzamy n razy: wpisz do komórki, drukuj. W kolejce drukowania mam n dokumentów, i wychodzą po kolei.

Sprawdziłem też pod Windowsem, na drukarce PDFCreator, i co?
Drukuje się tyle kopii ile żądam, ale niektóre wartości się powtarzają. Podejrzewam, że komunikacja z drukarką nie nadąża w czasie kiedy dokument jest modyfikowany.
Dodałem po Print() polecenie Wait(2000) i już jest OK. Prawdopodobnie można tę wartość (2 sekundy) zmniejszyć.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: rafal_sosz »

!!!!!!!
Oooo to pomogło, wystarczyła jedna komenda :),
Mam to co chciałem!
Jestem ogromnie wdzięczny za pomoc, mam nadzieję post przyda się wielu osobom mającym do czynienia z "auto drukiem" arkuszy kalkulacyjnych,
Dzięki Panu nabrałem ochoty na naukę VB w oparciu o pakiety biurowe, bo nawet mogę nie wiedzieć i nie wiem co można wykonać znając ten język.
Jeszcze raz ogromne dzięki.
pozdrawiam serdecznie
OpenOffice 3.0 na Windows Vista
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: rafal_sosz »

...mam jeszcze jedno pytanko,

czy istnieje możliwość dodania do kodu linii w której:
nastąpi pobranie z komórki z arkusza wartości liczbowej?
będzie to też ułatwienie w przypadku gdy liczba pętli będzie się zmianiała.

np. w arkuszu roboczym komórka $R$1 będzie zawierała wartość 60 (porządana liczba pętli)
i chciałbym by właśnie ta linijka ściągała z tej komórki tę wartość, by tyle pętli program wykonał.

bo na tą chwilę z palca należy zmienić w kodzie wartość dla n, fajnie by było to zautomatyzować

pozdrawiam
OpenOffice 3.0 na Windows Vista
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: Jan_J »

n = ark.getCellByPosition(kolumna, wiersz).getValue
ark jest uchwytem do arkusza na którym ta dana jest wpisana. Pamiętaj,że kolumny i wiersze są numerowane od zera.
Inna możliwość to okno dialogowe pytające o liczbę powtórzeń.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Re: Problem z makrem wstawiającym wartości i druk po każdej !!!

Post autor: rafal_sosz »

Super!!! wielkie dzięki,
wszystko działa.
pozdrawiam
OpenOffice 3.0 na Windows Vista
rafal_sosz
Posty: 6
Rejestracja: sob lut 27, 2010 9:13 pm

Re: Problem z makrem wstawiającym wartości i druk po każdej

Post autor: rafal_sosz »

Witam,
Jak to temat lubi wrócić po latach :)

Zwrócę się jeszcze raz o pomoc tym razem chodzi o to samo ale pod MS Excel.
Kod dobrze działał na OO a w MS Excel zakreśla mi (czy to błąd) na linii:
Dim wydruk(0) As New com.sun.star.Table.CellRangeAddress

...nie wiem może dla Excela powinien być jakiś inny kod.

Oczywiście nadal nie znam VBa :( może kiedyś przyjdzie czas na szkolenia?

Mam nadzieję, że uda się pomóc raz jeszcze po 5 latach.
Jeśli mogę ponownie prosić o odp. na maila rafal_sosz@interia.pl

pozdrawiam
Rafał
OpenOffice 3.0 na Windows Vista
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Problem z makrem wstawiającym wartości i druk po każdej

Post autor: Jan_J »

Musi być inny kod bo API aplikacji jest inne, nawet gdyby sam język był ten sam albo podobny.
Excel nie wie co to jest com.sun.star itd. Struktur danych Excela nie używam na codzień; były tam zdaje się obiekty Range: Dim ... As Range.
Na działanie tego samego kodu w Calcu i Excelu bym nie liczył.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ