Seite 1 von 1

Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 10:47
von mw7180
Hallo zusammen,

ich bin gerade dabei eine Tabelle von Excel auf OOo zu portieren. Dabei bin ich gerade bei dem Importmakro am Verzweifeln.
Ziel ist es, die Daten aus einen Bereich von einer Tabelle in eine andere zu bekommen.

Die Zuweisung einzelner Zellen zueinander funkt., aber beim Array gibt es ein Fehler.

Code: Alles auswählen

      oSrcRange = oQuelle.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow)
      oDataArray = oSrcRange.getDataArray 
      ZielMappe.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow).setDataArray(oDataArray())
Das einlesen des Quellbereiches (getDataArray) funkt., habe ich mir im Debugger angesehen, nur das übergeben in den
Zielbereich (setDataArray) will nicht. Ich hoffe ihr könnt mir helfen.

Grüße, Marc

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 11:03
von Karolus
Hallo

In den drei Zeilen Code sehe keinen offensichtlichen Fehler ...

Karolus

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 11:43
von mw7180
o.k. dann hänge ich mal das Komplette Makro drann (wollte nur nicht zu viel "Ballast" mitliefern :-)

Code: Alles auswählen

Option VBASupport 1

Sub Datei_Inhalte_kopieren()
'
' QuellenDatei_Bestand_in_ZielDatei_NeueVersion_kopieren

  
Dim objAppExcel As Object
Dim objWb As Object
Dim objSH As Object
Dim lngLastrow As Long
Dim ZielMappe As object


Dim myFileProp(0) as New com.sun.star.beans.PropertyValue

ZielMappe = ThisComponent
 lngLastrow=ZielMappe.sheets.getByName("Berge").getCellRangeByName("B5:B197").getRows.getCount()

fileToOpen = ChooseAFileName
  If fileToOpen = "" Then
     MsgBox "Keine Datei ausgewält, Import wird abgebrochen", vbCritical, "Datenimport"
     GoTo Ende
   End
  End If

'Sub DateiVerstecktOeffnen
'myFileProp(0).name="Hidden"
myFileProp(0).value=True 
oQuelle = StarDesktop.loadComponentFromURL(fileToOpen, "_blank", 0, myFileProp() )

ZielMappe.Sheets.getByName("Datenkopieren").getCellRangeByName("B5").String = "Import begonnen"


' CallDAT Daten übertragen
  With oQuelle.Sheets.getByName("CallDAT")                            
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C3").String = .getCellRangeByName("C3").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C5").String = .getCellRangeByName("C5").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C7").String = .getCellRangeByName("C7").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C9").String = .getCellRangeByName("C9").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C11").String = .getCellRangeByName("C11").String'c11:c12
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C14").String = .getCellRangeByName("C14").String'c14:C16
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C18").String = .getCellRangeByName("C18").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C20").String = .getCellRangeByName("C20").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A26").String = .getCellRangeByName("A26").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A27").String = .getCellRangeByName("A27").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A28").String = .getCellRangeByName("A28").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A29").String = .getCellRangeByName("A29").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A30").String = .getCellRangeByName("A30").String
    ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("A31").String = .getCellRangeByName("A31").String
  End With

lngLastrow=oQuelle.sheets.getByName("Berge").getCellRangeByName("B5:B197").getRows.getCount()
dim oSrcRange(1 to 8, 1 to 200)

For varSh = 1 To 6
  Select Case varSh
    Case 1:   varSheet = "144_vom_Berg"
    Case 2:   varSheet = "430_vom_Berg"
    Case 3:   varSheet = "23_vom_Berg"
    Case 4:   varSheet = "144_zum_Berg"
    Case 5:   varSheet = "430_zum_Berg"
    Case 6:   varSheet = "23_zum_Berg"
  End Select
    
      oSrcRange = oQuelle.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow)
      oDataArray = oSrcRange.getDataArray 
      ZielMappe.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow).setDataArray(oDataArray())
    
    If varSh <= 3 Then
      oSrcRange = oQuelle.Sheets.getByName(varSheet).getCellRangeByPosition(14,4,14,lngLastrow)
      oDataArray = oSrcRange.getDataArray ' "kopiere" Daten in Variable   
      ZielMappe.Sheets.getByName(varSheet).getCellRangeByPosition(14,4,14,lngLastrow).setDataArray(oDataArray)
    End If
Next varSh



varSheet = "höher_23_vom_Berg"

oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14")
ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14").setDataArray(oDataArray)
  
