Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1600to1604
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Spaltenverdopplung abstellen wenn unerwünscht

Spaltenverdopplung abstellen wenn unerwünscht
19.01.2018 12:01:11
Markus
Hallo Community,
gesundes Neues Jahr noch :)
Folgendes Problem besteht bei mir:
Bisher funktioniert die korrekte Anlegung und Prüfung von Spalten nicht so wie erhofft für die Tabellen 1 und 2:
Was geht:
Wenn in jeder zu prüfenden Spalte das Wort Umrandung vorkommt, dann wird keine Spalte angefügt, was richtig ist.
Wenn in jeder zu prüfenden Spalte Excel das Wort "Umrandung" nicht findet, wird diese Spalte angelegt und das Wort „Umrandung“ in die dritte Zeile der neu angelegten Spalte geschrieben, was auch richtig ist.
Was nicht geht:
Nun aber das Problem: Fehlt eine der prüfenden Spalten wird diese zwar auch mit dem Wort "Umrandung" in der dritten Zeile angelegt, doch leider werden zusätzlich bei allen weiteren zu prüfenden Spalten ebenfalls nochmal neue Spalten angelegt, was aber nicht sein soll, da diese ja laut Prüfung schon vorhanden sind.
Um das Problem also beim Namen zu nennen: Wenn bei einer zu prüfenden Spalte das Wort „Umrandung“ fehlt, wird es zwar korrekt angelegt, aber die Spalten wo es richtig ist bekommen trotzdem nochmal eine Spalte angehangen, was aber falsch ist.
Folgenden Code habe ich damals von Daniel erhalten und mir schon wie folgt angepasst:

