1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Leere Zellen füllen

Discussion in 'Programmieren' started by schneiderlein1, May 11, 2009.

Thread Status:
Not open for further replies.
  1. Hallo zusammen,

    ich habe folgendes Problem:
    In einer Tabelle mit ca. 6000 Zeilen sind einige Zellen aus "Faulheitsgründen" leer. Der damalige Erfasser war wohl zu bequem, die Daten jedesmal einzugeben.
    Bsp.:
    Name Vorname Strasse Geschlecht
    Maier Alfons Alpenweg männlich
    x Berta Alpenweg weiblich
    x Christa Birnenweg x
    Müller Axel Parkstraße männlich
    ...
    Die Felder mit x sind die leeren Zellen.
    Das war jetzt natürlich nur ein vereinfachtes Beispiel. Und ich hab auch manchmal Spalten, die ich nicht auffüllen möchte, wenn etwas leer ist. Also sollte man irgendwie abfragen können für welche Spalten es gefüllt werden soll und auch ab welcher Zeile.
    Kann mir bitte jemand helfen?
    Ein weiteres Problem stellt wohl die Zeit da, da ich bis spätestens Mittwoch eine Lösung bräuchte, weil ich mit den Daten weiterarbeiten muss.
    Das ganze sollte in VBA programmiert sein.

    Vielen Dank im Vorraus.
     
  2. Urs2

    Urs2 Megabyte

    Hallo Schneiderlein,

    Was soll in den "leeren" Zellen stehen? Ich vermute einmal, das was in der gleichen Spalte eine Zelle darüber steht...
    Also unter Mayer Alphonse muss dann Mayer Berta und Mayer Christa stehen. Richtig?

    Da das sicher eine einmalige Aufgabe ist, muss man nicht zu kompliziert sehen...
    Füge diesen Code im VB-Editor ein >>>
    Code:
    Sub ZellenFuellen()
    
    Dim letzteZeile
    
    letzteZeile = 6000          'hier unterste Zeilennummer in Deiner Tabelle einsetzen
    
    Do While ActiveCell.Row <= letzteZeile
        If ActiveCell.Value = "" Then ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
        ActiveCell.Offset(1, 0).Select
    Loop
        
    End Sub
    
    Funktion >
    - Im Tabellenblatt > Fokus in die oberste Zelle in der Spalte setzen, ab welcher abwärts die leeren Zellen gefüllt werden sollen.
    - oberste Zelle darf nicht in Zeile1 sein... ab Zeile2...
    - Makro ausführen >>> bei leeren Zellen wird jetzt immer der Wert aus der Zelle darüber eingesetzt.

    >> dann für jede gewünschte Spalte ab jeder gewünschten Zeile abwärts dasselbe...

    Im Makro musste Du die Zahl 6000 auf die Zeilennummer der letzten Zeile in Deiner Tabelle anpassen.

    Teste an einer Kopie der Tabelle ob das Makro tut, was Du willst...

    Gruss Urs
     
  3. also es geht alles perfekt, nur ein problem gibt es noch: wenn ich jetz als letzte Zelle nicht die Zelle 6000 habe, sondern ich die letzt gefüllte Zelle als letzte Zeile haben möchte, wie muss ich es dann umprogrammieren??

    Danke schon mal für deine Mühe
     
  4. Urs2

    Urs2 Megabyte

    Du musst nichts umprogrammieren !

    Du musst nur im VB-Editor meine beispielhafte Annahme, also die Zeile >
    letzteZeile = 6000
    ......Deiner tats&#228;chlichen Tabellengr&#246;sse, also deren letzten Zeilennummer, anpassen, zB >>>
    letzteZeile = 6487
    ......oder wie Deine Tabelle halt aussieht...

    Wenn es nicht eine einmalige Aufgabe w&#228;re, k&#246;nnte man das Makro auch selbst nach der letzten Zeile suchen lassen...
    ...aber dazu m&#252;sste man wissen, in welcher Spalte mit absoluter Sicherheit der unterste Eintrag auch dem unteren Ende der Tabelle entspricht.

    Gruss Urs
     
    Last edited: May 11, 2009
  5. Urs2

    Urs2 Megabyte

    Vielleicht hatte ich Dich ja auch falsch verstanden...

    Dieser Code sucht in der Spalte mit dem Fokus die unterste Zelle mit Inhalt, und füllt dann die leeren Zellen nur oberhalb.
    Aber Achtung >>>
    VBA schaut hier von unten nach oben, bis es eine gefüllte Zelle findet. Unterhalb der Tabelle darf also nichts mehr stehen...

    Code:
    Sub ZellenFuellen()
    
    Dim letzteZeile
    
    letzteZeile = Cells(65536, ActiveCell.Column).End(xlUp).Row
    
    Do While ActiveCell.Row <= letzteZeile
        If ActiveCell.Value = "" Then ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
        ActiveCell.Offset(1, 0).Select
    Loop
        
    End Sub
    
    ...der Sinn erschliesst sich mir aber nicht.
    Wenn die letzten 50 Personen männlich sind, und Dein Vorgänger bei 49 von Ihnen das Feld leer gelassen hatte, dann bleiben so diese 49 auch weiterhin geschlechtslos...

    Gruss Urs
     
  6. also die Aufgabe schaut so aus, nochmal zu Erklärung:
    ich habe irgendeine Tabelle ins Excel kopiert (das mit den Namen war nur ein Beispiel ;) ). Nun soll es, wenn ich das Makro ausführe, ab der Zelle, die ich anklicke, alle nachfolgenden Zellen der Spalte füllen und zwar immer mit dem was oben steht, (das hast du schon verstanden). Jetzt ist aber die Tabelle nicht immer gleich lang, und deshalb müsste man es so programmieren, dass die Zellen immer nur bis zu der letzten Zelle in der etwas steht, aufgefüllt werden.

    Hier hab ich mal ein Codebeispiel, das dies macht, aber hier hab ich das Problem, dass dann immer gleich die ganze Tabelle gefüllt wird und nicht die einzelnen Spalten, wie bei deinem Code:

    Sub Ersetzen()
    Dim rngZelle As Range
    Application.ScreenUpdating = False
    For Each rngZelle In ActiveSheet.UsedRange
    If rngZelle = "" Then rngZelle = rngZelle.Offset(-1, 0)
    Next rngZelle
    Application.ScreenUpdating = True
    End Sub

    Hoffe du kannst mir weiterhin helfen und danke dir, dass du so geduldig mit mir bist :)
     
  7. zur Verdeutlichung anbei eine Beispieltabelle:
    A B C
    1
    2 test1 test00 test01
    3 test00
    4 test00
    5 test00
    6 test00 test02
    7 test00
    8 test2 test00
    9 test00
    10 test00
    11 test00
    12 test00
    13 test00

    Nun möchte ich als Beispiel nur die Zellen A3-A13 gefüllt haben, aber ab Zelle A8 eben mit test2 anstatt mit test1 :)
     
  8. irgendwie hat es sich verschoben...
    test 00 gehört überall in Spalte B und test01, test02 in Spalte C xD
     
  9. Urs2

    Urs2 Megabyte

    Hallo Sariele

    Beim Antworten mit Zitat habe ich begriffen... dort wird Deine Eingabe der Beispieldaten richtig angezeigt.
    Bei der normalen Anzeige im Forum werden die Leerzeichen einfach weggelassen. Nur wenn Du die Eingaben als "Code" (#-Symbol) machst, werden die Leerzeichen behalten...

    Was mich noch verwirrt >
    Es ist eine einzige Tabelle. Aber die einzelnen Kolonnen sind nicht gleich lang?

    1. Mein erster Code geht von gleich langen Kolonnen aus. Wenn mit obigen Beispielwerten der Wert "letzteZeile" von 6000 auf 13 verändert wird, tut er das richtig.

    2. Mein zweiter Code geht von ungleich langen Kolonnen aus, und arbeitet in der gewählten Kolonne bis zur letzten Zeile mit Inhalt (von Zeile 65536 aus nach oben gesehen...).
    Mit Deinen Beispieldaten kann er aber nichts machen, er hört bei der ersten leeren Zelle auf...und das ist Zelle A9.
    Wie soll er auch wissen, welche Endzelle Dir vorschwebt?

    Abhilfe-Krücke mit Code2 >>>
    Für jede Spalte, eine Zeile unterhalb der letzten zu bearbeitenden Zelle (mit den Beispieldaten also in Zelle A14), ein "x" eintippen. Dann arbeitet er alles bis A13 richtig ab. das "x" in A14 bleibt aber bestehen >>> manuell löschen.

    Gruss Urs
     
  10. danke für deine Mühe... habe jetzt eine Lösung für mein Problem gefunden....
    falls es dich interessiert kannst du dir ja den quellcode ansehen:

    Sub Ersetzen()
    Dim rngZelle As Range
    Application.ScreenUpdating = False
    For Each rngZelle In ActiveSheet.UsedRange
    If rngZelle = "" And rngZelle.Column = ActiveCell.Column And rngZelle.Row >= ActiveCell.Row Then rngZelle = rngZelle.Offset(-1, 0)
    Next rngZelle
    Application.ScreenUpdating = True
    End Sub

    Nochmals vielen Dank
    lg schneiderlein1
     
  11. Urs2

    Urs2 Megabyte

    Na ja, jetzt klappert er für jeden Aufruf 100'000 Zellen ab...
    ...und von verschieden langen Spalten ist jetzt auch nicht mehr die Rede.

    Das hätte mein erstes Makro einfacher gemacht...
    ...wenn dann nicht plötzlich die mysteriösen, unterschiedlich langen Spalten aufgetaucht wären.

    Gruss Urs
     
Thread Status:
Not open for further replies.

Share This Page