Nächste leere Zeile/Zelle in Spalte befüllen

Hallo zusammen

Makro1
Für eine Einsatzplanung möchte ich ein Makro erstellen, welches mir die Werte in der „Eingabemappe“ (separate Tabelle) übernimmt und in meiner Einsatzplanung in die erste freie Zelle schreibt. Aus der Eingabemappe sind folgende Zellwerte zu übernehmen: C1 (soll in die erste Zelle in der freien Zeile), B2 (soll in die Nachfolgende Zelle der Zeile), D2 (nachfolgende Zelle in Zeile) B3 (nächste Zelle) usw für E1, B3, B6, B7.

Die Werte in der Eingabemappe werden danach wieder geklierte, damit der nächste Datnsatz geladen werden kann.

Kann mir da jemand weiterhelfen?

  1. Makro
    Ich arbeite wiederum mit einem Eingabeblatt und mit einer Dtenbasis. In der Datenbasis ist der Schlüssel jeweils der Name des Mitarbeienden in der Spale A. Nun möchte ich im Eingabeblatt in der Zelle B2 den Namen des MA erfassen, in Zelle B3 das Eintrittsdatum und in Zelle B4 das Austrittsdatum. Alle Dten werden jeweils komplett erfasst. Nun muss das Makro die Daten im Blatt der Dtenbasis dem richtigen Namen in der ersten Spalte zuordnen und wenn der Name gefunden wird, in die erste freie Zelle in dieser Zeile schreiben. Wenn der Name nicht gefunden wird, so soll eine Messagebox eine Mitteilung vornehmen.

Vielen Dank für Eure Hilfe bereits im voraus.

Gruß
Whatabout

Was Du da möchtest, ist ja ein kompletter Entwicklungsauftrag - naja, ein kleiner…

Dazu habe ich in diesem Rahmen weder Lust noch Zeit.
Ein Problem bei so einer Sache ist es aber immer wieder, die letzte leere Zelle zu finden. Viele der üblichen Methoden funktionieren nicht zuverlässig.

Diese Funktion macht das aber richtig:

Function RealLastCell(TheSheet As Worksheet) As Range

'Excel bezieht bei der Letzte-Zellen-Prüfung auch die formatierten Zellen mit ein.
’ Nachfolgend ein Code von John Walkenbach zur Ermittlung der real letzten Zelle.

Dim ExcelLastCell As Range
Dim Row%, Col%, LastRowWithData%, LastColWithData%
Application.ScreenUpdating = False
Set ExcelLastCell = TheSheet.Cells.SpecialCells(xlLastCell)
LastRowWithData = ExcelLastCell.Row
Row = ExcelLastCell.Row
Do While Application.CountA(TheSheet.Rows(Row)) = 0 And Row 1
Row = Row - 1
Loop
LastRowWithData = Row
LastColWithData = ExcelLastCell.Column
Col = ExcelLastCell.Column
Do While Application.CountA(TheSheet.Columns(Col)) = 0 And Col 1
Col = Col - 1
Loop
LastColWithData = Col
Set RealLastCell = TheSheet.Cells(Row, Col)
End Function

Ansonsten würde ich Dir raten, den von Dir beschriebenen ARbeitsauflauf einmal „zu Fuss“ zu machen und mit dem Makro-Rekorder aufzuzeichnen.
Auf dieser Basis kann man dann gut weiterarbeiten.

Hallo,

zum Makro 1: man kann in Excel jede Zelle über Variablen adressieren, z.B. Sheets(name). Cells(zeile, spalte). Also kann man in einer Schleife ganz einfach nach einer leeren Zelle suchen, z.B.
row = 1
col = 5 ’ Annahme der Spalte in der gesucht werden soll
Do While Cells(row, col) vbNullstring
row = row +1
Loop
’ row zeigt auf die entsprechende Zeile
Zum Makro 2:
analog zuvor kann man suchen und den Zellen Werte zuweisen oder löschen, allerdings weiss ich nicht, wie der Zugriff von Excel auf Deine Datenbank funktioniert (ich mache in solchen Fällen oft einen Export aus der Datenbank in eine Excel-Tabelle (wenn die DB das anbietet). Man kann die obige Anweisung Cells(row, col) auch noch mit der Excel-Datei und dem Worksheet qualifizieren, Beispiel findest Du in der Hilfe (oder in einem Makromitschnitt).
Viel Erfolg
Rainer

Zu deinen Problemen:
zu 1. mir ist a) nicht klar was wohin soll und b) warum du kein Userform mit Speicherbutton benutzt, was die Daten entgegen nimmt und dann gleich in die richtige Tabelle schreibt. Mit einer Eingabemappe weiß das Makro ja nicht, wann es tätig werden soll.
zu 2. hier ist das mit dem Zuordnen derart kompliziert formuliert, das man nur Fehler produzieren könnte. Auch hier wäre ein Userform besser.
ZU beiden: Dies ist ein Board für gegenseitige kleine Hilfestellungen. Das was du willst, ist eine komplexe Programmierung, die nicht mal ins Eingabefenster passen würde. Außerdem scheint es mir ja um was gewerbliches zu gehe. Da solltet ihr einen professionellen Programmierer beschäftigen, der damit sein Geld verdient. Die Firma kann es ja absetzen.

