ListBox-Multiselect + if-anweisung geht nicht

Hallo Leutz,

kann mir jemand von euch sagen, wo mein fehler ist?
Ich habe eine Listbox mit multiselect-option. Nun will ich dass der markierte eintrag in einer excel-tabelle gefunden und gelöscht wird.
Im normalen Modus, ohne Schleife, funktioniert das auch einwandfrei. nur wenn ich jetzt die schleife einfüge und die funktion in eine if-anweisung setze, kommt die fehlermeldung „End IF ohne IF“

weiss nt was daran falsch sein soll. bin aber auch kein Pro im programmieren…

Private Sub BAuswEntf\_Click()
 'spricht das ausgewählte feld an
 auswahl = ListBox1.List(ListBox1.ListIndex)

 With UserForm2.ListBox1
 Tabelle2.Activate

 For i = .ListCount - 1 To 0 Step -1 'Schleife, wegen Multiselect
 If .Selected(i) Then Tabelle2.Activate
 'ListBox-Auswahl in tabelle suchen und Zelle aktivieren
 Columns("A:A").Find(what:=auswahl, \_
 After:=Range("A1"), LookIn:=xlFormulas, lookat:=xlPart, \_
 SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
 'ganze Zeile markieren und löschen
 intRow = ActiveCell.Row
 Rows(intRow).Delete
 ' Eintrag auch sofort aus ListBox löschen
 ListBox1.RemoveItem (ListBox1.ListIndex)
 ListBox1.ListIndex = 0
 End If
 Next i
 End With
End Sub

kann das was mit diesem „Matchcase:=False“ zu tun haben? Hatt ich zwar schon mit true ausprobiert aber naja.

Und noch ne Frage: Ich habe eine Userform(Formular) geöffnet. Auf dieser ist ein Butto, der ein zweites Formular öffnet. Wenn ich dieses zweite Formular verschieben will (mittels Mauszeiger im obersten Balken), kommt immernur ne kopie davon. d.h. wenn ich es an eine andere stelle ziehe, sieht man sie trotzdem noch an der alten stelle… schliessen brauch ichs aber nur einmal. weiss jemand was das ist und wie es weg geht?

Bin sehr sehr dankbar für jeden hinweis.

MFG Uschi

[MOD] pre-Tag eingefügt

Hallo Leutz,

Hallo Uschi,

kann mir jemand von euch sagen, wo mein fehler ist?

Na schauen wir mal :wink:

Ich habe eine Listbox mit multiselect-option. Nun will ich
dass der markierte eintrag in einer excel-tabelle gefunden und
gelöscht wird.

es handelt sich also um VBA! Das solltest du zukuenftig immer dazu schreiben, da es einige Unterschiede gibt :smile:

Im normalen Modus, ohne Schleife, funktioniert das auch
einwandfrei. nur wenn ich jetzt die schleife einfüge und die
funktion in eine if-anweisung setze, kommt die fehlermeldung
„End IF ohne IF“

das bedeutet das du ein END IF geschrieben hast ohne iF!

weiss nt was daran falsch sein soll. bin aber auch kein Pro im
programmieren…

'Auszug aus deinen Code wo der Fehler liegt :wink:
If .Selected(i) Then Tabelle2.Activate

Ich bin zwar mehr auf VB spezialisiert, aber in diesem Falle sollte das das selbe sein :smile:

Ein normales IF Satement schaut wiefolgt aus

If .... then
elseif ... then
Else
End if

'Oder

IF ... then
Else
End if

'Oder

If ... then
End if

'Alternativ kannst du schreibarbeit sparen. 
'Wenn nur 1 Befehl ausgefuehrt werden soll, so kannst du auch folgendes schreiben

If ... Then Dein Befehl

'Das führt Dein Befehl aus wenn die IF Bedingung erfuellt ist.

Wenn du dir nun deine Code anschaust, siehst du das genau den "Fehler " gemacht hast. Du hast hinter dem IF Statement und dort hinter Then einen Befehl geschrieben!Das bedeutet wenn die IF Bedingung erfuellt ist, nur dann wird der Befehl ausgeführt! Tabelle 2 wird aktiviert :wink:
Die anderen Befehle werden für jedes Element ausgefuehrt, egal ob die IF Bedingung erfuellt ist!

Aber lange Rede kurzer Sinn. So sollte es gehen :smile:

Private Sub BAuswEntf\_Click()
 auswahl = ListBox1.List(ListBox1.ListIndex)
 With UserForm2.ListBox1
 Tabelle2.Activate
 For i = .ListCount - 1 To 0 Step -1 
 If .Selected(i) Then 'hier nehmen wir den Befehl weg :wink:
 Tabelle2.Activate
 Columns("A:A").Find(what:=auswahl, \_
 After:=Range("A1"), LookIn:=xlFormulas,
 lookat:=xlPart, \_
 SearchOrder:=xlByRows, SearchDirection:=xlNext,
 MatchCase:=False).Activate
 intRow = ActiveCell.Row
 Rows(intRow).Delete
 ListBox1.RemoveItem (ListBox1.ListIndex)
 ListBox1.ListIndex = 0
 End If
 Next i
End With
End Sub

kann das was mit diesem „Matchcase:=False“ zu tun haben? Hatt
ich zwar schon mit true ausprobiert aber naja.

Nein hat es nicht :wink:

Und noch ne Frage: Ich habe eine Userform(Formular) geöffnet.
Auf dieser ist ein Butto, der ein zweites Formular öffnet.
Wenn ich dieses zweite Formular verschieben will (mittels
Mauszeiger im obersten Balken), kommt immernur ne kopie davon.
d.h. wenn ich es an eine andere stelle ziehe, sieht man sie
trotzdem noch an der alten stelle… schliessen brauch ichs
aber nur einmal. weiss jemand was das ist und wie es weg geht?

Da kann ich dir leider nicht weiterhelfen, da ich wie gesagt mich auf VB spezialisiert habe :wink:

Bin sehr sehr dankbar für jeden hinweis.

Nichts zu danken, dazu sind wir da :smile:

MFG Uschi

MFG Alex

hey alex,

danke. das war ja nen blöder fehler. da wär ich bestimmt nie drauf gekommen :wink:

kannste mir nochmal helfen?
quelltext sieht jetzt bissel anders aus:

 For i = .ListCount - 1 To 0 Step -1 'Schleife, wegen Multiselect
 If .Selected(i) Then
 auswahl = .List(ListBox1.ListIndex)
 Tabelle2.Activate 'ListBox-Auswahl in tabelle suchen und Zelle aktivieren
 Columns("A:A").Find(what:=auswahl, \_
 After:=Range("A1"), LookIn:=xlFormulas, lookat:=xlPart, \_
 SearchOrder:=xlByRows, SearchDirection:=xlNext, \_
 MatchCase:=False).Activate
 'ganze Zeile markieren und löschen
 intRow = ActiveCell.Row
 Rows(intRow).Delete
 Range("a1").Activate

 ' Eintrag auch sofort aus ListBox löschen
 ListBox1.RemoveItem (ListBox1.ListIndex)
 'ListBox1.ListIndex = 0
 End If
 Next i

ich versuche folgendes:
ausgewählte einträge der listbox sollen in der zugehörigen tabelle gelösch werden.
das funktioniert soweit auch. nur dass jeweils die markierten einträge und alle dazwischen gelöscht werden.
ich hab schonmal den lisindex auf -1,0,1 gesetzt und da hat er mal die einträge vor und nach den markierten gelöscht. aber nur die markierten einträge löscht er nur, wenn einer ausgewählt ist…

…ich mag langsam keine listboxen mehr :wink:

mfg uschi

[MOD] Pre - Tag eingefügt

hey alex,

Hallo USchi,

danke. das war ja nen blöder fehler. da wär ich bestimmt nie
drauf gekommen :wink:

Nichts zu danken. Dafür sind wir ja da :smile: Und auf den Fehler waerst du sicherlich frueher oder später auch darauf gekommen. Spätestens haettest du das Macro im Step by Step Modus laufen lassen :wink:

Du kannst dich beruhigen. Auch mir passieren unmengen von Fehlern und manchmal sehe ich sie auch erst nach Wochen oder garnicht :confused:

kannste mir nochmal helfen?

Ja klar, sofern ich es weiss :smile: Wie gesagt mit VBA schaut es bei mir schlecht aus. VB dagegen schon nen bissl besser :smile:

quelltext sieht jetzt bissel anders aus:

Na dann schauen wir mal :smile:

For i = .ListCount - 1 To 0 Step -1 'Schleife, wegen
Multiselect
If .Selected(i) Then
auswahl = .List(ListBox1.ListIndex)
Tabelle2.Activate 'ListBox-Auswahl in tabelle suchen
und Zelle aktivieren
Columns(„A:A“).Find(what:=auswahl, _
After:=Range(„A1“), LookIn:=xlFormulas,
lookat:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False).Activate
'ganze Zeile markieren und löschen
intRow = ActiveCell.Row
Rows(intRow).Delete
Range(„a1“).Activate

’ Eintrag auch sofort aus ListBox löschen
ListBox1.RemoveItem (ListBox1.ListIndex)
'ListBox1.ListIndex = 0
End If
Next i

ich versuche folgendes:
ausgewählte einträge der listbox sollen in der zugehörigen
tabelle gelösch werden.
das funktioniert soweit auch.

Das ist doch schon einmal super :smile:

nur dass jeweils die markierten
einträge und alle dazwischen gelöscht werden.
ich hab schonmal den lisindex auf -1,0,1 gesetzt und da hat er
mal die einträge vor und nach den markierten gelöscht. aber
nur die markierten einträge löscht er nur, wenn einer
ausgewählt ist…

Richtig. Da hast du einen kleinen Schönheitsfehler drinnen, den du auf 2 Arten beseitigen kannst :wink:

Nehmen wir einmal die wichtigsten Dinge auseinander :smile:

For i = .ListCount - 1 To 0 Step -1

Richtig! Auch das du von hinten anfangen musst zu zaehlen :wink:

If .Selected(i) Then

Wenn der Eintrag I !!! Selectiert ist dann -> Richtig :smile:

auswahl = .List(ListBox1.ListIndex)
Tabelle2.Activate
Columns(„A:A“).Find(what:=auswahl, _
After:=Range(„A1“), LookIn:=xlFormulas,
lookat:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False).Activate
intRow = ActiveCell.Row
Rows(intRow).Delete
Range(„a1“).Activate

Da kann ich dir nichts zu sagen. Aber du sagtest ja das das klappt. Also Richtig :smile:

ListBox1.RemoveItem (ListBox1.ListIndex)

Und genau da ist der Hund begraben!!!

End If
Next i

So da ich wieder mal in Schreiblaune bin *lächel* Eine kurze Erläuterung!

Du füllst ja deine Liste. Sagen wir einmal dort stehen 21 eintraege drinnen. Nun wird jeder ungerade Eintrag selektiert ( 1,3,5,7,9 etc)
Der makierte Eintrag ist sagen wir mal der 1! Also der mit dem Index 0
Nun durchlaeufst du die Liste und fragst jeden Eintrag von hinten ab.
Der erste hat den Index 20 und somit nicht selektiert. Ergo macht deine Routine auch nicht. Danach beginnt die Schleife wieder von vorne und es kommt der Eintrag mit dem Index 19 dran, der Selektiert ist.
Das bedeutet das die IF Bedingung erfuellt ist. Es werden dann auch Ordnungsgemaess die Daten aus der Tabelle gelöscht!
Nun hast du aber die Anweisung

ListBox1.RemoveItem (ListBox1.ListIndex)

stehen. Wir hatten ja gesagt es war der erste Eintrag makiert ( Blau unterlegt) das bedeutet das Der Listindex 0 ist! Mit deiner Anweisung löschst du nun das erste Element! Bei einen weiteren Versuch würdest du eine Fehlermeldung bekommen ( Zumindest bei VB) es seidenn du hast ein On Error … in deiner Routine stehen :smile:

Um die Sache zu lösen, gibt es nun 2 Wege. Entweder makierst du das zu löschende Element und löschst es dann mit deiner variante. Oder du gibst die Position an, welches du ja anhand von I weisst ( Diese Variante würde ich vorziehen)

Im Klartext würde es so ausschauen

list1.listindex=i
list1.removeitem i

'oder 

List1.RemoveItem i

Wie du siehst ist es mal wieder nur ein Fluechtigkeitsfehler :smile:

Ändere deinen Source mal wiefolgt ab. Danach sollte es klappen :smile:

For i = .ListCount - 1 To 0 Step -1 
 If List1.Selected(i) Then
 auswahl = List1.List(List1.ListIndex)
 Tabelle2.Activate 
 Columns("A:A").Find(what:=auswahl, \_
 After:=Range("A1"), LookIn:=xlFormulas,
 lookat:=xlPart, \_
 SearchOrder:=xlByRows, SearchDirection:=xlNext, \_
 MatchCase:=False).Activate
 intRow = ActiveCell.Row
 Rows(intRow).Delete
 Range("a1").Activate
 List1.RemoveItem (i)' Diese Zeile so abändern :wink:
 End If
Next i

Vorraussetzung ist das deine Liste List1 sich schimpft.
Mir ist gerade aufgefallen das du die Liste einmal nur mit einem Punbkt ansprichst, was auf ein With … End with hinweist und dann wiederrum mit dem Objectnamen :wink: Sollte ich Recht haben, so entscheide dich mal was du magst. Schaut sonst unschön aus! :smile:

…ich mag langsam keine listboxen mehr :wink:

Ach Quatsch, nur nicht verzweifeln! Sind doch nur Faselfehler :smile:

mfg uschi

MFG Alex

[MOD] Pre - Tag eingefügt

PS: Uschi, wenn du Code postest so verwende bitte in den PRE Tag.
Um diesen zu nutzen mache es wiefolgt

Dein Source

Die 1 jeweils weglassen.( Also nur PRE und /PRE
Die habe ich nur gemacht damit du siehst was ich meine :wink:
Schaut auch besser aus :wink: und Rainer hat nicht soviel Stress :smile:

hallöchen alex,

super, jetzt funktionierts alles wie es soll. is eigentlich auch ganz logisch :wink: …und ich lag diesmal ja schon nah dran, mit meiner vermutung, dass es was mitm listindex zu tun hat :wink:
deine hinweise mit pre werd ich das nächste mal befolgen.

also danke nochmal, auch für die erläuterungen. jetzt bin ich auf jeden fall wieder n bissel schlauer :smiley:

bye bye, bis zum nächsten.

uschi