Sub Test()
Dim wsh
Dim c
'Z = Columns(13)
'd = Columns(10)
'e = Columns(7)
'f = Columns(4)
For Each wsh In Sheets(Array("Tabelle1", "Tabelle2"))
For Each c In Array(13, 10, 7, 4)
If WorksheetFunction.CountIf(wsh.Columns(13), "Umrandung") = 0 Then
'wenn es nicht vorhanden ist
wsh.Columns((13) + 1).Insert
wsh.Cells(3, (13) + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(13), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(10), "Umrandung") = 0 Then
wsh.Columns((10) + 1).Insert
wsh.Cells(3, (10) + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(10), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(7), "Umrandung") = 0 Then
wsh.Columns(7 + 1).Insert
wsh.Cells(3, 7 + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(7), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(4), "Umrandung") = 0 Then
wsh.Columns(4 + 1).Insert
wsh.Cells(3, 4 + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(4), "Umrandung")  0 Then Exit Sub        _
End If
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung") = 0 Then
wsh.Columns(c + 1).Insert
wsh.Cells(3, c + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung")  0 Then Exit Sub
End If
Next
Next
End Sub

Hoffe mir kann da jemand helfen, das dieses anlegen der Spaltenverdopplung aufhört, (wenn also eine, zwei oder drei von allen 4 Spalten noch fehlen und die die bereits da sind nicht automatisch noch verdoppelt werden, wenn die zu fehlendne Spalten ergänzt werden bei der Prüfung.
Beste Grüße
Markus

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spaltenverdopplung abstellen wenn unerwünscht
19.01.2018 12:10:47
Jack_d
Moin Moin Markus,
Ohne Mappe prüf ich das nicht, aber warum der Doppelmoppel (das wird auch die Ursache des Problems sein)
Der initiale Code-Ersteller hat sich bei dem Array(13,10,7,4) schon was gedacht ^^
Sub Test()
Dim wsh
Dim c
'Z = Columns(13)
'd = Columns(10)
'e = Columns(7)
'f = Columns(4)
For Each wsh In Sheets(Array("Tabelle1", "Tabelle2"))
For Each c In Array(13, 10, 7, 4)
If WorksheetFunction.CountIf(wsh.Columns(13), "Umrandung") = 0 Then
'wenn es nicht vorhanden ist
wsh.Columns((13) + 1).Insert
wsh.Cells(3, (13) + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(13), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(10), "Umrandung") = 0 Then
wsh.Columns((10) + 1).Insert
wsh.Cells(3, (10) + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(10), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(7), "Umrandung") = 0 Then
wsh.Columns(7 + 1).Insert
wsh.Cells(3, 7 + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(7), "Umrandung")  0 Then Exit Sub
End If
If WorksheetFunction.CountIf(wsh.Columns(4), "Umrandung") = 0 Then
wsh.Columns(4 + 1).Insert
wsh.Cells(3, 4 + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(4), "Umrandung")  0 Then Exit Sub        _
_
End If
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung") = 0 Then
wsh.Columns(c + 1).Insert
wsh.Cells(3, c + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung")  0 Then Exit Sub
End If
Next
Next
End Sub
Das müsste reichen!
Grüße
Anzeige
Falschen Code Einkopiert -.-
19.01.2018 12:11:47
Jack_d

Sub Test()
Dim wsh
Dim c
'Z = Columns(13)
'd = Columns(10)
'e = Columns(7)
'f = Columns(4)
For Each wsh In Sheets(Array("Tabelle1", "Tabelle2"))
For Each c In Array(13, 10, 7, 4)
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung") = 0 Then
wsh.Columns(c + 1).Insert
wsh.Cells(3, c + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung")  0 Then Exit Sub
End If
Next c
Next wsh
End Sub

AW: Falschen Code Einkopiert -.-
19.01.2018 13:00:46
Markus
Hallo Jack_d, danke erst mal für Deine Rückmeldung,
und ja verstehe ich, daher habe ich Dir mal eine Datei zusammengebaut wo Du es hoffentlich gut nachvollziehen kannst, wenn Du die Makros ausführt und diese Datei mit hochgeladen.
https://www.herber.de/bbs/user/119099.xlsm
Zu Deinem Ansatz, den ich auch mit eingebaut habe, der geht genauso wie das was ich umgebaut hatte von Daniel, habe ich probiert, das selbe Problem besteht aber leider weiterhin:
Die fehlenden Spalten werden korrekt angelegt, wenn keine vorhanden ist und auch nicht verdoppelt wenn vorhanden bei Neuausführung des Makros.
Doch die Spalten werden immer noch verdoppelt, wenn eine, zwei oder drei Spalten mit dem Wort "Umrandung" von den 4 generierten Spalten fehlen, wenn neue Spalte für die fehlende angelegt wird.
Also was ich damit meine: löscht man nun zum Beispiel eine der neu generierten Spalten (Markieren  rechte Maustaste  Zellen löschen) und möchte diese dann wieder per Makro erstellen lassen, geschieht dies zwar, aber bei den vorhanden Spalten werden nochmals neue Spalten dahinter generiert (verdoppelt), was aber nicht sein soll, da kommt dann alles durcheinander.
Beste Grüße
Markus
Anzeige
AW: Falschen Code Einkopiert -.-
19.01.2018 13:31:07
Robert
Hallo Markus,
keine Lösung, aber die Ursache des Problems dürfte folgendes sein:
Das Makro (Deines und auch das von Jack) prüft die Spalten 4, 7, 10 und 13 (also D, G, J und M) auf das Wort "Umrandung". Ist dieses Wort nicht in der entsprechenden Spalte, dann wird sie angelegt.
Wenn Du nun in einem Tabellenblatt, in dem die vier Spalten mit dem Wort Umrandung enthalten sind, z. B. die Spalte 4 (D) löschst, dann rutschen die nachfolgenden Spalten je eine Spalte nach vorne. Das Makro findet dann das Wort Umrandung nicht mehr in den Spalten 7 (G), 10 (J) und 13 (M) - die entsprechenden Spalten sind jetzt nämlich 6 (F), 9 (I) und 12 (L) - und legt sie also wieder neu an.
Gruß
Robert
Anzeige
AW: Falschen Code Einkopiert -.-
19.01.2018 14:27:22
Markus
Hallo Robert,
kann man das nicht irgendwie verhindern, das alles sich verdoppelt oder an falschen Stellen Spalten eingelegt werden, wo sie gar nicht hinsollten, wenn man halt nicht alle Umrandungsspalten von vornherein in dem Sheet hat?
Folgendes passiert um es mal genauer zu beschreiben, vielleicht hilft das auch noch:
Wenn ich das Makro in der Datei ausführe die ich hochgeladen habe, legt er mir die Spalten E, I,M und Q an. Soweit richtig. Er prüft also nach den von Dir genannten Spalten (D, G, J und M) ab.
Zuerst hat die Spalte E das Dreieck. Klicke ich auf das Makro wird für die Spalte E die „Umrandungsspalte“ eingefügt. Es ist also korrekt das Dreieck dann Viereck und zuletzt Sechseck kommen, dann die neue Spalte mit der Umrandung und danach wieder mit dem Dreieck in der Spalte F begonnen wird. Das macht er für alle 4 Fälle korrekt.
Wenn ich jetzt die Spalte E wieder lösche bekommt die Spalte E wieder das Dreieck und alle anderen Spalten stimmen auch noch, manche Vorlagen sind halt so wo nur drei von vier Umrandungsspalten vorliegen, jedoch und hier wird’s verkehrt führe ich das Makro dann erneut aus wird für die Spalte E wieder die „Umrandungsspalte generiert“, aber bei den anderen Spalten stimmt es dann nicht mehr. Spalte I wird erkannt aber Spalten J danach ist nun plötzlich auch zu einer „Umrandungsspalte“ geworden (J soll aber nicht als „Umrandung“ angelegt werden, da sollte dann eigentlich das Dreieck wieder drin stehen).
Bei den Spalten M und Q verdoppelt er sie doch auch nicht, jedoch legt er nun noch in O und T eine neue Spalte „Umrandung“ an, die ich aber nicht haben wollte. Sondern er sollte die gelöschte Spalte E nur wieder neu anlegen und erkennen das die Spalte I, M und Q vorhanden sind und diese belassen, wenn ich das Makro nach der Löschung von der Spalte E erneut ausführe.
Löscht man nun mal zwei Spalten also E und I (es sind also von den vier fällen schon zwei "Umrandungsspalten" vorhanden und zwei fehlen, so wird aus Spalte I dann erst mal H, die dann gelöscht werden mit dem Wort „Umrandung“. Das Makro wird ausgeführt, man hat dann Spalte E wieder korrekt, I korrekt, nun stimmt auch J wieder, M korrekt, aber danach auch noch die Spalten N von Spalte M aus verdoppelt und O. Spalte Q stimmt auch nicht mehr, da sollte eigentlich Sechseck stehen doch er hat richtig für die Spalte S eine „Umrandungsspalte“ eingebaut.
Dadurch das ich durch meine Codeanpassung es für jeden Fall aufgeteilt hatte, wollte ich erreichen, das er erkennt, wenn ich eine neu generierte Spalte „Umrandung“ lösche, er die anderen beibehält, daher hatte ich das aufschlüsseln wollen und den Code angepasst, damit er dies für alle vier neu generierten Spalten einzeln anpassen kann und diese separat für sich stehen und nicht irgendwie voneinander abhängig sind und diese falschen Ergebnisse herauskommen. Das also wenn man eine Spalte löscht (E), die anderen bestehen bleiben und nur für die Spalte E die „Umrandung“ angelegt wird, nicht aber das sich dann bei den anderen Verdopplungen einstellen wie zum Beispiel bei den Spalten I und J direkt hintereinander, wenn man die nur die Spalte E löscht.
Hoffe konnte es jetzt besser beschreiben. Im Grunde funktioniert ja alles nur wenn man löscht dann verdoppelt er halt Spalten die er einfach nur prüfen und stehen lassen sollte oder aber er schreibt Umrandungsspalten mitten zwischen die Drei- Vier- und Sechsecke, was nicht sein soll, sondern die sollen immer dahinter angelegt werden, so wie er es richtig macht wenn man zum ersten Mal das Makro ausführt.
Das löschen ist aber notwendig da ich Fälle habe wo nur eine, zwei oder drei "Umrandungsspalten jeweils vorgegeben sind und dort soll er nur die fehlenden an den entsprechenden Stellen prüfen wie im Code angegeben und notfalls ergänzen, die anderen aber nicht überschreiben noch diese verdoppeln.
Hoffe Du oder wer anders noch kann mir da helfen und versteht mein Problem jetzt besser nachdem ich es versucht habe besser zu beschreiben.
Beste Grüße
Markus
Anzeige
AW: Falschen Code Einkopiert -.-
19.01.2018 14:39:57
Jack_D
Moin ihr beiden.
Also
1. Was Robert sagt kann eigentlich nicht passieren, da der Code Ersteller mitgedacht hat und von hinten anfängt ..
2. Das Problem hat der TE selber im letzten Post geschrieben.
Er startet mehrfach das Makro. Bzw unterschiedliche Bedingungen für unterschiedliche Spalten
Die Lösung ist also vergleichsweise einfach. In der 1. If Bedienung muss eine 2.bedingung rein
Also if Bedingung1 true and Bedingung 2 true then
Bedingung 1 ist das Vorhandensein von Umrandung
Bedingung 2 prüfen ob die nachfolgende Spalte schon angelegt ist (3. Zeile)
Kann’s nur nicht grad coden weil ich grad keinen Rechner hab
Grüße
Anzeige
AW: Falschen Code Einkopiert -.-
19.01.2018 15:53:21
Markus
Hallo Jack_D,
danke für Deine Antwort, es gibt also doch eine Lösung für mein Problem wie mir scheint, das freut mich. :)
Leider ist Deine Erläuterung mir zwar schon schlüssig, aber mit der Codeumsetzung hapert es bei mir gewaltig. Könntest Du es vielleicht bitte coden, wenn Du einen Rechner mal hast, das wäre gut.
Derweil versuche ich mich weiter mit meinen bescheidenen Programmierkenntnissen an der Umsetzung Deiner Idee.
Trotzdem wäre es schön, sollte ich es nicht hinbekommen, das Du mir die Lösung schreiben könntest.
Beste Grüße
Markus
AW: Falschen Code Einkopiert -.-
19.01.2018 16:49:16
Robert
Hallo Markus,
was ist denn, wenn man das Makro von Jack dahingehend anpasst, dass das Array die Spalten von vorne prüft. In nachstehendem Code werden die Spalten 5 (E), 9 (I), 13 (M) und 17 (Q) dahin gehend geprüft, ob "Umrandung" in der Spalte steht. Wenn nicht wird die Spalte angelegt.
Sub Makro()
Dim wsh
Dim c
For Each wsh In Sheets(Array("Tabelle1", "Tabelle2"))
For Each c In Array(5, 9, 13, 17)
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung") = 0 Then
wsh.Columns(c).Insert
wsh.Cells(3, c).Value = "Umrandung"
End If
Next
Next
End Sub

Probiere es mal aus.
Wieso soll das ganze denn eigentlich außer auf der Tabelle1 auch noch auf Tabelle2 gemacht werden (For Each wsh In Sheets(Array("Tabelle1", "Tabelle2"))), dort steht doch nichts?
Gruß
Robert
Anzeige
Noch offene Fragen
19.01.2018 17:45:02
Markus
Ich glaub ich werd nicht wieder, das funktioniert bei mir im Test tadellos. :))) Genau so wie Du es beschreibst bzw. programmiert hast, sollte es mal funktionieren, tat es aber leider bisher nicht. :(
Mir ist aufgefallen Du hast das c+1 durch c ersetzt, in den Zeilen wsh.Columns(c + 1).Insert und wsh.Cells(4, c + 1)Value = "Umrandung", aber warum frage ich mich?
c+1 war doch dazu gedacht das er eine neue Spalte anhängt, das scheint aber auch ohne das +1 zu funktionieren.
Außerdem fiel mir auf weil Du es erwähnst, das bei meiner Anpassung irgendwie in der Tabelle 2 in die Spalten (E, I, M, Q) nichts reingeschrieben wird, warum auch immer, ich habe die For Each Schleife doch auch drin stehen lassen, aber dort greift es nicht mehr, mich würde interessieren warum das so ist bei meiner angepassten Lösung, also das in der"Alt-Spalten verdoppelt-Button" hinterlegte Makro Test_Spaltenanlegung() in der hochgeladenen Datei.
Zu Deiner Frage:
Weil es für mehrere Tabellenblätter gelten sollte, die man angibt, also die schon geöffnet sind und geprüft werden sollen. Dort soll er dann in den entsprechenden Tabellenblättern die fehlenden Spalten ergänzen bzw. diese dann nicht überschreiben, wenn schon vorhanden. Es gibt Fälle da fehlt eine Spalte „Umrandung“, es gibt aber auch Fälle da fehlen zwei oder drei. Wenn alle 4 Fehlen funktionierte es ja schon, das diese korrekt angelegt wurden und auch nicht verdoppelt, wenn man das Makro nochmals ausführt, also nicht überschrieben werden, was sehr wichtig ist. Nur bei den Varianten wo jeweils eine „Umrandungsspalte nicht angegeben ist haute er halt alles bisher durcheinander, wie schon aufgezeigt. Daher also die verschiedenen Tabellenblätter in dem Array, das ist schon richtig so.  Also ja es soll in allen Tabellenblättern die man angibt bei dieser For Each Schleife funktionieren und nicht nur für die Tabelle 1, was es aber ja bei Deiner Lösung tut. :)
Trotzdem würde mich falls er es liest auch Jack_D's Lösung interessieren wie er es coden würde mit seiner Idee. Bisher komme ich da nämlich leider mit den Bedingungseinbau seiner Lösung/Idee auf keinen grünen Nenner.
Beste Grüße und Danke soweit erstmal:)
Markus
Anzeige
AW: Noch offene Fragen
20.01.2018 13:41:20
Robert
Hallo Markus,
zu Deiner Frage, wieso ich das c+1 durch c ersetzt habe:
Die Variable c erhält die Werte aus dem Array, also 5, 9, 13 und 17. Dies sind die Spalten-Nr., in denen das Wort Umrandung stehen soll. Wenn das Wort nicht in der Spalte steht und ich eine neue Spalte einfügen will, soll diese Spalte ja an dieser Position (also 5 für Spalte E, 9 für Spalte I usw.) erscheinen. Würde ich die Spalte bei c+1 einfügen,wäre die neue Spalte die Spalte F, und das wäre ja falsch.
Zur Frage, wieso in Deinem Makro die Tabelle2 nicht mit den neuen Spalten befüllt wird:
Du hast in Deinem Makro für jede Spalte (13, 10, 7 und 4) eine eigene If-Abfrage, um eine eventuell fehlende Spalte einzufügen. Am Schluß hast Du aber noch folgende Zeilen:

