Hello, Guest the thread was called1.1k times and contains 32 replays

last post from oobdoo at the

Hilfe in VBA Excel

  • HI, hier gibts doch bestimmt Spezialisten!


    Ich bastel mir gerade ein VBA Script und tu mich etwas schwer. Ist doch anders als 6510 Assembler oder Basic..


    Ich bekomme von einem System eine Excel Datei generiert, die sehr unübersichtlich ist und ich bastel grade was, um die Tabelle automatisch umzuformatieren. Ich komme ganz gut voran, aber eins weiss ich nicht und vielleicht kann mir jemand nen Codeschnipsel machen, damit ich das einbauen kann. Folgendes brauche ich (im Pseudocode):


    Code
    1. selektiere die Spalte mit der Bezeichnung "Test" von Reihe 2 bis zur letzten benutzten Reihe
    2. Bei allen Zellen, die den Wert "TestTest" enthalten soll die Schrift rot (#ff0000) eingefärbt und die Schrift auf "fett" gesetzt werden


    Ich kann die Spaltenbezifferung nicht nehmen, da die Sortierung der Spalten mitunter abweicht!

  • ungetestet...


    Um einen Bereich zu selektieren

    Code
    1. ActiveSheet.Range("A1:A5").Select
    2. 'oder
    3. ActiveSheet.Range(Cells(i, j), Cells(k, l)).Select
  • Ist das "i = i + 1" in dem FOR-Loop nicht zu viel? Damit würde er doch nur jede zweite Zeile vergleichen (sofern die For-Schleife in VBA die Indexvariabe selber hochzählt, was ich mal vermuten würde)...


    und in den beiden "Formatierungsanweisungen" ist die Zelladresse andersrum angegeben als in bei der Abfrage der Zelle (erst (i, Testspalte) , danach zwei mal (Testspalte, i))


    Code
    1. For i = 1 To Zeilen
    2. Value = wb.Sheets(1).Cells(i, Testspalte).Value
    3. If Value = "testtest" Then
    4. ' gefunden
    5. 'Einzelne Zelle umformatieren
    6. wb.Sheets(1).Cells(Testspalte, i).Font.Bold = True
    7. wb.Sheets(1).Cells(Testspalte, i).Interior.Color = RGB(255, 0, 0) 'RGB
    8. End If
    9. i = i + 1
    10. Next i


    keine Ahnung, welche Reihenfolge richtig ist, ich bin kein "VBA-Mensch", aber eins von beidem müsste falsch sein :nixwiss:

  • Ja, stimmt. War vorher ein Do-Loop.

  • Ich hab das einfach mal ausprobiert, weil ich eh gerade am Rechner sitze.


    Diese Anweisung:

    Code
    1. Zeilen = wb.Sheets(1).Range("D999999").End(xlUp).Row

    scheint nur zu zählen, wie viele benutzte Zellen es in Spalte "D" gibt, was ja nicht unbedingt die gesuchte Spalte ist. Vielleicht ist dann die "Do-Loop" Schleife doch besser geeignet. Korrigiert mich gerne, ich habe, wie schon erwählt, mit VBA nichts am Hut.

    Statt "End" muss die Do-Schleife scheinbar mit "Exit Do" beendet werden, sonst bricht er das ganze Makro ab.



    Ich hab das ganze mal so abgeändert, dass es bei mir läuft:


    Credits gehen natürlich an Bulli_ , da er das ja geschrieben hat, ich habe nur abgeändert :thumbup:


    [edit] Zu bedenken ist dabei natürlich, dass er in der Testspalte nur so lange sucht, bis er auf eine leere Zelle stößt. Wenn es vorkommen kann, dass mittendrin leere Zellen sind, müsste man das natürlich irgendwie berücksichtigen.

    Wenn allerdings klar ist, dass leere Zellen nicht vorkommen können, müsste es so gehen.

  • so, habe nachgeforscht, wie man die benutzte "Länge" einer beliebigen Spalte rausfindet. Damit ist jetzt der For-Loop wieder im spiel, und das ganze funktioniert auch, wenn in der Spalte leere Zellen vorkommen :


  • Ich habe auch meinen Teil an VBA Code hinter mir, aber warum löst Du das nicht ganz einfach ohne Code mit bedingter Formatierung?

    Das wäre ja geradezu für solche Sachen gedacht.

  • Ok, das ist nachvollziehbar.


    Ich persönlich bin kein Freund von reiner Farbhervorhebung von Zeilen in Tabellen, weil sie einen gravierenden Nachteil haben, den Normaluser oft nicht wahrnehmen, weil sie sehr optisch und deshalb "manuell" arbeiten.

    Zeilen lassen sich so nicht filtern und auch z.B. bedingte Summen können so nicht eingebaut werden.


    In meinen Tabellen oder wenn ich Daten bekomme, füge ich eine oder mehrere Filter-Spalten ein mit "0" oder "1" oder Gruppierungswörtern.

    Manchmal nerven mich aber die grausigen Rohdaten und dann bin ich für die Bereinigung schneller, den Inhalt in eine SQL Datenbank einzufügen und die Daten mit SQL (und damit wiederholbar) zu bereinigen. Dann kann man auch bessere Auswertungen machen.

  • Schau mal, ob ein oder mehrere Leerzeichen in der Zelle sind, also z.B. "test " oder " test".

    Oft erlebe ich dass User das so eingeben. Dann wird ein Vergleich mit "test" nicht klappen.

  • - Du könntest die Zellen füllen statt lesen, um festzustellen, ob wirklich das richtige Worksheet in der richtigen Zeile auf die Überschrift getestet wird.

    - Bestimme die Zelle einmalig manuell und lese sie aus. Eventuell ist ein CR in der Überschrift, oder ein schweres Space (chr$(160)) am Ende? Msgbox(len(value)) würde sowas zeigen.

  • Ist die Bezeichnung als echter Text in der Zelle, oder in irgendeiner Art als Formel?

    Das ist eine sehr gute Frage. Ich habe vorhin festgestellt, dass bei "Zelle formatieren" ich ausschliesslich die Schriftart ändern kann! Sonst kann ich nix formatieren. Und wie gesagt in einem komplett neuem Sheet funktionierts!

  • Ist die Bezeichnung als echter Text in der Zelle, oder in irgendeiner Art als Formel?

    Das ist eine sehr gute Frage. Ich habe vorhin festgestellt, dass bei "Zelle formatieren" ich ausschliesslich die Schriftart ändern kann! Sonst kann ich nix formatieren. Und wie gesagt in einem komplett neuem Sheet funktionierts!

    Versteh ich richtig? Der Code funktioniert in einem neuen Sheet, aber nicht in dem tatsächlichem Sheet? Oder meinst du nur das "Zelle formatieren"?