Zusammenhängende Zellenblöcke kopieren

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Zusammenhängende Zellenblöcke kopieren
von: FlipHH
Geschrieben am: 27.11.2003 18:08:54

Hallo

Ich bin neu zu VBA gekommen und habe ein Problem: Ich möchte gerne aus einem Workbook Zellen in ein anderes kopieren. Ich kenne den Anfang der Ursprungszelle und möchte von dort nach unten und rechts alle nichtleeren Zellen kopieren. Von dem Ziel kenne ich auch nur die Anfangszelle. Das ganze sollte wenn es geht in einer Funktion passieren, die die beiden Range Objekte übergeben bekommt.
Ich habe mehrer Versionen probiert, aber es hat nur mit zwei verschachtelte While - Schleifen (ansatzweise) funktioniert. Diese Version war aber leider sehr sehr langsam (weil das Programme jede Zelle einzeln öffnen muss ?!). Ich hätte gerne gewust, ob ihr eine bessere Idee habt...

Meine bisherige Version:

Function(VarSheetRange AS Range DestRange AS Range)
While VarSheetRange.Cells(i, j) <> ""
While VarSheetRange.Cells(i, j) <> ""
DestRange.Cells(i, j).Value = VarSheetRange.Cells(i, j).Value
i = i + 1
Wend
i = 1
j = i + 1
Wend
End Function

Viele Grüße
Flip

Bild


Betrifft: AW: Zusammenhängende Zellenblöcke kopieren
von: Günther Abel
Geschrieben am: 27.11.2003 19:45:52


Sub aufr()
   Dim z1 As Range, b1 As Range, z2 As Range, b2 As Range
   Dim WB1 As Workbook, WB2 As Workbook
   Dim ws1 As Worksheet, ws2 As Worksheet
   
   Set WB1 = Workbooks("Mappe1.xls")
   Set WB2 = Workbooks("Mappe2.xls")
   Set ws1 = WB1.Worksheets("Tabelle1")
   Set ws2 = WB2.Worksheets("Tabelle1")
   Set z1 = ws1.[a1]
   Set z2 = ws2.[b3]
   
   Call blablab(z1, z2, b1, b2)
   b1.Copy b2
End Sub


Sub blablab(Ur_Zelle As Range, Zielzell As Range, _
           UBereich As Range, ZBereich As Range)
     
   Dim r&, c&
   
   r = Ur_Zelle.End(xlDown).Row - 1
   c = Ur_Zelle.End(xlToRight).Column - 1
   Set UBereich = Range(Ur_Zelle, Ur_Zelle.Offset(r, c))
   Set ZBereich = Range(Zielzell, Zielzell.Offset(r, c))
End Sub



Bild


Betrifft: AW: Zusammenhängende Zellenblöcke kopieren
von: FlipHH
Geschrieben am: 28.11.2003 09:44:37

Hallo
Ich bin beeindruckt: vielen Dank für deine schnelle Antwort. Das Programm klappt super, wenn ich es mit zwei Arbeitsmappen laufen lasse und die Namen von Hand eingebe ("Mappe1" , "Tabelle1" usw.).
Wenn ich aber als Worksheet das Rückgabeobjekt meiner Funktion verwende (soll mir den Namen/das Worksheet der entsprechenden Quelle berechnen), dann bekomme ich ein Fehler 1004. Ich denke ich habe ein Problem mit der Übergabe des Worksheet-Objekts. Auch wenn ich mir nur den Namen als String übergebe und dann versuche mit datenWorkbook.Worksheet(NameString) ein Handle auf das Worksheetobjekt zu erhalten, habe ich den gleichen Fehler.
Könnt ihr mir helfen?
Ich muss auch zugeben, das ich bei der o.A. Lösung die Übergabe/Gültigkeit der Objekte nicht verstanden habe...
Vielen Dank
Flip


Bild


Betrifft: Schritt für Schritt
von: Günther Abel
Geschrieben am: 28.11.2003 19:29:11

Hi Flip,

wenn du noch "neu" in VBA und Einsteiger ohne Programmiererfahrung bist,
so ist deine Erwartungshaltung an dich selbst in dieser Phase zu hoch.

Ich möchte deshalb nicht näher auf deine Funktion,
sondern vielmehr auf die eingesetzten Objekte eingehen.

Diese Excel-Objekte sind hierarchisch aufgebaut:
Die Arbeitsmappe, eine darin enthaltene Tabelle, ein darin enthaltener Bereich.

Der erste Schritt ist die Variablendeklaration:

Dim WB1 As Workbook
Dim ws1 As Worksheet
Dim z1 As Range

Die Variablen (hier WB1, ws1, z1) kannst du selbst bennenen.
Cursor auf DIM, F1 = schau mal in die Online-Hilfe.

Set weist einer Objektvariablen den Verweis auf das über dim deklarierte Objekt zu.

Set WB1 = Workbooks("Mappe1.xls")

Dadurch erhält WB1 die Attribute einer Arbeitsmappe
(probiers: schreib irgendwo WB1 innerhalb der Prozedur und einen Punkt dahinter....)

hier geht's weiter:

Set ws1 = WB1.Worksheets("Tabelle1")

ws1 stellt jetzt Tabelle1 von Mappe1.xls dar und mit

Set z1 = ws1.[a1] oder
Set z1 = ws1.range("a1") (F1 auf set.....)