If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung") = 0 Then
wsh.Columns(c + 1).Insert
wsh.Cells(3, c + 1).Value = "Umrandung"
Else
If WorksheetFunction.CountIf(wsh.Columns(c), "Umrandung")  0 Then Exit Sub
End If


c hat im ersten Durchlauf der For-Next-Schleife den Wert 13. In der Spalte 13 gibt es aber durch die vorherigen Code-Zeilen den Wert Umrandung. Dieser wurde als Spalte 11 (im Code 10+1) eingefügt und rutschte durch die Einfügung von zwei weiteren Spalten danach (als Spalten-Nr. 7+1 und 4+1) auf die Spalten-Nr. 13. Da also das Wort Umrandung in der Spalte 13 vorkommt, tritt der Else-Teil des Codes in Kraft, also Exit Sub. Somit wird bei der äußeren For-Next-Schleife auch nicht mehr die Tabelle2 abgearbeitet.
Gruß
Robert
Anzeige
AW: Noch offene Fragen
22.01.2018 16:35:03
Markus
Danke Robert,
für Deine Erklärungen. :)
An Hand Deiner Schilderung konnte ich den Fehler auch bei der von mir angepassten Prozedur von Daniels Code nachvollziehen.
Verstehe dann war die ganze Zeit diese +1 der Fehler gewesen, warum es alles durcheinanderbrachte und ich dachte das braucht er gerade um immer eine Spalte anzuhängen an die 4 ausgewählten Spalten (E,I,M,Q).
Beste Grüße
Markus

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige