Seite 1 von 1

Anfänger benötigt Unterstützung

Verfasst: Di, 22.03.2011 11:38
von Daniel1973
Hallo,

ich habe mir mit meinen bescheidenen Kenntnissen das folgende Script zusammengeschustert.
Das meiste habe ich dabei aus anderen Scripts aus dem Internet zusammengesetzt.

Das Makro funktioniert auch - aber sooooooo langsam.

Ziel das Scipts ist es die Zellen in Spalte 2 des 1. und 2. Tabellenblatts zu vergleichen. Wird hier ein Paar gefunden sollten die Zellen in den Spalten 3 verglichen werden. Wir auch hier ein Paar gefunden, soll der Wert in den Spalten 4 verglichen werden und bei einer Abweichung der Inhalt im 3. Tabellenblatt ausgegeben werden.

Wie gesagt: Es funktioniert. Ich bin mir aber sicher ich habe dies viel zu umständlich "programmiert" und es gibt eine Möglichkeit den Abgleich deutlich schneller durchzuführen.

Vorab vielen Dank für Eure Unterstützung.

Daniel

Code: Alles auswählen

Sub Zellen_vergleichen
Dim myDoc, mySheet_1, mySheet_i  as Object
Dim mycell_1, mycell_2, mycell_3, mycell_4, mycell_5, mycell_6, mycell_7 as String
Dim i, j, xy as integer
myDoc = thisComponent
Anzahl=myDoc.Sheets.count

      mySheet_1 = myDoc.Sheets(0)
      mySheet_i = myDoc.Sheets(1)
      xy=0
      
      for o = 1 to 100
        odoc=thiscomponent
        mysheet=odoc.sheets(3)
		mycell = mysheet.getCellByPosition(0,o) 
		mycell.string=""
		mycell = mysheet.getCellByPosition(1,o) 
		mycell.string=""
		mycell = mysheet.getCellByPosition(2,o) 
		mycell.string=""
		mycell = mysheet.getCellByPosition(3,o) 
		mycell.string=""
		mycell = mysheet.getCellByPosition(4,o) 
		mycell.string=""
      next o
      
      for j = 0 to 1000
      mycell = mysheet.getCellByPosition(9,0) 
	  mycell.string=j
      mycell_1 = mysheet_1.getCellByPosition(1,j).string
      mycell_3 = mysheet_1.getCellByPosition(3,j).string
      mycell_5 = mysheet_1.getCellByPosition(0,j).string
      mycell_6 = mysheet_1.getCellByPosition(2,j).string
  		for x = 0 to 10000
  		 mycell_2 = mysheet_i.getCellByPosition(1,x).string
  		 mycell_4 = mysheet_i.getCellByPosition(3,x).string
  		 mycell_7 = mysheet_i.getCellByPosition(2,x).string
  		  if mycell_1 = mycell_2 then
  		    if mycell_6 = mycell_7 then 
  		      if mycell_3 <> mycell_4 then
  		  	    xy=xy+1
                odoc=thiscomponent
                mysheet=odoc.sheets(3)
			    mycell = mysheet.getCellByPosition(0,xy) 
			    mycell.string=mycell_1
			    mycell = mysheet.getCellByPosition(1,xy) 
			    mycell.string=mycell_6
			    mycell = mysheet.getCellByPosition(3,xy)       
			    mycell.string=mycell_5   
			    mycell = mysheet.getCellByPosition(2,xy) 
			    mycell.string=mycell_3
			    mycell = mysheet.getCellByPosition(4,xy)       
			    mycell.string=mycell_4
			  end if
  		    end if
  		  end if
  		next x
      next j 
End Sub


Moderation,4: CODE tags gesetzt

Re: Anfänger benötigt Unterstützung

Verfasst: Di, 22.03.2011 13:50
von Stephan
Du darfst nicht einzelne Zellen lesen und scheiben sondern ganze Ranges. Statt:

Code: Alles auswählen

for o = 1 to 100
	odoc=thiscomponent
	mysheet=odoc.sheets(2)
	mycell = mysheet.getCellByPosition(0,o)
	mycell.string=""
	mycell = mysheet.getCellByPosition(1,o)
	mycell.string=""
	mycell = mysheet.getCellByPosition(2,o)
	mycell.string=""
	mycell = mysheet.getCellByPosition(3,o)
	mycell.string=""
	mycell = mysheet.getCellByPosition(4,o)
	mycell.string=""
next o

verwende z.B.:

Code: Alles auswählen

Dim tmp(4)

odoc=thiscomponent
myRange=odoc.sheets(2).getCellRangeByPosition(0,1,4,100)
werte = myRange.getDataArray()

for j = 0 to 4
	tmp(j) = ""
Next j

for o = 0 to 99 
	werte(o) = tmp()
Next o

myRange.setDataArray(werte())

das ist hier bei mir ca. 40-mal schneller.


siehe idl-Referenz:
http://api.openoffice.org/docs/common/r ... tDataArray



Anmerkung:
im Übrigen gehören bei oben zitierten Code natürlich die Zeilen:

Code: Alles auswählen

odoc=thiscomponent
mysheet=odoc.sheets(2)
nicht in, sondern außerhalb der Schleife.



Gruß
Stephan

Re: Anfänger benötigt Unterstützung

Verfasst: Di, 22.03.2011 16:51
von Daniel1973
Hallo Stephan,
vielen Dank für die Antwort. Ich habe Dein Script gleich getestet und bin begeistert.
Leider reichen meine Kenntnisse nicht um dies auf mein ganzes Script anazuwenden.
Wie kann ich über Ranges Zellen vergleichen und Paare finden?
Kannst Du mir hier vielleicht noch ein Beispiel machen?
Vielen Dank.
Grüße
Daniel

Re: Anfänger benötigt Unterstützung

Verfasst: Di, 22.03.2011 19:48
von Stephan
Das eingelesene Array namens werte:

Code: Alles auswählen

myRange=odoc.sheets(2).getCellRangeByPosition(0,1,4,100)
werte = myRange.getDataArray()
ist einfach eine 'Kopie' der Werte des Zellbereichs, es gilt:

Code: Alles auswählen

myRange=odoc.sheets(2).getCellRangeByPosition(0,1,4,100)
der Zellbereich myRange ist festgelegt durch 2 Zellen und zwar die Zelle links-oben und die Zelle rechts-unten.
Hier im Konkreten also die Zelle mit dem Spaltenindex 0 und Zeilenindex 1, entspricht Zelle A2 und die Zelle 4,100 entspricht Zelle E101.

Das Array werte ist nun ein Spaltenarray, mit 1 Spalte Breite und 100 Zeilen Höhe, hierbei enthält jedes Feld des Array ein Unterarray in Form eines Zeilenarray, welches dann die einzelnen Zellwerte enthält.

Beispiel 1:
Das Feld werte(0) enhält im Konkreten ein Array, welches sich auslesen läßt z.B. mittels:

Code: Alles auswählen

tmp = werte(0)
wobei tmp nun seinerseits ein Zeilenarray ist, welches die entsprechenden Zellwerte enthält, also, wiede im Konkreten, enthält tmp(0) hierbei den Wert aus Zelle A2, also:

Code: Alles auswählen

x = tmp(0)
wobei x dann dem Wert aus Zelle A2 entspricht.


Beispiel 2:

Wie bekommt man den Wert aus Zelle B24?

zuerst alle Werte des gewünschten bereiches einlesen, z.B.:

Code: Alles auswählen

myRange=odoc.sheets(2).getCellRangeByPosition(0,1,4,100)
werte = myRange.getDataArray()
werte(0) enthält nun ein Unterarray mit allen Werten der ersten gelesen Zeile, die hier Zeile 2 ist, wegen index=1 (die 1 in 0,1,4,100).
Folglich enthält werte(1) ein Array aus Zeile 3 usw.

Deshalb enthält nun werte(22) die Werte aus Zeile 24 und zwar 5 insgesamt denn es wurde ja nur Spalte A bis E eingelesen (die 0 und die 4 in 0,1,4,100).

Liest man nun das UNterarray aus werte(22) mit z.B.:

Code: Alles auswählen

tmp() = werte(22)
so befinden sich folgende Zellwerte in tmp():

in tmp(0) der Wert aus Zelle A24
in tmp(1) der Wert aus Zelle B24
in tmp(2) der Wert aus Zelle C24
in tmp(3) der Wert aus Zelle D24
in tmp(4) der Wert aus Zelle E24

also:

Code: Alles auswählen

Wert_aus_Zelle_B24 = tmp(1)

insgesamt:

Code: Alles auswählen

myRange=odoc.sheets(2).getCellRangeByPosition(0,1,4,100)
werte = myRange.getDataArray()
tmp() = werte(22)
Wert_aus_Zelle_B24 = tmp(1)


Gruß
Stephan

Re: Anfänger benötigt Unterstützung

Verfasst: Mi, 23.03.2011 11:34
von Daniel1973
Hallo Stephan,

super erklärt! Jetzt hab es sogar ich kapiert und konnte mein Makro entsprechend anpassen. Die Geschwindkeit ist top!

Grüße und viiiielen Dank.
Daniel