Tabelleninhalt zu anderer Tabelle hinzufügen?

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

Moderator: Moderatoren

CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

Hallo Zusammen,

da ich mich mit Base - und mit Makros noch viel weniger - nicht auskenne und schon seit nen paar Stundeb drüber nachkdenke frage ich doch einfach mal ganz allgemein welche Möglichkeiten es gibt den Inhalt einer Tabelle (ods-Format) automatisiert an eine andere anzuhängen?

Ist die gleiche Spaltenanzahl eine notwendige Voraussetzung oder geht es auch anders?

Wie geht es überhaupt?

Hintergrund der Geschichte ist folgender:

Ich lade meinen Kontoauszug im csv Format herunter und wandle ihn dann mittels eines Makros ( das nun endlich läuft :D ) in eine ods Tabelle um. Diese Tabelle enthält ja nun die Buchungen von 2 Wochen oder so. Die würde ich gerne - wiederum mit einem Makro welches ich dann auf eine Schaltfläche legen kann - an eine Tabelle anhängen in der schon all die anderen Buchungen sind!

So nun bin ich gespannt ob sowas überhaupt geht :shock:
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

Na guck mal einer an was da gerade hochgebumpt wurde. :D

Hab soeben ein paar Threads weiter unten folgendes Makro gefunden:

Code: Alles auswählen

sub bereich_kopieren
oDocument = ThisComponent
oQuellblatt = oDocument.Sheets().getByName("Email-Formular")
oZielblatt = oDocument.Sheets().getByName("Email-Formular Anfrage")
' Quellbereich festlegen
oQuelleRange = oQuellblatt.getCellRangeByName("A1:J65")
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oZielblatt.getCellByPosition(26,1) 'einfügen ab A2
oZielCellAdresse=oZiel.getCellAddress
oZielblatt.copyRange(oZielCellAdresse,oQuellRangeAddresse)
end sub
Das ist ja im Grunde genau mein Ding . Ich hätte nur gerne die Möglichkeit die zu kopierenden Datei mittels ihres Pfads anstatt ihres Namens zu bestimmen. Das Ganze am besten noch mit einem Datei Öffnen Dialog. Geht sowas?

wie muss ich "oQuellblatt = oDocument.Sheets().getByName("Email-Formular")" ändern. getby...?
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

Code: Alles auswählen

sub CSVzuCalc



'Auswahldialog CSV Datei 
	DialogOpen=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	DialogOpen.displaydirectory="c:\import\"
	DialogOpen.execute
	Auswahl=DialogOpen.Files(0)


'Deklaration der Variablen
	Dim CSVProps(1) as New com.sun.star.beans.PropertyValue
	Dim CALCProps(0) As New com.sun.star.beans.PropertyValue
	Dim speicherDialog as Object
	Dim dateiname As String
	Dim DialogTyp(0)
	Dim arg()
	Dim antwort
	arg = Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION)
	dateiname = Auswahl
	
'Eigenschaften Importierte CSV Settings fuer Raiba
	CSVProps(0).Name = "FilterName"
	CSVProps(0).Value = "scalc: Text - txt - csv (StarCalc)"
	
	CSVProps(1).Name = "FilterFlags"
	CSVProps(1).Value = "59,0,IBMPC_850,4,1/1/1/1"
	

'Eigenschaften fuer Speichern 	
	CALCProps(0).Name = "Overwrite"
	CALCProps(0).Value = True	

	
'Öffnen		
	CSVFile = StarDesktop.loadComponentFromURL(Auswahl,"_blank", 0,CSVProps())

