MSG Abfrage

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: MSG Abfrage
von: Jürgen
Geschrieben am: 07.09.2015 19:37:01

Hallo zusammen,
Armin hat mir einen Code zusammengestellt. Hier die Aufgabe:
https://www.herber.de/bbs/user/100071.xlsm
der gesuchte Wert ( Lagerbereich ist Spalte A)
Ich möchte jetzt auf meinen Button Klicken ( Tabellenblatt Zusammenfassung F1) Lagerbereich.
Jetzt sollte eine MSG Box Anfrage kommen, die soll so ungefähr aussehen wie in der Tabelle2.
Jetzt Klicke ich auf
Lager 13
Lager 15
Lager 17
Dann auf OK,
und jetzt werden alle Zeilen gelöscht die nicht im Bereich ( Spalte A) sind.
Bereich bedeutet:
z.b.
1-62-01-61 = Lager16
1-62-01-62 = Lager16
1-62-01-63 = Lager16
1-73-99-99 = Lager17
1-62-01-71 = Lager16
1-63-01-22 = Lager16
1-34-01-10 = Lager13
1-62-01-74 = Lager16
1-71-01-81 = Lager17
1-80-01-10 = Lager18
1-62-01-82 = Lager16
1-62-01-84 = Lager16
1-62-02-61 = Lager16
1-55-21-10 = Lager15
1-62-02-62 = Lager16
1-62-02-63 = Lager16
0-01-01-62 = Lager00
Die Lagerbereiche sind immer die ersten zwei Zahlen.
Jetzt in der Tabelle 3 wäre das Ergebnis.
Das alles soll aber nur in der Tabellenblatt Zusammenfassung passieren.
Tabelle2 und Tabelle3 sind nur als Test, damit es verständlicher ist.
Also die Abfrage immer Spalte A ( rest Spalte B, C,D,E,F usw.... ist nicht zu beachten) und alle Zeilen müssen gelöscht werden.
Bei einer Originaltabelle ca. 25000Zeilen reagiert Excel nicht mehr und stürzt nicht mehr ab, sondern muß über den Taskmanager beenden.
Kann man die Abfrage auch über einen Befehlschaltfläche button erstellen?
Ich hoffe ihr könnt mir dabei helfen.
LG Jürgen

Bild

Betrifft: AW: MSG Abfrage
von: Michael
Geschrieben am: 08.09.2015 12:02:38
Hallo Jürgen,
Jetzt sollte eine MSG Box Anfrage kommen, die soll so ungefähr aussehen wie in der Tabelle2.
Das macht doch die Userform, die Dir offensichtlich Armin erstellt hat. Wobei: so, wie Du es schilderst, soll die Logik umgekehrt sein: alles, was nicht angeklickt ist, soll gelöscht werden.
Wenn ich mir Deine Tabelle2 ansehe, vermute ich, daß sich am Lager selbst nichts ändert, strukturmäßig, d.h. die Lagernummern sind fix und ändern sich auch nicht laufend.
Wenn das so ist, könnte man nämlich die ListBox mit diesen festen Werten "füttern" und spart sich dabei den ersten "Lauf" durch den kompletten Datenbestand.
Einzelne Sachen zum Anklicken benötigen auch wieder ne Userform, nur daß Du dann halt 15 oder 20 CheckBoxen hast, da ist die Liste handlicher. Oder Du verwendest tatsächlich die Tabelle2 für die Eingabe und bringst hier einen Button an. Die Kreuze ließen sich bequem mit Doppelklick setzen, falls Du Dich für diese Variante entscheiden würdest.
Grundsätzlich finde ich es etwas unglücklich, daß die Lager-Nr. aus der Spalte A erst herausgerechnet werden muß: das kostet Zeit, zumal bei 25000 Zeilen. Wie wäre es, eine neue Spalte A einzufügen (und alles andere nach rechts zu verschieben), die nur die Lager-Nr. enthält?
Die kann man sich ja per Formel ermitteln: =LINKS(B3;1) & TEIL(B3;3;1)
Naja, äußere Dich mal, dann sehen wir weiter.
Schöne Grüße,
Michael

Bild

Betrifft: AW: MSG Abfrage
von: Jürgen
Geschrieben am: 08.09.2015 17:19:23
Hallo Michael,
"Das macht doch die Userform, die Dir offensichtlich Armin erstellt hat. Wobei: so, wie Du es schilderst, soll die Logik umgekehrt sein: alles, was nicht angeklickt ist, soll gelöscht werden.
"
Genau richtig erkannt. So wäre es richtig. Alles was nicht angeklickt wird soll gelöscht werden.
Wenn es schneller geht, das man eine Spalte hinzufügt, wäre kein Problem, Hauptsache die Auswertung geht schnell.
Danke ersteinmal.
LG Jürgen

Bild

Betrifft: AW: MSG Abfrage
von: Michael
Geschrieben am: 09.09.2015 13:05:16
Hallo Jürgen,
doch, ich denke, die Hilfsspalte macht Sinn.
Ich muß aber nochmal die Frage wiederholen: sind die Lagernummern fix?
Ich würde sagen, wie man das Programm bedient, ist erst Mal zweitrangig, da kann man noch dran feilen, wenn die eigentliche Verarbeitung paßt.
Letztlich würde auch ein simple Stringeingabe ausreichen, so ähnlich wie in Excel (oder Word) beim Ausdruck einzelner Seiten, die man schlicht mit Komma getrennt eingibt.
Also etwa so:

Bitte geben Sie die Lagernummern ein: 13,15,17
Generelle Fragen:
1) In Deiner Beispieldatei gibt es drei Datenblöcke: die Spalten A bis E und zwei weitere. In Tabelle3 werden Zeilen der beiden rechten mitgelöscht.
Bei der ganzen Geschichte geht es aber nur um die Spalten A bis E, oder?
2) So, wie Du hier Daten löschst, handelt es sich sicher nur um eine Kopie, die Du vor jeder Verarbeitung erneut in das Blatt kopierst.
Ist das so?
3) Ist die Reihenfolge der Daten wichtig?
Meine Fragen zielen darauf ab, daß es evtl. sinnvoll sein kann, Excels Sortierfunktion zu benutzen anstatt den Datenbereich komplett via Schleife durchzuackern.
Das könnte als Rezept etwa so aussehen:
a) Markiere alle Daten in A1 bis En (n wie unterste Zeile) (bzw. A-F mit neuer Spalte)
b) sortiere nach Spalte A (in der denn die besagte Formel steht)
c) Merke die 1. Zeile
d) suche den ersten benötigten Lagerort
lösche alles von der gemerkten Zeile bis vor dem benötigten Lagerort
suche die erste Zeile des nächsten Lagerorts und merke die Zeile
wiederhole so lange, bis ende erreicht bzw. nichts mehr gefunden
Das ist jetzt nicht ganz exakt wiedergegeben, aber Du verstehst hoffentlich, wie ich's meine.
Die Sortierfunktion ist sehr fix: 5000 Zeilen sind in nicht spürbarer Zeit sortiert, bei 25000 kannst Du es mal händisch testet.
Bitte mach das mal und teile mit, ob es tut.
Zu guter Letzt wäre es eine nette Sache, eine etwas umfangreichere Testdatei zu haben, wobei die Spalten A bis E völlig ausreichen.
Schöne Grüße,
Michael

Bild

Betrifft: AW: MSG Abfrage
von: Jürgen
Geschrieben am: 09.09.2015 21:22:42
Hallo Michael,
Danke erst einmal für deine Hilfe.
Zu deine Fragen:

Ich muß aber nochmal die Frage wiederholen: sind die Lagernummern fix?