varSheet = "höher_23_zum_Berg"
oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14")
ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14").setDataArray(oDataArray)


Application.ScreenUpdating = True    ' Aktualisierung der Anzeige von Excel ab-, bzw. angeschalten, False Anzeige unterdrückt
  
 
ZielMappe.Sheets.getByName("Datenkopieren").getCellRangeByName("B5").Text= " "

oQuelle.Close()

MsgBox "Datenkopieren abgeschlossen", vbInformation, "Datenimport"




Exit Sub
 
errhandler:
MsgBox "Fehlernr:" & Err.Number & " " & Err.Description

Ende:

End Sub


Function ChooseAFileName() As String
Dim vFileDialog					     	'Instanz des Service FilePicker
Dim vFileAccess 						'Instanz des Service SimpleFileAccess
Dim iAccept as Integer 					'Rückgabe vom FilePicker
Dim sInitPath as String 				'Der Startpfad
ChooseAFileName=""

'Achtung: Die folgenden Services müssen in dieser Reihenfolge
'aufgerufen werden, sonst wird Basic den vFileDialog nicht wieder entfernen.
vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

sInitPath = ConvertToUrl(CurDir)		'Jetzt wird der Startpfad gesetzt.
If vFileAccess.Exists(sInitPath) Then
   vFileDialog.SetDisplayDirectory(sInitPath)
End If

iAccept = vFileDialog.Execute() 		'Der Dateiauswahldialog wird ausgeführt.
If iAccept = 1 Then 					'Prüfung des Rückgabewerts des Dialogs.
ChooseAFileName = vFileDialog.Files(0) 	'Rückgabe des Dateinamens, falls
										'der Dialog nicht abgebrochen wurde.
End If
vFileDialog.Dispose() 					'Der Dialog wird entfernt.
End Function


Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 12:33
von Karolus
Hallo

Tut mir leid - aus diesem Codehaufen kann ich hier nichts nachvollziehbares extrahieren, da brauch ich ja Stunden um entsprechende Quell- und ZielDateien aufzusetzen.
Was mir spontan aufffällt:
  • 1 benötigst du wirklich VBA-support 1 ?
    2 die zeile dim oSrcRange(1 to 8, 1 to 200) würde ich ersatzlos entsorgen
    3 Der Codeteil:

Code: Alles auswählen

varSheet = "höher_23_vom_Berg"

oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14")
ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14").setDataArray(oDataArray)
 
varSheet = "höher_23_zum_Berg"
oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14")
ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14").setDataArray(oDataArray)
ist Unsinn plus Wiederholung von Unsinn.

Karolus

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 13:00
von mw7180
Hallo,

Karolus hat geschrieben: Tut mir leid - aus diesem Codehaufen kann ich hier nichts nachvollziehbares extrahieren, da brauch ich ja Stunden um entsprechende Quell- und ZielDateien aufzusetzen.
Was mir spontan aufffällt:
ich kann dir auch die komplette Datei geben, wenn dir das hilft?
Karolus hat geschrieben:
  • 1 benötigst du wirklich VBA-support 1 ?
gute frage, ich hab gelesen das er das gerne möchte um VBA Code laufen zu lassen, ohne hatte ich Probleme so das ich es Standardmäßig reinschreibe.

Karolus hat geschrieben: 2 die zeile dim oSrcRange(1 to 8, 1 to 200) würde ich ersatzlos entsorgen
o.k., war ein Versuch, aber da es weder mit noch ohne Deklaration läuft kann es raus.
Karolus hat geschrieben: 3 Der Codeteil:[/list]

Code: Alles auswählen

varSheet = "höher_23_vom_Berg"

oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14")
ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14").setDataArray(oDataArray)
.....
ist Unsinn plus Wiederholung von Unsinn.
Karolus[/quote]
meinst du die mehreren, zusammen angesprochenen Bereiche oder was anderes?
Ich bin ja wie gesagt noch nicht mal bis zu dieser stelle mit dem Debugger gekommen.

Grüße

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 13:23
von Karolus
Hallo
man kann mit der Methode .getCellRangeByName() nicht mehrere CellRanges einlesen - wo hast du das her?

aber du scheiterst anscheinend schon vorher :?

Karolus

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 16:27
von balu
Hallo Marc,

fangen wir mal vorne an, aber dennoch ist es fast die Mitte.

Code: Alles auswählen

      With oQuelle.Sheets.getByName("CallDAT")                           
        ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C3").String = .getCellRangeByName("C3").String
        ZielMappe.Sheets.getByName("CallDAT").getCellRangeByName("C5").String = .getCellRangeByName("C5").String
