Makro umändern durch Code ändern

Hallo liebe Helfer,

ich bräuchte eure hilfe, ich muss ein Makro erstellen und dieses dann quasi im excel bzw. im breich VBA umschreiben.

Ich muss in Tabelle 1 in der Zeile 1 Spalte A-F
A B C D E F
1 Haller Manu 12.01.200 Stuttgart BW DE

eintragen nun mache ich ein Makro und tue es zuweisen:

Dieses Makor muss die Daten aus Zeile 1 A-F in den neuen Reiter bzw. Tabelle 2

in die erste Zeile Einfügen. Dieses klappt und habe ich geschafft…

wenn ich nun aber einen neuen Z.b. freund eingeben und wieder aufs gleiche Makro klicke überschreibt er natürlich meine Daten, er sollte aber diese 'Daten in Tabelle 2 Zeile 2 A-F notieren. Als ergebnis soll ich dann in Zeile 1 stehen und jeder weitere Datensatz soll unter mir eingefügt werden.

Ich schaffe dies nicht, er tut mir immer meinen Datensatz überschreiben.

Wie kann ich das Makro bzw. den Code so umschreiben das er dann immer automatisch die nächste Zelle mit den Daten füllt?

So sieht das Makro momentan aus

Sub Makro3()

’ Makro3 Makro


Range(„A1:F1“).Select
Selection.Copy
Sheets(„Tabelle2“).Select
Range(„A1“).Select
ActiveSheet.Paste
End Sub

Ich danke im Voraus lg

Haller

Hallo,

Ich wuerde das mit einer einfachen Funktions loesen, der die Zielzeile als Parameter uebergeben wird.

etwa so:

Function Makro3(aktRow as Integer)

Dim destCells as String
destCells = „A“& aktRow & „:F“ & aktRow

Range(destDells).Select
Selection.Copy
Sheets(„Tabelle2“).Select
Range(destCells).Select

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Function

Tschau

Peter

Hi,

was Du willst, kann man zwar mit Excel erreichen, aber es ist äußerst unprofessionell und wird Dir nur Schwierigkeiten bereiten.

Verzichte auf die Makros und verwende die Datenmaske.

M.

Hallo liebe Helfer,

Hallo Haller,

ich bräuchte eure hilfe, ich muss ein Makro erstellen und
dieses dann quasi im excel bzw. im breich VBA umschreiben.

Wie wir weiter unten sehen, hast Du ein Makro aufgezeichnet, dass, sofern Du ihm nichts anderes beibringst immer genau das gleiche tut: auf Tabelle 2 in Zeile 1 schreiben (und ggf. überschreiben).

Ich muss in Tabelle 1 in der Zeile 1 Spalte A-F
A B C D E F
1 Haller Manu 12.01.200 Stuttgart BW DE

Wenn Du Daten von Tabelle 1 nach Tabelle 2 kopierst, könnte man fragen, warum Du nicht gleich Tabelle 1 verwendest. Zur Lösung Deines Problems (bedingt kopieren) treffe ich also Annahmen. Wenn die nicht korrekt sind, lass es mich wissen.

  1. Annahme: Du kopierst immer 6 Spalten, immer A bis F, die Zeile kann sich ändern und soll durch die Position der selektierten Zelle (auf Tabelle 1) gegeben sein.

eintragen nun mache ich ein Makro und tue es zuweisen:

Dieses Makor muss die Daten aus Zeile 1 A-F in den neuen
Reiter bzw. Tabelle 2

in die erste Zeile Einfügen. Dieses klappt und habe ich
geschafft…

wenn ich nun aber einen neuen Z.b. freund eingeben und wieder
aufs gleiche Makro klicke überschreibt er natürlich meine
Daten, er sollte aber diese 'Daten in Tabelle 2 Zeile 2 A-F
notieren. Als ergebnis soll ich dann in Zeile 1 stehen und
jeder weitere Datensatz soll unter mir eingefügt werden.

  1. Annahme: Dein Problem ist: Finde die erste freie Zeile in Tabelle 2.

Ich schaffe dies nicht, er tut mir immer meinen Datensatz
überschreiben.

Wie kann ich das Makro bzw. den Code so umschreiben das er
dann immer automatisch die nächste Zelle mit den Daten füllt?

So sieht das Makro momentan aus

Sorry, aber das habe ich hier überschrieben:

Option Explicit

Sub Kopiere_T1T2()
'kopiert selektierte Zeile nach Tabelle 2
Dim Z1 As Long, Z2 As Long
Dim Eintrag As String

Z1 = ActiveCell.Row 'ermittle Zeile
Range(Cells(Z1, 1), Cells(Z1, 6)).Select 'Spalte A bis F wählen
Selection.Copy 'und kopieren
Sheets(„Tabelle2“).Select 'Tabelle zwei wählen
Z2 = 1 'Zeile 1 als Start
Eintrag = Cells(Z2, 1).Value 'prüfen ob Zelle leer ist
Do Until Eintrag = „“ 'Zeilen hochzählen bis Zelle leer
Z2 = Z2 + 1 'nächste Zeile
Eintrag = Cells(Z2, 1).Value
Loop 'Ende der Schleife
Cells(Z2, 1).Select 'Wählen
ActiveSheet.Paste 'und Einfügen

End Sub

Ich danke im Voraus lg

Haller

MfG MwieMichel

Hallo Haller,

so kann es gehen. Das Makro ist zwar nicht schön, aber es funktioniert.

Sub Makro3()
Dim Zeile As Long
Sheets(„Tabelle1“).Range(„A1:F1“).Copy
Zeile = Sheets(„Tabelle2“).Range(„A1“).CurrentRegion.Rows.Count + 1
Sheets(„Tabelle2“).Activate
Sheets(„Tabelle2“).Cells(Zeile, 1).Select
Sheets(„Tabelle2“).Paste
End Sub

