Supportnet / Forum / Tabellenkalkulation
Auslesen des Ranges eines Kopierbereichs
Frage
Hallo,
ich habe eine Frage bzgl. des Kopierens in Excel.
ich will die Kopiermethode in Excel (STRG+C bzw. STRG+V) innerhalb einer ExcelTabelle nutzen. Allerdings in Kombination
mit einem Makro, das das Feld derselben Zeile in Spalte 1 grau färbt, um in einer großen Tabelle es übersichtlicher zu machen, in welcher Zeile man sich befindet.
Mal angenommen ich gehe in eine Zelle (Feld in Spalte 1 wird grau), kopiere sie, gehe nun in eine andere Zelle. das Feld in Spalte 1 der neuen Zeile wird grau, das der vorherigen wieder weiß - so wie das Makro programmiert ist. Nur geht bei der zwischenzeitlichen Umformatierung einer Zelle damit auch der Kopierbereich (laufende gestrichelte Linie) verloren, und das Kopieren funktioniert nicht.
Ich würde gerne beides kombinieren. Daher meine Fragen:
1. Es muss doch in Excel ein Objekt geben, dass genau diesen Kopierbereich enthält, den es per Strg+C dynamisch zugewiesen bekommt. Wie lautet dieses bzw. kann man auch in Makros darauf zugreifen, z.B. um zu fragen, ob dem Objekt ein Bereich zugewiesen wurde (und damit ein Kopieren aktiv ist)
2. Kann man soeinen Bereich auch über ein Makro setzen. Funktioniert dann das Einfügen oder müssen noch andere Einstellungen vorgenommen werden?
3. Oder gibt es eine Möglichkeit, zu verhindern, dass der Kopierbereich verloren geht, wenn man zwischendurch eine Zelle formatiert?
Vielen Dank.
Dirk
Antwort 1 von Beverly
Hi Dirk,
ich hoffe, ich habe dein Anliegen richtig verstanden. Sobald du in die neue Zelle gehst und das Makro für die Farbe dadurch wieder ausgelöst wird, wird sozusagen der Zwischenspeicher gelöscht und dein Kopierbereich ebenfalls. Du musst also zum Kopieren das Makro zwischenzeitlich abschalten. Schau mal auf die HP von Hajo Ziplies http://home.media-n.de/ziplies/, da gibt es auf der Seite VBA 2 Beispiele "Fadenkreuz". Vielleicht hilft dir das ja weiter.
Bis später,
Karin
ich hoffe, ich habe dein Anliegen richtig verstanden. Sobald du in die neue Zelle gehst und das Makro für die Farbe dadurch wieder ausgelöst wird, wird sozusagen der Zwischenspeicher gelöscht und dein Kopierbereich ebenfalls. Du musst also zum Kopieren das Makro zwischenzeitlich abschalten. Schau mal auf die HP von Hajo Ziplies http://home.media-n.de/ziplies/, da gibt es auf der Seite VBA 2 Beispiele "Fadenkreuz". Vielleicht hilft dir das ja weiter.
Bis später,
Karin
Antwort 2 von Dirki
Hallo Karin,
erstmal vielen Dank für die superschnelle Hilfe.
Aber ich möchte ja zum Kopieren das Makro gerade nicht abschalten.
D.h. wenn ich eine Zelle kopiere, möchte ich bei der Auswahl eines Zielfeldes sehen, in welcher Zeile ich mich nun befinde, sprich das Fadenkreuz (oder Markierung in welcher Form auch immer) UND die kopierte Zelle sollten sichtbar sein. Deshalb möchte ich ja gerne das Makro derart anpassen so frei nach der Devise (es wird aufgerufen, wenn ich in einer Zelle "lande")
1. Ist irgendwo gerade ein Kopiervorgang (d.h. gibt´s irgendwo einen markierten Kopierbereich), dann merke dir den Bereich
2. Setze die Zeilenmarkierung (und damit verschwindet der Kopierbereich ja)
3. Falls ein markierter Kopierbereich markiert worden ist, stelle dies wieder her mittels des gespeichert Werts.
Damit wird die Markierung der Zielzelle durchgeführt und der Kopiervorgang kann wie geplant durchgeführt werden.
Ich kann mir nicht vorstellen, dass Excel diesen Kopierbereich mit dem laufenden, gestrichelten Rahmen nicht als Objekt irgendwo speichert und darauf basierend kopiert. Und dann müsste man doch per Makro auch auf dieses Objekt zugreifen bzw. selbst einen Wert zuweisen können.
Ich hoffe, ich bin jetzt verstanden worden, es ist schwierig, das zu beschreiben, aber ich gebe mir Mühe. :-)
Vielen Dank.
Dirk
erstmal vielen Dank für die superschnelle Hilfe.
Aber ich möchte ja zum Kopieren das Makro gerade nicht abschalten.
D.h. wenn ich eine Zelle kopiere, möchte ich bei der Auswahl eines Zielfeldes sehen, in welcher Zeile ich mich nun befinde, sprich das Fadenkreuz (oder Markierung in welcher Form auch immer) UND die kopierte Zelle sollten sichtbar sein. Deshalb möchte ich ja gerne das Makro derart anpassen so frei nach der Devise (es wird aufgerufen, wenn ich in einer Zelle "lande")
1. Ist irgendwo gerade ein Kopiervorgang (d.h. gibt´s irgendwo einen markierten Kopierbereich), dann merke dir den Bereich
2. Setze die Zeilenmarkierung (und damit verschwindet der Kopierbereich ja)
3. Falls ein markierter Kopierbereich markiert worden ist, stelle dies wieder her mittels des gespeichert Werts.
Damit wird die Markierung der Zielzelle durchgeführt und der Kopiervorgang kann wie geplant durchgeführt werden.
Ich kann mir nicht vorstellen, dass Excel diesen Kopierbereich mit dem laufenden, gestrichelten Rahmen nicht als Objekt irgendwo speichert und darauf basierend kopiert. Und dann müsste man doch per Makro auch auf dieses Objekt zugreifen bzw. selbst einen Wert zuweisen können.
Ich hoffe, ich bin jetzt verstanden worden, es ist schwierig, das zu beschreiben, aber ich gebe mir Mühe. :-)
Vielen Dank.
Dirk
Antwort 3 von CaroS
Hallo Karin und "in Abwesenheit" auch hallo Hajo,
ich muss mal außer der Reihe einen Dank an Euch loswerden für die bereits geleistete Arbeit zum Thema "Fadenkreuz und kopieren".
Nach stundenlangen eigenen Versuchen nähere ich mich der Einsicht, dass das, was Dirki sich wünscht, wahrscheinlich wirklich nicht geht, auch wenn er es sich jetzt noch nicht vorstellen kann, dass es so ist und nicht wie er es gerne hätte.
Das Leben kann ziemlich gemein sein, aber ich versuche es mit Fassung zu tragen. Um so mehr möchte ich mich denen bedanken, die das Gebiet schon mal nach einer möglichen Lösung abgeklopft und auch eine gefunden haben. Da ist zumindest etwas Licht im Tunnel, was ja nicht heißen muss, dass man in alle Ewigkeit nicht versucht, doch mal einen ganz neuen Stollen zu graben. Aber im Moment schaffe ich es nicht.
Es scheitert leider daran, dass ich einen gemerkten Zellinhalt per Makro nicht aus einer Variablen in die Zwischenablage hineinbekomme, so dass der Benutzer diesem Inhalt dann - so als wäre nichts gewesen außer seinem vorherigen Strg+C - nur noch mit Strg+V in die markierte Zelle kopieren braucht. Schade, aber trotzdem ganz interessant.
Gruß,
CaroS
ich muss mal außer der Reihe einen Dank an Euch loswerden für die bereits geleistete Arbeit zum Thema "Fadenkreuz und kopieren".
Nach stundenlangen eigenen Versuchen nähere ich mich der Einsicht, dass das, was Dirki sich wünscht, wahrscheinlich wirklich nicht geht, auch wenn er es sich jetzt noch nicht vorstellen kann, dass es so ist und nicht wie er es gerne hätte.
Das Leben kann ziemlich gemein sein, aber ich versuche es mit Fassung zu tragen. Um so mehr möchte ich mich denen bedanken, die das Gebiet schon mal nach einer möglichen Lösung abgeklopft und auch eine gefunden haben. Da ist zumindest etwas Licht im Tunnel, was ja nicht heißen muss, dass man in alle Ewigkeit nicht versucht, doch mal einen ganz neuen Stollen zu graben. Aber im Moment schaffe ich es nicht.
Es scheitert leider daran, dass ich einen gemerkten Zellinhalt per Makro nicht aus einer Variablen in die Zwischenablage hineinbekomme, so dass der Benutzer diesem Inhalt dann - so als wäre nichts gewesen außer seinem vorherigen Strg+C - nur noch mit Strg+V in die markierte Zelle kopieren braucht. Schade, aber trotzdem ganz interessant.
Gruß,
CaroS
Antwort 4 von JoeKe
Hallo zusammen,
auch wenn ich denn Vorschlag von @Karin nutzen würde, hier mal ein Denkansatz.
In das VBA-Projekt "DieseArbeitsmappe":
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "^{c}"
Application.OnKey "^{v}"
End Sub
Private Sub Workbook_Open()
Application.OnKey "^{c}", "Kopieren"
Application.OnKey "^{v}", "Einfügen"
End Sub
In ein Standartmodul:
Option Explicit
Public a As String
Sub Kopieren()
a = ActiveCell
End Sub
Sub Einfügen()
ActiveCell = a
End Sub
Beim öffnen der Datei wird der Tastenkombi "Strg+c" das Makro "Kopieren" zugewiesen und der Kombi "Strg+v" das Makro "EInfügen". Beim schließen der Mappe werden die Standart Funktion gesetzt.
Das Makro "Kopieren" liest den Wert der aktive Zelle in die Variable a ein. Das Makro "Einfügen" liest die Variable in die aktieve Zelle aus.
Um in Spalte A die Zeile der aktiven Zelle grau zu färben, könnte folgender Code im VBA-Projekt der Tabelle verwendet werden:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Zeile As Long
Cells.Interior.ColorIndex = xlNone
Zeile = ActiveCell.Row
Cells(Zeile, 1).Interior.ColorIndex = 15
End Sub
Nachteile des Ganzen:
- Es funktioniert bloß für eine Zelle.
- Alle Zellhintergrundformatierungen, die eventuell bestehen, gehen verloren.
- Es ist immer heikel die Standart Einstellungen auf diese Weise zu verändern. Meine Empfehlung wäre eine andere Tastenkombi zu wählen. Strg+k und Strg+e z.B. Sollten die Belegungen dann nicht zurück gesetzt werden, können sie keinen Schaden anrichten. Und Nutzer die die neue Belegung nicht kennen, können in der Datei keinen Schaden anrichten.
MfG
JöKe
auch wenn ich denn Vorschlag von @Karin nutzen würde, hier mal ein Denkansatz.
In das VBA-Projekt "DieseArbeitsmappe":
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "^{c}"
Application.OnKey "^{v}"
End Sub
Private Sub Workbook_Open()
Application.OnKey "^{c}", "Kopieren"
Application.OnKey "^{v}", "Einfügen"
End Sub
In ein Standartmodul:
Option Explicit
Public a As String
Sub Kopieren()
a = ActiveCell
End Sub
Sub Einfügen()
ActiveCell = a
End Sub
Beim öffnen der Datei wird der Tastenkombi "Strg+c" das Makro "Kopieren" zugewiesen und der Kombi "Strg+v" das Makro "EInfügen". Beim schließen der Mappe werden die Standart Funktion gesetzt.
Das Makro "Kopieren" liest den Wert der aktive Zelle in die Variable a ein. Das Makro "Einfügen" liest die Variable in die aktieve Zelle aus.
Um in Spalte A die Zeile der aktiven Zelle grau zu färben, könnte folgender Code im VBA-Projekt der Tabelle verwendet werden:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Zeile As Long
Cells.Interior.ColorIndex = xlNone
Zeile = ActiveCell.Row
Cells(Zeile, 1).Interior.ColorIndex = 15
End Sub
Nachteile des Ganzen:
- Es funktioniert bloß für eine Zelle.
- Alle Zellhintergrundformatierungen, die eventuell bestehen, gehen verloren.
- Es ist immer heikel die Standart Einstellungen auf diese Weise zu verändern. Meine Empfehlung wäre eine andere Tastenkombi zu wählen. Strg+k und Strg+e z.B. Sollten die Belegungen dann nicht zurück gesetzt werden, können sie keinen Schaden anrichten. Und Nutzer die die neue Belegung nicht kennen, können in der Datei keinen Schaden anrichten.
MfG
JöKe
Antwort 5 von nighty
hi caros :)
beschaeftige dich mal mit globalen ein oder mehrdimensionalen variablen
das sollte deine beschriebene problematik leicht beheben koennen
gruss nighty
beschaeftige dich mal mit globalen ein oder mehrdimensionalen variablen
das sollte deine beschriebene problematik leicht beheben koennen
gruss nighty
Antwort 6 von CaroS
Hallo nighty,
vielleicht kannst Du mir noch etwas weiter auf die Sprünge helfen, denn genau damit probiere ich es schon seit längerer Zeit, schaffe es aber nicht. Das Problem waren bisher auch nicht die Variablen.
Ich kann ja kurz mal meinen Ansatz erklären. Ich habe eine globale Range-Variable und eine globale Wert-Variable (da habe ich erstmal String genommen, die kann aber ebenso gut auch Variant sein). Wenn sie beide leer sind, selektiere ich im Workbook_Open irgendeine Zelle (A1 oder so) und initialisiere damit die beiden Variablen (A1 und Wert von A1). Bei jedem Worksheet_SelectionChange weiß ich nun, welche die letzte Zelle war und was drinne steht. Nachdem ich den alten Wert in die Zwischenablage kopiert habe, schreibe ich aus Target gleich die neuen Werte in die globalen Variablen, während der letzte Wert so in der Zwischenablage steht , als ob ihn der Benutzer in der letzten Zelle mit Strg+C dort hineinkopiert hätte. Hatte er ja vielleicht auch, aber das bleibt leider effektiv ohne Wirkung, aber das wiederung braucht er ja nicht wissen.
Der Benutzer drückt also in der alten Zelle Strg+C und denkt, er hat den Inhalt der Zelle in die Zwischenablage kopiert. Da das im Zusammenhang mit dem Fadenkreuz aber wirkungslos bleibt, mache ich das (mit Hilfe der globalen Variablen) noch einmal "richtig", nachdem er in eine andere Zelle gewechselt ist und er kann dort nun in aller Ruhe Strg+V drücken und bekommt den alten Wert in die neue Zelle eingefügt. Das Fadenkreuz kann man dann nebenbei auch irgendwann setzen. Wenn man ScreenUpdating zeitweilig ausgeschaltet hat, kommt es gar nicht so darauf an, wann man das tut.
So könnte das (vielleicht) gehen, aber das Reinkopieren des alten Wertes aus der globalen Variablen in die Zwischenablage kriege ich leider nicht hin. Wobei ich mich auch noch nicht richtig mit Application.OnKey beschäftigt habe, das sollte ich vielleicht mal als nächstes tun.
Ich weiß übrigens auch, dass dieses Vorgehen einen ziemlich großen Nachteil hat, aber bevor es nicht läuft, brauchen wir darüber auch nicht diskutieren. Vielleicht gibt´s ja sowieso noch andere, bessere Vorschläge.
Gruß,
CaroS
vielleicht kannst Du mir noch etwas weiter auf die Sprünge helfen, denn genau damit probiere ich es schon seit längerer Zeit, schaffe es aber nicht. Das Problem waren bisher auch nicht die Variablen.
Ich kann ja kurz mal meinen Ansatz erklären. Ich habe eine globale Range-Variable und eine globale Wert-Variable (da habe ich erstmal String genommen, die kann aber ebenso gut auch Variant sein). Wenn sie beide leer sind, selektiere ich im Workbook_Open irgendeine Zelle (A1 oder so) und initialisiere damit die beiden Variablen (A1 und Wert von A1). Bei jedem Worksheet_SelectionChange weiß ich nun, welche die letzte Zelle war und was drinne steht. Nachdem ich den alten Wert in die Zwischenablage kopiert habe, schreibe ich aus Target gleich die neuen Werte in die globalen Variablen, während der letzte Wert so in der Zwischenablage steht , als ob ihn der Benutzer in der letzten Zelle mit Strg+C dort hineinkopiert hätte. Hatte er ja vielleicht auch, aber das bleibt leider effektiv ohne Wirkung, aber das wiederung braucht er ja nicht wissen.
Der Benutzer drückt also in der alten Zelle Strg+C und denkt, er hat den Inhalt der Zelle in die Zwischenablage kopiert. Da das im Zusammenhang mit dem Fadenkreuz aber wirkungslos bleibt, mache ich das (mit Hilfe der globalen Variablen) noch einmal "richtig", nachdem er in eine andere Zelle gewechselt ist und er kann dort nun in aller Ruhe Strg+V drücken und bekommt den alten Wert in die neue Zelle eingefügt. Das Fadenkreuz kann man dann nebenbei auch irgendwann setzen. Wenn man ScreenUpdating zeitweilig ausgeschaltet hat, kommt es gar nicht so darauf an, wann man das tut.
So könnte das (vielleicht) gehen, aber das Reinkopieren des alten Wertes aus der globalen Variablen in die Zwischenablage kriege ich leider nicht hin. Wobei ich mich auch noch nicht richtig mit Application.OnKey beschäftigt habe, das sollte ich vielleicht mal als nächstes tun.
Ich weiß übrigens auch, dass dieses Vorgehen einen ziemlich großen Nachteil hat, aber bevor es nicht läuft, brauchen wir darüber auch nicht diskutieren. Vielleicht gibt´s ja sowieso noch andere, bessere Vorschläge.
Gruß,
CaroS
Antwort 7 von nighty
hi caros :)
hier ein beispiel was von einer mehrfachmarkierung die werte wie den farbindex wie die addresse in einem array speichert
1 selection einer mehrfachmarkierung
2 mehrfachmarkierung wird farblich hervorgehoben
3 von der activen zelle ausgehend werden die zuvor in einem array gespeicherten werte wieder dargestellt
4 loeschung der zuvor hervorgehobenen farbmarkierung
viel spass damit :))
gruss nighty
Public zellen() As String
Public zaehler As Long
Option Explicit
Sub Kopieren()
zaehler = 0
Dim zelle As Range
Dim selekt As Long
ReDim zellen((Selection.Count + 1) * 3)
If Selection.Count > 1 Then
For Each zelle In Selection
zellen(zaehler) = Cells(zelle.Row, zelle.Column).Address(0, 0)
zellen(zaehler + 1) = Cells(zelle.Row, zelle.Column).Interior.ColorIndex
zellen(zaehler + 2) = Cells(zelle.Row, zelle.Column).Value2
zaehler = zaehler + 3
Cells(zelle.Row, zelle.Column).Interior.ColorIndex = 3
Next zelle
End If
End Sub
Sub einfuegen()
Dim bereich As Range
Dim zaehler1 As Long
Dim anzahl As Long
If zaehler > 0 Then
Set bereich = ActiveCell
For anzahl = 0 To zaehler - 1 Step 3
Range(zellen(anzahl)).Interior.ColorIndex = Val(zellen(anzahl + 1))
Cells(bereich.Row + zaehler1, bereich.Column) = Val(zellen(anzahl + 2))
zaehler1 = zaehler1 + 1
Next anzahl
ReDim zellen(0)
zaehler = 0
End If
End Sub
hier ein beispiel was von einer mehrfachmarkierung die werte wie den farbindex wie die addresse in einem array speichert
1 selection einer mehrfachmarkierung
2 mehrfachmarkierung wird farblich hervorgehoben
3 von der activen zelle ausgehend werden die zuvor in einem array gespeicherten werte wieder dargestellt
4 loeschung der zuvor hervorgehobenen farbmarkierung
viel spass damit :))
gruss nighty
Public zellen() As String
Public zaehler As Long
Option Explicit
Sub Kopieren()
zaehler = 0
Dim zelle As Range
Dim selekt As Long
ReDim zellen((Selection.Count + 1) * 3)
If Selection.Count > 1 Then
For Each zelle In Selection
zellen(zaehler) = Cells(zelle.Row, zelle.Column).Address(0, 0)
zellen(zaehler + 1) = Cells(zelle.Row, zelle.Column).Interior.ColorIndex
zellen(zaehler + 2) = Cells(zelle.Row, zelle.Column).Value2
zaehler = zaehler + 3
Cells(zelle.Row, zelle.Column).Interior.ColorIndex = 3
Next zelle
End If
End Sub
Sub einfuegen()
Dim bereich As Range
Dim zaehler1 As Long
Dim anzahl As Long
If zaehler > 0 Then
Set bereich = ActiveCell
For anzahl = 0 To zaehler - 1 Step 3
Range(zellen(anzahl)).Interior.ColorIndex = Val(zellen(anzahl + 1))
Cells(bereich.Row + zaehler1, bereich.Column) = Val(zellen(anzahl + 2))
zaehler1 = zaehler1 + 1
Next anzahl
ReDim zellen(0)
zaehler = 0
End If
End Sub