ist letztendlich exakt die Zelle A1 der Tabelle1 in Mappe1.xls
eindeutig angesprochen.

Dabei will ich es belassen.
Wenn du dazu noch Fragen hast... ok

Schönes Wochenende

Günther


Bild


Betrifft: AW: Schritt für Schritt
von: FlipHH
Geschrieben am: 01.12.2003 11:43:19

Hi Günther,
ich glaube ich habe mich etwas ungünstig ausgedrückt. Ich habe etwas Programmiererfahrung in Java und mir ist der Grundgedanke des objektorientierten Programmierens durchaus klar, allein mit VBA haperte es noch.
In Java erstelle ich ein Objekt und habe dann automatisch ein Handle darauf mit dem ich Arbeiten kann, während in Excel die Objekte: Tabellen/Dateien/Zellen schon vorher da sind und ich mir dann irgendwie ein Handle darauf besorgen muss, eh ich damit arbeiten kann. Wenn ich mir aber ein Handle in einer Subroutine/Funktion besorge und das dann als Rückgabewert meiner Funktion verwende:

FUNKTION xy(...) AS WORKSHEET

und im Hauptprogramm:

DIM ws AS WORKSHEET
SET ws=xy(...)

müsste ich auf das Objekt doch auch aus meinem Hauptptogramm zugreifen können.
In meinem Programm durch suche ich alle Worksheets in einem Workbook nach einem bestimmten Eintrag (mit FOR EACH worksheet in übergebenem Workbook...)
Wenn ich dann dieses Worksheet gefunden habe sichere ich es in einer Variable vom Typ Worksheet und gebe diese zurück, bzw. erhalte dann Fehler 1004.

Jetzt zu meinen Schwierigkeiten mit dem Verständnis deines Programms: Du erstellst im Hauptprogramm ein leeres Objekt vom Typ Range (Urbereich), übergibst es an die Subroutine und überschreibst es dann mit dem richtigen Rangeobjekt und dann ist es auch im Hauptprogramm geändert (wegen Übergabe als Referenz : byRef ?!)

Vielen Dank und viele Grüße
Philipp


Bild


Betrifft: AW: Schritt für Schritt
von: Günther Abel
Geschrieben am: 01.12.2003 22:08:30

Hallo Philipp,

sorry, jetzt hat's aber etwas gedauert mit einer Antwort.
>Jetzt zu meinen Schwierigkeiten mit dem Verständnis deines Programms: Du erstellst im
>Hauptprogramm ein leeres Objekt vom Typ Range (Urbereich), übergibst es an die
>Subroutine und überschreibst es dann mit dem richtigen Rangeobjekt und dann ist es auch
>im Hauptprogramm geändert (wegen Übergabe als Referenz : byRef ?!)

Ja.

Alles ByRef, z1 und z2 sind bereits definierte Range-Objekte
b1 und b2 die Rückgaben aus der Funktion.
Ist natürlich nicht astrein, weil z1 und z2 ausreichen würden,
wollte das wegen der besseren Übersichtlichkeit trennen
und hab wohl nur für Verwirrung gesorgt.... :-))
Call blablab(z1, z2, b1, b2)


>müsste ich auf das Objekt doch auch aus meinem Hauptptogramm zugreifen können.
Ja:
Angenommen, in der Arbeitsmappe, in der sich dieser Quellcode befindet,
muss einmal in irgend einer Tabelle Hurra in Zelle a1 stehen
(alles ohne Fehlerbehandlung):


Sub MachMal()
   Dim wb As Workbook
   Dim ws As Worksheet
   
   Set wb = ThisWorkbook ' oder Workbooks("NameEinerGeoeffnetenMappe")
   MsgBox MySheet(wb).Name
End Sub




Function MySheet(wb) As Worksheet
   Dim ws As Worksheet
   
   For Each ws In wb.Worksheets
      If ws.[a1] = "Hurra" Then
         Set MySheet = ws
         Exit Function
      End If
   Next
End Function


' [a1] = kurzschreibweise für Range("a1")


Viel Spass

Günther


Bild


Betrifft: AW: Schritt für Schritt
von: FlipHH
Geschrieben am: 02.12.2003 13:01:33

Hallo Günther,

ich hab es jetzt hinbekommen, vielen Dank für deine Hilfe. Das Problem lag daran, dass die Routine und die Hilfsfunktionen einem Tabellenblatt zugeordnet waren und nicht als Modul geschrieben war (was ich dir ungünstiger weise verschwiegen hatte...). deshalb haben die Rangeobjekte, die aus der Funktion zurückgegeben wurden, bzw. gesetzt wurden nur dann Funktioniert (d.h. kein Fehler 1004), wenn sie sich auf Zellen aus dem selben Arbeitsblatt beziehen. D.h. also ein Rangeobjekt beinhaltet scheinbar nur dann die Information zu welcher Arbeitsmappe.Arbeitsblatt sie gehören, wenn sie in Modul definiert sind. Wenn der aufrufende Code hingegen in einem Tabellenblatt steht bzw. diesem zugeordnet ist, enthält es nur den lokalen Zellenbezug, und kann daher nicht auf andere Arbeitsblätter zugreifen. Ist das so ungefähr richtig?!
Vielen Dank für deine Hilfe, es läuft bestens.

Philipp


Bild

Beiträge aus den Excel-Beispielen zum Thema " Zusammenhängende Zellenblöcke kopieren"