Bon j'ai crée un projet allégé avec seulement la problématique via le .zip si dessous
ARIANE TEST.zip
En espérant que cela fonctionne maintenant !
Bon j'ai crée un projet allégé avec seulement la problématique via le .zip si dessous
ARIANE TEST.zip
En espérant que cela fonctionne maintenant !
Re,
J'ai bien reçu ton projet et je peux l'exécuter.
Il y a effectivement un problème : je ne comprends pas pourquoi ComboBox2.DataSource = MonDico.Keys ne fonctionne pas dans ce code, alors que cela fonctionne par ailleurs. Je chercherai dans la soirée si je peux comprendre.
En attendant, j'ai remplacé cette ligne de code par un remplissage "manuel" du ComboBox. Cela se fait en mémoire interne (sans accès à XLS) et sans nécessiter de tri (le SortedList fait le travail). Cette solution te dépannera en gardant une grande rapidité d'exécution.
J'ai placé le remplissage de la SortedList dans un bloc Try parce que, si d'aventure, il devait y avoir un doublon dans les données, cela provoquerait une erreur. Avec le Try, celle-ci ne bloquera pas le programme.
Attention, dans la procédure ComboBox2_SelectedValueChanged(...) tu as encore un appel à SupprDoublon(). Il faut retirer ces appels dès lors que tu travailles avec la SortedList.
J'espère que ceci te permettra d'avancer ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 ' ... ... ... For Me.lngCnt = 2 To range.Rows.Count If f.Range("A" & lngCnt).Text <> ("") Then Try ' Adsn un Try pour éviter les erreurs d'exécutions sur doublons. MonDico.Add((f.Range("A" & lngCnt).Text), "") ' ComboBox2.Items.Add(f.Range("A" & lngCnt).Text) Catch End Try Else End If ProgressBar2.Value = (lngCnt - 1) + 1 'incremente la ProgressBar pour chaque ligne Next ' *** ' ComboBox2.DataSource = MonDico.Keys ' Puisque le DataSource ne focntionne pas, je le remmplace par les 3 lignes suivante : For I As Integer = 0 To MonDico.Count - 1 ComboBox2.Items.Add(MonDico.Keys(I)) Next ' ... ... ...![]()
ok, j'essaye ...
Comme tu as put le voir, il y a plusieurs ComBobox en cascade et c'est surtout pour charger la 3e combobox (apres choix dans la 2e) que cela prends du temps
Et oui je vais supprimer le code de Supprdoublon
Eureka qu'il a dit, parait-il ...
La propriété Sorted du ComboBox est à TRUE dans ton programme. Ce n'est pas sa valeur par défaut. Si tu la remets à FALSE, alors le code ComboBox2.DataSource = MonDico.Keys fonctionne parfaitement et te dispense de ma boucle de dépannage.
Il est inutile de modifier cette propriété du ComboBox puisque la SortedList est toujours ordonnée sur les KEYS.
Si dans un autre ComboBox tu présentes les Values (ComboBox2.DataSource = MonDico.Values), ou d'autres valeurs, et que tu veux qu'elles soient ordonnées, alors d'accord d'affecter TRUE à la propriété Sorted du ComboBox. Mais dans ce cas, il ne faut pas appeler un procédure de tri, c'est le ComboBox a ce qu'il faut.
Enfin, si je peux me permettre, pour modifier les valeurs par défaut des propriétés des composants, il est préférable de le faire dans le code ComboBoxN.Sortde = True, généralement dans le Form_Load. S'il en avait été ainsi avec le ComboBox2, j'aurais constaté le problème ce matin ...
...![]()
Effectivement ça marche mieux !
Le nouveau problème c'est que le chargement de chaque Combobox affiche un item et donc les autres combobox se lancent aussi ...
Et pas de gain de temps avec ce nouveau code ou en tout cas pas instantanée comme sur VBA excel ...
Merci cependant pour ton implication !
bonjour,
sans vouloir offenser personne, retranscrire un code VBA comme deux goute d'eau en vb.net je n'adhère pas!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Dim XLS As Object = XlApp.Workbooks.Open("C:\Test\test.xlsm") Dim R As Array = XLS.Sheets("Feuil1").range("A1:A997920").value Dim T As Object = R.Cast(Of Object).ToArray.ToList.Distinct.ToArray() Array.Sort(T) Me.ComboBox1.DataSource = T
En fait, Thumb down, c'était plutôt pour faciliter la compréhension de la problématique et non pour transposer à tout prix !
Peu importe le code, tant que les combobox en cascade fonctionne (chargement du suivant à chaque sélection manuelle du précèdent)
et que le chargement soit quasi instantané ! car la 8000 cellules en 20 secondes c'est trop !
D'ailleurs la solution de Phil Rod n'a pas accéléré le processus et donc au final je garde le simple ComboBox2.Items.Add(f.Range("A" & lngCnt).Text) !
Et comme tu peux le vois par mon nombre de contribution à ce forum, ce sont mes débuts en VB.NET et donc je me raccroche à ce que je connais, c'est à dire du codage VBA !
Partager