Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

vba: Daten aus Namensbereich umkopieren
#11
Smile 
Hallo Helmut,

ja genau das befürchte ich ja auch - dass die Bereiche zerschossen werden.

Ideen hätte ich wie man das handeln könnte - aber ob es einfach umzusetzen ist weiß ich nicht - und wie es ev. mit vba umsetzbar wäre erst recht nicht.

Ich versuche mal meine einige Möglichkeiten zu formulieren -
mit der Prämisse wie zuvor beschrieben - sollen die Datenbereiche im Zielblatt nach dem Umkopieren jeweils eine Zeile & eine Spalte voneinander getrennt sein.

1. Alle Daten und benannte Bereiche im Zielblatt vor einem Um-Kopiervorgang löschen - somit ist nichts mehr im Wege und die Datenbereiche können neu angelegt werden.

2. Oder - man fügt beim ersten Kopiervogang einen Zeilen- und Spaltenpuffer ein - den man ev. über eine Dialogbox festlegen kann (Muss aber nicht sein) - z.B. 5 Zeilen & 3 Spalten.
Mehr als 5 Zeilen & 3 Spalten Puffer werde ich für diesen Anwendungsfall sicher nicht benötigen. Ist der Um-Kopiervorgang beendet löscht man alle freien Zeilen/Spalten, bis auf eine Zeile/Spalte wieder weg.

3. Oder - man erkennt beim Kopiervorgang wie groß der neue Datenbereich ist und schiebt dann u.U. eine weitere Zeile/Spalte vor den nächsten Datenblock.

4. Wie unter 1. Alle Daten und benannte Bereiche im Zielblatt vor einem Um-Kopiervorgang löschen - bewerten wie groß der größte Datenbereich in den Quellblättern ist - und dann alle Datenbereiche im Zielblatt auf diese Größe einstellen.

Was noch wichtig wäre ist, wenn die Quelldaten gefiltert sich - also nicht alle Zeilen sichtbar sind - dann sollen auch nur diese ins Zielblatt kopiert werden.

Ich hänge mal ein Beispiel-Zielblatt an. So sollte die Aufteilung aussehen, wobei wie gesagt die einzelnen Blöcke unterschiedlich lang sein können.

Sicher gibt es noch elegantere Möglichkeiten so etwas abzubilden - es führen viele Wege nach Rom

Vielleicht kannst Du jetzt nochmal etwas zaubern!


Angehängte Dateien
.xlsx   Zieltabelle1.xlsx (Größe: 17,54 KB / Downloads: 2)
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#12
Hallo Erich,

wenns so "gekachelt" (die ersten Zellen der benannten Bereiche stehen immer in der gleichen Zeile oder Spalte) ist, geht eine Erweiterung.
Immer wenn ein Bereich in eine andere "Kachel" reichen würde, werden entsprechend viele ganze Zeilen oder Spalten hinzugefügt.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#13
Hallo Erich,

in der Anlage ein Programmversion, die die hinteren Kacheln nach unten/rechts verschiebt, wenn der Bereich ansonsten in die nächste Kachel reichen würde.


Angehängte Dateien
.xlsm   BereicheKopieren.xlsm (Größe: 31,72 KB / Downloads: 2)
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





[-] Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:
  • sharky51
Antworten Top
#14
Hallo helmut,

das ist genial, vielen Dank!

Ist es jetzt noch möglich nur den sichtbaren Bereich der Quell-Mappe zu übertragen? Im Moment wird ja alles was im Bereichsnamen der Quell-Mappe steht mit übertragen.
Ich blende aber mittels eines Makros alle Zeilen ohne Hintergrundfarbe aus - heißt ich will nun nur die jetzt sichtbaren Zeilen umkopieren.

Gibt es dazu noch eine Möglichkeit? Vielleicht ist die Größe des Namenbereiches mit der Filterung anzupassen eine einfache Möglichkeit.

Hier die Makros (Quelle aus dem Netz) für die Filter ein- und ausblenden:
Code:
'Blendet alle Zeilen in allen Tabellenblätter ohne Hintergrundfarbe ab Blatt 2 aus
Sub Hide_Zeilen_ohne_Farbe()
 
 On Error Resume Next
 
 'letzte Zeile in Spalte A suchen
 Dim Zeilenanzahl As Long
 Zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
 
 'letzte Spalte in Zeile 1 suchen - falls alle Spalten durchsucht werden sollen
 Dim Spaltenanzahl As Integer
 'Spaltenanzahl = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
 
 'Spalte J
 Spaltenanzahl = 11
 Startzeile = 5
 Startspalte = 8
 
 Dim i As Long, n As Integer, myColor As Boolean
 For i = Startzeile To Zeilenanzahl
   'For n = 1 To Spaltenanzahl
   Cells(i, Startspalte).Select
   'Falls Du mal alles farbige (Hintergrund) ausblenden willst
   'If Cells(i, n).Interior.ColorIndex <> xlNone Then
   If (Cells(i, Startspalte).Interior.ColorIndex = 43) Or (Cells(i, Startspalte).Interior.ColorIndex = 44) Then
     myColor = True
     'Exit For
   End If
   'Next n
   If myColor = False Then
     Rows(i).Hidden = True
   End If
   myColor = False
 Next i
End Sub


