• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

the object invoked has disconnected from its clients

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.233
Ik probeer in een UserForm (Excel 2010) 2 gekoppelde keuzelijsten te maken: na keuze van het land in de eerste wordt de tweede gevuld met steden van dat landBekijk bijlage LinkedComboboxes.xlsmBekijk bijlage LinkedComboboxes.xlsm
Geen problem, totdat ik de dropdown method wil toepassen op de tweede combobox, dit geeft een fout: "the object invoked has disconnected from its clients"
Google brengt geen raad.
Wat is het problem?

Code:
Option Explicit
Dim ChoosenCountry As String



Private Sub cbo_Country_Change()
Dim town As Range
cbo_town.Clear
ChoosenCountry = cbo_Country.Value
For Each town In Range(ChoosenCountry).Cells
    cbo_town.AddItem town
Next town

With cbo_town
    .SetFocus
    '.DropDown the object invoked has disconnected from its clients
End With
    
End Sub

Private Sub UserForm_Initialize()
Dim country As Range

For Each country In Range("Landen").Cells
cbo_Country.AddItem country
Next country
End Sub
 
Wat het probleem is heb je zelf al uitgelegd ;)

Maar draai ze om:
Code:
With cbo_town
    .DropDown
    .SetFocus
End With
 
Laatst bewerkt:
Dat werkt niet, combobox spring niet open.
En rare is dat een vergelijkbare code op een access formulier géén fout genereert, je MOET daar eerst SetFocus doen

Code:
With DoCmd
    .Requery "Member_Country" 
    .Requery "Member_Town"
End With

With Member_Town
  .SetFocus 'if you don't do this the next command will not work
  .Dropdown
End With
 
Laatst bewerkt door een moderator:
Het werkt hier prima zoals ik het zei.
 
Sorry, je hebt gelijk.
Ik testte verkeerd.
 
Google geeft vele treffers op die fout, maar in heel andere codes
 
Laatst bewerkt door een moderator:
Deze code is voldoende:


Code:
Private Sub UserForm_Initialize()
     cbo_Country.List = Sheet1.ListObjects("n").DataBodyRange.Value
End Sub

Private Sub cbo_Country_Change()
   If cbo_Country.ListIndex > -1 Then cbo_town.List = Sheet1.ListObjects("Tabel_" & cbo_Country.Value).DataBodyRange.Value
End Sub

Kijk ook eens hier: http://www.snb-vba.eu/VBA_Fill_combobox_listbox.html
 
Ik kan me wel voorstellen waarom dat fout gaat.
Kijk eens of het zo wat voor je is.
De opmerkingen van snb zijn er niet in verwerkt, maar zou ik wel in acht nemen.
Bekijk bijlage LinkedComboboxes.xlsm
 
Beste reneemettrie,

Bij een directie reactie is quoten niet nodig, u kunt simpelweg de "Reageer op bericht" knop gebruiken.

m.v.g
Rick van Lieshout
 
Los van bovenstaande suggesties, jouw probleem is een timing-probleem.

Gebruik application.ontime

In een gewone module :

Code:
Sub test(cbo As String)

With UserForm1.Controls(cbo)
    .SetFocus
    .DropDown
End With
End Sub

Jouw Combo-change - event:

Code:
Private Sub cbo_Country_Change()
Dim town As Range
cbo_town.Clear
ChoosenCountry = cbo_Country.Value
For Each town In Range(ChoosenCountry).Cells
    cbo_town.AddItem town
Next town
 Application.OnTime Now, "'test """ & cbo_town.Name & "'"
 
End Sub
 
Bedankt iedereen voor het meedenken.

Ik weet niet hoe ik hier iemand moet taggen?

snb, heb je nuttige suggestie toegepast. Een keer met een listobject, een keer met range(….).cells.value

Edmore, vernuftige oplossing, maar nadeel van listbox is dat je er niks nieuws in kunt typen en in geval van een lange lijst niet handig dat je maar één letter kunt typen om naar een item te gaan

Eric, waarschijnlijk doe ik iets verkeerd maar jouw oplossing werkt niet.
Begrijp ook absoluut de logica ervan niet. Theoretisch zou het toch geen verschil mogen maken of je die dropdown method aanroept via de afterupdate event, of via application.OnTime? Is daar ergens een uitleg over te vinden?

Bekijk bijlage LinkedComboboxes.xlsm

Hier mijn code:

Code:
Option Explicit
Dim ChoosenCountry As String, ws As Worksheet
Sub test()

With cbo_town
    .SetFocus
    .DropDown
End With
End Sub


Private Sub cbo_Country_AfterUpdate()


ChoosenCountry = "tabel_" & cbo_Country.Value

