478 Aufrufe
Gefragt in Tabellenkalkulation von revanchist Mitglied (210 Punkte)
Bearbeitet von revanchist
Hallo Experten

heute eine Frage, welche hoffentlich von Euch beantwortet werden kann.

Ich bin im Tabellenblatt "3. Matrix Erscheinen" und setze den Cursor z.B. in Zelle EF3.
Nach Click auf CommandButton1 wird der Spalteninhalt von EF3 bis EF276 kopiert und in Spalte EX von Zelle 3 bis 276 als Wert(e) eingefügt.
Anschließend befindet sich die Cursorposition in Zelle EX3. Soweit alles OK – funktioniert einwandfrei.

Nun soll per VBA-Befehl (noch in der Routine von CB1) der Cursor in die Zelle zurück positioniert werden, in der dieser vor der Kopier- + Einfügeaktion stand (in meinem Fall also nach EF3 - kann aber auch jede andere Zelle von Spalte DE bis EI immer in Zeile 3 sein).
UND: von hier aus nun exakt 59 Zellen weiter nach rechts neu platziert werden (weil dann von dieser Position wieder eine andere Aktion per CB erfolgen soll).  

Und falls auch noch möglich per Anweisung automatisch der CommandButton2 angeklickt werden.
Falls die Routine jetzt noch weiß in welcher Zelle (im Beispiel hier EF3) der Cursor zu Beginn stand, den Cursor um eine Zelle nach rechts - hier nach EG3 frisch platzieren.

Ich weiß hört sich kompliziert an - aber irgendwas fehlt mir immer, um es funktionsfähig hinzubekommen.

Ciao der Revanchist

---------------------------------------------------------------------------------
hier der aktuelle Code:
Private Sub CommandButton1_Click()
Dim lngEinf As Long
Dim lngZeile As Long

Sheets("3. Matrix Erscheinen").Range("EX3:EX276").ClearContents

 'Bereich kopieren beginnend in der Zelle wo der Cursor steht

Range(Selection, Selection.End(xlDown)).Copy
  Range("EX3:EX276").PasteSpecial Paste:=xlPasteValues

End Sub

8 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)

Hallo Revanchist,

hier mal ein kleiner Beispielcode, der dir zeigt, wie du das mit dem Cursor lösen kannst:

Sub Cursortest()

Dim rngAlt As Range

'hier wird die Ausgangsadresse in eine Variable geschrieben
Set rngAlt = ActiveCell
ActiveCell = "Ausgangspositition"

'nun etwas springen
ActiveCell.Offset(9, 1).Activate
ActiveCell.Value = "hier"

MsgBox "Ich bin jetzt hier", 64, "Hinweis"

'und jetzt bin ich 59 Spalten weiter
rngAlt.Offset(0, 59).Activate

End Sub

Um den 2. Button zu aktivieren, bzw. das dort hinterlegte Makro aufzurufen, nutze einfach Call:

Sub aufruf()

Call CommandButton2_Click

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Hallo M.O.

Danke für deinen schnellen Lösungsvorschlag.

Hab deine Befehle auch gut in meine Routine integrieren können.

Was noch fehlt ist nur noch der Befehl ganz am Ende, dass der Cursor eine Zelle nach rechts springt und zwar von der Zelle aus, wo die ganze Routine begann.
Irgendwie erkennt (merkt sich) das Programm aktuell aber noch nicht, wo alles begann (rngAlt).
Vlt. stört es, dass man am Ende der ersten Routine (aber natürlich vor End sub) erst zwischenzeitlich einen Ausflug zu CommandButton 2 gemacht hat.

Ciao der Revanchist
0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

noch ein Tipp am Rande: beim Einfügen kopierter Zellen reicht es aus, wenn die 1. Zelle des Zielbereichs angegeben wird, denn Excel weiß ja, wieviele Zellen kopiert werden sollen - also anstelle dieser Codezeile

Range("EX3:EX276").PasteSpecial Paste:=xlPasteValues

reicht dies

Range("EX3").PasteSpecial Paste:=xlPasteValues

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Danke Karin für deinen Tipp
0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)
Hi,

damit am Ende die Startzelle richtig erkannt wird, darf die Variable nicht in der Prozedur selbst deklariert werden sondern muss außerhalb der Prozeduren beider CommandButton deklariert werden - dadurch steht sie dann in beiden Prozeduren zur Verfügung.

In deinem Fall kannst du sie halt direkt im Codemodul des Tabellenblattes deklarieren, da beide Prozeduren in diesem Modul wirken. Sollte es irgendwann einmal notwendig sein, dass eine Variable in verschiedenen Prozeduren unterschiedlicher Codemodule wirksam sein soll, dann muss sie in einem Standardmodul als Public-Variable deklariert werden.

Bis später, Karin
0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Karin vielen Dank für deine Hinweise

"ABER" für derartige »Operationen« reichen meine VBA-Kenntnisse noch nicht aus [selbst zu alt, zu spät mit VBA angefangen oder einfach zu wenig Durchblick].

Ich speichere mir deinen Tipp und vlt. kann ich ihn noch einmal umsetzen.

Fürs Erste setze ich einmal eine feste Zelle als Ziel für die abschließende Cursorplatzierung ein, z.B. EK1, weil diese ganz nah an dem Bereich ist, wo ich mit der Prozedur gestartet bin.
Den einen Klick in die Zelle von wo aus es dann weiter gehen soll, macht mir jetzt erst einmal keine große Mühe.
Ihr @Karin und @M.O. habt mir aber schon sehr viel Komfortgewinn mit Euren Tipps verschafft. Daumen hoch!

Ciao der Revanchist
0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

ich meinte das so - Code im Codemodul des Tabellenblattes:

Option Explicit
Dim rngZelle As Range '<== Variable für die Startzelle

Private Sub CommandButton1_Click()
    With Sheets("3. Matrix Erscheinen")
        Set rngZelle = Selection.Cells(1) '<== Startzelle auf Variable schreiben
        .Range("EX3:EX276").ClearContents
        'Bereich kopieren beginnend in der Zelle wo der Cursor steht
        .Range(Selection, Selection.End(xlDown)).Copy
        .Range("EX3").PasteSpecial Paste:=xlPasteValues
    End With
    Call CommandButton2_Click
    rngZelle.Offset(0, 59).Select '<== Zelle 59 Spalten rechts von der Startzelle auswählen
End Sub

Private Sub CommandButton2_Click()
    MsgBox "Hier der Code für CommandButton2"
End Sub

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
Danke Karin für die Mühe welche du dir mit mir bzw. meinen VBA-Wünschen gibst.

Sieht in jedem Fall für mich jetzt schon verständlicher aus.
Habe gerade aber noch einige andere Sachen am ausprobieren.
Wenn es mit dem letztgenannten Code nicht klappen sollte, melde ich mich wieder.

Schönes Wochenende
Ciao der Revanchist
...