(gelöst)If Then freies Feld

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Taghor
**
Beiträge: 45
Registriert: So, 18.05.2014 03:08

(gelöst)If Then freies Feld

Beitrag von Taghor »

Hallo,
ich stehe gerade bischen auf dem Schlauch.

Code: Alles auswählen

	If 	 addValue2 <> 0 then 
hab das in meiner Rechnenformel drinnen nur das problem wenn ist wenn das Ergebniss 0 ist
geht er auf false.

ich bräuchte eine abfrage If addValue2 = leeres Feld
oder
If (Feld in E = leer ) thenn

addValue2 = osheet.getCellByPosition(iStartCol+1,iStartRow).value REM Spalte E auslesen. addValue2 (mom.HP)
das is die Abfrage vorher. hmm ich glaub ich poste mal alles :-)

Code: Alles auswählen

Sub AddItNnow(event)
	odoc=thisComponent
	oSheet = oDoc.sheets(0)
	oZelle = oDoc.getCurrentSelection()
	iStartCol = oZelle.RangeAddress.StartColumn
	iStartRow = oZelle.RangeAddress.StartRow

	if iStartCol = 3 then

		if iStartRow < 200 and iStartRow > 1 then   rem Zeilen begrenzung
		addValueMaxHp = osheet.getCellByPosition(iStartCol+2,iStartRow).value rem Spalte F auslesen. addValueMaxHp
		addValue = osheet.getCellByPosition(iStartCol,iStartRow).value REM Spalte D auslesen. addValue Schaden
 		addValue2 = osheet.getCellByPosition(iStartCol+1,iStartRow).value  REM Spalte E auslesen. addValue2 (mom.HP)

	    	if addValueMaxHp = 0 then
			osheet.getCellByPosition(iStartCol+2,iStartRow).string = "Max.HP"  rem addValueMaxHp
			osheet.getCellByPosition(iStartCol,iStartRow).string = ""
	    	else
		
 				If 	 addValue2 <> 0 then  REM HIER BRÄUCHTE ICH NE ABFRAGE OB DAS FELD EINFACH LEER IST
					osheet.getCellByPosition(iStartCol+1,iStartRow).value = addValue2-addValue
					osheet.getCellByPosition(iStartCol+3,iStartRow).value = addValue
					osheet.getCellByPosition(iStartCol,iStartRow).string = ""
	
	    		 	else	
    				osheet.getCellByPosition(iStartCol+1,iStartRow).value = addValueMaxHp-addValue
					osheet.getCellByPosition(iStartCol+3,iStartRow).value = addValue
  					osheet.getCellByPosition(iStartCol,iStartRow).string = ""
  	      		 	end if
  
  
    		end if

		end if
	end if 

end sub
Zuletzt geändert von Taghor am Di, 11.12.2018 20:28, insgesamt 2-mal geändert.
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: If Then freies Feld

Beitrag von Toxitom »

Hey Taghor,

Den Inhalt der Zelle fragst Du über den "type" ab. Eine leere Zelle hat den Typ "0", eine Zelle mit Wert-Inhalt den Typ "1" , eine Zelle mit Textinhalt den Typ "2" und eine Formelzelkle den Typ "3".

Also: die Abfrage

Code: Alles auswählen

if osheet.getCellByPosition(iStartCol+1,iStartRow).type = 0   '  liefert True, wenn die Zelle leer ist
Nun musst Du es halt nur noch entsprechend verschachteln;))

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: If Then freies Feld

Beitrag von balu »

Mahlzeit Taghor,
ich bräuchte eine abfrage If addValue2 = leeres Feld
Und warum prüfst Du auf 0?
Ich weiss nicht welches Office Du genau hast, aber bis jetzt hat eigentlich das hier bei mir immer gut Funktioniert.

Code: Alles auswählen

If 	 addValue2 ="" then
Merksatz:
Eine Zelle mit dem Wert 0 ist nicht leer. Denn 0 ist eine Zahl.
Auch wenn Du in Calc in den Optionen das Anzeigen von Nullwerten deaktiviert hast, so steht dennoch eine 0 drin.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: If Then freies Feld

Beitrag von Toxitom »

@Balu: Manchmal ist es schade, dass Du einen schon beantworteten Thread nochmals beantworten willst....

Leider ist Deine Aussage dann auch noch nicht korrekt.

Da der Variablen "addValue2" bei Taghor das Ergebnis von "oZelle.value" zugewiesen wurde, ist dieser auch dann Null, wenn die Zelle Leer ist, also oZelle.Type = 0. Da läuft dann die Abfrage "addValue2 = "" " ins Leere, da sie "false" statt "true" liefert.

Mag sein, dass dies in AOO noch geht oder auch in anderen Office-Versionen (LO, AOO, OOo), wäre aber immer ein Unsicherheitsfaktor und eben nicht korrekt (in der Programmierung). In LO Version 5.3.x ist es im Übrigen korrekt umgesetzt - eine leere Zelle liefert dennoch als oZelle.value den Wert 0 zurück.

Eine Leere Zelle ist nur und ausschließlich sicher mit der Type-Eigenschaft zu identifizieren.

Kleiner Test: In der Zelle(z.B. B2) steht die Formel: =wenn(a1;a1;"") -> in A1 steht nix, ist nun die Zelle B2 leer oder nicht?

Also: eine wirklich leere Zelle lässt sich nur über die Type-Eigenschaft feststellen.

vg
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: If Then freies Feld

Beitrag von balu »

Hallo Tom,
In LO Version 5.3.x ist es im Übrigen korrekt umgesetzt - eine leere Zelle liefert dennoch als oZelle.value den Wert 0 zurück.
Danke für die sehr wertvollen Info.
Also muss man nun noch verstärkter aufpassen mit welchem Office man ein Makro erstellt.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: If Then freies Feld

Beitrag von Toxitom »

hey Balu,
Also muss man nun noch verstärkter aufpassen mit welchem Office man ein Makro erstellt.
Nicht unbedingt;) Dass es (leider) oft unterschiedliche Ausprägungen gibt.. na gut.

Makro korrekt programmiert - sollte immer korrekt laufen;) Basic neigt leider dazu, den Benutzer "schludern" zu lassen.. und dann wird es eben schwieriger.

Beispiel hier:
Würde man korrekt progammieren und alle Variablen deklarieren, so wäre die Variable "addvalue2" auch als Double definiert worden. Dies entspricht dem Typ der Value-Eigenschaft der Zelle.

die Variable "dim addvalue2 as double" würde jetzt aber schon vordimensioniert und hätte den Wert "0". Kannst Du direkt prüfen mit "msgbox addvalue2".

Anders sieht es im Übrigen aus, wenn Du statt der Value-Eigenschaft die Formula-Eigenschaft ausliest. Diese wird tatsächlich als "string" abgebildet und hätte bei einer leeren Zelle als Rückgabe einen String der Länge 0 - also einfach leer. Hier würde Deine Prüfung übrigens auch funktionieren.
formula bildet den Inhalt der Zelle als string ab - ist die String-Länge 0, dann ist zeimlich wahrscheinlich die Zelle auch leer;) (also, mir fällt jedenfalls keine Variante ein, in der das nicht zutreffen würde). Acuh ein Wert der Zelle (Value) wird in formula als string abgebildet, ebenso wie natürlich Texte.

Andererseits bietet die API je gerade die Type-Eigenschaft und damit eine korrekte und sichere Unterscheidung. Also gleich das Richtige nehmen und so entsprechend programmieren - liegste immer richtig:)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Taghor
**
Beiträge: 45
Registriert: So, 18.05.2014 03:08

Re: If Then freies Feld

Beitrag von Taghor »

Danke mit

Code: Alles auswählen

if osheet.getCellByPosition(iStartCol+1,iStartRow).type = 0 then '  liefert True, wenn die Zelle leer ist
ging es.

Ja ich muß mich da noch weiter einlesen habe im moment leider nicht so viel zeit und muß rausfinden welches Buch oder pdf wirklich
das beste/einfachste ist für den anfang um alles zu verstehen von angang an.

Ich habe früher Basic und C++ glaub auch mal Pascal programiert und auch mal VBA aber das ist schon LANGE LANGE her :-)
diese Formel hab ich aus anderen Formeln und Tips zusammengebastel und umgestellt und weiter umgeschrieben :-)

Achja habe Open Office 4.1.6
Antworten