Wertänderung von 2 Zellen => Leerzeile einfügen (EXCEL)

  • VBScript

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von felix_gorgas.

    Wertänderung von 2 Zellen => Leerzeile einfügen (EXCEL)

    Hallo,

    das Problem ist leider etwas komplex. Es geht um ein Stücklisten VBS was in einem Excel Dokument zum tragen kommen soll.

    Vorgeschichte:
    Wir nutzten als Konstruktionsprogramm (CAD) HiCAD. Hierbei werden in einem sogenannten Reportmanager die Stücklisten erzeugt. Man kann sich diverse Sortierungen
    und Bestandteile zusammenstellen und diese dann in Excel expotieren. Hierzu wird ein VBS genutzt (siehe Anhang in ZIP Datei). Dieses Script wurde nicht von mir erstellt,
    sondern in uns wichtigen Bereichen angepasst.

    Problem:
    Hierzu ersteinmal die Stückliste (siehe Anhang Screenshot). In der Spalte M wird momentan nach dem Wert 1 gesucht und anschließend die Zeile grau hinterlegt und die
    Schrift auf Fett gestellt. Diesen Ablauf hatten wir auf eine globale Suche in Spalte C mit der Suche nach "Baugruppe". Das funktioniert wunderbar, doch wenn wir sogenannte
    Losteile (die haben keine Baugruppe) in der Konstruktion haben, dann kommen die, wie auch im Beispiel zu sehen, anscheinend in die letzte Baugruppe. Das produziert fehler in
    der Fertigung und sollte abgestellt werden. NUn könnte ich hingehen und immer diese Stelle suchen an der es vorkommt. Leider ist das zeitaufwendig und wenn man es mal
    vergisst ist die "Kacke am Dampfen".

    Wunsch:
    Es sollte beim Wechsel der Werte "2 auf 1", "3 auf 2" und "4 auf 3" eine Leerzeile unter die höhere Zahl (wenns einfacher ist auch über die niedrigere Zahl) eingefügt werden.

    Ist das irgentwie zu bewerkstelligen?

    Für die schnellen Blicke hier das Suchscript:

    Quellcode

    1. Dim wsStruct
    2. Dim Such, Treffer1
    3. set wsStruct = objExcel.Worksheets("strukturliste")
    4. Set Such = wsStruct.Columns("M").Find("1")
    5. If Not Such Is Nothing Then
    6. Treffer1 = Such.Address
    7. Do
    8. Such.EntireRow.Font.Bold = True
    9. Such.EntireRow.Interior.Color = RGB(220,220,220)
    10. Set Such = wsStruct.Columns("M").FindNext(Such)
    11. Loop While Not Such Is Nothing And Treffer1 <> Such.Address
    12. End If


    Ich hoffe auf Hilfe :whistling: .

    MfG
    Bilder
    • Stückliste.jpg

      380,82 kB, 1.356×1.080, 261 mal angesehen
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felix_gorgas“ ()

    wenn wir sogenannte
    Losteile (die haben keine Baugruppe) in der Konstruktion haben, dann kommen die, wie auch im Beispiel zu sehen, anscheinend in die letzte Baugruppe
    Keine Ahnung, ob ich deine Fragestellung richtig verstanden habe:
    Wenn dein Pattern überhaupt nicht gefunden wurde ist Such = Nothing.

    Visual Basic-Quellcode

    1. If Such Is Nothing Then 'tu was immer du tun musst


    Es sollte beim Wechsel der Werte "2 auf 1", "3 auf 2" und "4 auf 3" eine Leerzeile unter die höhere Zahl (wenns einfacher ist auch über die niedrigere Zahl) eingefügt werden.
    Leere Zeilen fügst du ein mit
    wsStruct.Rows(xyz).Insert -4162 ' -4162=xlup, xyz ist die Zeile über der du einfügen willst
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    uff böhmische Dörfer^^

    Also die Suche nach den gewünschten Einträgen funktioniert. Lasse ich nach "Baugruppe" oder 1 suchen, so wird mir der Eintrag nach meinen Vorstellungen (Formatierung) hervorgehoben.
    Ich möchte nun die Suche abwandeln, sodass in Spalte M so gesucht wird, dass bei einem Wechsel von 2 auf 1 bzw. 3 auf 2 bzw. 4 auf 3 über der gefundenen Zeile eine Leerzeile eingefügt wird.
    Im Anhang habe ich mal ein "nachher" Screenshot gemacht, wie es aussehen sollte (Stückliste 2) ...
    Leere Zeilen fügst du ein mit

    wsStruct.Rows(xyz).Insert -4162 ' -4162=xlup, xyz ist die Zeile über der du einfügen willst
    Das mit XYZ ist ein Problem. Die Zeile ist durch das "Such Script" gefunden worden. Ich weiß also nicht, wo ich es eintragen soll. Diese ändert sich auch von Stückliste zu Stückliste! Wenn ich in
    meiner Suchschleife folgendes eintrage

    Quellcode

    1. Such1.EntireRow.Insert

    wird permanent in der ersten Zeile (sprich da wo 1 in Spalte M gefunden wurde) eine neue Zeile eingefügt. Es rutscht also der gesamte Inhalt immer weiter nach unten und es
    wird nicht zur nächsten 1 gesprungen. Dazu habe ich auch mal einen Screenshot angehängt (Stückliste 3).

    Was ich möchte:
    Mein Suchscript so abwandeln, dass bei einem Wertwechsel von 2 auf 1 ... in Spalte M eine Leerzeile zwischen den Wechsel (als über Zeile mit "1" oder unter Zeile mit "2") eingefügt wird.
    Eventuell ist soetwas möglich:

    1. Suche nach "2"
    2. "2" gefunden
    3. Vergleiche ob Folgezeile "1" ist
    4.1 trifft zu ==> also Leerzeile einfügen
    4.2 trifft nicht zu ==> also überspringen und nächsten Vergleich in nächster Zeile

    Alternativ vielleicht soetwas wie ein Größenvergleich ala 2>1 daher Leerzeile dazwischen...

    Geht soetwas?

    MfG
    Bilder
    • Stückliste 2.jpg

      490,67 kB, 1.928×1.080, 146 mal angesehen
    • Stückliste 3 - Fehler mit Leerzeile.jpg

      541,41 kB, 1.918×1.080, 172 mal angesehen
    Bei so vielen Wechseln würde ich nicht mit Find arbeiten, sondern sequentiell von unten nach oben durchgehen.
    Ganz grob so:

    Visual Basic-Quellcode

    1. n0 = 99999
    2. For r = wsStruct.Cells(wsStruct.Rows.Count, 13).End(-4162).Row To 1 Step -1
    3. n = Val(wsStruct.Cells(r, 13))
    4. If n > 0 Then
    5. If n > n0 Then wsStruct.Rows(r + 1).Insert -4121
    6. n0 = n
    7. End If
    8. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    erstmal danke dass du mir helfen möchtest!

    Ich habe deinen Code eingefügt doch leider kommt eine Fehlermeldung. Ich habe beides als Screenshot angehängt. Ich denke mal, so sieht man dies
    am einfachsten wo der Hase im Pfeffer liegt. Das Eintragen der Daten funktioniert, doch sobald der Vergleich losgehen soll, kommt die Felhlermeldung.

    Quellcode

    1. Dim wsStruct
    2. Dim n0
    3. Dim r
    4. n0 = 99999
    5. For r = wsStruct.Cells(wsStruct.Rows.Count, 13).End(-4162).Row To 1 Step -1
    6. n = Val(wsStruct.Cells(r, 13))
    7. If n > 0 Then
    8. If n > n0 Then wsStruct.Rows(r + 1).Insert
    9. n0 = n
    10. End If
    11. next


    MfG
    Bilder
    • Fehlercode in Zeile 516.jpg

      268,88 kB, 1.591×828, 81 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felix_gorgas“ ()

    Hallo petaod,

    gesagt getan, doch nun sagt mir der Fehler, dass Val nicht definiert ist. Schreibe ich Dim Val hinein, so kommt der Fehlercode "Typenconflikt" Code 800A000D.
    Mit dem n nicht wundern, das habe ich durch x und x0 ersetzt, da n bereits weiter vorn benutzt wurde und ich einen eventuellen Konflikt vermeiden möchte.

    MfG
    Bilder
    • Fehlercode 2.jpg

      314,4 kB, 1.604×1.064, 141 mal angesehen
    Stimmt.
    Val ist in VBS nicht vorhanden.
    CLng müsste aber in diesem Fall auch funktionieren.
    n = CLng(wsStruct.Cells(r, 13).Value)
    Alternativ n = wsStruct.Cells(r, 13).Value *1
    Das ist ja nur zum Erkennen, ob die Zelle überhaupt einen Wert enthält.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo

    folgendes Script klappt:

    Quellcode

    1. Dim wsStruct
    2. Dim x, x0
    3. Dim r
    4. set wsStruct = objExcel.Worksheets("strukturliste")
    5. x0 = 99999
    6. For r = wsStruct.Cells(wsStruct.Rows.Count, 13).End(-4162).Row To 1 Step -1
    7. x = wsStruct.Cells(r, 13).Value
    8. If x > 0 Then
    9. If x > x0 Then wsStruct.Rows(r + 1).Insert
    10. x0 = x
    11. End If
    12. next


    Jetzt würde ich gern noch 2 Dinge einbauen.

    1.)
    Die Farbe der leeren Zeile in einen grauen Hintergrund legen. Das geht (zumindest bei der Suche) mit

    Quellcode

    1. Such2.EntireRow.Interior.Color = RGB(220,220,220)

    Wenn ich in der Zeile

    Quellcode

    1. If x > x0 Then wsStruct.Rows(r + 1).Insert

    den Teil nach Then in die nächste Zeile schiebe und

    Quellcode

    1. wsStruct.Rows(r + 1).Interior.Color = RGB(220,220,220)

    zusätzlich einfüge, kommt das ein next zu viel ist (das am Ende dieses "Vergleiches"). Lösche ich es, sagt mir der Fehler, dass ein next erwartet wird^^

    2.)
    Die Suche bis zur Zeile 6 begrenzen (diese nicht mehr mit), da "oben" im Excel-Kopf noch Schrift kommt.

    Es wäre klasse, wenn wir das auch noch irgentwie bewerkstelligen können :)

    DANKE!!! :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „felix_gorgas“ ()

    Hallo petaod,

    der hier:

    felix_gorgas schrieb:

    1.)
    Die Farbe der leeren Zeile in einen grauen Hintergrund legen. Das geht (zumindest bei der Suche) mit

    Quellcode

    1. Such2.EntireRow.Interior.Color = RGB(220,220,220)

    Wenn ich in der Zeile

    Quellcode

    1. If x > x0 Then wsStruct.Rows(r + 1).Insert

    den Teil nach Then in die nächste Zeile schiebe und

    Quellcode

    1. wsStruct.Rows(r + 1).Interior.Color = RGB(220,220,220)

    zusätzlich einfüge, kommt das ein next zu viel ist (das am Ende dieses "Vergleiches"). Lösche ich es, sagt mir der Fehler, dass ein next erwartet wird^^


    Wir haben auch noch etwas anderes, da mach ich aber einen anderen Thread auf, da wir aus diesem Zustand gern noch etwas ermittelt haben wollen. Das kommt aber später :)

    MfG