einzelne Zellen in Liste schreiben

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

Moderator: Moderatoren

DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

einzelne Zellen in Liste schreiben

Beitrag von DITA »

Hallo zusammen,

brauche nochmal Eure Unterstützung bei meinem Projekt

habe im Tabellenkopf "Eingabezellen" und möchte diese auf Schaltflächendruck in die darunter befindliche Liste eintragen ( Beispieldatei anbei )
Adressen-eintragen.ods
(11.38 KiB) 101-mal heruntergeladen
Mein Problem: Es kommen ja immer mehr Zellinhalte dazu, daher kann ich ja nicht sagen, Zelle u6 soll p14 werden - einmal würds ja stimmen, beim zweiten Mal müßte es dann ja p15 werden.

Bin mir sicher, so etwas ähnliches schon hier oder woanders in Open Office gesehen zu haben, find es leider nicht wieder

Danke für die Hilfe

Gruss Dirk
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: einzelne Zellen in Liste schreiben

Beitrag von F3K Total »

Hi,
natürlich geht das, man muss per Makro leere Zellen suchen. Dazu kann man gut die Zelleneigenschaft

Code: Alles auswählen

.Type = com.sun.star.table.CellContentType.EMPTY
verwenden.
Hier ein Beispiel, auf deine Datei gemünzt:

Code: Alles auswählen

Sub S_Find_next_empty_Row
    oSheet = thisComponent.Sheets.getbyname("Tabelle1")
    ocursor = oSheet.createCursor
    oCursor.gotoendofusedArea(false)
    nEndrow = oCursor.Rangeaddress.Endrow + 1
    oRange = oSheet.getcellrangebyposition(5,12,5,nEndrow)'5 = Spalte F, 12 = beginnt in Zeile 13
    for i = 0 to oRange.rows.count
         oCell = oRange.getcellbyposition(0,i)
         if oCell.Type = com.sun.star.table.CellContentType.EMPTY then
          nRow = oCell.Celladdress.row
          exit for
         endif
    next i
    msgbox "Die nächste leere Zeile ist Zeile "+(nrow+1)
End Sub
HTH R
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: einzelne Zellen in Liste schreiben

Beitrag von balu »

Hallo,

unser Stephan hatte mal eine kürzere Version zur Ermittelung der letzten benutzten Zeile innerhalb einer bestimmten Spalte veröffentlicht. Zu finden hier.
Der Vorteil dabei ist, das nur in der angegebenen Spalte gesucht wird. Was links oder rechts daneben ist, spielt keine Rolle.
Nachteil ist, man muss in diesem vorliegenden Fall darauf achten, dass die zu durchsuchende Spalte auch immer nahtlos mit Daten befüllt ist. Wenn beispielsweise nicht immer bei "Name I" ein Eintrag vorhanden ist, also vielleicht nur jedes dritte oder vierte mal einer ist, dann kann es zu komplikationen kommen.

Die Metode mit gotoendofusedArea ist vom gleichen Nachteil betroffen. Sie hat aber auch noch den Nachteil das sie länger ist, was manchmal störend wirken kann.

Egal welche Methode man anwendet, es muss, wie schon erwähnt, immer darauf geachtet werden, das die zu durchsuchende Spalte durchgehend immer mit daten befüllt ist. Und deshalb habe ich den Code von Stephan genommen, und auf die Spalte BB (Spaltenindex in Basic = 53) angesetzt.

Code: Alles auswählen

Sub Naechste_Leere_Zeile_in_Spalte_BB
	oSheet = thisComponent.Sheets.getbyname("Tabelle1")
	With oSheet ' Letzte Zeile der Spalte BB ermitteln
		x = .Columns(53).queryEmptyCells()
		iLetzte = x(x.Count-1).RangeAddress.StartRow + 1
	End With
	print "Die nächste leere Zeile ist die " & iLetzte  
End Sub
Das ist der gesamte Code um die nächste freie (leere) Zeile sich anzeigen zu lassen.



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
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: einzelne Zellen in Liste schreiben

Beitrag von DITA »

Hallo,

Ich danke Euch beiden,- auch die einzelnen Erklärungen helfen sehr weiter

Hätte aber noch eine Frage, kann ich denn nicht "sicherheitshalber" zwei Spalten abfragen, und wenn in einer von beiden etwas steht, nimm die nächste Zeile????

Danke erst einmal, denke das ich erstmal Spalte 54 (BB) abfrage, werde mich mal mit allen Codes beschäftigen (Erfahrungen machen).

Danke

Gruss Dirk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: einzelne Zellen in Liste schreiben

Beitrag von balu »

Hallo,
Hätte aber noch eine Frage, kann ich denn nicht "sicherheitshalber" zwei Spalten abfragen, und wenn in einer von beiden etwas steht, nimm die nächste Zeile?
Kannst Du machen. Ich würde aber empfehlen, das Du beim ausfüllen der Datenfelder dafür sorgst das es so genannte *Pflichtfelder* gibt. Mit anderen Worten, wenn diese Pflichtfelder nicht ausgefüllt sind, werden erst gar keine Daten in die Liste eingetragen. Und erst wenn die Pflichtfelder ausgefüllt sind, werden die Daten übernommen.

Vorteil: Du kannst dir aussuchen in welcher Spalte das Makro suchen soll, die allerdings mit den Pflichtfeld übereinstimmt. Es muss folglich nur eine Suchroutine für nur eine Spalte geschrieben werden.

