per Makro (Worksheet_BeforeDoubleClick) bestimmten Zellen Inhalt in eine andere Zelle kopieren

  • Excel

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    per Makro (Worksheet_BeforeDoubleClick) bestimmten Zellen Inhalt in eine andere Zelle kopieren

    Hallo und guten Tag,

    ich hoffe ich beschreibe hier nicht ein schon so oft behandeltes Thema, aber meine Suche ergab nicht das richtige Ergebnis.

    ich habe eine Excel Tabelle, in dieser soll per Makro ((Worksheet_BeforeDoubleClick)) der Zellen Inhalt in eine andere kopiert werden (Range("..").Value = Range("...").Value).

    Beispiel:
    In Zelle B2 steht der Wert 123, bei doppel Klick in Zelle A3 soll der Wert 123 in der Zelle A3 eingefügt bzw. kopiert werden, bei doppel Klick auf A4 soll der Wert aus der Zelle B3 in die Zelle A4 kopiert werden. Das ganze 15 mal in der Spalte A (A3-A18 kopieren den Wert aus B2-B17).
    Zudem soll das gleiche Prozedere in der Spalte C 15 mal möglich sein, bei doppel Klick auf C3 wird der Wert aus D2 kopiert usw......

    Gruß und Danke in voraus
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Also kann man sagen wenn Wert in a2 dann copy in b2 bei Doppelklick auf b2 oder ist das zu Pauschal?
    Weil woran kann erkannt werden, welcher Wert wohin soll?

    Sagen wir a1 und a2 haben einen Wert und dann soll in b3 einer dieser Werte. Woran soll das erkannt werden?

    Edit: Bzw. willst du das wenn z. B. in a2 ein Wert steht, dieser nach b2+1 also b3 kopiert wird?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Sam85“ ()

    Richtig, es ist ziemlich Pauschal. Wenn Wert in B2 und bei doppel Klick auf A3, dann den Wert aus B2 in A3 kopieren uns so weiter bis wenn doppel Klick auf A18 und Wert in B17, dann kopiere Wert aus B17 in A18.
    Das gleiche in Spalte C und D.

    Wenn Wert in D2 und doppel Klick auf C3 dann kopiere Wert aus D2 in C3
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Was fehlt dir?
    Der grundsätzliche Rahmen?

    Visual Basic-Quellcode

    1. ​Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, ByRef Cancel As Boolean)
    2. If Target.Row > 1 And Target.Row < 19 And Target.Column = 3 Then
    3. Target.Value = Target.Offset(-1,-1).Value
    4. Cancel = True
    5. End If
    6. End Sub
    Ist aus dem hohlen Bauch geschrieben.
    Anpassen und debuggen musst du selbst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @knuepel

    Wenn es so passt :) ...etwas umfangreicher. :whistling:

    EDIT:
    Jetzt auch mit Cancel und Target.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    3. Dim ColumnsAffected As Variant
    4. ColumnsAffected = Array("A", "C")
    5. If Not IsError(Excel.Application.Match(ColumnAsLetter(Target.Column), ColumnsAffected, 0)) Then
    6. If Target.Row - 1 > 0 Then
    7. If Not IsEmpty(Excel.Application.Cells(Target.Row - 1, Target.Column + 1).Value) Then
    8. Target.Value = Excel.Application.Cells(Target.Row - 1, Target.Column + 1).Value
    9. Else
    10. MsgBox ("Cell " & ColumnAsLetter(Target.Column - 1) & Target.Row - 1 & " is empty."), vbInformation
    11. End If
    12. Else
    13. MsgBox ("Cell " & ColumnAsLetter(Target.Column - 1) & Target.Row - 1 & " is out of range."), vbCritical
    14. End If
    15. Else
    16. MsgBox ("Column " & ColumnAsLetter(Target.Column) & " is not defined in ColumnsAffected."), vbInformation
    17. End If
    18. Cancel = True
    19. End Sub
    20. Function ColumnAsLetter(Column As Integer) As String
    21. ColumnAsLetter = VBA.Strings.Split(VBA.Strings.Replace(Excel.Application.Columns(Column).Address, ":", "$"), "$")(1)
    22. End Function

    Dieser Beitrag wurde bereits 21 mal editiert, zuletzt von „Sam85“ ()

    Sam85 schrieb:

    .etwas umfangreicher
    Umfangreicher ist es in der Tat.
    Aber du arbeitest mit ActiveCell.
    Vor dem Doppelklick ist die Zelle noch gar nicht aktiv.
    Deswegen unbedingt mit Target arbeiten. Dafür ist der Parameter da.

    Dagegen ist es unnötig, wb und ws zu definieren, weil der Code im Kontext des aktiven Sheets laufen muss, um das Event abfangen zu können.
    Das Cancel wird von dir auch nicht gesetzt, so dass du nach dem Doppelklick in den Edit-Modus der Zelle kommst.
    Also außer umfangreich ist dein Code auch ziemlich unelegant und sogar falsch.

    Warum sollte man einen eleganten Sechszeiler durch aufgeblähte 34 Zeilen ersetzen, die noch nicht mal funktional dem Anspruch genügen.
    Denk noch mal über deinen Vorschlag nach!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod ich bin ja offen für Kritik ^^ von daher, Danke. Dennoch funktioniert es auch.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Danke für eure Hilfe und sorry für die späte Rückmeldung.

    leider funktionieren beide nicht, es wird nicht mal eine Fehlermeldung angezeigt :(
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „knuepel“ ()

    ich habe einen Haltepunkt gesetzt und in die Tabelle1 eingefügt, es scheint überhaupt nicht zu starten. Ich mache wahrscheinlich schon beim Einfügen in die Tabelle einen Fehler. Kann ich eigentlich die Beispiel Mappe hier nicht hochladen?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    knuepel schrieb:

    es scheint überhaupt nicht zu starten
    Der Code wird aktiviert, wenn du in einen Doppelklick in einer beliebigen Zelle machst.

    knuepel schrieb:

    Kann ich eigentlich die Beispiel Mappe hier nicht hochladen?
    gezippt.
    Unter "Erweiterte Antwort" als Anhang hochladen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hier hast du mal mein Beispiel. Die xlsm Dateien musst du vorher zippen.

    EDIT:
    Wolltest du es für ein einziges Worksheet verwenden oder für jedes Worksheet im Workbook? Oder nur bestimmte Worksheets im Workbook?

    Solltest du es für jedes Worksheet im Workbook verwenden wollen, dann kommt der Code in "Diese Arbeitsmappe". Wobei @petaod uns vielleicht sagen kann, auf was sich das ByVal Sh As Object in diesem Fall bezieht, bin leider nicht im Bilde ?( .

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    3. Dim ColumnsAffected As Variant
    4. ColumnsAffected = Array("A", "C")
    5. If Not IsError(Excel.Application.Match(ColumnAsLetter(Target.Column), ColumnsAffected, 0)) Then
    6. If Target.Row - 1 > 0 Then
    7. If Not IsEmpty(Excel.Application.Cells(Target.Row - 1, Target.Column + 1).Value) Then
    8. Target.Value = Excel.Application.Cells(Target.Row - 1, Target.Column + 1).Value
    9. Else
    10. MsgBox ("Cell " & ColumnAsLetter(Target.Column - 1) & Target.Row - 1 & " is empty."), vbInformation
    11. End If
    12. Else
    13. MsgBox ("Cell " & ColumnAsLetter(Target.Column - 1) & Target.Row - 1 & " is out of range."), vbCritical
    14. End If
    15. Else
    16. MsgBox ("Column " & ColumnAsLetter(Target.Column) & " is not defined in ColumnsAffected."), vbInformation
    17. End If
    18. Cancel = True
    19. End Sub
    20. Function ColumnAsLetter(Column As Integer) As String
    21. ColumnAsLetter = VBA.Strings.Split(VBA.Strings.Replace(Excel.Application.Columns(Column).Address, ":", "$"), "$")(1)
    22. End Function


    Dateien
    • Test.zip

      (18,53 kB, 171 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Sam85“ ()

    Okay, Danke für die schnellen Antworten und die Beispiel Mappe. Es liegt an mein Excel, am einen anderen Rechner läuft die Beispiel Mappe. Ich mache mich mal auf die Suche und berichte.

    Update: der Kaspersky war Schuld, Danke euch beide für eure Hilfe !!!
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „knuepel“ ()

    Sam85 schrieb:

    auf was sich das ByVal Sh As Object in diesem Fall bezieht
    Es bezieht sich auf das Worksheet-Objekt, in dem der Doppelklick ausgeführt wurde.
    Damit du nicht solche Konstrukte wie ​Excel.Application.Cells verwenden musst, sondern statt dessen ​Sh.Cells schreiben kannst.
    Die Range-Objekte in Application beziehen sich nämlich ähnlich wie die in ActiveSheet auf das momentan im Fokus befindliche Arbeitsblatt.
    Wenn der Nutzer nach dem Doppelklick und vor Ende des Event-Code das Arbeitsblatt wechselt, zieht er dem Code den Boden unter den Füßen weg.
    Ist zwar unwahrscheinlich bei einem normalen Ablauf, aber wenn im Hintergrund eine aufwendige Zellberechnung läuft, könnte das schon mal der Fall sein.
    Sauber ist jedenfalls, mit dem übergebenen Sheet-Objekt zu arbeiten und sich nicht auf benutzerabhängige Randbedingungen zu verlassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --