automatyczne uzupełnianie i obliczenia

Nie wiesz, gdzie umieścić swój post? Pisz tutaj!
piotrekgp
Posty: 4
Rejestracja: wt lis 23, 2010 7:19 pm

automatyczne uzupełnianie i obliczenia

Post autor: piotrekgp »

Witam Wszystkich.

Właśnie kończę pisać pracę na uczelni. Promotor "troszkę" zmienił koncepcję i pojawił się problem.
Mam 3 dokumenty calc'a.
1 - dane wchodzące (dw)
2 - obliczenia (obl)
3 - wyniki dla założonych wartości (wyn)

W danych wchodzących miałem podaną moc jaką stałą. Teraz muszę przeprowadzić obliczenia dla podanego zakresu wartości mocy. Czyli ze stałej zrobiła mi się zmienna. Dla każdej mocy będę otrzymywać grupę wyników.

Jak mogę to zrealizować, aby podając zakres mocy, calc sam podstawiał kolejne wartości z zakresu do (dw). Wywoływał (obl). A następnie dla każdej mocy zapisywał w arkuszu w wynikach w kolejnych liniach wyniki. Jeśli jest to wszystko możliwe do zrealizowania oczywiście.

Dziękuję za pomoc.
OpenOffice 3.0, XP
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: automatyczne uzupełnianie i obliczenia

Post autor: Jan_J »

Obliczenia zapewne angażują wielokomórkowe zestawy danych pośrednich.
Makro z pętlą byłoby najprostsze. W pseudokodzie

Kod: Zaznacz cały

przygotuj obszar na wyniki
x = poczatkowa dana wejsciowa
dx = krok przyrostu danej wejsciowej
for i = 1 to liczba krokow
  wstaw x w odpowiednią komorkę
  odbierz y z komórki gdzie jest formuła wynikowa
  dopisz parę (x, y) do obszaru wyników
  zwiększ x o dx
koniec petli
opracuj wyniki
Konkrety zależą od przyjętych szczegółów technicznych. W razie czego pytaj.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
piotrekgp
Posty: 4
Rejestracja: wt lis 23, 2010 7:19 pm

Re: automatyczne uzupełnianie i obliczenia

Post autor: piotrekgp »

Kod: Zaznacz cały

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

Sub Main
oDocument=ThisComponent
oSheet=oDocument.Sheets.getByName("Arkusz1")
oCell=oSheet.getCellRangeByName("B2")
min=oCell.getValue 
oCell=oSheet.getCellRangeByName("B3")
max=oCell.getValue 
oCell=oSheet.getCellRangeByName("B4")
s=oCell.getValue 

for i=min to max

oCell=oSheet.getCellRangeByName("f2")
oCell.setValue (min)
min=min+s
i=i+s

	for j=8 to 20
	oCellRangeAddress.Sheet = 0
	oCellRangeAddress.StartColumn = 5
	oCellRangeAddress.StartRow = 1
	oCellRangeAddress.EndColumn = 5
	oCellRangeAddress.EndRow = 1
	oCellAddress.Sheet = 0
	oCellAddress.Column = 2
	oCellAddress.Row = j
	
	oSheet.copyRange(oCellAddress, oCellRangeAddress)
	
	next j

next i

End Sub
Mam problem z kodem. Min jest 10, max mam 100, skok czyli s w programie jest 10. Dane są pobierane z komórek. Macro powinno skończyć liczyć i wyświetlić wynik dla 100, wyświetla dla 90. Gdzie popełniłem błąd?
Także z kopiowaniem jest coś nie tak. Zamiast kopiować mi kolejne wyniki do kolejnych komórek, to zapisuje mi w wszystkich komórkach z wynikami ten sam wynik.

Dziękuję za pomoc.
OpenOffice 3.0, XP
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: automatyczne uzupełnianie i obliczenia

Post autor: Jan_J »

Kod: Zaznacz cały

Sub Main()

rem OK
oDocument=ThisComponent
oSheet=oDocument.Sheets.getByName("Arkusz1")

rem oCell=oSheet.getCellRangeByName("B2") itd.: można prościej
min = oSheet.getCellByPosition(1,1).getValue()
max = oSheet.getCellByPosition(1,2).getValue()
s = oSheet.getCellByPosition(1,3).getValue()