'cbo_town.List = ws.ListObjects(ChoosenCountry).DataBodyRange.Value
cbo_town.List = Range(ChoosenCountry).Cells.Value


cbo_town.Value = ""
cbo_town.DropDown 'werkt niet maar geeft geen run time error
Application.OnTime Now, "'test """ & cbo_town.Name & "'" 'Werkt niet
SendKeys "{TAB}" 'werkt niet
cmd_Dropdown_Click 'werkt niet
    
End Sub





Private Sub cmd_Dropdown_Click()
cbo_town.DropDown 'werkt
End Sub

Private Sub CommandButton1_Click()
Application.OnTime Now, "'test """ & cbo_town.Name & "'"

End Sub





Private Sub UserForm_Initialize()
Dim country As Range

Set ws = Worksheets("GekoppeldeLijsten")

cbo_Country.List = ws.ListObjects("Tabel_Landen").DataBodyRange.Value



End Sub


en in een gewone module:

Code:
Option Explicit

Sub test(cbo As String)
MsgBox "Sub test"
With UserForm1.Controls(cbo)
    .SetFocus
    .DropDown
End With

End Sub
 
Mijn voorbeeld met de listbox was alleen om het lijstje te tonen.
Zodra je in de steden combobox klikt of anders naar toe gaat is deze weer weg en kan je gewoon de combobox gebruiken.
 
Volgens mij haal je eea door elkaar, de gegeven code in jouw bestandje uit post #1 gezet, volgens mij werkt dit gewoon....
 

Bijlagen

  • Copy of LinkedComboboxes-2.xlsm
    24,5 KB · Weergaven: 40
Bedankt voor ieders input!
Na veel uittesten heb ik een heel eenvoudige oplossing gevonden zonder speciale truukjes.
Ik geef opleidingen en heb het niet zo begrepen op onverklaarbare run time errors :)

Code:
Option Explicit
Private Sub cbo_Country_Change()
With cbo_town
    .List = Range(cbo_Country.Value).Cells.Value
    .Value = ""
End With
SendKeys "{TAB}"
End Sub

Private Sub cbo_town_Enter()
cbo_town.DropDown
End Sub

Private Sub UserForm_Initialize()
cbo_Country.List = Range("Landen").Cells.Value
End Sub
Bekijk bijlage LinkedComboboxes.xlsm
 
Dan hoop ik niet dat je de cursisten dit leert:

Code:
With cbo_town
    .List = Range(cbo_Country.Value).Cells.Value
    .Value = ""
End With

maar dit

Code:
cbo_townList = Range(cbo_Country.Value).Value

Sendkeys zou bij mij volledig uit den boze zijn.

Kijk eens hier: http://www.snb-vba.eu/VBA_Fill_combobox_listbox.html
 
Blijkbaar werkt
Code:
cbo_Country.List = Range("Landen").Value
ook?

Waarom werk jij in een vorige reactie met listobjects(…) ? Bij mij gaat het ook om listobjects, maar ik heb een gedefinieerde naam toegekend, lijkt me eenvoudiger?

De finesses ontgaan me nog, ik ga zeker je link bestuderen. In de meeste handboeken staat helaas bitter weinig over Userforms, zal zeker heel nuttig zijn.

Het was er mij eigenlijk om te doen die run time error (en bijhorend vastlopen, ik kon niet eens meer ALt F11 gebruiken) kwijt te raken, en was blij daarin geslaagd te zijn :)

Wat is er mis met Sendkeys?
 
Als je een listobject gebruikt heb je inherent benoemde gebieden [Tabel2[België]], [Tabel2[NL]]. etc., die hoef je dan nog eens apart te gaan definiëren.
 
Ja, weet ik wel. Maar ik verkies gedefinieerde namen, gemakkelijker om als functie argument of als bron van een draaitabel in te voeren (F3).

En ook de code range(gedefinieerde naam) vind ik eenvoudiger dan sheets(…).listobjects(….)


Waarom moet je Sendkeys vermijden? Hier geen groot probleem natuurlijk, gebruiker kan ook op TAB drukken
 
Waarom moet je Sendkeys vermijden?

Omdat er oa vreemde dingen kunnen gebeuren wanneer er bijvoorbeeld iets anders de 'focus'heeft, of wanneer er reeds een andere toets is ingedrukt.... Dit is trouwens ook meteen het grootste probleem in jouw code (Change event gebruiken om een (andere) ComboBox te vullen + de waarde in jouw 1e combobox te gebruiken.
De Change wordt steeds aangeroepen wanneer er iets wijzigt, dus ook bij een 'verkeerde' toetsaanslag en dan probeer je de List te vullen met een niet bestaand bereik.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan