Remplissage de contrôle dynamique

Re-Bonjour à tous,

Dans le Frame "Modifier / Supprimer" si vous sélectionnez une valeur dans la combobox, les autres contrôles se remplissent :

capture d ecran 2023 01 21 174009

Dans le Frame "Renseignement généraux " si vous sélectionnez une valeur dans la combobox, le code se mets en erreur :

capture d ecran 2023 01 21 1740442

Et pourtant il s'agit du même code ... Adapté bien sûr.

Merci pour le coup de main

A + ;)

Bonsoir,

avec ce code du "change" de la combobox date :

Private Sub ComboBox_date_ancienne_Change()
Dim cCTRL As Control
Dim i As Byte, Col As Byte

            On Error GoTo pb

                    With ActiveSheet

                        lig = .Range("AA:AA").Find(ComboBox_date_ancienne.Value, LookIn:=xlValues, lookat:=xlWhole).Row

                                    Me.TextBox_montant_course = .Cells(lig, "X").Value

            Exit Sub

pb:
    MsgBox "Date non trouvée"

                 End With

End Sub

Vous faites une recherche d'un texte car les textbox et combobox sont des texte dans une colonne où les dates sont numériques(normal c'est excel !), il faut spécifier à VBA que la valeur cherchée est une date :
lig = .Range("AA:AA").Find(CDate(ComboBox_date_ancienne.Value), LookIn:=xlValues, lookat:=xlWhole).Row

Après pour revenir sur un commentaire de BrunoM45 vous pourriez écrire le code comme cela :

Private Sub ComboBox_date_ancienne_Change()
    Dim lig As Long

    On Error GoTo pb
    With ActiveSheet
        lig = .Range("AA:AA").Find(CDate(ComboBox_date_ancienne.Value), LookIn:=xlValues, lookat:=xlWhole).Row
        Me.TextBox_montant_course = .Cells(lig, "X").Value
        Exit Sub
    End With
pb:
    MsgBox "Date non trouvée"
End Sub

C'est plus propre et plus lisible (suppression des DIM inutileset ajout de lig en long !

@ bientôt

LouReeD

Bonsoir,
Une autre proposition non testée !?
Cdlt.

Private Sub ComboBox_date_ancienne_Change()
Dim vRow
    With ActiveSheet
        vRow = Application.Match(CDate(ComboBox_date_ancienne.Value), .Range("AA:AA"), 0)
        If IsError(vRow) Then
            MsgBox "Date non trouvée"
        Else
            Me.TextBox_montant_course = .Cells(vRow, "X").Value
        End If
    End With
End Sub

Bonjour LouReeD,

Merci pour le coup de main et la solution !

Petite question sur le "Dim lig As Long", comme je m'en sers à plusieurs reprises je l'avais écris dans le général et en "Integer".

Est-ce qu'il vaut mieux le replacer à chaque fois ? et pourquoi plutôt "Long" ?

Pour les autres "Dim" inutiles effectivement j'ai zappé de les virer.

Autre question, est-ce que sauter une ligne à chaque retour a une influence sur le code ?

A + ;)

Bonjour Jean-Eric,

Merci pour votre aide, mais après avoir testé votre code ne fonctionne pas.

Bonne journée ;)

Bonjour,

si le Lig est défini en public, nul besoin de le redéfinir, à la condition que pour chaque Sub il soit recalculé, sinon sa dernière valeur reste en mémoire, mais c'est peut être ce que vous cherchez à faire...

Pour ce qui est du Long c'est uniquement "par sécurité" car le Integer permet des valeur entières allant jusqu'à 32 767, et le Long permet d'aller à 2 147 483 647.
Comme les feuilles Excel admettent jusqu'à 1 048 576 lignes, en définissant une variable en Long pour les lignes on évite des erreurs de capacités ou de type.
mais si vôtre tableau ne dépassera pas les 32000 lignes alors le Integer suffit !

@ bientôt

LouReeD

Bonjour,
Pour le principe.
Cdlt.

3sotin.xlsm (23.37 Ko)

Re,

Merci beaucoup, c'est toujours bien de connaitre plusieurs solutions ;)

Bonne journée

Rechercher des sujets similaires à "remplissage controle dynamique"