rem teraz pytanie: jak działa iteracja for?
rem i odpowiedż: sama aktualizuje zmienną kontrolną (która powinna mieć typ dyskretny, np. całkowity -- choć w Basicu niekoniecznie)
rem to wymaga oddzielenia wartości mocy od numeracji przebiegu pętli
rem np tak
moc = min ' moc jest bieżącą wartością parametru
for i=1 to n ' i jest licznikiem wykonań
  rem kilka pierwszych instrukcji bez zmian

  rem usunąć min = min+s
  rem usunąć i = i+s
  
  rem pętla wewnętrzna po j bez zmian -- wymaga modyfikacji adresów, patrz komentarz niżej

  rem to jest nowe:
  moc = moc + s
next i

End Sub
Zamiast kopiować mi kolejne wyniki do kolejnych komórek, to zapisuje mi w wszystkich komórkach z wynikami ten sam wynik.
Bo kopiujesz komórkę na blok. Zadbaj, by oba bloki miały ten sam rozmiar (tj różnice EndRow-StartRow, podobnie w kolumnach, muszą być jednakowe).
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
piotrekgp
Posty: 4
Rejestracja: wt lis 23, 2010 7:19 pm

Re: automatyczne uzupełnianie i obliczenia

Post autor: piotrekgp »

Kod: Zaznacz cały

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

   rem początek bez zmian
  
   z=max/s   'dodałem zmienną z do określenia liczby powtórzeń

    for i=1 to z  'zmieniłem min na 1 i dodałem z

    oCell=oSheet.getCellRangeByName("f2")
    oCell.setValue (min)
    min=min+s
    
rem skasowałem i=i+s
          
       oCellRangeAddress.Sheet = 0
       oCellRangeAddress.StartColumn = 5
       oCellRangeAddress.StartRow = 1
       oCellRangeAddress.EndColumn = 5
       oCellRangeAddress.EndRow = 1
       oCellAddress.Sheet = 0
       oCellAddress.Column = 2
       oCellAddress.Row = j
       
       oSheet.copyRange(oCellAddress, oCellRangeAddress)
       j=j+1 'dodałem do zmieniania na kolejne wiersze i skasowałem next j
       
    next i

    End Sub
Dziękuję za pomoc.
Faktycznie można prościej. Ale jednak zostawię tak jak było, aby łatwiej innym było zorientować się o co chodzi jak kod będą przeglądać. Problem z powtarzaniem tego samego wyniku był spowodowany przez pętlę w pętli. Mój błąd.
Mam jeszcze jedno pytanie.
W jaki sposób skopiować wynik z jednej komórki do drugiej aby skopiowanym wynikiem była liczba.
W komórce mam np. =A1+A2 Wynikiem będzie 10. Chcę aby skopiowało 10, a nie formułę. Jaką komendą to zrealizować?
OpenOffice 3.0, XP
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: automatyczne uzupełnianie i obliczenia

Post autor: Jan_J »

Za pomocą metod (get|set)(Value|String|Formula). tylko funkcje z Formula zajmują się formułami, pozostałe pobierają i przypisują wartości:
x = oCell.getValue()
oCell.setValue(x)
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
piotrekgp
Posty: 4
Rejestracja: wt lis 23, 2010 7:19 pm

Re: automatyczne uzupełnianie i obliczenia

Post autor: piotrekgp »

Nie napisałem dokładnie o co chodzi mi. :/
Makro będzie podstawiało wartość w jedno pole z danych wejściowych. Arkusz będzie wszystko przeliczał na formułach. Dla jednej danej będzie sprawdzana wartość czy spełnia wymagania. To już udało mi się rozwiązać i działa.
Wszystko działa w pętli.
Teraz pozostała kwestia w jaki sposób mogę skopiować wartość komórek (wartości liczbowe nie formuły) do innych komórek.
Czyli z komórek np. A1,B1,C1 do komórek A2,B2,C2, w następnej pętli A1,B1,C1 do A3,B3,C3. Komórki z wynikami się nie będą zmieniać. Będzie się zmieniać tylko kolejny wiersz dla wyników które będzie makro kopiować. To jest ostatni problem jaki mi został do rozwiązania.
OpenOffice 3.0, XP
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: automatyczne uzupełnianie i obliczenia

Post autor: Jan_J »

Sorry, ale mam wrażenie, że rozumiem, i że o tym właśnie piszę...
copyRange kopiuje jak leci. Użyj getValue, setValue, ale ona działają tylko na odrębnych komórkach. Czyli pętla wewnętrzna po kopiowanym zakresie komórek.
Albo wywołaj funkcję kontrolera uno:Copy z odpowiednimi opcjami, jakoś tak: http://www.oooforum.org/forum/viewtopic.phtml?t=26491. Jest to dość wredna składnia, ale właściwie ona jedyna zasługuje na nazwę `makro'.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