'Blendet alle ausgeblendeten Zeilen in allen Tabellenblätter ab Blatt 2 wieder ein
Sub AllesEinblenden()
 
 SheetNumber = 3       'Start ab Tabelle3
 
 With ActiveWorkbook
   ' Begin the loop.
   For i = SheetNumber To Worksheets.Count
     Worksheets(i).Select
     
     With ActiveSheet
       .Columns.Hidden = False        'Kurzform
       .Rows.EntireRow.Hidden = False 'Langform
     End With
   Next i
   
 End With
End Sub


Habe schon überlegt ob erst alle Datenblöcke komplett ins Zielblatt übertragen werden sollen und dann erst alle Zeilen ohne Hintergrundfarbe auszublenden sind.
Das funktioniert aber nicht, weil die Blöcke ja unterschiedlich lang sind - und immer in einer Zeile in irgend einer Spalte eine Zelle einen farbigen Hintergrund hat.
Ist deshalb wohl keine Option!

Wäre schön wenn Du da noch einen Tipp oder Lösung hättest.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#15
Hallo Erich,

hier eine Version, in der nur die sichtbaren Zeilen kopiert werden.

ps. Da beim Anlegen eines Filters auch ein Name erzeugt wird, dürfen die zu kopierenden Bereiche jetzt im Namen die Zeichenfolge "_Filter" nicht mehr enthalten.


Angehängte Dateien
.xlsm   BereicheKopieren.xlsm (Größe: 32,84 KB / Downloads: 4)
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





[-] Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:
  • sharky51
Antworten Top
#16
Hallo helmut,

das ist einfach genial was Du da anbietest, super!
VIELEN DANK! - für Deine Mühe und Geduld!

Jetzt muss ich den Code nur noch komplett verstehen.

Ich wünsche Dir ein Schönes WE.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#17
Hallo helmut,

ich hätte da noch eine Frage.
Die umkopierten Datenbereiche in die Zieltabelle können, wie bereits beschrieben, unterschiedliche Längen haben.
Dadurch entstehen zwischen den Datenblöcken unterschiedlich viele leere Zeilen.
Zur Anschauung ist die Tabelle nochmals beigefügt.

Meine Frage jetzt dazu:
Wie kann man per vba alle leeren Zeilen zwischen den Datenblöcken nach dem umkopieren herauslöschen - aber wegen der Übersichtlichkeit sollen jeweils zwei Zeilen Abstand zwischen den Datenblöcken erhalten bleiben.

Vielleicht hast Du mir da noch einem Tipp?


Angehängte Dateien
.xlsx   Zieltabelle1.xlsx (Größe: 20,4 KB / Downloads: 1)
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#18
Hallo Erich,

A) Bisher habe ich die Erweiterung so eingerichtet, dass nach einer Erweiterung immer mindestens eine Leerzeile/-spalte zwischen den Datenblöcken ist. Sollen das bei den Zeilen nun zwei sein?

B) Da ich nicht weis, wie die Blöcke nach einer Kürzung aussehen, dachte ich, dass du, wenn die Blöcke zu weit auseinanderstehen, einfach vor einem Kopiervorgang manuell einige Zeilen oder Spalten entfernst. Hierbei must du nicht auf die genaue Zeile/Spalte achten, da ja, wenn du zuviel löscht, die Bereiche wieder erweitert werden. Nur die Leerzeile/-spalte vor dem Block und die erste Zeile/Spalte des Blockes müssen bleiben.


C) Man könnte aber auch ein Programm schreiben, dass die Abstände der Kacheln minimiert. Es könnte über einen eigenen Button angestossen werden oder nach jedem Kopiervorgang laufen.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





[-] Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:
  • sharky51
Antworten Top
#19
Hallo helmut,

es wäre schön wenn die Variante "C" mit einem separaten Button möglich wäre.
Als Minimum der Abstände zwischen den Kacheln sollten aber zwei Zeilen bestehen bleiben bzw. wenn notwendig auf zwei Zeilen erweitert werden.

Ich habe mich selbst mal ein wenig versucht, aber mit weniger Erfolg.
Es werden nicht alle leere Zeilen erkannt weil die Schleifenvariable ja hochläuft.

Code:
Sub ZeileLeer()
  With ActiveSheet.UsedRange
   leZeile = .Row + .Rows.Count - 1
 End With
 For i = 2 To leZeile
       If WorksheetFunction.CountA(Rows(i)) = 0 Then
     MsgBox "Zeile " & i & " ist leer"
     Rows(i).Delete shift:=xlUp
     leZeile = i - 1
   Else
     MsgBox "Zeile " & i & " ist nicht leer"
   End If
  Next
End Sub
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#20
Hallo Erich,

In dem Zieltabellenblatt nach leeren Zeilen und Spalten zu suchen passt meines Erachtens nicht  zu den bisherigen Funktionen. Ich habe daher folgendes realisiert:

Das Programm sucht in jeder Kachelzeile/-spalte nach dem längsten benannten Bereich. Wenn die Kachelläng um mehr als 2Zeilen/1Spalte länger ist, werden die entsprechenden Zeilen/Spalten gelöscht.

Das heist, dass manuelle Einträge im Zielarbeitsblatt in den/der  2Zeilen/1Spalte vor einer Kachel nicht gelöscht werden, wenn sie


Angehängte Dateien
.xlsm   BereicheKopieren.xlsm (Größe: 40,08 KB / Downloads: 4)
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





[-] Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:
  • sharky51
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste