Zelle per vba kopieren
#1
Hallo Profis,

diese Script hier kopiert die Formel aus Bereich AA2:AC2 und wird das dann in Zelle G2 eingefügt und schließlich nach unten kopiert und zwar bis der letzte nicht Leere Zelle in Spalte A (als Bezug).Wenn die letzte Zelle in Spalte A die en Text oder Wert enthält die die Zelle A20 entspricht, dann wird von Bereich G2:I2 nach unten bis G20:I20 kopiert.

Das funktioniert auch gut! Nur ich möchte nicht ab G2 runterziehen (kopieren) sondern ab aktive Zelle.

Z.B. wenn G7 markiert ist (aktiv), dann soll ab G7 nach unten kopiert  werden  (G7:I7) anstatt von G2




" Range("AA2:AC2").Select
    Selection.Copy
      
    If IsEmpty([G2]) Then
        [G2].Select
    Else
        [G1].End(xlDown).Offset(1).Activate
    End If

      

    ActiveSheet.Paste
    Application.CutCopyMode = False



Dim letzte&
    letzte = Cells(Rows.Count, 1).End(xlUp).Row
    Range("G2:I" & letzte - 0).FillDown "




Die letzte Zeile in Rot ist das problem , hab versucht mit "ActiveCel" anstatt "G2:I" ging nicht und sowas auf Google zu suchen ist nicht einfach. 

Danke vielmals Im Voraus
ms2000
Antworten Top
#2
Hallo,

ein Profi bin ich sicherlich nicht in VBA. - Versuche einmal diese Lösung. Entgegen Deinem Wunsch die aktive Zelle automatisch zu erkennen und die Werte einzufüllen, habe ich Dir eine Lösung gemacht, in der Du in einer Input Box die Gewünschte Zelle angeben kannst, ab welcher die Werte eingefügt werden sollen. Dies geht nach meinem Wissen nur mit einer Schleife. - Vielleicht kann einer der Profis im Forum das noch einfacher ausgestalten.


Code:
Sub Test()
Dim letzte&
Dim rng As Range

letzte = Cells(Rows.Count, 1).End(xlUp).Row

Range("AA2:AC2").Select
    Selection.Copy
     
    If IsEmpty([G2]) Then
        [G2].Select
         ActiveSheet.Paste
         Range("G2:I" & letzte - 0).FillDown
         Application.CutCopyMode = False
    Else
        Set rng = Application.InputBox("Range:", Type:=8)
        Sheets("Tabelle1").Range("A2:C2").Copy
        For i = 1 To letzte
        rng.Cells(i, 1).PasteSpecial xlPasteValues
        Next
        Application.CutCopyMode = False
    End If
End Sub
Grüße
Norbert
Antworten Top
#3
Hi,

so grundsätzlich, da Du VBA ja offenbar noch lernst, würde ich Dir empfehlen, Objekte sauber zu referenzieren (und nicht zu [evaluieren]) sowie alle Parameter eine Funktion/Methode - wie in Deinem Code z.B. bei Offset(1) - explizit anzugeben:

Code:
Offset(rowoffset:=1, columnoffset:=0)

Oder zumindest:

Code:
Offset(1, 0)

Das gibt Dir ein Gefühl für die Syntax bzw. vorhandene Parameter.
Zudem nimmst Du Dir mit der [Evaluierung]

Code:
[G2].Select

auch die Unterstützung durch die Intellisense, die Dir bei

Code:
Range("G2").

mit Eingabe des Punktes zur Hilfe eilt Wink
Antworten Top
#4
Hi Boris,

danke für die Infos. - Kann ich immer gebrauchen!
Hab noch einmal klarer strukturiert, die Evaluierungen herausgenommen und in beiden Fällen eine Schleife eingebaut:

Code:
Sub Test1()
Dim letzte&
Dim rng As Range
Dim i As Integer

letzte = Cells(Rows.Count, 1).End(xlUp).Row
     
    If IsEmpty(Sheets("Tabelle1").Range("G2")) Then
         Sheets("Tabelle1").Range("AA2:AC2").Copy
            For i = 2 To letzte
            Tabelle1.Cells(i, 7).PasteSpecial xlPasteValues
            Next
            Application.CutCopyMode = False
    Else
        Set rng = Application.InputBox("Range:", Type:=8)
        Sheets("Tabelle1").Range("AA2:AC2").Copy
            For i = 1 To letzte
            rng.Cells(i, 1).PasteSpecial xlPasteValues
            Next
            Application.CutCopyMode = False
    End If
End Sub
Mir war nur nicht klar, worauf sich Dein Hinweis auf "offset" in diesem Zusammenhang bezieht.
Grüße
Norbert
Antworten Top
#5
Hi,


Code:
Mir war nur nicht klar, worauf sich Dein Hinweis auf "offset" in diesem Zusammenhang bezieht.

In Deiner Eingangsfrage hing auch dieser Codeschnipsel bei:

 If IsEmpty([G2]) Then
        [G2].Select
    Else
        [G1].End(xlDown).Offset(1).Activate
    End If



Zitat:danke für die Infos. - Kann ich immer gebrauchen!


Dann noch 2 Infos zu Deinen Variablen:

Dim letzte&

Die Typenkürzel (hier: & für Long) sind zwar schick, aber für den Anfang (und eigentlich auch darüber hinaus) nicht wirklich hilfreich.


Und zu

Dim i As Integer

Da es eine Variable für den Zeilenzähler ist, sollte diese (vorsichtshalber) stets vom Typ Long sein, da für Integer bei 32768 Schicht im Schacht ist, Excel aber deutlich mehr Zeilen hat.
Antworten Top
#6
Danke sehr. Werde ich es am Wochenende Versuchen.
Nochmals, vielen Dank.

PS: Kennt vielleicht jemand von Euch (ohne das Ich jetzt ein neue Thread öffne) der Grund weshalb 2 Gleiche Excel Dateien A.xlsm und B.xlsm unterschiedlich lange brauchen zum Starten bzw. berechnen? A.xlsm ist viel schneller, B.xlsm extrem langsam als wäre die Datei mit Millionen von Formel belastet!! 
Ich versuche gerade von A nach B step by Step rüber zu kopieren, das ist aber alles nicht normal!!!! Irgendwann passiert das wieder und dann? Na ja, das kann ganz schön Stressen, am bestens so wenig wie möglich mit Excel arbeiten. Entmutigend!
Antworten Top
#7
Hallöchen,

Zitat:2 Gleiche Excel Dateien A.xlsm und B.xlsm ... Ich versuche gerade von A nach B step by Step rüber zu kopieren

falscher Ansatz. Besser: Speichern unter A als B
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


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