hallo whatabout
du hast keine ahnung wie du das angehen möchtest – oder?
kennst du die funktion ‚makro aufzeichnen‘? damit kannst du die schritte, welche du ‚von hand‘ ausführst als makro speichern und dieses makro dann anpassen, damit es genau deinen wünchen entspricht.

hier mal ein vorschlag für makro 1:

Sub manipulate()

’ eingabeblatt auswählen
Sheets(„eingabe“).Select

’ werte einlesen
Dim werte(8)
werte(1) = Cells(1, 3)
werte(2) = Cells(2, 2)
werte(3) = Cells(2, 4)
werte(4) = Cells(3, 2)
werte(5) = Cells(1, 5)
werte(6) = Cells(3, 2)
werte(7) = Cells(6, 2)
werte(8) = Cells(7, 2)

’ ausgabeblatt auswählen
Sheets(„ausgabe“).Select
irow = 1
While Cells(irow, 1) „“
irow = irow + 1
Wend

For iwert = 1 To UBound(werte)
Cells(irow, iwert) = werte(iwert)
Next

End Sub

die blattnamen musst du natürlich noch anpassen. falls du andere zellen einlesen willst, musst du das ebenfalls noch anpassen.

viele grüsse, rolf

Hallo Whatabout,

Verstehe ich Dich bisher richtig:
zum 1.Makro:
Makro befindet sich in der Mappe „Einsatzplanung“

  1. Mappe „Eingabemappe“ laden/öffnen
  2. Freie Zeile in „Einsatzplanung“ suchen
  3. Zelle (Spalte A,freie Zeile) in „Einsatzplanung“ = C1 von „Eingabemappe“
  4. Zelle (Spalte B,freie Zeile) in „Einsatzplanung“ = B2 von „Eingabemappe“

    n. Mappe „Eingabemappe“ wieder schließen

Wo sind Deine konkreten Probleme?
Wie sieht denn Dein Makro bis jetzt aus?

Um Makro 2 sollten wir uns dann später kümmern.

Gruß, Jens

Hi Whatabout.
Um auf die nächste freie Zeile in einer Spalte zu springen musst Du den Cursor auf Deine „Startzelle“ in der entsprechenden Spalte setzen.
z.B. Range(„A1“).Select
Range(Selection, Selection.End(xlDown)).Select
So steuerst Du die erste/nächste freie Zelle in der aktuellen SPalte an.

Viel Erfolg.

Gruß
Ernie

Hallo,

Makro1:
Habe ich richtig verstanden, hast Du zwei Tabellen: A=„Eingabe“
und B=„Einsatzplanung“. In B suchst Du die erste freie Zeile (z),
sodann sollen C1, B2, D2, B3, E1, B3, B6, B7 aus A nach B in die
Zellen (z,1), (z,2) … (z,7) übernommen werden. Nach der Über-
nahme sollen die Zellen C1 bis B7 im Blatt A gelöscht (? - den
Ausdruck „geklierte“ verstehe ich nicht) werden. Sind beide Blätter
in derselben Mappe? Ich gehe einmal davon aus. B3 kopierst Du
übrigens doppelt, gewollt? Falls in den Ursprungszellen Formeln
stehen, solltest Du mir ebenfalls Bescheid geben.

Sub Makro1()
 Dim Quelle As Worksheet, Ziel As Worksheet
 Dim z As Long, i As Integer
 Dim Zellen(1 To 8) As Variant
 'Hier legst Du Deine Daten fest
 Const Tbl1 As String = "Eingabeblatt"
 Const Tbl2 As String = "Einsatzplanung"
 On Error Resume Next
 Zellen(1) = "C1": Zellen(2) = "B2": Zellen(3) = "D2":
 Zellen(4) = "B3": Zellen(5) = "E1": Zellen(6) = "B3":
 Zellen(7) = "B6": Zellen(8) = "B7"
 Application.ScreenUpdating = False
 Set Quelle = ActiveWorkbook.Sheets(Tbl1)
 Set Ziel = ActiveWorkbook.Sheets(Tbl2)
 z = Ziel.UsedRange.Rows.Count
 'Übernehmen nach Ziel
 For i = 1 To 8
 Ziel.Cells(z + 1, i).Value = Quelle.Range(Zellen(i)).Value
 Next i
 'Löschen in Quelle
 For i = 1 To 8
 Quelle.Range(Zellen(i)).Clear
 Next i
 Application.ScreenUpdating = True
 Ziel.Activate
End Sub

Makro2:

Falls ich recht verstehe: im Datenblatt soll in der zu einem
Namen gefundenen Zeile ab der ersten freien Spalte der Inhalt
der Zellen B2, B3 und B4 aus dem Eingabeblatt geschrieben
werden. Der Name taucht dann in der Spalte A und in der ersten
freien Spalte nochmals auf, gewollt? Oder sollen nur Eintritts-
und Austrittsdatum übernommen werden? Ich gehe einmal davon
aus. - Ich würde nicht den Namen, sondern eine ID als Schlüssel
wählen, denn bei jedem Vertipper in der Eingabe landest Du in
der Fehlermeldung; Groß-Kleinschreibung unterscheiden ja/nein?
Ich schicke Dir den Code auf Deine eigene Gefahr. Übrigens:
„erste freie Spalte“ bedingt u.U., daß keine Lücken in der
Zeile sind. Der gelieferte Code positioniert ganz nach rechts.

Sub Makro2()
 Dim Quelle As Worksheet, Ziel As Worksheet
 Dim s As Integer, z As Long, i As Integer, ok As Boolean, Tx As String
 'Hier legst Du Deine Daten fest
 Const Tbl1 As String = "Eingabeblatt"
 Const Tbl2 As String = "Datenbasis"
 On Error Resume Next
 Set Quelle = ActiveWorkbook.Sheets(Tbl1)
 Set Ziel = ActiveWorkbook.Sheets(Tbl2)
 z = Ziel.UsedRange.Rows.Count
 ok = False
 For i = 1 To z
 If Quelle.Cells(2, 2).Value = Ziel.Cells(i, 1).Value Then
 'Falls nicht case-sensitiv:
 'if LCase(...) = UCase(...) then (auch Lcase geht)
 ok = True
 With Ziel
 'letzte Zelle in Zeile:
 s = .Cells(i, 255).End(xlToLeft).Column
 .Cells(i, s + 1).Value = Quelle.Range("B3").Value
 .Cells(i, s + 2).Value = Quelle.Range("B4").Value
 'Ggf Datumsformat festlegen
 .Cells(i, s + 1).NumberFormat = "yyyy-mm-dd"
 .Cells(i, s + 2).NumberFormat = "yyyy-mm-dd"
 End With
 Exit For
 End If
 Next i
 If Not ok Then
 Tx = "Name " & Quelle.Range("B2").Value & " nicht vorhanden!"
 MsgBox Tx, vbOKOnly, "Fehler"
 Exit Sub
 End If
 Ziel.Activate
 Set Quelle = Nothing
 Set Ziel = Nothing
End Sub

Frohe Ostern!
gs

Hi,

sorry, bin in Excel nicht fitt.
Access sieht es etwas besser aus, ist aber auch schon aus der Übung.
Ich nutze zur Zeit überwiegende OpenOffice (läuft auch unter Linux:wink: ).
Bis dann

Karsten

Hallo,

weiß ich leider auch nicht,

Gruß

Hallo Whatabout,

entschuldige bitte die späte Rückmeldung, hier ein paar Tipps:

  1. So ganz eindeutig ist es nicht, was Du da machen möchtest, ich versuche es trotzdem einmal:
    a) Erste leere Zelle finden
    Ich gehe hier davon aus, dass Du eigentlich leere Zeile meinst, da Du datenbankähnliche Tabellen benutzt. Die erste leere Zeile kann man über zwei Arten finden:
    aa) über eine Schleife, z.B.
    Zeile=1 'hier sind die Überschriften
    Do While Range(„A“ & Zeile).value „“ and Zeile then 'hier Zellverweis statt Variable möglich

