[VBA]Combo.Value > Long à l'execution

TheLio

XLDnaute Accro
Bonjour le forum,
Ci joint un fichier qui a pris forme grâce à Hasco, BrunoM45, + ceux que j'oublie. Que je remercie au passage ;)
Il y a deux points que j'aimerais pouvoir régler sur ce fichier bouton9 :
  • Au moment de la validation des données, le processus est assez long à s'executer, peut-on l'optimiser d'une manière ou d'une autre?

  • Paralellement, je n'arrive pas à modifier l'affectation des labels Nom, Age,...
    avec ma macro effacer,
    J'ai tenté de faire un deuxième Userform pour la Macro Effacer, atteignable par Mot de passe, ce qui serait mieux que de l'avoir sur le masque de base, mais je butte.
Alors si vous avez quelques pistes pour moi, c'est très volontiers.
A++
TheLio
 

Pièces jointes

  • Forum_Cartes.zip
    131.1 KB · Affichages: 54
  • Forum_Cartes.zip
    131.1 KB · Affichages: 53
  • Forum_Cartes.zip
    131.1 KB · Affichages: 57

jp14

XLDnaute Barbatruc
Re : [VBA]Combo.Value > Long à l'execution

Bonjour

Vu le nombre de boucle il est normal que le temps de traitement soit relativement long.
Pour améliorer le temps de réponse il faudrait utiliser exit for pour sortir des boucles, regrouper les test dans des boucles.

JP
 
G

Guest

Guest
Re : [VBA]Combo.Value > Long à l'execution

Lionel,

voici ta procédure supprimer tout modifiée et plus rapide:

Code:
Sub Effacer_Tout()
    Dim ligne As Long                                 'Ligne de BD
    Dim Col As Long                                   'Colonne
    Dim obj As Control
    'Si une sélection de chambre a étée faite
    If cbChambres.ListIndex > -1 Then
        'Récupération du numéro de ligne dans la feuille
 
        ligne = 6 + cbChambres.ListIndex
        Sheets("BD").Range("F" & ligne & ":DK" & ligne).ClearContents
        For Each obj In Me.Controls
            If Left(obj.Name, 2) = "lb" Then
                obj.Caption = ""
            Else
                If TypeName(obj) = "ComboBox" Or TypeName(obj) = "TextBox" Then obj.Text = ""
            End If
        Next
    End If
End Sub

conseil: renomme tes combos avec pour racine de nom "cbx" et complément le numéro de colonne. ex cbx11

Ensuite pour modifier tu peux parcourir les cellules de la plage comme ceci
Code:
dim Col as long
ligne = 6 + cbChambres.ListIndex
'Pour les combos
For Col=11 to 115
Sheets("BD").cells(ligne, col)=me.controls("cbx" & i).value
Next
Cela sera plus rapide que de multiples boucles.

Vérifie mes indices de colonne et adapte.

A+
 

TheLio

XLDnaute Accro
Re : [VBA]Combo.Value > Long à l'execution

Bonjour messieurs,
Et merci pour vos pistes d'optimisations,
Je suis entrain d'y travailler, mais je rencontre déjà un problème qui va audelà de mes limites:
Dans la procédure Private Sub UserForm_Initialize()
Je fais appel à des listes, jusque là pas de problème, je renomme mes Combobox, mais pour celles qui étaient regroubées pour en début de procédure pour faire appel aux collections,je coince... (encore)
D'avance Merci
L.
 

TheLio

XLDnaute Accro
Re : [VBA]Combo.Value > Long à l'execution

Bonjour Hasco, JP14, le fil, le forum,
J'ai tenté d'adapter, mais j'ai commis une erreur...
Vos yeux experts la trouveront certainment.
Merci pour votre patience et votre dévouement.
A++
Lio
 

Pièces jointes

  • Forum_Cartes (version 1).zip
    132.3 KB · Affichages: 41

jp14

XLDnaute Barbatruc
Re : [VBA]Combo.Value > Long à l'execution

Bonjour

Bonjour Hasco, JP14, le fil, le forum,
J'ai tenté d'adapter, mais j'ai commis une erreur...
Vos yeux experts la trouveront certainment.
Merci pour votre patience et votre dévouement.
A++
Lio
Pour trouver ce type d'erreur il faut utiliser la touche F8 et poser les points d'arrêts au fur et à mesure du contrôle du code.
La ligne ci dessous pose problème, il faudrait cbx
Call MaJCombo(Me("cbxt" & Inc))
Cbx1 n'existe pas.

Pour éviter ce type de problème un exemple de macro à utiliser. Cette macro se base sur le type de contrôle TypeName et on récupère le nom avec .Name