Wie oft willst Du denn noch: ZielMappe.Sheets.getByName("CallDAT"), tippen? Dat is blödsinn.
Das macht man z.B. so

Code: Alles auswählen

oZielDat = ZielMappe.Sheets.getByName("CallDAT")
und dies wird gleich am Anfang des Makros nach der Variablen deklaration gemacht, nach

Code: Alles auswählen

    ZielMappe = ThisComponent
Dadurch ändert sich der eingangs zitierte Code wie folgt

Code: Alles auswählen

      With oQuelle.Sheets.getByName("CallDAT")                           
        oZielDat.getCellRangeByName("C3").String = .getCellRangeByName("C3").String
        oZielDat.getCellRangeByName("C5").String = .getCellRangeByName("C5").String
Aber selbst das ist noch ne unvorteilhafte Sache, die man verbessern kann.
Da ja die Quell- und Zieladressen der einzelnen Zellen identisch sind, würde ich diese in ein Array packen und dann per Schleife auslesen und abarbeiten. Das würde dann ungefähr so aussehen.

Code: Alles auswählen

	dim iBereich as variant
	iBereich(13) = array("C3", "C5", "C7", "C9", "C11", "C14", "C18", "C20", "A26", "A27", "A28", "A29", "A30", "A31")
[...]
	for ib = 0 to 13
		oZielDat.getCellRangeByName(iBereich(ib)).String = oQuellDat.getCellRangeByName(iBereich(ib)).String
	next ib
Und hier der überarbeitete Code, habe aber nicht alles geändert was man ändern kann, keine Lust dazu.

Code: Alles auswählen

    Option VBASupport 1

    Sub Datei_Inhalte_kopieren()
    '
    ' QuellenDatei_Bestand_in_ZielDatei_NeueVersion_kopieren
     
    Dim objAppExcel As Object
    Dim objWb As Object
    Dim objSH As Object
    Dim lngLastrow As Long
    Dim ZielMappe As object

	dim iBereich as variant

    Dim myFileProp(0) as New com.sun.star.beans.PropertyValue
    
	iBereich(13) = array("C3", "C5", "C7", "C9", "C11", "C14", "C18", "C20", "A26", "A27", "A28", "A29", "A30", "A31")
	
    ZielMappe = ThisComponent
    oZielDat = ZielMappe.Sheets.getByName("CallDAT")
    
     lngLastrow=ZielMappe.sheets.getByName("Berge").getCellRangeByName("B5:B197").getRows.getCount()	
	
    fileToOpen = ChooseAFileName
      If fileToOpen = "" Then
         MsgBox "Keine Datei ausgewält, Import wird abgebrochen", vbCritical, "Datenimport"
         GoTo Ende
       End
      End If

    'Sub DateiVerstecktOeffnen
    'myFileProp(0).name="Hidden"
    myFileProp(0).value=True
    oQuelle = StarDesktop.loadComponentFromURL(fileToOpen, "_blank", 0, myFileProp() )
	oQuellDat = oQuelle.Sheets.getByName("CallDAT")
	
    ZielMappe.Sheets.getByName("Datenkopieren").getCellRangeByName("B5").String = "Import begonnen"


    ' CallDAT Daten übertragen
	for ib = 0 to 13
		oZielDat.getCellRangeByName(iBereich(ib)).String = oQuellDat.getCellRangeByName(iBereich(ib)).String
	next ib


    lngLastrow=oQuelle.sheets.getByName("Berge").getCellRangeByName("B5:B197").getRows.getCount()


    For varSh = 1 To 6
      Select Case varSh
        Case 1:   varSheet = "144_vom_Berg"
        Case 2:   varSheet = "430_vom_Berg"
        Case 3:   varSheet = "23_vom_Berg"
        Case 4:   varSheet = "144_zum_Berg"
        Case 5:   varSheet = "430_zum_Berg"
        Case 6:   varSheet = "23_zum_Berg"
      End Select
       
	
	dim aDatArray()
	aDatArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow).getDataArray
	ZielMappe.Sheets.getByName(varSheet).getCellRangeByPosition(2,4,9,lngLastrow).setDataArray(aDatArray)
	
	
        If varSh <= 3 Then
          oSrcRange = oQuelle.Sheets.getByName(varSheet).getCellRangeByPosition(14,4,14,lngLastrow)
          oDataArray = oSrcRange.getDataArray ' "kopiere" Daten in Variable   
          ZielMappe.Sheets.getByName(varSheet).getCellRangeByPosition(14,4,14,lngLastrow).setDataArray(oDataArray)
        End If
    Next varSh



    varSheet = "höher_23_vom_Berg"

    oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14")
    ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14","Q5:Q14").setDataArray(oDataArray)
     
    varSheet = "höher_23_zum_Berg"
    oDataArray = oQuelle.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14")
    ZielMappe.Sheets.getByName(varSheet).getCellRangeByName("B5:B14","C5:J14","K5:L14").setDataArray(oDataArray)


    Application.ScreenUpdating = True    ' Aktualisierung der Anzeige von Excel ab-, bzw. angeschalten, False Anzeige unterdrückt
     
     
    ZielMappe.Sheets.getByName("Datenkopieren").getCellRangeByName("B5").Text= " "

    oQuelle.Close()

    MsgBox "Datenkopieren abgeschlossen", vbInformation, "Datenimport"




    Exit Sub
     
    errhandler:
    MsgBox "Fehlernr:" & Err.Number & " " & Err.Description

    Ende:

    End Sub


    Function ChooseAFileName() As String
    Dim vFileDialog                       'Instanz des Service FilePicker
    Dim vFileAccess                   'Instanz des Service SimpleFileAccess
    Dim iAccept as Integer                'Rückgabe vom FilePicker
    Dim sInitPath as String             'Der Startpfad
    ChooseAFileName=""

    'Achtung: Die folgenden Services müssen in dieser Reihenfolge
    'aufgerufen werden, sonst wird Basic den vFileDialog nicht wieder entfernen.
    vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
    vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

    sInitPath = ConvertToUrl(CurDir)      'Jetzt wird der Startpfad gesetzt.
    If vFileAccess.Exists(sInitPath) Then
       vFileDialog.SetDisplayDirectory(sInitPath)
    End If

    iAccept = vFileDialog.Execute()       'Der Dateiauswahldialog wird ausgeführt.
    If iAccept = 1 Then                'Prüfung des Rückgabewerts des Dialogs.
    ChooseAFileName = vFileDialog.Files(0)    'Rückgabe des Dateinamens, falls
                                  'der Dialog nicht abgebrochen wurde.
    End If
    vFileDialog.Dispose()                'Der Dialog wird entfernt.
    End Function

