Excel 2003: Makro Range und Zellenposition

Hakaori

Ensign
Registriert
Mai 2009
Beiträge
225
Ich habe ein vertracktes Problem.

Ich suche gerade nach einer Möglichkeit, dass ein Excel Makro den Inhalt der Zelle F2
als Range in einer anderen Datei benutzt und dann mit Offset einen Bereich markiert und kopiert, woanders dann einfügt.
Ich gebe mit dem Inhalt der Zelle F2 sozusagen den Startpunkt an, mit dem Excel mit Hilfe eines Offsets einen Bereich kopiert und woanders einfügt.

So sieht es momentan aus, funktioniert natürlich nicht, weil ich nich weiß wie ich die Range mit dem Inhalt der Zelle F2 deklariere. Habe jetzt nur den relevanten Teil hier reinkopiert.
Abhängig von dem Inhalt der Spalte F (F2..F3 usw.) soll Excel zu dieser Position in einer anderen Datei gehen (Test.xls) und dann mit dem Offset 53 Zeilen nach unten und
22 Spalten nach rechts gehen und von der Anfangsposition bis zu dieser Position alles kopieren und in einer anderen Datei einfügen. Hat jemand eine Idee,
ist nicht ganz einfach zu verstehen oder ich drücke mich schlecht aus.

Code:
Sub Datei_Erstellen()
    
    Dim rCell As Range, KORDI As String
     
    For Each rCell In Worksheets("Tabelle1").Range("A2:A100")
     
    KORDI = rCell.Offset(0, 5).Value

    Windows("Test.xls").Activate
    Sheets("Schritt 4").Select
    Range((KORDI):Y56).Select <= Absolute Ahnungslos
    ActiveCell.Offset(-16, -8).Range("A1:X53").Select <= Absolute Ahnungslos
    

    Next rCell
     
    End Sub
 
Ich finde bei sowas sind konkrete Beispiele immer sinnvoll...
Also was konkret in F2 drinstehen würde, und was konkret dann markiert werden soll...
 
In Zelle F2 steht "B4".

Er soll also in Text.xls auf Blatt "Schritt 4" zur Zelle B4 gehen, dann anfangen zu markieren und zwar einen Raum 53 Zeilen nach unten und 22 Zeilen nach rechts. Dann diesen Kopieren. (Selection.Copy?)


Code:
    Range("B" & KOORDI, "Y" & (KOORDI + 52)).Select

So hat das gut geklappt :-)
 
Zuletzt bearbeitet:
OK.
Aber mal gefragt wozu es dir nützlich ist das zu selecten?

Ich verwende Select effektiv nur wenn ich nach einem fertigen Makro (oder beim Öffnen) eine ungefährliche Zelle markiert haben will.

Alle Rechenoperationen greifen direkt auf Zellen/Ranges über letztlich eindeutige Koordianten zu.
Greifbar machen wie mit Activate tut man normal nicht, man kann direkt referenzieren. z.B.
Debug.Print Workbooks("007.xls").Worksheets("Bond").Cells(3, 11)
…das zeigt im Direktbereich den Inhalt von Zelle K3 auf Blatt Bond in Mappe 007 (die natürlich offen sein muss) an.

Benenne doch mal das Problem das du lösen willst, vielleicht können wir einen effizienteren Code zaubern.

CN8
 
Hakaori schrieb:
In Zelle F2 steht "B4".

OK, und dann weist du der Variablen KOORDI diesen Wert als String zu:
Code:
KORDI = rCell.Offset(0, 5).Value
Wie dann allerdings
Code:
    Range("B" & KOORDI, "Y" & (KOORDI + 52)).Select
"super klappen" soll, das verstehe ich nicht. Du musst da irgend etwas total geändert haben.

Im Endeffekt willst du die INDIREKT-Funktion nachbauen. Das geht auch, aber wohl anders, als du es hier darstellst. Beispielsweise so:
Code:
Option Explicit
'Deine Anforderung:
'Er soll also in Text.xls auf Blatt "Schritt 4" zur Zelle B4 gehen,
'dann anfangen zu markieren und zwar einen Raum 53 Zeilen nach unten
'und 22 Zeilen nach rechts. Dann diesen Kopieren. (Selection.Copy?)

Sub Bereich_kopieren()
   Dim strStart As String
   Dim lngStartZeile As Long, lngStartSpalte As Long
   
   strStart = Range("F2").Value
   lngStartZeile = Range(strStart).Row
   lngStartSpalte = Range(strStart).Column
   Range(Cells(lngStartZeile, lngStartSpalte), Cells(lngStartZeile + 53, lngStartSpalte + 22)).Copy
   '...
End Sub

'Alternative, da du das evtl. 'zig mal aufrufen möchtest (F2:F100):
Sub Bereich_kopieren2()
   Dim strStart As String
   Dim lngStartZeile As Long, lngStartSpalte As Long
   Dim i As Integer
   
   For i = 2 To 100  'Zeile 2 bis 100
      strStart = Range("F" & i).Value
      lngStartZeile = Range(strStart).Row
      lngStartSpalte = Range(strStart).Column
      Range(Cells(lngStartZeile, lngStartSpalte), Cells(lngStartZeile + 53, lngStartSpalte + 22)).Copy
   Next i
   '...
End Sub
Schön einfach und übersichtlich. Und ohne SELECT und ACTIVATE, die alles nur ausbremsen und unübersichtlicher machen.

Ansonsten: Sinnvoller helfen können wir nur, wenn du und die beiden Musterdateien (mit anonymisierten Daten) zur Verfügung stellst.
 
Hallo Günther,

zunächst danke für deine Antwort. Konnte nicht früher antworten, da ich beruflich
eingebunden war. Dein Ansatz ist natürlich wesentlich professioneller. Werde mich mit
deinem Code auseinandersetzen und Rückmeldung geben.
Danke und einen schönen Abend.

Gruß
 
Nur um euch einen kleinen Tipp zu geben:

Um Bereiche zu vergrößern/verkleinern benutzt man am besten:
Range("A2").Resize(53, 22).Copy
 
€ DPXone:

Stimmt, ist in diesem Fall besser. Der Mensch ist eben ein Gewohnheitstier :D
 
Zurück
Oben