Schöner wäre es z.B. so:

Sub Makro3()
Dim Zeile As Long
Dim i As Integer
Zeile = Sheets(„Tabelle2“).Range(„A1“).CurrentRegion.Rows.Count + 1

For i = 1 To 6
Sheets(„Tabelle2“).Cells(Zeile, i) = Sheets(„Tabelle1“).Cells(1, i)
Next i
End Sub
'Das Makro übertrag allerdings nur die Zellwerte und nicht ggf. vorliegende Formatierungen oder Formeln. Die kennt das Cells-Objekt allerdings auch und Du könntest sie übertragen. Schau Dir mal in der Hilfe die Attribute des „Range“-Objekts an.

mfg

Trampi

Hallo,

Hier solltest Du eine Prüfung einbauen welche Zeile in dieser Spalte gefüllt ist um dann den zu kopierenden Inhalt in die nächste einzufügen. Hier der Code dazu…

Sub Makro3()

’ Makro3 Makro


Range(„A1:F1“).Select
Selection.Copy
Sheets(„Tabelle2“).Select
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Sheets(„Tabelle2“).cells(letztezeile,1).select
ActiveSheet.Paste
End Sub

Viele Gruesse

Christian

Hallo,

Ich habe noch etwas übersehen hier der korrigierte Code…

Sub Makro3()

’ Makro3 Makro
Range(„A1:F1“).Select
Selection.Copy
Sheets(„Tabelle2“).Select
letztezeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Sheets(„Tabelle2“).cells(letztezeile+1,1).select
ActiveSheet.Paste
End Sub

VG

Christian

Hallo Haller87,

Eigentlich wollte ich jetzt schimpfen, dass Programmier-Grundlagen fehlen und Excel eben keine Datenbank ist. Aber das ist der falsche Ansatz.

Schön, dass Du Dich für das Programmieren interessiertst!

Was Dir fehlt, ist die nächste freie Zeile in Tabelle2. Diese kannst Du mit einer Funktion ermitteln, z. B. FIND_EMPTY_CELL unter http://www.herber.de/forum/archiv/304to308/305303_Mi….

oder einfach
function FindNextFreeLine
Dim i as Integer
for i = 1 to 1000 (oder eine andere vernünftige Zahl)
if cells(i, „A“).text = „“ then
FindNExtFreeLine = i
Exit for
Next i
(aus dem Kopf raus programmiert, keine Syntax-Prüfung)

Dann in Deinem Teil:

Sub Makro3()

’ Makro3 Makro


Range(„A1:F1“).Select
Selection.Copy
Sheets(„Tabelle2“).Select

Range(„A1“).Select => Range(„A“ & FindNextFreeLine).select

ActiveSheet.Paste
End Sub

Gruß
Harry

Range(„A1“).Select
Wenn du immer die gleiche Zelle selektierst, wird auch immer an die gleiche Stelle geschrieben. Also 3 Möglichkeiten:

  1. Merke Dir die Zeile, in der Du zueletzt eingesetzt hast, und zähle sie hoch.
  2. Suche ab „A1“ die erste freie Zeile, und füge dort ein.
  3. Füge an der selektierten Stelle eine neue Zeile ein, in die du dann einfügst. Dann steht aber der nerueste Eintrag oben!
    Range(„A1“).Select
    Selection.EntireRow.Insert

Gruß
Wolfram

Hallo Haller,
klar wenn Du mit Range(„A1“).select wählst, dann kann das Makro ja auch nur da hin schreiben. Also müsstest Du Dein Makro „die erste freie Zelle“ finden lassen.

Etwa so:

ab
Sheets(„Tabelle2“).select

DieReihe = 1
DaGehts = FALSE
While not Dagehts
…Range(cells(DieReihe,1);cells(DieReihe,1)).select
…If Activecell.value = „“ Then ’ Wenn also leer
…DaGehts = TRUE
…Endif
Wend
Activesheet.paste

Das ist natürlich höchst grob und man könnte noch andere Prüfungen (nicht nur Spalte A prüfen, was wenn die leer ist und die anderen nicht ?) einfügen, aber so gehts erstmal.
Gruß, Matthias

Hallo Haller,

einfach die nächste leere Zeile suchen (hier vereinfacht angenommen, wenn Zelle in Spalte A leer, ist auch B-F leer):

Sub Makro3()
Dim Zeile as Long

'Initialisierung
Zeile = 0

'Leere Zeile suchen
Do
Zeile=Zeile + 1
Loop Until sheets(„Tabelle2“).Range(„A“ & Zeile).Value = „“

'Datensatz eintragen
Sheets(„Tabelle2“).Range(„A“ & Zeile).Value = Range(„A1“).Value
Sheets(„Tabelle2“).Range(„B“ & Zeile).Value = Range(„B1“).Value
Sheets(„Tabelle2“).Range(„C“ & Zeile).Value = Range(„C1“).Value
Sheets(„Tabelle2“).Range(„D“ & Zeile).Value = Range(„D1“).Value
Sheets(„Tabelle2“).Range(„E“ & Zeile).Value = Range(„E1“).Value
Sheets(„Tabelle2“).Range(„F“ & Zeile).Value = Range(„F1“).Value
End Sub

Man kann die einzelnen Spalten auch noch eleganter per Schleifendurchlauf füllen, Deine Vorgabe mit dem Select und Copy / Paste geht auch, finde ich aber aufgrund des Zwischenspeichers in der Zwischenablage nicht so gut.

Die andere Frage wäre, warum Du den neuen Datensatz nicht gleich auf Tabellenblatt 2 einträgst.