'Speichern
	speicherDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
   
  									'xray speicherDialog
   									With speicherDialog
								        .Initialize(arg())
								        .appendFilter("OpenDocument Tabellendokument (.ods)", "*.ods")
								        .SetMultiselectionMode(False)
								        .setDisplayDirectory(ConvertToURL("c:\import\"))
								        .SetDefaultName(dateiname) 'Hier kannts Du Deinen variablen Dateinamen definieren
								        .SetTitle("Vergeben sie einen Namen und speichern sie das Angebot")
								        .setcurrentFilter("OpenDocument Tabellendokument (.ods)")
								        .SetValue(com.sun.star.ui.dialogs.ExtendedFilePickerElementIds.CHECKBOX_AUTOEXTENSION, 0, true)
   									End With

   									antwort = speicherDialog.execute()
   										If antwort = 1 Then
     										datei = speicherDialog.Files(0)
     										CSVFile.storeAsUrl(datei, CALCProps())
   										End If

'Schliessen	
	CSVFile.close(false)



End Sub[
Hier mal mein Makro das die CSV Datei öffnet und anschließend als Calc-Datei speichert. Das ganze funktioniert wunderbar und ich bilde mir sogar ein verstanden zu haben was ich da getan habe :lol:

Was hier noch zu verbessern wäre ist einerseits der Schönheitsfehler mit dem vorgeschlagenem Datei Namen beim Speichern. Wie lasse ich bei der Übergabe von der URL auf den String bestimmte Zeichen weg?

Auch nett wären irgendwelche Maßnahmen um den Abbruch zu verhindern wenn beim Speichern/Laden nichts eingegeben wird.


Am meisten hänge ich aber momentan an der Aufgabe die Calc Datei nun in Base weiter zu bearbeiten. Ich möchte sie nicht jedes Mal per Drag und Drop herüberziehen. Es muss doch irgend eine andere Möglichkeit geben aus dec Calc Tabelle eine Base Tabelle zu machen. Ein Trostpreis wäre zumindest ein Makro welches den Copy Wizard aufruft - gibt es sowas?


Für einen Hinweis wäre ich dankbar - schon viel gelesen - deutsch sowie englisch aber ich habe nichts zu genau diesem Thema gefunden was mir weiterhift. Dabei kann ich mir nicht vorstellen das jemand nicht schon mal Ähnliches gemacht hat.
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von turtle47 »

Hi CaptainCannabis,

einen Bereich kopieren kann man auch mit einem Zweizeiler: :lol:

Code: Alles auswählen

sub bereich_kopieren
oQuellblatt = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:J65").getdataArray()
ThisComponent.Sheets().getByIndex(1).getCellRangeByName("A1:J65").setdataArray(oQuellblatt)'Zielblatt
end sub
CaptainCannabis hat geschrieben:wie muss ich "oQuellblatt = oDocument.Sheets().getByName("Email-Formular")" ändern. getby...?
Wie oben mit

Code: Alles auswählen

getByIndex(0)
CaptainCannabis hat geschrieben:Auch nett wären irgendwelche Maßnahmen um den Abbruch zu verhindern wenn beim Speichern/Laden nichts eingegeben wird.

Code: Alles auswählen

Sub Main
	goBack:
	DialogOpen=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	DialogOpen.title = "Datei auswählen"
	DialogOpen.displaydirectory = "c:\"
	Ausgabe = DialogOpen.execute
	if Ausgabe = 0 Then
	msgbox "Es wurde keine Datei ausgewählt!"
	goto goback
	'Exit sub' alternativ zu "goto goback"
	End if
	Auswahl=DialogOpen.Files(0)
	msgbox Auswahl
End Sub
CaptainCannabis hat geschrieben:deutsch sowie englisch aber ich habe nichts zu genau diesem Thema gefunden was mir weiterhift
In diesem PDF-Dok ab Seite 23.

Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

Geil - endlich nen Hinweis. Ich hol mir nen Kaffee und schau mir das mal genau an. Danke schonmal! :)
einen Bereich kopieren kann man auch mit einem Zweizeiler: :lol:

Code: Alles auswählen

Code: Alles auswählen
    sub bereich_kopieren
    oQuellblatt = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:J65").getdataArray()
    ThisComponent.Sheets().getByIndex(1).getCellRangeByName("A1:J65").setdataArray(oQuellblatt)'Zielblatt
    end sub
Das gilt aber doch nur innerhalb der Tabelle oder? Also Quellblatt und Zielblatt müssen in der selben ODS Datei liegen? Das bringt mir ja leider nichts. Ich muss wohl mit den zwei Datenbanken arbeiten wobei eine als Datenquelle die umgewandelte Csv-Datei zugewiesen bekommt. Auf diese greife ich dann aus der anderen Datenbank mittels SQL Abfrage zu und habe die Datensätze dann endlich in Base zum weiter verarbeiten. Ist dieses Vorgehen sinnvoll bzw. das was du meinst? Ich muss gerade die Hürde des Verstehens nehmen wie du merkst :lol:
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von turtle47 »

Hi,
CaptainCannabis hat geschrieben:Also Quellblatt und Zielblatt müssen in der selben ODS Datei liegen?
Ja, das hast Du recht. Aber der obige Code von Dir konnte aber auch nichts anderes. :(

Folgendes Makro aus meiner Grabbelkiste kopiert einen Zellbereich in ein anderes Dokument.
Man braucht den Zeilenbereich nicht extra definieren weil dieser automatisch nach der letzten benutzen Zeile in den Tabellen sucht. :lol:

Code: Alles auswählen

Sub Daten_uebertragen
	actUser= environ ("username")
	odoc = thiscomponent
	SheetQuelle = odoc.sheets(0) 'Quelleassungstabelle
	ocursorQuelle = SheetQuelle.createcursor
	ocursorQuelle.gotoEndofusedArea(false)
	LastrowQuelle = ocursorQuelle.getrangeaddress.endrow +1
	
	oRange1 = SheetQuelle.getCellRangeByName("A1:J" & LastrowQuelle)
	oData() = oRange1.getDataArray()
	rowdiff = LastrowQuelle -1
	Dim oDocSrc1 as Object
	dim p(0) as new com.sun.star.beans.PropertyValue
	p(0).Name = "Hidden"
	p(0).Value = true
	oUrlSrc  = "file:///C:/Testordner/Datei_001.ods" 'Zielpfad und Tabelle anpassen
	oDocSrc1 = StarDesktop.loadComponentFromURL(oUrlSrc, "_blank", 0, p())'Datei "Datei_001.ods" im Hintergrund öffnen

	
	SheetZiel = oDocSrc1.sheets(0)
	ocursorZiel = SheetZiel.createcursor
	ocursorZiel.gotoEndofusedArea(false)
	LastrowZiel = ocursorZiel.getrangeaddress.endrow
	
	if LastrowZiel = 0 then
	LastrowZiel = LastrowZiel + 1
	else
	LastrowZiel = LastrowZiel + 2
	End if
	
	oRange2 = SheetZiel.getCellRangeByName("A" & LastrowZiel & ":J" & LastrowZiel + rowdiff)
	oData() = oRange2.setDataArray(oData)
	SheetZiel.getCellRangeByName("K" & LastrowZiel).string = "Erfasst:"
	SheetZiel.getCellRangeByName("L" & LastrowZiel).String = (now)
	
	SheetZiel.getCellRangeByName("K" & LastrowZiel + 1 ).string = "User:"
	SheetZiel.getCellRangeByName("L" & LastrowZiel + 1 ).string = actUser
	oDocSrc1.store 'Zieldatei speichern
	oDocSrc1.Close(True)'Zieldatei schliessen
	Msgbox "Die Datenübertragung ist abgeschlossen"
	'Inhalt der Quelltabelle löschen
	'oCellRange = SheetQuelle.getCellRangeByName("A1:J" & LastrowQuelle)    
	'ocellRange.clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING)
End Sub
Die Daten aus der Quelltabelle werden immer unten in die Zieltabelle angehangen. 8)

Viel Spass beim kopieren.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

CaptainCannabis hat geschrieben:Also Quellblatt und Zielblatt müssen in der selben ODS Datei liegen?

Ja, das hast Du recht. Aber der obige Code von Dir konnte aber auch nichts anderes. :(
Ja sorry - ich musste meine Vorgehensweise bei jeder grundlegenden Erkenntnis ändern. Die ersten Posts sind somit schon lange verworfen :D
Folgendes Makro aus meiner Grabbelkiste kopiert einen Zellbereich in ein anderes Dokument.
Man braucht den Zeilenbereich nicht extra definieren weil dieser automatisch nach der letzten benutzen Zeile in den Tabellen sucht.
Das allerdings klingt sehr gut - und meine nächste Frage gleich mit beantwortet. Super - vielen vielen Dank!

So long,

CaptainCannabis
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
CaptainCannabis
**
Beiträge: 37
Registriert: Mo, 30.03.2009 13:17

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von CaptainCannabis »

So kurzer Zwischenstand:

Habe das Makro zum kopieren so geändert das es nicht aus dem geöffneten Calc Blatt aktiviert werden muss sondern einfach Quelle und Ziel mittels Pfad bestimmt. Erste Tests lassen mich schon fast wie nen Profi aussehen :lol:

So nun wirds wieder eine Stufe spezieller. Ich möchte behaupten das ich nun in der Lage wäre ein Makro zu schreiben welches nacheinander:

- Eine CSV Datei mittels Dialog auswählt

- diese in eine temporäre ODS umwandelt

- diese temporäre ODS öffnet und den Inhalt an eine andere ODS anhängt


==> somit hätte ich eine lange Tabelle mit allen Buchungssätzen meines Online Bankings aus denen sich dann meine Abfragen und Berichte bedienen können. Nie wieder Buchungssätze eintippen :D

Um das ganze Deppensicher zu machen sollte ich natürlich irgendwie beim Kopieren der Datensätze prüfen ob dieser schon vorhanden ist sowie die erste Zeile auslassen. Ich habe in der Tabelle 5 Felder - KontoNr - Datum - Buchungstext - Betrag - Währung

Die Währungsspalte ist aber eigentlich uninteressant. Da keine einzigartig ist müsste man vergleichen ob Die Kombination aus KontoNr, Datum, Buchungstext , Betrag schon vorhanden ist. Gibt es für soetwas Beispiele und funkioniert es überhaupt mit dem Kopier-Makro das ich momentan verwende?

hier nochmal das aktuelle makro:

Code: Alles auswählen

Sub Daten_uebertragen
   actUser= environ ("username")
   
   
   'odoc = thiscomponent
   Dim oDocSrc2 as Object
   dim n(0) as new com.sun.star.beans.PropertyValue
   n(0).Name = "Hidden"
   n(0).Value = true
    
   odoc  = "file:///C:/import/600.ods"
   oDocSrc2 = StarDesktop.loadComponentFromURL(odoc, "_blank", 0, n())
   SheetQuelle = oDocSrc2.sheets(0) 'Quelleassungstabelle
   
   
   ocursorQuelle = SheetQuelle.createcursor
   ocursorQuelle.gotoEndofusedArea(false)
   LastrowQuelle = ocursorQuelle.getrangeaddress.endrow +1
   
   oRange1 = SheetQuelle.getCellRangeByName("A1:J" & LastrowQuelle)
   oData() = oRange1.getDataArray()
   rowdiff = LastrowQuelle -1
   
   Dim oDocSrc1 as Object
   dim p(0) as new com.sun.star.beans.PropertyValue
   p(0).Name = "Hidden"
   p(0).Value = true
   oUrlSrc  = "file:///C:/import/test.ods" 'Zielpfad und Tabelle anpassen
   oDocSrc1 = StarDesktop.loadComponentFromURL(oUrlSrc, "_blank", 0, p())'Datei "Datei_001.ods" im Hintergrund öffnen

   
   SheetZiel = oDocSrc1.sheets(0)
   ocursorZiel = SheetZiel.createcursor
   ocursorZiel.gotoEndofusedArea(false)
   LastrowZiel = ocursorZiel.getrangeaddress.endrow
   
   if LastrowZiel = 0 then
   LastrowZiel = LastrowZiel + 1
   else
   LastrowZiel = LastrowZiel + 2
   End if
   
   oRange2 = SheetZiel.getCellRangeByName("A" & LastrowZiel & ":J" & LastrowZiel + rowdiff)
   oData() = oRange2.setDataArray(oData)
   SheetZiel.getCellRangeByName("K" & LastrowZiel).string = "Erfasst:"
   SheetZiel.getCellRangeByName("L" & LastrowZiel).String = (now)
   
   SheetZiel.getCellRangeByName("K" & LastrowZiel + 1 ).string = "User:"
   SheetZiel.getCellRangeByName("L" & LastrowZiel + 1 ).string = actUser
   oDocSrc1.store 'Zieldatei speichern
   oDocSrc1.Close(True)'Zieldatei schliessen
   oDocSrc2.Close(True)
   Msgbox "Die Datenübertragung ist abgeschlossen"
   'Inhalt der Quelltabelle löschen
   'oCellRange = SheetQuelle.getCellRangeByName("A1:J" & LastrowQuelle)   
   'ocellRange.clearContents(com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING)
End Sub[/c
WIN XP 32BIT SP3 / WIN 7 64 BIT mit OO V3.1.1
AMD Athlon X2 5000+
Geforce 8800 GT 1024MB
2GB RAM + 1TB Platte
rob
*
Beiträge: 11
Registriert: Do, 12.02.2009 12:07

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von rob »

Grüßt Euch

schönes Thema was Ihr hier habt. Das hat mich die letzten Wochen auch immer mal wieder beschäftigt.

Hab ne ganz gute variable Lösung gefunden.

Kurz beschrieben. sucht in dem zweiten Tabellenblatt in Spalte 0 und 4 nach dem Namen der Felder, liest die dazugehörigen Daten (Spalte 1 und 5) ein, dann geht es in das andere Tabellenblatt, sucht dort in der Kopfzeile nach dem Namen und trägt die dazugehörigen Daten in die dazugehörige Zeile ein.

Hoffe verstanden und du kannst es für deine zwecke umschreiben ;)

Code: Alles auswählen


sub daten_uebertragen

	odoc = ThisComponent
	ozielTab = odoc.sheets(0)  '1.Tabellenblatt über den Index-
	oquellTab = odoc.sheets().getbyname("____________") 
	label_column=0
	data_column=1

	orows = ozieltab.getrows
	orows.insertbyindex(2,1) 'einfügen an 2.Pos.→index1, eine Zeile →1

	for zi = 2 to 100  
		item_label = oquelltab.getcellbyposition(label_column,zi ).string
		item_value = oquelltab.getcellbyposition(data_column,zi ).string
		
		zielspalte=seek_column(item_label, ozieltab)
		if zielspalte=61 then
			msgbox "Das Item >> " & item_label & " <<  ist nicht in der Datenbank vorhanden oder falsch geschrieben.", 64, "Clipboard Copy"
		else
			ozieltab.getcellbyposition(zielspalte, 2).string = item_value
		
			if item_label="" then
				select case label_column
					case 0: 
						label_column=3
						data_column=4
						zi=1
					case 3: exit for
				end select
			end if
		end if
	next zi				  
   						  zielspalte=zielspalte - 1
   						  
ozieltab.getcellbyposition(zielspalte, 2).string = Date()
  
end sub


function seek_column(header, ozieltab)
dim q as integer
	for q = 0 to 60
		if  ozieltab.getcellbyposition( q , 0 ).string = header then
			columnhit = q
			exit for
		end if
	next q
	if q=61 then
		seek_column=q
	else
		seek_column=columnhit
	end if
end function

hätte nun aber auch ne Frage. Möchte nach mit diesem Makro Daten zwischen zwei Dateien übertagen (über copy-paste), doch hab ich nun das Problem, dass er mit dem select Befehl nur 1x klar kommt, dannach bekomme ich die Fehlermeldung "Einfügen auf Mehrfachselektion nicht möglich". Nun Hab ich spaßenshalber die Zeile mal löschen lassen und sofort funktiniert es vernünftig.
Gibt es eine Möglichkeit "select zu leeren"???

Code: Alles auswählen

	Dim vonBereich As Object
						vonBereich = oquellTab.GetCellrangeByPosition(0,zii,255,zii) ''' zu kopierender Bereich
						dim oFrame As object
						dim oDisp As object
						oFrame = ThisComponent.CurrentController.Frame
						oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
						odocu.currentcontroller.select(vonBereich)
						oDisp.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())

						args2(0).Value = "A"+(zi+1)	
						dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
				
						dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
						msgbox ("über alte Datenzeile als neue Zeile eingefügt")								
						
						dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, Array()) 'NUR NEN VERSUCH
			

Ihr würdet mir sehr Helfen, da ich Montag eine Präsi über das ganze was ich mache halten muss. Leider verzweifel ich nun gerade an diesem aufgezeichnetem Zeug :(

Grüße Ronny
Zuletzt geändert von rob am Sa, 04.04.2009 12:53, insgesamt 2-mal geändert.
rob
*
Beiträge: 11
Registriert: Do, 12.02.2009 12:07

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von rob »

stell mal das ganze Makro ein, sieht wüst aus :D

Möchte eigentlich auch Daten aus einer externen Datei übertagen, dazu öffne ich die Datei mittels des Öffnen dialogs, schaue dann ob die Daten Spalte 0,1 und 3 in der Stammdatei schon vorhanden sind, wenn ja dann möchte ich sie überschreiben und wenn nicht, in eine neue Zeile schreiben. Ganz zum Schluß möchte ich die Tabelle dann sortieren um die Daten einzugliedern.

wie gesagt mein Problem ist die Sache mit der odocu.currentcontroller.select(vonBereich) Anweisung
die wird im zweiten Durchlauf nicht mehr so gefüllt, wie ich es mir wünsche.

Code: Alles auswählen

Sub Datei_oeffnen_dialog

dim document   as object
dim dispatcher as object
dim row as object
Dim odoc As Object
Dim odocu As Object
Dim ozielTab As Object

			
			
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"

			
	odoc = ThisComponent
 	ozielTab = odoc.Sheets.getByName("Versuchspersonen")
 	
 'Dialog "Datei öffnen" 	
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	dispatcher.executeDispatch(document, ".uno:Open", "", 0, Array())
	odocu = ThisComponent
	oquellTab =odocu.sheets().getbyname("Versuchspersonen") 

'vergleich ob Daten schon vorhanden sind

for zii = 2 to 100

	oRange_fb_a	= oquellTab.getCellByposition(0, zii).string
	msgbox (orange_fb_a)
	oRange_fb_b = oquellTab.getCellByposition(1,zii).string
	oRange_fb_c = oquellTab.getCellByposition(3,zii).string



	if oRange_fb_a ="" and oRange_fb_b ="" then
	
	exit sub
	end if
	

'bei mehr als 1000 Versuchspersonen in der Datenbank hier Erhöhen
	for zi = 0 to 20
  		oRange_vp_a = ozielTab.getCellByposition(0, zi).string
'		msgbox (orange_vp_a)
	 	oRange_vp_b = ozielTab.getCellByposition(1, zi).string
	   	oRange_vp_c = ozielTab.getCellByposition(3, zi).string
		
		if oRange_fb_a = oRange_vp_a  and oRange_fb_b = oRange_vp_b and oRange_fb_c = oRange_vp_c  and oRange_fb_a <> "" then

'		Abfrage ob Daten wirklich überschrieben werden sollen
	
				wert = msgbox ("möchten Sie die alten Daten"+ "  " + oRange_fb_a + "  " + oRange_fb_b+ "  " +" wirklich überschreiben?",4,48,"")	
				if wert = 6 then	

'vorhandene Daten auf Tabellenblatt 1 bringen				
				
						Dim vonBereich As Object
						vonBereich = oquellTab.GetCellrangeByPosition(0,zii,255,zii) ''' zu kopierender Bereich
						dim oFrame As object
						dim oDisp As object
						oFrame = ThisComponent.CurrentController.Frame
						oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
						odocu.currentcontroller.select(vonBereich)
						oDisp.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())

						args2(0).Value = "A"+(zi+1)	
						dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
				
				
'						dispatcher.executeDispatch(document, ".uno:InsertRows", "", 0, Array()) 
						dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
						msgbox ("über alte Personendatenzeile als neue Zeile eingefügt")								
						
						dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, Array()) 
			
			
						exit for
					else 
					exit for
					end if
		else
'Tabelle durchsucht und kein vorhandenen Datensatz gefunden
'schreiben der Daten in Zeile 3
		
	if zi=20 then 
		vonBereich2 = oquellTab.GetCellrangeByPosition(0,zii,255,zii) ''' zu kopierender Bereich
		
		oFrame = ThisComponent.CurrentController.Frame
		oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
		odocu.currentcontroller.select(vonBereich2)
		oDisp.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())
  		args2(0).Value = "A3"

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


			dispatcher.executeDispatch(document, ".uno:InsertRows", "", 0, Array()) 
			dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

	

	msgbox ("neuer Datensatz eingefügt"+"  "+ oRange_fb_a + "  " + oRange_fb_b )
	
		end if
	end if
 next zi
zi=0 

 next zii
 sortieren

 'Bereich von zeile 2 bis 1000 markiert und sortiert

 	odoc = ThisComponent
 	ozielTab = odoc.Sheets.getByName("Versuchspersonen")
 
 	Dim vonBereich1 As Object
 	vonBereich1=ozielTab.getCellRangeByPosition(0,2,255,1000)
 	oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
 	odoc.currentcontroller.select(vonBereich1)
	dispatcher.executeDispatch(document, ".uno:SortAscending", "", 0, Array())


end sub	

		
greetz
rob
*
Beiträge: 11
Registriert: Do, 12.02.2009 12:07

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von rob »

Guten Morgen


wollte noch mal ganz lieb nachfragen, ob jemand eine Idee hat, wie meinem begrenzten Wissen und google Unfündigkeit, zu helfen ist.

das Problem ist, das der Befehl

odocu.currentcontroller.select(vonBereich)

in der For-Schleife beim zweiten Durchlauf die Fehlermeldung: "Einfügen auf Mehrfachselektion nicht Möglich" bringt.

nun meine Frage: Kann ich das was select-iert wurde wieder löschen???? (wenn ich die eingefügte Zeile wieder lösche, dannn funktioniert es komischerweise)
rob
*
Beiträge: 11
Registriert: Do, 12.02.2009 12:07

Re: Tabelleninhalt zu anderer Tabelle hinzufügen?

Beitrag von rob »

Hab ne Lösung gefunden 2x einfügen, dann kann man 1x löschen und alles funkt :lol:

angenehmes Wochenende noch
Zuletzt geändert von rob am So, 05.04.2009 11:40, insgesamt 1-mal geändert.
Antworten