mw7180 hat geschrieben:
Karolus hat geschrieben:
  • 1 benötigst du wirklich VBA-support 1 ?
gute frage, ich hab gelesen das er das gerne möchte um VBA Code laufen zu lassen, ohne hatte ich Probleme so das ich es Standardmäßig reinschreibe.
Da Du wohl die Datei für Calc umschreiben willst/musst, und folglich das Makro nicht in Excel laufen muss, empfehle ich dir dringend, vergess das mit VBA-support 1 und kümmere dich lieber darum wie das in StarBasic gemacht wird. Eine hilfreiche Anlaufstelle um sich damit zu befassen, findest Du z.B. hier: StarBasic / OpenOffice.org Basic FAQ

Ich häng dir mal hier ne Datei an, in der ein File- und Folder-Dialog eingebaut ist. Dann hast Du wenigstens schon mal einen Punkt wo Du weniger auf VBA angewiesen bist. Die Datei macht aber nix weiter, es wird also keine Datei z.B. geladen. Aber das dürfte wohl dann auch nicht mehr arg so schwer sein, denn der eben genannte Link wird dir dabei weiterhelfen.



Gruß
balu

Re: Calc, Probleme mit setDataArray

Verfasst: Di, 21.01.2014 23:33
von mw7180
Hallo,

@Balu

die Seite ist mir bekannt und hat auch schon einiges geholfen.
Deine Optimierungen werde ich mal einbauen, macht den Code schöner :)


@Karolus

die "Idee" die Bereiche zusammen zu fassen hab ich von o.g. Seite (7.1.1.): http://www.dannenhoefer.de/faqstarbasic ... l#Zweig167

Re: Calc, Probleme mit setDataArray

Verfasst: Do, 23.01.2014 00:00
von mw7180
Hallo zusammen,

evtl. habe ich den Grund gefunden. Nach diesem Beitrag funkt. get und setDataArray nicht bei Zellen die Gültigkeitsüberprüfungen enthalten.
Nun enthalten aber Quell und Zeildatei Gültigkeitsüberprüfungen. Hat jemand eine idee die man das Problem "elegant" löst?
(es sollen nur die Werte übertragen werden)

grüße, Marc