Also die sind immer FIX, es kann sein, dass es statt 25000 Zeilen nur 10000 weil vorher nur ein kleinerer Lagerbereich gewählt wurde. Aber z.b. 1-95-75-80 diese sind immer gleich.
Leichter zu verstehen ist
1-95-75-80
1 =Lager1
95= der Gang
75= Feld
80= Greifplatz
19 (1-9)die ersten zwei zahlen bedeutet Lagerbereich.
Generelle Fragen:
1) In Deiner Beispieldatei gibt es drei Datenblöcke: die Spalten A bis E und zwei weitere. In Tabelle3 werden Zeilen der beiden rechten mitgelöscht.
Bei der ganzen Geschichte geht es aber nur um die Spalten A bis E, oder?
Also es muss von Spalte A bis M löschen. Es geht hier nur um das TabellenblattZusammenfassung
2) So, wie Du hier Daten löschst, handelt es sich sicher nur um eine Kopie, die Du vor jeder Verarbeitung erneut in das Blatt kopierst.
Ist das so?
NE, Also meine Liste kommt so wie du sie siehst. Danach möchte ich gerne auf meinen Button klicken und die Meldung kommen :" Welcher Lagerbereich soll ausgewertet werden" Danach sollen alle Daten gelöscht werden von der Spalte A die nicht angekreuzt wurden
3) Ist die Reihenfolge der Daten wichtig?

Es wäre wichtig, das die Spalte B sortiert wäre
In meinen Beispiel habe ich jetzt mal die sie Spalte A eingefügt ( Lagerbereich) da könnte man , wie du gemeint hast mit Linksformel arbeiten.
Und in der Tabellenblatt 2 habe ich eingefügt, wie ungefähr die MSG Box Abfrage aussehen sollte.
https://www.herber.de/bbs/user/100107.xlsm
Ich würde dir gerne die Datei mit 15000 Zeilen schicken, aber ich kann nur bis 300 KB hochladen.
Ich Lade in Prinzip immer das ganze Lager hoch. Zieh es auf Excel und jetzt möchte ich einen Button wo ich dann draufklicke , wähle dann meine Lagerbereiche ( Spalte A) und alle anderen Daten sollen gelöscht werden. .Somit erfolgt dann in der Spalte O die Auswertung.
Ich hoffe ich du kommst klar, wenn nicht Frage einfach, bin dir jetzt schon einmal sehr Dankbar
LG Jürgen

Bild

Betrifft: AW: MSG Abfrage
von: Michael
Geschrieben am: 10.09.2015 16:55:58
Hallo Jürgen,
wenn die Spalte B ohnehin sortiert ist, isses eigentlich ganz einfach (ich hoffe, Du sortierst nicht mit dem Bubble-Sort im Modul, das geht ratz-fatz mit der Excel-eigenen Funktion).
Ich habe die Löschfunktion anders gestaltet: sie sucht jetzt nach dem 1. und letzten Auftreten des Lagers und löscht anschließend.
Die Listbox holt sich die Lagernummern aus Tabelle2, da stehen sie ja schön, und zwar als TEXT bzw. String.
Teste halt mal: https://www.herber.de/bbs/user/100120.xlsm
Schöne Grüße,
Michael

Bild

Betrifft: AW: MSG Abfrage
von: Jürgen
Geschrieben am: 10.09.2015 17:53:49
Hallo Michael,
mit Pool kenne ich mich überhaupt nicht aus.
Ist das der gane Code?
Option Explicit
Public Type Liste
ID_Lager As Integer
Lager As String
Hoehe As String
H2 As String
Wx As String
Artikel As String
End Type
'Public LPool() As Liste

Sub Liste_Loeschen()
Dim k As Long, N As Long
Dim LPool() As Liste
With Tabelle1
   For k = 3 To .Cells(Rows.Count, 1).End(xlUp).Row
       ReDim Preserve LPool(N)
       LPool(N).ID_Lager = Left(.Cells(k, 1).Value, 1) & Mid(.Cells(k, 1).Value, 3, 1)
       LPool(N).Lager = .Cells(k, 1).Value
       LPool(N).Hoehe = .Cells(k, 2).Value
       LPool(N).H2 = .Cells(k, 3).Value
       LPool(N).Wx = .Cells(k, 4).Value
       LPool(N).Artikel = .Cells(k, 5).Value
       N = N + 1
   Next
End With
Bubbelsort_LPool
With UserForm1.ListBox
  .ColumnCount = UBound(LPool)
  .List = LPool
 End With
