Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
344to348
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
344to348
344to348
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zusammenhängende Zellenblöcke kopieren

Zusammenhängende Zellenblöcke kopieren
27.11.2003 18:08:54
FlipHH
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

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zusammenhängende Zellenblöcke kopieren
27.11.2003 19:45:52
Günther Abel

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

Anzeige
AW: Zusammenhängende Zellenblöcke kopieren
28.11.2003 09:44:37
FlipHH
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
Anzeige
Schritt für Schritt
28.11.2003 19:29:11
Günther Abel
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
Anzeige
AW: Schritt für Schritt
01.12.2003 11:43:19
FlipHH
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
Anzeige
AW: Schritt für Schritt
01.12.2003 22:08:30
Günther Abel
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
Anzeige
AW: Schritt für Schritt
02.12.2003 13:01:33
FlipHH
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
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige