VBA Code in Excel verändern

Hallo liebe Helfer,

ich habe eine Frage/bitte bzw. brauche eure Hilfe.

Ich habe ein Makro welches wie folgt aussieht und müsste wenn ich den nächsten Datensatz der aus der gleichen Stelle kopiert wird immer in die nächste freie zeile wählen. Sprich wie in dem Makro angegeben jedoch muss der nächste Datensatz der eingefügt wird eine Zelle darunter immer eingefügt werden so das keine Daten überschrieben werden. Ich hoffe ich konnte mein Problem erklären und danke im Voraus für Ihre Hilfe:

Sub Objekt_einfügen()

’ Objekt_einfügen Makro


Range(„B10:C10“).Select
Selection.Copy
Sheets(„Basisdaten-Objekt“).Select
Range(„B7“).Select
ActiveSheet.Paste
Sheets(„Eingabemaske“).Select
Range(„D10:G10“).Select
Application.CutCopyMode = False
Selection.Copy
Sheets(„Basisdaten-Objekt“).Select
Range(„G7“).Select
ActiveSheet.Paste
Sheets(„Eingabemaske“).Select
Range(„H10:X10“).Select
Application.CutCopyMode = False
Selection.Copy
Sheets(„Basisdaten-Flächen“).Select
Range(„B7“).Select
ActiveSheet.Paste
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 25
ActiveWindow.ScrollColumn = 32
ActiveWindow.ScrollColumn = 40
ActiveWindow.ScrollColumn = 47
ActiveWindow.ScrollColumn = 32
ActiveWindow.ScrollColumn = 25
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 2
End Sub

Sub Neuer_Standort()

’ Neuer_Standort Makro


Range(„B19:smiley:19“).Select
Selection.Copy
Sheets(„Sonstige Daten“).Select
ActiveWindow.ScrollRow = 17
ActiveWindow.ScrollRow = 18
ActiveWindow.ScrollRow = 19
ActiveWindow.ScrollRow = 20
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 22
ActiveWindow.ScrollRow = 23
ActiveWindow.ScrollRow = 24
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 26
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 28
Range(„C35“).Select
ActiveSheet.Paste
Sheets(„Eingabemaske“).Select
Range(„E19:J19“).Select
Application.CutCopyMode = False
Selection.Copy
Sheets(„Sonstige Daten“).Select
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 26
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 24
ActiveWindow.ScrollRow = 23
ActiveWindow.ScrollRow = 22
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 20
ActiveWindow.ScrollRow = 19
ActiveWindow.ScrollRow = 18
ActiveWindow.ScrollRow = 16
ActiveWindow.ScrollRow = 15
ActiveWindow.ScrollRow = 14
ActiveWindow.ScrollRow = 13
ActiveWindow.ScrollRow = 12
ActiveWindow.ScrollRow = 11
ActiveWindow.ScrollRow = 10
ActiveWindow.ScrollRow = 9
ActiveWindow.ScrollRow = 8
ActiveWindow.ScrollRow = 7
ActiveWindow.ScrollRow = 6
ActiveWindow.ScrollRow = 5
ActiveWindow.ScrollRow = 4
ActiveWindow.ScrollRow = 3
ActiveWindow.ScrollRow = 2
Range(„C17“).Select
ActiveSheet.Paste
End Sub

Würde es vlt. auch Sinn machen diese ganzen ScrollRow zu entfernen?

Bin ein blutiger Anfäger also nicht darüber wundern =)

Danke

liebe Grüße

Müller Andi

Sorry ! Bin kein Experte.

Hallo Andi,

du kannst die ScrollRow in der Tat entfernen, das sind Mausrad Bewegungen oder die Blättern Taste

Bei deinem Problem hilft dir die Offset Funktion weiter
Bsp: Range(„A1“).End(xldown).Offset(1,0).Select

Das bedeutet er wählt Zelle A1 geht hinunter bis zur letzten gefüllten (wichtig) Zeile und mit der Offset Funktion Offset(„Zeile“, „Spalte“) kannst du dann die Markierung um Zeilen und/oder Spalten verschieben

Bsp: Letzte gefüllt Zeile ist A9
Range(„A1“).End(xldown).Offset(1,0).Select
->Markierte Zelle = A10

Range(„A1“).End(xldown).Offset(2,1).Select
->Markierte Zelle = B11

Bau die Offste Geschichte vor deinem Paste ein und es sollte dann funktioniern

Hoffe ich habe mich verständlich ausgedrückt

Gruß
Marco

Hast die richtige Antwort schon von Marco bekommen,
viel Erfolg!
Katharina

Grüezi Andi

Eigentlich müsste dir dieser Link hier auch weiterhelfen:

http://www.office-loesung.de/ftopic572514_0_0_asc.ph…

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo liebe Helfer,

Hallo Andi,

ich habe eine Frage/bitte bzw. brauche eure Hilfe.

dafür sind wir ja da…

Ich habe ein Makro welches wie folgt aussieht und müsste wenn

Ich sehe zwei Makros…

ich den nächsten Datensatz der aus der gleichen Stelle kopiert

Mit Stelle meinst Du ein Tabellenblatt (Sheet)?
Mit einem Makro kopierst Du von „Eingabemaske“ nach „Basisdaten-Objekt“ oder „Basisdaten-Flächen“, mit dem anderen von „Eingabemaske“ nach „Sonstige Daten“.

wird immer in die nächste freie zeile wählen. Sprich wie in

Nächste freie Zeile kann ich nicht nachvollziehen. Du kopierst zwei nebeneinander liegende Zellen „B10:C10“ nach B7. Die nächste freie Zeile wäre 8. Die nächste freie Spalte wäre D. Der nächste Kopiervorgang landet aber in G7?

dem Makro angegeben jedoch muss der nächste Datensatz der
eingefügt wird eine Zelle darunter immer eingefügt werden so
das keine Daten überschrieben werden. Ich hoffe ich konnte
mein Problem erklären und danke im Voraus für Ihre Hilfe:

Du hast zwei Makros aufgezeichnet, nehme ich an: Objekt_einfügen und Neuer_Standort. Den Code zitiere ich hier nicht, weil er Deine Aufgabe nur bedingt verständlich beschreibt.

Würde es vlt. auch Sinn machen diese ganzen ScrollRow zu
entfernen?

Definitiv. Du kannst auf alle ScrollRow Einträge verzichten.

Bin ein blutiger Anfäger also nicht darüber wundern =)

Ich vermute, Du möchtest mit der Maus einen Bereich markieren, und diesen per Makro entweder auf „Basisdaten-Objekt“, „Basisdaten-Flächen“ oder „Sonstige Daten“ kopieren. Dazu benötigst Du drei Makros oder eine Möglichkeit zur Wahl des Zieles.
Kann es sein, dass Du Zeilen (Ziffern) und Spalten (Buchstaben) verwechselst? Möchtest Du die kopierten Daten untereinander oder nebeneinander kopieren? und: sind auf dem Zieldatenblatt evtl. noch Einträge, die wir im Makro nicht sehen können?

Danke

Vielleicht kannst Du mir ein wenig auf die Sprünge helfen. Das Problem dürfte wirklich lösbar sein (wenn man es richtig verstanden hat, woran ich noch arbeite).

liebe Grüße

Müller Andi

LG MwieMichel

Also so lässt sich Deine Anfrage leider nicht beantworten:

Im ersten Makro sind drei Kopie und drei Einfügungen
Im zweiten nochmals zwei.
Welche der Kopien ist gemeint?

Auf welchem Tabellenblatt befindest Du dich?

Nur eins kann mit Sicherheit gesagt werden:
Der ScrollRow-Teil ist jeweils obsolet und kann entfernt werden.

Das hättest Du aber auch selbst herausbekommen können, indem Du diese Zeilen auskommentierts, d.h. vorn ein Hochkomma (’) setzt.

Insgesamt ist es zwar ein durchaus machbare Lösung VBA über die Aufzeichnungen des Makrorekorders zu lernen, aber ich empfehle immer einen zusätzlichen Kurs:

http://www.excel-training.de/lektion\_frs.asp?id=34
http://www.excel-training.de/
http://kostenlose.rbytes.net/der-excel-lehrgang\_download/
http://www.excelmexel.de/HTMLExcel/default.htm

Und vor jedem Code hier bitte eine Zeile Setzen:

und nach dem Code dann

So kommt der Code dann auch strukturiert hier an.

Hallo,