UserForm1.Show
End Sub
Sub Bubbelsort_LPool()
Dim VTemp As Liste
Dim j As Integer, i As Integer
For j = UBound(LPool) - 1 To LBound(LPool) Step -1
    For i = LBound(LPool) To j
      ' Ist das aktuelle Element seinem Nachfolger gegenüber korrekt sortiert?
      If UCase(LPool(i).ID_Lager) > UCase(LPool(i + 1).ID_Lager) Then
        ' Element und seinen Nachfolger vertauschen.
        VTemp = LPool(i)
        LPool(i) = LPool(i + 1)
        LPool(i + 1) = VTemp
      End If
    Next i
  Next j
End Sub

Kann ich diesen Code jetzt nehmen und in meiner Original Liste nehmen?
Würde es morgen gleich mal Testen :-)
Danke Danke Danke
LG Jürgen

Bild

Betrifft: AW: MSG Abfrage
von: Jürgen
Geschrieben am: 11.09.2015 06:50:13
Hallo Michael,
hab es getestet und muss sagen wow geht das schnell.
bloß ein problem. Die 00 wird nicht gelöscht sondern. Wie kann man es machen nicht mit einer null sondern er soll Doppel null löschen.
Aber super danke
lg jürgen

Bild

Betrifft: AW: MSG Abfrage
von: Michael
Geschrieben am: 11.09.2015 12:54:39
Hi Jürgen,
wenn Du die Datei so genommen hast, wie ich sie hochgeladen habe...
Also, geändert habe ich:
a) Die LagerNummern in Tabelle2, insbesondere habe ich dort eine Formel verwendet, um sicherzustellen, daß die Werte als STRINGs in die Listbox übernommen werden: also eben "00" statt (Zahlenwert) 0. Excel stellt bei Zahlenwerten ja keine führenden Nullen dar.
b) Hier die Initialisierung der Listbox:

Sub Userform_Activate()
Dim N As Long, k As Long
Dim Lager As String                      ' **** String!!! ****
' Liest die Lager-Nummern aus Tabelle2 ein.
With Tabelle2
   For k = 8 To 19
       Lager = .Cells(k, 3).Value
       ListBoxNr.AddItem
       N = ListBoxNr.ListCount - 1
       ListBoxNr.List(N, 0) = Lager
   Next
End With
End Sub

c) die vorhandene Loeschen_Range auf Loeschen_Range_Alt umbenannt und neu geschrieben:
Sub Loeschen_Range(Lager As Integer)
Dim DatenOben&, DatenUnten&
Dim c As Range
 With Tabelle1
  Set c = .Range("A2:A" & Rows.Count).Find(Lager)
  If Not c Is Nothing Then
    DatenOben = c.Row
    Set c = .Range("A3:A" & Rows.Count).FindPrevious
    If Not c Is Nothing Then
      DatenUnten = c.Row
      .Range("A" & DatenOben & ":M" & DatenUnten).Delete Shift:=xlUp
      End If
  End If
End With
End Sub
Das LPool hat mich eben verwundert: das ist eine Sortierfunktion, die aber von nirgendwo aus aufgerufen wird. Ich würde sie mit zwei Zeilen Excel ersetzen, wenn man sie denn bräuchte.
Zu Deinem Problem: Bei mir löscht die Funktion auch "00"; ich vermute, daß Du in Deinen Daten keine "00" stehen hast, sondern nur 0 als Zahl.
Markiere doch einfach mal die Spalte A und suche nach 0 bzw. 00, dann siehst Du, was gefunden wird.
Oder lade mir nochmal die Datei mit einem Datenausschnitt hoch, der "Deine" 00 enthält.
Schöne Grüße,
Michael

Bild

Betrifft: AW: MSG Abfrage
von: Jürgen
Geschrieben am: 11.09.2015 17:11:57
Hallo michael,
ich hab einfach durch suchen und ersetzten 00 auf 0 geändert. Jetzt geht alles.
Möchte mich nocheinmal für alles bedanken. :-)
LG jürgen

Bild

Betrifft: gerne, danke für die Rückmeldung owT
von: Michael
Geschrieben am: 11.09.2015 19:41:57


 Bild

Beiträge aus den Excel-Beispielen zum Thema "MSG Abfrage "