Informationen und Beispiele zum Thema MsgBox | |
---|---|
![]() |
MsgBox-Seite mit Beispielarbeitsmappe aufrufen |
Betrifft: einfachste Möglichkeit
von: Christian
Geschrieben am: 24.09.2019 20:29:03
Hallo,
Ich wollte mal fragen, ob es für das was ich hier mache, auch schnellere Wege gibt, a ich das doch recht häufig mache.
1. sortiere ich Tabelle1 Spalte A von A bis Z.
2. 100 der Zeilen beginnen mit Ordnungszahlen von 1. bis 100. diese behalte ich, alle andere lösche ich.
3. Ich ersetze ". " durch "~".
4. Ich trenne den Text in Spalten mit Trennzeichen "~".
5. Ich lösche die erste Spalte mit den Zahlen.
6. Ich wende die Glätten Formel auf die übrig gebliebene Spalte an, da alle Texte ein Leerzeichen am Ende haben.
7. Ich kopiere die 100 Zellen mit der Glätten Formel und füge die Werte am Ende von Tabelle 3 Spalte A ein.
8. Ich entferne in der kompletten Tabelle 3 Spalte A Duplikate.
9. ich sortiere Tabelle3 Spalte A von A bis Z.
Wie gesagt gibt es da praktikablere Lösungen?`
Oder anders die Fragestellung aufgebaut, wie mache ich am einfachsten aus Tabelle 1 die Tabelle 3, wobei wenn ich das ganze wiederhole, indem ich andere Texte in Tabelle 1 einfüge, die neuen Texte unter die alten in Tabelle3 geschrieben werden sollen und dann Duplikate entfernt werden sollen.
https://www.herber.de/bbs/user/132177.xlsx
Danke
Christian
Betrifft: AW: einfachste Möglichkeit
von: Piet
Geschrieben am: 24.09.2019 23:35:05
Hallo Christian
baue dir bitte in dein Beispiel, in ein normales Modul, diesen Code ein. Start ihn mit einem Button.
Ich hoffe das Makro erfüllt alle dein Wünsche. Würde mich freuen wenn es problemlos klappt.
mfg Piet
Option Explicit Sub String_aufbereiten() Dim AC As Variant, zx, lz As Integer Worksheets("Tabelle1").Select SpalteA_sortieren 'A sortieren 'Punkte Vorspann abschneiden For lz = 1 To 100 If Len(Cells(1, 1)) < 10 Then Rows(1).Delete Next lz 'LastZell in Spalte A ermitteln lz = Cells(Rows.Count, 1).End(xlUp).Row 'Alle Nummern 1.-100. abschneiden For Each AC In Range("A1:A" & lz) If IsNumeric(Left(AC, 1)) Then AC.Value = Trim(Mid(AC, InStr(AC, " "), 100)) Else 'restliche Zeilen löschen Cells(AC.Row, 1).Resize(lz, 1).Clear End If Next AC 'LastZell in Spalte A + Tabelle 3 ermitteln lz = Cells(Rows.Count, 1).End(xlUp).Row zx = Worksheets("Tabelle3").Cells(Rows.Count, 1).End(xlUp).Row Range("A1:A" & lz).Copy Worksheets("Tabelle3").Select Range("A" & zx + 1).PasteSpecial xlPasteAll Application.CutCopyMode = False 'Duplikate in Tabelle3 entfernen Columns(1).RemoveDuplicates Columns:=1, Header:=xlNo SpalteA_sortieren 'A sortieren lz = Worksheets("Tabelle3").Cells(Rows.Count, 1).End(xlUp).Row Range("A1").Select MsgBox zx - lz & " Titel neu hinzugkommen" End Sub Sub SpalteA_sortieren() ActiveSheet.Sort.SortFields.Clear ActiveSheet.Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveSheet.Sort .SetRange Columns(1) .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
Betrifft: AW: einfachste Möglichkeit
von: Piet
Geschrieben am: 24.09.2019 23:43:39
Nachtrag
gestartet werden muss nur das erste Makro. Und achte bitte mal in Tabelle3 ob da die Überschrift nach unten sortiert wird? Dann muss ich das noch aendern.
mfg Piet
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 08:53:06
Hallo Piet,
erstmal danke für deine Mühe.
Prinzipiell funktioniert es, nur leider hat sich beim Testen mit einem anderen Text eine Schwachstelle aufgezeigt:
Dieser Text beinhaltete die Zeile
21-year-old media darling is known for her portrayal as Emma Ross on the fan favorite Disney's Jessie and Bunk'd, and made a name for herself on the network's long-running series.
Die Zeile wurde mit in Tabelle3 übernommen obwohl sie nicht dem eigentlichen vorgegebenen System mit den Ordnungszahlen entspricht.
Schaust du da bitte nochmal nach?
Ach so und noch was zweites, war zwar eine nette Idee mit einem Button, ich habe nur leider keine Ahnung wie man so einen erstellt.
Gruß
Christian
Betrifft: AW: einfachste Möglichkeit
von: Piet
Geschrieben am: 25.09.2019 17:59:56
Nachtrag - Button Frage
Schau bitte mal in Youtube rein, da gibt es gute Anleitungen wie du das machen kannst. Auch andere gute Tipps zu Excel!
Betrifft: AW: einfachste Möglichkeit
von: Piet
Geschrieben am: 25.09.2019 17:55:55
Hallo Christian
der Fehler in meinem Makro ist sehr einfach zu korrigieren, das kannst du selbst machen! Unten der Code Teil dazu.
Beim Befehl Instr() muss ein Punkt rein, anstatt " "! Das ist alles! - AC.Value = Trim(Mid(AC, InStr(AC, ".", 100))
mfg Piet
For Each AC In Range("A1:A" & lz) If IsNumeric(Left(AC, 1)) Then AC.Value = Trim(Mid(AC, InStr(AC, " "), 100)) Else 'restliche Zeilen löschen Cells(AC.Row, 1).Resize(lz, 1).Clear End If Next AC
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 19:39:33
Hallo Piet,
jetzt werden nur die Zahlen entfernt, die Punkte bleiben erhalten.
Gruß
Christian
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 19:40:46
Hallo Piet,
jetzt werden nur die Zahlen entfernt, die Punkte bleiben erhalten.
Gruß
Christian
Betrifft: AW: einfachste Möglichkeit
von: Werner
Geschrieben am: 25.09.2019 00:48:57
Hallo Christian,
hier mal die "Aufbereitung" der Daten.
Die brauchst du dann nur noch ans Ende vun Tabelle 3 zu kopieren und dann Duplikate entfernen auf die Spalte anzuwenden.
Public Sub aaa() Application.ScreenUpdating = False With Worksheets("Tabelle1") .Rows(1).Insert .Range("A1") = "Name" .Range("B1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row) _ .FormulaLocal = "=WENN(ISTZAHL(LINKS(A1;1)*1);ZEILE();0)" .Range("B1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value = _ .Range("B1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value .Columns("A:B").RemoveDuplicates Columns:=2, Header:=xlNo .Columns("B").ClearContents .Columns("A").Replace What:="*. ", Replacement:="", LookAt:=xlPart .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Sort _ Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, orderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal .Columns("A").RemoveDuplicates Columns:=1, Header:=xlYes .Rows(1).Delete End With End SubGruß Werner
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 08:57:51
Hallo Werner,
prinzipiell funktioniert auch dieses Makro,
nur ich bin mit einem anderen Text genauso wie bei Petes Makro auf das Problem mit der Zeile
21-year-old media darling is known for her portrayal as Emma Ross on the fan favorite Disney's Jessie and Bunk'd, and made a name for herself on the network's long-running series.
gestoßen. Die eigentlich hätte gelöscht werden sollen, da sie nicht dem genannten System mit den Ordnungszahlen entspricht.
Gruß und schonmal Danke
Christian
Betrifft: AW: einfachste Möglichkeit
von: Daniel
Geschrieben am: 25.09.2019 08:00:18
Hi
1. füge diese Formel in Spalte B ein und ziehe sie nach unten
=WENNFEHLER(WENN(FINDEN(".";A1)<=4;GLÄTTEN(TEIL(A1;FINDEN(".";A1)+1;999));"");"")
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 08:45:27
Hallo Daniel,
auch wenn ich das Prinzip hinter deiner Formel verstehe, gibt sie bei mir anderes aus, als anscheinend von dir beabsichtigt.
2 Dinge: Wenn ich sie in meine Beispieldatei einfüge, gibt sie in keiner der Zeilen FALSCH aus, ich kann also nicht nachvollziehen, wo ein FALSCH zustande kommen soll, dass ich dann löschen soll.
Das andere, in B35, B309 und B347 gibt die Formel Punkte aus, das ar natürlich so nicht von mir gedacht.
Gruß und danke schonmal
Christian
Betrifft: AW: einfachste Möglichkeit
von: Daniel
Geschrieben am: 25.09.2019 09:41:31
Hi
sorry, hatte das nachträglich noch mal geändert und statt FALSCH den Leerstring "" als Ausgabe für nicht benötigte Zeilen verwendet.
die die Zeilen, die du nicht benötigst, sollten leer bleiben.
ansonsten ersetze halt die "" durch FALSCH.
die drei aufeinander folgenden Punkte kannst du noch mit einer vorgeschalteten WENN-Abfrage ausschalten:
=Wenn(A1="...";Falsch;hier die weitere Formel)
Gruß Daniel
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 19:46:53
Hallo Daniel,
habe es noch etwas abgeändert in
=WENN(A1="…";"";WENNFEHLER(WENN(FINDEN(".";A1)<=4;GLÄTTEN(TEIL(A1;FINDEN(".";A1)+1;999));"");""))Aber so scheint es zu funktionieren.
Betrifft: AW: einfachste Möglichkeit
von: Werner
Geschrieben am: 25.09.2019 14:07:40
Hallo Christian,
hier mit der Formel von Daniel (ohne die Erweiterung vom letzten Beitrag Daniels) weil in deinen Rohdaten Versionen vorkommen z.B. In... die von der Formel nicht erfasst werden.
Die Punkte eliminiere ich mit Replace.
Public Sub aaa() Dim wsQ As Worksheet, wsZ As Worksheet Dim loLetzte As Long, loLetzteNeu As Long Set wsQ = ThisWorkbook.Worksheets("Tabelle1") Set wsZ = ThisWorkbook.Worksheets("Tabelle3") Application.ScreenUpdating = False wsQ.Range("B1:B" & wsQ.Cells(wsQ.Rows.Count, "A").End(xlUp).Row).FormulaLocal = _ "=WENNFEHLER(WENN(FINDEN(""."";A1)<=4;GLÄTTEN(TEIL(A1;FINDEN(""."";A1)+1;999));"""");"""")" wsQ.Range("B1:B" & wsQ.Cells(wsQ.Rows.Count, "A").End(xlUp).Row).Value = _ wsQ.Range("B1:B" & wsQ.Cells(wsQ.Rows.Count, "A").End(xlUp).Row).Value wsQ.Range("B1:B" & wsQ.Cells(wsQ.Rows.Count, "B").End(xlUp).Row).Replace ".", "" loLetzte = wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row wsQ.Range("B1:B" & wsQ.Cells(wsQ.Rows.Count, "B").End(xlUp).Row).Copy _ wsZ.Range("A" & wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Offset(1).Row) wsQ.Columns("B").ClearContents wsZ.Range("A1:A" & wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row).Sort _ Key1:=wsZ.Range("A1"), Order1:=xlAscending, Header:=xlNo, orderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal wsZ.Columns("A").RemoveDuplicates Columns:=1, Header:=xlNo loLetzteNeu = wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row If loLetzteNeu - loLetzte = 0 Then MsgBox "Es gibt keine neuen Datensätze." Else MsgBox "Es wurden " & loLetzteNeu - loLetzte & " Datensätze hinzugefügt." End If Set wsQ = Nothing: Set wsZ = Nothing End SubGruß Werner
Betrifft: AW: einfachste Möglichkeit
von: Christian
Geschrieben am: 25.09.2019 19:51:12
Hallo Werner,
soweit ich es überblicken kann, sieht auch das jetzt super aus.
Aber eine kleine Frage hätte ich noch, ich bin grad am überlegen, ob es für mich nicht sinnvoller ist, die Tabelle3 unsortiert zu lassen.
Reicht es einfach den Teil
Key1:=wsZ.Range("A1"), Order1:=xlAscending, Header:=xlNo, orderCustom:=1, _ MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormalzu löschen, wenn ich nicht sortieren will oder muss ich da noch mehr machen?
Betrifft: AW: einfachste Möglichkeit
von: Piet
Geschrieben am: 26.09.2019 08:28:53
Hallo Christian
Sorry, dummer Flüchtigkeitsfehler. Jetzt sollte der Code auch wesentlich schneller laufen wie vorher.
AC.Value = Trim(Mid(AC, InStr(AC, ".") + 1, 100)) - Hatte die +1 im Code vergessen!!
mfg Piet
Sub String_aufbereiten() Dim AC As Variant, zx, lz As Integer Worksheets("Tabelle1").Select SpalteA_sortieren 'A sortieren 'Punkte Vorspann abschneiden For lz = 1 To 100 If Len(Cells(1, 1)) < 10 Then Rows(1).Delete Next lz Application.ScreenUpdating = False 'LastZell in Spalte A ermitteln lz = Cells(Rows.Count, 1).End(xlUp).Row 'Alle Nummern 1.-100. abschneiden For Each AC In Range("A1:A" & lz) If IsNumeric(Left(AC, 1)) Then AC.Value = Trim(Mid(AC, InStr(AC, ".") + 1, 100)) Else 'restliche Zeilen löschen Cells(AC.Row, 1).Resize(lz, 1).Clear Exit For End If Next AC 'LastZell in Spalte A + Tabelle 3 ermitteln lz = Cells(Rows.Count, 1).End(xlUp).Row zx = Worksheets("Tabelle3").Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = True Range("A1:A" & lz).Copy Worksheets("Tabelle3").Select Range("A" & zx + 1).PasteSpecial xlPasteAll Application.CutCopyMode = False 'Duplikate in Tabelle3 entfernen Columns(1).RemoveDuplicates Columns:=1, Header:=xlNo SpalteA_sortieren 'A sortieren lz = Worksheets("Tabelle3").Cells(Rows.Count, 1).End(xlUp).Row Range("A1").Select MsgBox zx - lz & " Titel neu hinzugkommen" End Sub