von komma4 » Fr, 09.07.2010 12:58
War in der Zwischenzeit offline und hatte ausnahmsweise etwas Zeit.
Dabei kam folgendes Makro raus...vielleicht hilft es ja jemanden
Den Namen des Zielblattes anpassen (erste Konstante), ggfs. die Blätter in der 2. Konstanten benennen, die nicht bearbeitet werden sollen.
Kopiert keine Formate!
Code: Alles auswählen
' de40039
' Inhalte kopieren auf ein Zielblatt
const cZielBlatt = "summary"
const cNichtbearbeiten = "Steuerung Deckblatt label"
Private sMakroName
Private oZielBlatt
Private oZielBereich
Private oZielCursor
Private lMaxZeilen
Private lErsteSpalte
Private lLetzteZeile
' ------------------------------------------------------------------
Sub de40039
sMakroName = "Makro de40039"
' Kopieren aller Daten von einer Anzahl Tabellenblätter
' auf ein Blatt "Zusammenfassung"
' Objekte der Datei
oDok = ThisComponent
oZielBlatt = oDok.Sheets().getByName( cZielBlatt )
' Cursor für Ziel
oZielCursor = oZielBlatt.createCursor()
' Zieladresse bestimmen
oZielCursor.gotoStartOfUsedArea( FALSE )
oZielCursor.gotoEndOfUsedArea( TRUE )
lErsteSpalte = oZielCursor.getRangeAddress().StartColumn
lLetzteZeile = oZielCursor.getRangeAddress().EndRow
' max Anzahl Zeilen pro Blatt
lMaxZeilen = oDok.Sheets().getByIndex( 0 ).Rows.getCount()
de40039_kopieren
End Sub
' ------------------------------------------------------------------
' Routine zum Kopieren der Daten
Sub de40039_kopieren
' alle Namen
aQuellBlaetter = oDok.Sheets().ElementNames
' für alle Blätter im Quellbereich
For i = LBound( aQuellBlaetter ) To UBound ( aQuellBlaetter )
oTempBlatt = oDok.Sheets().getByName( aQuellBlaetter(i) )
oTempBlattName = oTempBlatt.Name
If Instr( cNichtbearbeiten, oTempBlattName ) > 0 Then
oTempBlattname = "nicht bearbeiten"
End If
Select Case oTempBlattName
' Zielblatt nicht bearbeiten
Case cZielBlatt
' sonstige Blätter,die nicht bearbeitet werden sollen
Case "nicht bearbeiten"
' alle anderen kopieren
Case Else
oQuellCursor = oTempBlatt.createCursor()
' Datenbereich ermitteln
oQuellCursor.gotoStartOfUsedArea( FALSE )
oQuellCursor.gotoEndOfUsedArea( TRUE )
' Bereichsadressen
aQuellAdresse = oQuellCursor.getRangeAddress()
aQuellDatenBereich = oTempBlatt.getCellRangeByPosition( _
aQuellAdresse.StartColumn, aQuellAdresse.StartRow, _
aQuellAdresse.EndColumn, aQuellAdresse.EndRow )
' Prüfen, ob ins Ziel passt
If ( aQuellDatenBereich.Rows.Count + lLetzteZeile > lMaxZeilen ) Then
MsgBox "Zielbereich zu klein zum Einfügen!" & CHR(10) & _
"Blatt " & s & " nicht kopiert", 0, sMakroName
STOP
End If
'
aQuellDaten = aQuellDatenBereich.getDataArray()
'
oZielBlatt.getCellRangeByPosition( _
aQuellAdresse.StartColumn , _
aQuellAdresse.StartRow + lLetzteZeile, _
aQuellAdresse.EndColumn , _
aQuellAdresse.EndRow + lLetzteZeile ).setDataArray( aQuellDaten )
' letzteZeile neu setzen
lLetzteZeile = lLetzteZeile + aQuellDatenBereich.Rows.Count
End Select
Next
End Sub
Der Code und Ablauf sollten selbsterklärend sein... wenn Frage bestehen: fragen !
War in der Zwischenzeit offline und hatte ausnahmsweise etwas Zeit.
Dabei kam folgendes Makro raus...vielleicht hilft es ja jemanden 8)
Den Namen des Zielblattes anpassen (erste Konstante), ggfs. die Blätter in der 2. Konstanten benennen, die nicht bearbeitet werden sollen.
Kopiert keine Formate!
[code]
' de40039
' Inhalte kopieren auf ein Zielblatt
const cZielBlatt = "summary"
const cNichtbearbeiten = "Steuerung Deckblatt label"
Private sMakroName
Private oZielBlatt
Private oZielBereich
Private oZielCursor
Private lMaxZeilen
Private lErsteSpalte
Private lLetzteZeile
' ------------------------------------------------------------------
Sub de40039
sMakroName = "Makro de40039"
' Kopieren aller Daten von einer Anzahl Tabellenblätter
' auf ein Blatt "Zusammenfassung"
' Objekte der Datei
oDok = ThisComponent
oZielBlatt = oDok.Sheets().getByName( cZielBlatt )
' Cursor für Ziel
oZielCursor = oZielBlatt.createCursor()
' Zieladresse bestimmen
oZielCursor.gotoStartOfUsedArea( FALSE )
oZielCursor.gotoEndOfUsedArea( TRUE )
lErsteSpalte = oZielCursor.getRangeAddress().StartColumn
lLetzteZeile = oZielCursor.getRangeAddress().EndRow
' max Anzahl Zeilen pro Blatt
lMaxZeilen = oDok.Sheets().getByIndex( 0 ).Rows.getCount()
de40039_kopieren
End Sub
' ------------------------------------------------------------------
' Routine zum Kopieren der Daten
Sub de40039_kopieren
' alle Namen
aQuellBlaetter = oDok.Sheets().ElementNames
' für alle Blätter im Quellbereich
For i = LBound( aQuellBlaetter ) To UBound ( aQuellBlaetter )
oTempBlatt = oDok.Sheets().getByName( aQuellBlaetter(i) )
oTempBlattName = oTempBlatt.Name
If Instr( cNichtbearbeiten, oTempBlattName ) > 0 Then
oTempBlattname = "nicht bearbeiten"
End If
Select Case oTempBlattName
' Zielblatt nicht bearbeiten
Case cZielBlatt
' sonstige Blätter,die nicht bearbeitet werden sollen
Case "nicht bearbeiten"
' alle anderen kopieren
Case Else
oQuellCursor = oTempBlatt.createCursor()
' Datenbereich ermitteln
oQuellCursor.gotoStartOfUsedArea( FALSE )
oQuellCursor.gotoEndOfUsedArea( TRUE )
' Bereichsadressen
aQuellAdresse = oQuellCursor.getRangeAddress()
aQuellDatenBereich = oTempBlatt.getCellRangeByPosition( _
aQuellAdresse.StartColumn, aQuellAdresse.StartRow, _
aQuellAdresse.EndColumn, aQuellAdresse.EndRow )
' Prüfen, ob ins Ziel passt
If ( aQuellDatenBereich.Rows.Count + lLetzteZeile > lMaxZeilen ) Then
MsgBox "Zielbereich zu klein zum Einfügen!" & CHR(10) & _
"Blatt " & s & " nicht kopiert", 0, sMakroName
STOP
End If
'
aQuellDaten = aQuellDatenBereich.getDataArray()
'
oZielBlatt.getCellRangeByPosition( _
aQuellAdresse.StartColumn , _
aQuellAdresse.StartRow + lLetzteZeile, _
aQuellAdresse.EndColumn , _
aQuellAdresse.EndRow + lLetzteZeile ).setDataArray( aQuellDaten )
' letzteZeile neu setzen
lLetzteZeile = lLetzteZeile + aQuellDatenBereich.Rows.Count
End Select
Next
End Sub[/code]
Der Code und Ablauf sollten selbsterklärend sein... wenn Frage bestehen: fragen !