Du solltest in der Ziel Spalte immer Vorher ermitteln wieviele Zeilen bereits gefüllt sind und dann den Inhalt in die nächste Zelle einfügen.

Dazu kannst Du folgenden Code nutzen:

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

In der Variablen „letztezeile“ wird die Zeilen Nummer gespeichert bis zu der Inhalt gefüllt ist. Einfügen solltest Du dann wie folgt:

Sheets(„Basisdaten-Objekt“).cells(letztezeile+ 1, 1).paste

Dieses Beispiel funktioniert in der Spalte A. Wenn Du das Ganze in der Spalte B durchführen möchtest dann ist 1 durch eine 2 zu ersetzten.

Falls Du noch Fragen haben solltest dann melde Dich

VG

Christian

Ich hoffe ich konnte mein Problem erklären
Nein!

Hallo magicoandi,

Wenn ich das richtig verstehe, dann hast Du ein Eingabe-Tabellenblatt und möchtest die Daten in ein anderes Tabellenblatt speichern.
Dazu brauchst Du eine Funktion, die Dir die nächste freie Zeile liefert. Siehe hierzu FIND_EMPTY_CELL in http://www.herber.de/forum/archiv/304to308/305303_Mi…

Um andere Blätter, Zellen, Zeilen, etc. anzusprechen ist es NICHT notwendig, dieses visuell herzuscrollen oder zu selektieren.
Ein Verweis ist ausreichend: z. B. Worksheets(2).Cells(„A2“) = „BlaBla“.

Bevor Du massiv weiter in die falsche Richtung entwickelst, rate ich Dir dringend zu entsprechender Fachliteratur - Die gibts auch kostenlos z. B. bei Galileo.

Gruß
Harry

Hallo Andi,

Scroll-Anweisungen sind in Makros nur in Ausnahmefällen erforderlich, wenn man die Anzeige eines Tabellenblatts in eine bestimmte Position steuern will. Ansonsten kann man die vom Makrorekorder erstellten Zeilen löschen.

Auch Select- und Activate-Anweisungen kann man sich ersparen, wenn die invollvierten Objekte vollständig referenziert werden.

Bei dem Standort-Makro bin ich nicht sicher, ob ich es richtig verstanden habe. Gibt es hier 2 Datenblöcke (Block 1: Zeilen 17 bis 34 und
Block 2: Zeilen ab Zeile 35), die mit daten aufgefüllt werden sollen?

Gruß
Franz

Sub Objekt\_einfügen()
'
' Objekt\_einfügen Makro
'
 Dim wksEingabe As Worksheet, wksZiel As Worksheet
 Dim lngZeile As Long
 Set wksEingabe = Sheets("Eingabemaske")
 Set wksZiel = Sheets("Basisdaten-Objekt")
'
 'Nummer der nächsten freie Zeile
 lngZeile = fncNextFreeRow(wks:=wksZiel)
 'kopieren nach Spalte B
 wksEingabe.Range("B10:C10").Copy Destination:=wksZiel.Cells(lngZeile, 2)
 'kopieren nach Spalte G
 wksEingabe.Range("D10:G10").Copy Destination:=wksZiel.Cells(lngZeile, 7)

 Set wksZiel = Sheets("Basisdaten-Flächen")
 'Nummer der nächsten freie Zeile
 lngZeile = fncNextFreeRow(wks:=wksZiel)
 'kopieren nach Spalte B
 wksEingabe.Range("H10:X10").Copy Destination:=wksZiel.Cells(lngZeile, 2)
 wksZiel.Activate
 Set wksEingabe = Nothing: Set wksZiel = Nothing
End Sub

Sub Neuer\_Standort()
'
' Neuer\_Standort Makro
'
 Dim wksEingabe As Worksheet, wksZiel As Worksheet
 Dim lngZeile As Long
 Set wksEingabe = Sheets("Eingabemaske")
 Set wksZiel = Sheets("Sonstige Daten")

 'Nummer der nächsten freie Zeile
 lngZeile = fncNextFreeRow(wks:=wksZiel)
 If lngZeile = 35 Then lngZeile = 17
 wksEingabe.Range("E19:J19").Copy Destination:=wksZiel.Cells(lngZeile, 3)
 wksZiel.Activate
End Sub

Public Function fncNextFreeRow(ByVal wks As Worksheet, Optional Zeile As Long = 1) As Long
 Dim Zelle As Range
 'Zeile = Nummer der Zeile oberhalb der mit Suche begonnen werden soll
 With wks
 'Zelle in letzter Zeile mit Daten finden
 Set Zelle = .Cells.Find(What:="\*", After:=.Cells(Zeile, 1), LookIn:=xlFormulas, \_
 lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
 'Nummer der nächsten freie Zeile
 If Zelle Is Nothing Then
 fncNextFreeRow = 1
 Else
 fncNextFreeRow = Zelle.Row + 1
 End If
 End With
End Function

Hallo Andi,

das sieht so aus als ob Du Dein Makro mit „Makro aufzeichnen“ erzeugt hast.
Die ganzen Scroll-Zeilen kannst Du dann getrost löschen, weil Du erst mit Range("…").select die jeweilige Zelle oder den Bereich auswählst.

Entschuldige die Bemerkung, aber auch der Rest ist „von hinten durch die Brust ins Auge“. Denk mal darüber nach, Dein Sheet „Eingabemaske“ durch einen Dialog (geht auch nach AltF11) zu ersetzen.

Ansonsten empfiehlt es sich, gezielt nach dem jeweiligen Beginn eines eingegebenen Blockes zu suchen, um den dann zu kopieren.

Sorry aber weiteres artet schnell in einen Grundkurs VBA aus, das kann ich momentan leider nicht leisten.

Mit freundlichem Gruße,

Matthias

Hallo
Dies mit dem datensatz machst Du nicht mit dem Befehl Range, sondern mit dem Befehl Cells.
Tabelle1.cells(row,column)=Wert währe der Command, wovon Row für Zeile und Column für Spalte steht.
Sprichst Du das Feld A1 an, so wäre der Wert: Cells(1,1)
Bei A5 wäre er: Cells(5,1)
Bei C5 wäre er: Cells(5,3)
Bei E27 wäre er: Cells(27,5)

Du kannst Column und Row durch die Variable vom Typ Long ersetzten (Dim row as Long). Dadurch hast Du die Möglichkeit in einer For-Next Schleife die zellen fortlaufend anzusprechen.
Grüsse Sebastian

Hallo,

ja, ich würde auf jeden Fall zuerst die ActiveWindow.ScrollRow-Anweisungen entfernen :smile:

Um eine leere Zeile zu finden, kann man eine Function basteln, wie z.B.:

Function GetEmptyRow(ByVal Tabellenblatt as String) as Long
'Aufruf erfolgt mit Verweis auf das Tabellenblatt (Name als Zeichenkette), in welchem die leere Zeile gesucht werden soll

Dim Zeile as Long

'Initialisierung, Normal wäre es, in Zeile 1 anzufangen, daher init mit 0, Du scheinst aber in Zeile 10 anzufangen, müsstest unten also Zeile=9 eintragen!
Zeile = 0

'leere Zeile suchen, Annahme: Wenn Spalte B leer ist, ist auch der Rest leer
Do
Zeile=Zeile+1
Loop Until Sheets(Tabellenblatt).Range(„B“ & Zeile).Value = „“

GetEmptyRow = Zeile

End Function

Der Aufruf kann dann z.B. in Deinem Makro am Anfang erfolgen:

Sub …

Dim LeereZeile as Long

LeereZeile = GetEmptyRow(„Basisdaten-Objekt“)

Die Verwendung erfolgt dann so:
Sheets(„Basisdaten-Objekt“).Range(„B“ & LeereZeile).Value = Range(„B10“).Value

Dies musst Du dann für alle Spalten durchführen, also
Sheets(„Basisdaten-Objekt“).Range(„C“ & LeereZeile).Value = Range(„C10“).Value, etc.

Vergiss dabei bitte Deine Spaltensprünge nicht, d.h. Deine Zuweisung ist irgendwann Spaltenverschoben:
Sheets(„Basisdaten-Objekt“).Range(„G“ & LeereZeile).Value = Range(„D10“).Value

Achte auch darauf, dass Du irgendwann auf ein anderes Zielblatt wechselst („Basisdaten-Flächen“). Hier muss die Funktion GetEmptyRow nochmal mit dem Namen des Tabellenblattes „Basisdaten-Flächen“ aufgerufen werden.