Algorithme simplifié
Pour tout les contrôle de la feuille
Si le contrôles est de type label
on supprime dans le nom le mot label pour récupérer la valeur numérique
on affecte à la propriété caption l'entête de la colonne de la base de donnée.( ce qui permet de modifier l'ordre des colonnes)
Fin si
On recommence.

Code:
Private Sub ecrirelabel(£ligne1 As Long, £nomfeuille1 As String)
' Nom des label
' Label & numéro d'ordre= numéro colonne
Dim £Ctrl As Control
Dim £coln As Long
Dim £data1 As String

With Sheets(£nomfeuille1)

For Each £Ctrl In Me.Controls
    If TypeName(£Ctrl) = "Label" Then
            £data1 = Replace(£Ctrl.Name, "Label", "")
            coln = Val(£data1)
           Me.Controls(£Ctrl.Name).Caption = .Cells(£ligne1, coln)
    End If
    
Next £Ctrl
End With
End Sub
En utilisant cette méthode on simplifie au maximum les codes pour l'affichage et l'enregistrement des données.

JP
 

TheLio

XLDnaute Accro
Re : [VBA]Combo.Value > Long à l'execution

Bonjour tous,
je fais remonter ce fil, car, en espérant ne pas vexer ceux qui ont bien voulu me répondre, je n'arrive pas à mettre en pratique leurs judicieux conseils.
Le pricipe de renommer les combo "cbx+N°de colonne, c'est ok, ainsi les boucles sont optimisée. Mais je ne peut pas procéder ainsi à cause de des listes "collections" attribuées dans la procédure initialize.
Je pense que vous avez répondu à cette question, mais je n'y comprend rien...
Merci pour vos pistes
A++
Lio
 

skoobi

XLDnaute Barbatruc
Re : [VBA]Combo.Value > Long à l'execution

Bonjour Lionel :),


La variable "Inc" dans la boucle doit correspondre au numéro se trouvant dans le nom des comboboxs:

Code:
.....
  ' Pour chaque Combobox, attribuer la liste des AVERSIONS
  For Inc = [COLOR=Blue][B]31 To 41[/B][/COLOR]
    Call MaJCombo(Me("cbxt" & Inc))
  Next Inc
  ' Récupérer la liste des PREFERENCES sans ESPACES NI DOUBLONS et la TRIER
  ' Appeler la procédure avec le nom de la plage
  Call CreationListe("Preferences")
  ' Pour chaque Combobox, attribuer la liste des PREFERENCES
  For Inc = [B][COLOR=Blue]42 To 49[/COLOR][/B]
    Call MaJCombo(Me("cbxp" & Inc))
  Next Inc
 

TheLio

XLDnaute Accro
Re : [VBA]Combo.Value > Long à l'execution

Bonjour le forum, tous,...
Je ne sais pas si ça vient du fait que mes neuronnes tournent actuellement sur 1 roue ou si alors je suis complètement bouché => Fort taux de probabilité.
Au moment de la validation des données, j'ai toujpours cette maudite erreur qui revient.
J'ai cherché, mais la fièvre me gagne :(
Merci pour vos lumières (à force d'en abuser je vais finir par bronzer :))
A++
Lio
 

Pièces jointes

  • 07_12_Forum_Cartes (version 1).zip
    133.3 KB · Affichages: 34

skoobi

XLDnaute Barbatruc
Re : [VBA]Combo.Value > Long à l'execution

Salut Lionel,

remplace I par Col ;).
Tu as mis la roue de secours?:D

Code:
Private Sub BtnSave_Click()
Dim Col As Long
'Dim I As Variant
ligne = 6 + cbChambres.ListIndex
'Pour les combos
For Col = 11 To 19
Sheets("BD").Cells(ligne, Col) = Me.Controls("cbx" & [COLOR=Blue][B]Col[/B][/COLOR]).Value
Next
For Col = 20 To 30
Sheets("BD").Cells(ligne, Col) = Me.Controls("cbx" & [B][COLOR=Blue]Col[/COLOR][/B]).Value
Next
For Col = 50 To 115
Sheets("BD").Cells(ligne, Col) = Me.Controls("cbx" & [B][COLOR=Blue]Col[/COLOR][/B]).Value
Next
For Col = 31 To 41
Sheets("BD").Cells(ligne, Col) = Me.Controls("cbxt" & [B][COLOR=Blue]Col[/COLOR][/B]).Value
Next
For Col = 42 To 49
Sheets("BD").Cells(ligne, Col) = Me.Controls("cbxp" & [B][COLOR=Blue]Col[/COLOR][/B]).Value
Next
End Sub

Il faut que tu déprotèges aussi la feuille au début du code.

A bientôt.