463 Aufrufe
Gefragt in Tabellenkalkulation von mentor Einsteiger_in (60 Punkte)
Bearbeitet von mentor
habe diese formel ins modul kopiert,in welche zelle schreibe ich erledigt
wo muß hier der name tabelle1 eingetragen werden (verschieben 
von Tabelle1 nach Tabelle2 und so weiter) wenn möglich bitte 
alles was wichtig ist rot makieren danke


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim lngErste As Long
    If Target.Column = 1 Then
        Cancel = True
        With Worksheets("Erledigt")
            ' erste freie Zeile ermitteln
            lngErste = IIf(IsEmpty(.Cells(Rows.Count, 1)), _
                .Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) + 1
            ' Zielzeile kopieren in erste freie Zeile
            Target.EntireRow.Copy .Cells(lngErste, 1)
            ' Zielzeile löschen
            Target.EntireRow.Delete
        End With
    End If
End Sub

11 Antworten

+1 Punkt
Beantwortet von

Hallo mentor, 

mit deiner Beschreibung kann man nicht viel anfangen. Sie passt nicht zum Code. Wo hast du den Code her?

  1. sollst du den Code nicht nach Modul1 kopieren sondern in das Tabellenmodul wo du die Daten hast, in denen du deinen Doppelklick ausführst. z.B. Modul "Tabelle1 (Daten)"
  2. Warum willst du in irgendeine Zelle erledigt schreiben? Dem Code ist zu entnehmen, dass er eine Zeile deines Tabellenblatts Daten in ein zweites Tabellenblatt namens "Erledigt" kopiert. alle auf dem zweiten Tabellenblatt enthaltenen Daten sind somit erledigt.
  3. Der Name Tabelle1 muss nirgends eingetragen werden, da der Code ins Tabellenmodul Tabelle1 gehört wird er auch automatisch auf Tabelle1 ausgeführt.

Wenn du den Code also ins Modul Tabelle1 kopiert hast teste einfach mal indem du in Tabelle1 einen Doppelklick ausführst. Du wirst sehen, wie die Zeile verschwindet und im Tabellenblatt "Erledigt" wieder auftaucht. Wenn du weitere Fragen hast, melde dich einfach.

Gruß Mr. K.

0 Punkte
Beantwortet von mentor Einsteiger_in (60 Punkte)
Bearbeitet von mentor
danke für die antwort sie war eine große hilfe
,wie du siehst fehlt mir ein bisschen erfahrung,
bemühe mich aber ,um die fragen einfach zu halten bitte um geduld!!
musste hier eine anpassung vornehmen
With Worksheets("Erledigt"),  habe Erledigt durch Tabelle2 ersetzt
und siehe da du hatest recht es funktioniert supie supie!!

wie muß der code erweitert werden so das bei einem versehentlichen
(  nicht gewolltem ,falsche zeile gewählt )verschieben,zurükholen 
wieder möglich ist nicht mit der ( funtion speichern ja oder nein ) 
wegen weiteren eintragungen in der tabelle






+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo mentor,

ändere das Makro in dem VBA-Projekt der Tabelle1 wie folgt:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim Antwort
    
    If Target.Column = 1 Then
        Cancel = True
        'Nachfrage
        Antwort = MsgBox("Soll der aktuelle Datensatz in die Tabelle ""Erledigt"" übertragen werden?", 36, "Datensatz übertragen?")
        'Falls Antwort nein, dann Makro verlassen
        If Antwort = vbNo Then Exit Sub
        'zu kopierende Daten in Array schreiben
        arrRueck = Range(Cells(Target.Row, 1), Cells(Target.Row, Cells(Target.Row, Columns.Count).End(xlToLeft).Column))
        'aktuelle Zeile in Variable schreiben
        lngCZeile = Target.Row
        With Worksheets("Erledigt")
            ' erste freie Zeile ermitteln
            lngZZeile = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) + 1
            ' Zielzeile kopieren in erste freie Zeile
            Target.EntireRow.Copy .Cells(lngZZeile, 1)
            ' Zielzeile löschen
            Target.EntireRow.Delete
        End With
    End If
End Sub


Ich habe hier noch eine Sicherheitsabfrage eingebaut. Für das Rückgängigmachen der letzten Übertragung füge den folgenden Code so wie er hier steht in ein allgemeines Modul deiner Arbeitsmappe ein:

Global arrRueck As Variant
Global lngCZeile As Long
Global lngZZeile As Long
Sub Rueckgaengig()

If lngCZeile > 0 Then
 
  With Worksheets("Tabelle1")
    'gelöschte Zeile wieder einfügen
    .Rows(lngCZeile).Insert
    'übertragene Daten wieder einfügen
    .Range(.Cells(lngCZeile, 1), .Cells(lngCZeile, UBound(arrRueck, 2))) = arrRueck
  End With

  'übertragene Zeile wieder löschen
  With Worksheets("Erledigt")
    .Rows(lngZZeile).EntireRow.Delete
  End With
 
  'um ein mehrfaches Übertragen zu verhindern, die Variable lngCZeile auf Null setzen
  lngCZeile = 0
End If

End Sub

Du kannst damit immer nur die letzte Übertragung rückgängig machen.

Gruß

M.O.

0 Punkte
Beantwortet von mentor Einsteiger_in (60 Punkte)
Bearbeitet von mentor

Danke super ist echt perfekt !! den teil mit der bestätigung
und dem modul habe ich verstanden
aber nicht wie die  rückholfunktion funktioniert ( benutzt wird )

Antwort = MsgBox("Soll der aktuelle Datensatz in die Tabelle ""Erledigt"" übertragen werden?", 36, "Datensatz übertragen?")
wofür steht denn bitte die 36
+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo mentor,

es gibt für die Messagebox verschiedene Werte (siehe diesen Link).

Die 36 bedeutet nur die Buttons Ja und Nein (= 4) sowie Fragezeichen in der Messagebox anzeigen (=32). Dies gibt zusammen 36.

Zur Funktion der Rückgängigmachen.

Im allgemeinen Modul werden einige Variablen mit Global (oder auch Public) definiert. Diese Variablen stehen grds. in allen Modulen mit ihrem Wert zur Verfügung:

arrRück: hier handelt es sich um ein Feld (Array), in das die zu kopierenden Daten hineingeschrieben werden.

lngCZeile: ist die Zeile, aus der die Daten kopiert werden

lngZZeile: ist die Zeile, in die die Daten kopiert werden

Mit jedem Kopiervorgang werden diese Variablen neu gefüllt und stehen solange zur Verfügung bis Excel beendet wird oder eben eine neue Zeile kopiert wird.

Soll jetzt der letzte Kopiervorgang rückgängig gemacht werden, dann wird in Tabelle1 über lngCZeile wieder eine Zeile eingefügt, in der die Daten aus dem Array arrRueck geschrieben werden. Anschließend wird im Tabellenblatt "Erledigt" die lngZZeile, als die Zeile, in der die kopierten Daten eingefügt wurden, gelöscht.

Und damit eine Zeile nicht aus Versehen mehrfach zurückgeschrieben wird, wird nach dem Einfügen die Variable lngCZeile auf Null gesetzt.

Gruß

M.O.

0 Punkte
Beantwortet von mentor Einsteiger_in (60 Punkte)
Bearbeitet von mentor

hey muß leider nochmal nachfragen,wie die rückhollfunktion genutz wird,anscheinend mach ich noch etwas falsch,hab das modul erstellt,deine angaben eigefügt,eine zeile verschoben! wie geht denn jetzt die Wieder zurückfunktion aus der tabelle erledigt. alle  versuche bei mir waren erfolglos,( ich denke nicht das hier die funktion ausschneiden aus tabelle erledigt und einfügen in tabelle1 gemeint ist )

danke für die unterstützung                                                                                                                                         die weiteren infos von dir hab ich mr angeschaut und so einigermaßen verstanden

+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Mentor,

du startest einfach - per Hand oder per Button - das Makro "Rueckgaengig".

Gruß

M.O.
0 Punkte
Beantwortet von mentor Einsteiger_in (60 Punkte)
danke habe deinen rat befolgt und beides versucht ,das makro so zu starten und mit einem button.                            das ich das ja nicht gleich hinbekomme war mir ja klar, klappt noch nicht ganz!!!                                                          habe hier bei diesem text  ab und an einen  gelben pfeil vorne dran (Sub Rueckgaengig() ) ist das                            normal ??
0 Punkte
Beantwortet von mentor Einsteiger_in (60 Punkte)
Bearbeitet von mentor
inhalt gelöscht
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Mentor,

eine gelbe Zeile bedeutet, dass ein Fehler aufgetreten ist. Wie lautet denn die dazugehörige Fehlermeldung?

Gruß

M.O.
...