end if

In den Anweisungen sollten mehrere Dinge erledigt werden:

  • Setzen einer Boolean-Variablen auf True, damit man sehen kann, ob der Name gefunden wurde
  • Übernahme der Daten wie oben, nur hier ggf. die erste leere Spalte finden: Mittels Spaltenzählen kann man hier die folgende Schleife verwenden
    Spalte = 1
    Do While cells(Zeile, Spalte).Value „“ and Spalte

Makro1
Für eine Einsatzplanung möchte ich ein Makro erstellen,
welches mir die Werte in der „Eingabemappe“ (separate Tabelle)
übernimmt und in meiner Einsatzplanung in die erste freie
Zelle schreibt. Aus der Eingabemappe sind folgende Zellwerte
zu übernehmen: C1 (soll in die erste Zelle in der freien
Zeile), B2 (soll in die Nachfolgende Zelle der Zeile), D2
(nachfolgende Zelle in Zeile) B3 (nächste Zelle) usw für E1,
B3, B6, B7.

Code für das erste Makro:

Sub Makro1()
Sheets(1).Activate
ro = Range(ActiveSheet.Cells.SpecialCells(xlCellTypeBlanks).Address).Row 'nächste leere zeile
With Sheets(„Eingabemappe“)
Sheets(1).Cells(ro, 1) = .Cells(1, 3) 'C1
Sheets(1).Cells(ro, 2) = .Cells(2, 2) 'B2
Sheets(1).Cells(ro, 3) = .Cells(2, 4) 'D2
Sheets(1).Cells(ro, 4) = .Cells(3, 2) 'B3
Sheets(1).Cells(ro, 5) = .Cells(1, 5) 'E1
Sheets(1).Cells(ro, 6) = .Cells(3, 2) 'B3
Sheets(1).Cells(ro, 7) = .Cells(6, 2) 'B6
Sheets(1).Cells(ro, 8) = .Cells(7, 2) 'B7
End With
End Sub

Die Werte in der Eingabemappe werden danach wieder geklierte,
damit der nächste Datnsatz geladen werden kann.

Kann mir da jemand weiterhelfen?

  1. Makro
    Ich arbeite wiederum mit einem Eingabeblatt und mit einer
    Dtenbasis. In der Datenbasis ist der Schlüssel jeweils der
    Name des Mitarbeienden in der Spale A. Nun möchte ich im
    Eingabeblatt in der Zelle B2 den Namen des MA erfassen, in
    Zelle B3 das Eintrittsdatum und in Zelle B4 das
    Austrittsdatum. Alle Dten werden jeweils komplett erfasst. Nun
    muss das Makro die Daten im Blatt der Dtenbasis dem richtigen
    Namen in der ersten Spalte zuordnen und wenn der Name gefunden
    wird, in die erste freie Zelle in dieser Zeile schreiben. Wenn
    der Name nicht gefunden wird, so soll eine Messagebox eine
    Mitteilung vornehmen.

Wenn ich das richtig verstanden habe, so könnte der Code so aussehen:

Sub Makro2()
name1 = Sheets(„Eingabeblatt“).Cells(2, 2) ’ B2
anz = Range(Sheets(„Datenbasis“).Cells.SpecialCells(xlCellTypeBlanks).Address).Row - 1 'anzahl der MA
For i = 1 To anz
If Sheets(„Datenbasis“).Cells(i, 1) = name1 Then 'wenn name gefunden dann
For j = 2 To 256
If Sheets(„Datenbasis“).Cells(i, j) = Empty Then Exit For
Next j
Sheets(„Datenbasis“).Cells(i, j) = Sheets(„Eingabeblatt“).Cells(3, 2)
Sheets(„Datenbasis“).Cells(i, j + 1) = Sheets(„Eingabeblatt“).Cells(4, 2)
Exit For
End If
Next i
If i > anz Then
MsgBox „Mitarbeiter nicht gefunden“, vbInformation + vbOKOnly, „MA ??“
End If
End Sub

Eventuell müsstest du die Werte bzw. Daten deiner Tabellen anpassen.

Gruß Andreas