denke das ich erstmal Spalte 54 (BB) abfrage
Ich hatte nicht umsonst das hier gesagt:
balu hat geschrieben: Spaltenindex in Basic = 53
Denn die erste Spalte in Basic (also bei Makro Programmierung) ist nicht die 1, sondern die 0 (Null). Das gleiche gilt auch für die Zeilennummer, 0 ist die erste Zeile, und nicht die 1 denn das wäre schon die zweite Zeile.
Das musst Du dir unbedingt ganz dringend merken!



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
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: einzelne Zellen in Liste schreiben

Beitrag von DITA »

Hallo Balu,

Pflichtfelder ....., mhmmm, hört sich gut an, nur wie kann ich das realisieren????

per Gültigkeit ??? wie sag ichs bzw. calc dann Basic

Ah, ... Versuch

if variable NameVorname <>""
then durchlaufe makro
else msgbox "Fehler, Name muss unbedingt ausgefüllt werden"
End if
Ist der Ansatz richtig, oder "verrenn" ich mich grad????

Danke
Dirk
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: einzelne Zellen in Liste schreiben

Beitrag von F3K Total »

Hallo Balu,
gute Sache, das

Code: Alles auswählen

.queryEmptyCells()
Anbei eine Variante, bei der die im Array c eingetragenen Spalten untersucht werden.

Code: Alles auswählen

Sub S_Find_next_empty_Row
    c = array (5,15,53,91,129)'zu durchsuchende Spalten
    oSheet = thisComponent.Sheets.getbyname("Tabelle1")
    iLetzte = 1
    for i = 0 to ubound(c)
        With oSheet ' Letzte Zeile der Spalten 5,15,53,91,129 ermitteln
           x = .Columns(c(i)).queryEmptyCells()
           n = x(x.Count-1).RangeAddress.StartRow + 1 
           if n > iLetzte then iLetzte = n
        End With
    next i
    print "Die nächste leere Zeile ist die " & iLetzte 
End Sub
Gruß R
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: einzelne Zellen in Liste schreiben

Beitrag von DITA »

Hallo R - F3K Total,

wow, so bin ich ja immer auf der sicheren Seite, vielen Dank

Das öffnet ja ungeahnte Möglichkeiten

Werde nun erstmal testen - vielen vielen Dank für Eure Hilfe

Gruss Dirk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: einzelne Zellen in Liste schreiben

Beitrag von balu »

Hallo Dirk,
if variable NameVorname <>""
then durchlaufe makro
else msgbox "Fehler, Name muss unbedingt ausgefüllt werden"
End if
Ist der Ansatz Richtig, oder "verrenn" ich mich grad????
Halb Richtig. Da ich ja von 2 Pflichtfeldern sprach, muss die IF mit AND erweitert werden, damit zwei Bedingungen zutreffen. Also so in etwa:

Code: Alles auswählen

If vari1 <>"" AND vari2 <>"" then
	tu das Richtige
else
	gib fehler aus
end if
In der überarbeiteten Datei habe ich jetzt folgendes Makro reingepackt.

Code: Alles auswählen

Sub HauptTeil
	Dim oSheet as Object
	Dim sPflichtName as String, sPflichtOrt as String
	oSheet = thisComponent.Sheets.getbyname("Tabelle1")
	sPflichtName = oSheet.getCellRangeByName("U7").String
	sPflichtOrt = oSheet.getCellRangeByName("U9").String
	
	if sPflichtName <>"" and sPflichtOrt <>"" then

	   With oSheet ' Letzte Zeile der Spalte BB ermitteln
    	  x = .Columns(53).queryEmptyCells()
      	iLetzte = x(x.Count-1).RangeAddress.StartRow + 1
   		End With
   				print "Die nächste leere Zeile ist die " & iLetzte 
				    oSheet.getCellRangeByName("BB" & iLetzte).String = sPflichtName
				    oSheet.getCellRangeByName("DZ" & iLetzte).String = sPflichtOrt
				print "Daten sind eingetragen"
	else
		print "Vor- und Nachname UND Ort müssen ausgefüllt sein. Sie sind Pflichtfelder!"
	end if
	
End Sub
Du kannst dir ja jetzt selber mal Gedanken darum machen wie Du die ganzen eingegebenen Daten schon fein säuberlich eingetragen bekommst. Am besten überarbeitest Du dazu das Layout, denn das ist dir so nämlich hinderlich.

"Vor- und Nachname" sowie "PLZ / Ort" sind als Pflichtfelder Rot umrandet. Der Button ist funktionstüchtig.


Gruß
balu
Dateianhänge
Adressen-eintragen_balu-0.ods
(13.39 KiB) 123-mal heruntergeladen
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
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: einzelne Zellen in Liste schreiben

Beitrag von DITA »

Hallo Balu,

ja ist denn heut schon Weihnachten????

ok, mit den 2 Abfragen geb ich Dir natürlich Recht, obwohl, wenn hätte ich, das wär ja falsch gewesen, oder (or) geschrieben, aber mir gings ja um den Weg.

Ja stimmt, ist mir auch aufgefallen, irgendwie ist das noch nicht richtig so mit dem Layout, arbeite aber dran (brauche dazu wahrscheinlich auch noch Hilfe von Euch, werde dazu noch einen extra Threat starten)

Herzlichen Dank für Dein Bemühen, war ein lehrreicher Tag für mich - Danke

Gruss Dirk
Antworten