IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

userform en cascade avec combox cascade [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut userform en cascade avec combox cascade
    bonjour,

    me revoila avec un nouveau pb

    j'ai un usf1 saisie vente, dans celui-ci une fois rentré le nom et prenom, je fais une recherche pour savoir si variablenomprenon existe dans la feuille Clients de facon a remplir les autres champs de maniere automatique. si doublons sur variable nomprenom alors ouverture de usf12 "plusieurs occurences".
    l'usf12 reprend le nom et le prenom et affiche deux combobox en cascade pour selectionner ville et ensuite adresse stockées dans une feuille Temp2.
    et c'est la que je coince les deux combobox sont vides.

    pour info le code pour les combobox est tiré d'un article sur le net et qui fonctionne dans un fichier test mais pas dans le mien.

    un peu d'aide svp merci

    code pour remplissage automatique usf1 saisie vente
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
     
    ' test de remplissage automatique
     
    Private Sub TextBox3Prenom_AfterUpdate()
    'Private Sub TextBox21Ville_AfterUpdate()
    Dim c As Range
    Dim Lig As Long
    Dim VarNomPrenomVille As String
    Dim VarNomPrenom As String
    Dim cDest As Range
    Dim LastLig As Long
    Dim DerLig As Long
    Dim DerLig2 As Long
     
    VarNomPrenomVille = TextBox2Nom.Value + TextBox3Prenom.Value + TextBox21Ville.Value
    VarNomPrenom = TextBox2Nom.Value + TextBox3Prenom.Value
     
     
    With Worksheets("DoublonsTemp")
        ' effacement données temporaires des données clients en doublon sur 100 lignes
        .Range("A2:P100").ClearContents
        ' cdest : la cellulle de destination : premiere cellule vide de la colonne A de la feuille "DoublonsTemp"
        Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
    End With
     
    With Worksheets("Clients")
        ' on va copier dans feuille "DoublonsTemp" toute les lignes de la feuille clients
        ' dont la colonne K VarNomPrenom correspond au nom + prenom entrés dans usf1 "nouvelle vente"
     
        ' on enlève éventuel filtre automatique
        .AutoFilterMode = False
        ' LastLig  ligne de la derniere cellule remplie de la colonne K (NomPrenom) de la feuille "Clients"
        LastLig = .Cells(.Rows.Count, "K").End(xlUp).Row
        ' on fait un filtre automatique sur la colonne K de la feuille "Clients" avec comme critère VarNomPrenom
        .Range("K1:K" & LastLig).AutoFilter field:=1, Criteria1:=VarNomPrenom
        ' si au moins une ligne résultat du filtre (en plus de la ligne1 des titres)
        If .Range("K1:K" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            With .Range("K2:K" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                ' on copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                .Copy cDest
            End With
        End If
    End With
     
     
    ' je remplis les label Nom et prenom de Usf12
    UserForm12.Label6.Caption = UserForm1.TextBox2Nom.Value
    UserForm12.Label7.Caption = UserForm1.TextBox3Prenom.Value
     
    ' supprime donés existantes dans les combobox 1 et 2 de usf12
        UserForm12.ComboBox1.Clear
        UserForm12.ComboBox2.Clear
     
    ' je determine la derniere ligne de la colonne I (ville) de la feuille "DoublonsTemp"
    'With Worksheets("Doublonstemp")
        'DerLig = .Cells(.Rows.Count, "I").End(xlUp).Row
    'End With
     
     
    ' copie des colonnes I Ville et F Adresse1 de la feuille "DoublonsTemp"
    ' dans les colonnes A Ville et B Adresse1 de la feuille "Temp2"
    ' pour alimenter en cascade les combobox 1 et 2 de usf12
    Worksheets("DoublonsTemp").Range("I2:I100").Copy Worksheets("Temp2").Range("A2")
    Worksheets("DoublonsTemp").Range("F2:F100").Copy Worksheets("Temp2").Range("B2")
     
    ' tri des données de la feuille "Temp2" critère Ville ascendant
    With Worksheets("Temp2")
        .Range("A2:B100").Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2"), Order2:=xlAscending, Header:=xlGuess
    End With
     
     
    'affichage de usf12
    UserForm12.Show
     
    End Sub


    code de l usf12 pour combobox en cascade

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Temp2")
        'Définit le nombre de lignes dans la colonne A
        NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    Private Sub ComboBox2_Change()
        'Remplissage Combo3
        Alim_Combo 3, ComboBox2.Value
    End Sub
     
     
    Private Sub ComboBox3_Change()
     
    End Sub
        'Remplissage Combo4
        Alim_Combo 4, ComboBox3.Value
    End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Obj As Control
     
        'Définit le ComboBox à remplir
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Obj.Clear
     
        'alimente le Combobox initial (Combobox1)
        If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            For j = 2 To NbLignes
                Obj = Ws.Range("A" & j)
                'Remplit le ComboBox sans doublons
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
            Next j
        Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
            For j = 2 To NbLignes
                If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       End If
     
       'Enlève la sélection dans le ComboBox
       Obj.ListIndex = -1
    End Sub

  2. #2
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    bonjour,

    alors voilà, après de nombreuses heures a fouiller dans les forums et a essayer des variantes de mon code j'y suis arrivé !
    voici ci dessous les bouts de code corrigés pour ceux que cela interesse :

    bout de code pour remplissage automatique usf1 saisie vente

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    ' test de remplissage automatique
     
    Private Sub TextBox3Prenom_AfterUpdate()
     
    Dim c As Range
    Dim Lig As Long
    Dim VarNomPrenomVille As String
    Dim VarNomPrenom As String
    Dim cDest As Range
    Dim LastLig As Long
    Dim DerLig As Long
    Dim DerLig2 As Long
     
    VarNomPrenomVille = TextBox2Nom.Value + TextBox3Prenom.Value + TextBox21Ville.Value
    VarNomPrenom = TextBox2Nom.Value + TextBox3Prenom.Value
     
     
    With Worksheets("DoublonsTemp")
        ' effacement données temporaires des données clients en doublon sur 100 lignes
        .Range("A2:P100").ClearContents
        ' cdest : la cellulle de destination : premiere cellule vide de la colonne A de la feuille "DoublonsTemp"
        Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
    End With
     
    With Worksheets("Clients")
        ' on va copier dans feuille "DoublonsTemp" toute les lignes de la feuille clients
        ' dont la colonne K VarNomPrenom correspond au nom + prenom entrés dans usf1 "nouvelle vente"
     
        ' on enlève éventuel filtre automatique
        .AutoFilterMode = False
        ' LastLig  ligne de la derniere cellule remplie de la colonne K (NomPrenom) de la feuille "Clients"
        LastLig = .Cells(.Rows.Count, "K").End(xlUp).Row
        ' on fait un filtre automatique sur la colonne K de la feuille "Clients" avec comme critère VarNomPrenom
        .Range("K1:K" & LastLig).AutoFilter field:=1, Criteria1:=VarNomPrenom
        ' si au moins une ligne résultat du filtre (en plus de la ligne1 des titres)
        If .Range("K1:K" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            With .Range("K2:K" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                ' on copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                .Copy cDest
            End With
        End If
    End With
     
     
    ' je remplis les label Nom et prenom de Usf12
    UserForm12.Label6.Caption = UserForm1.TextBox2Nom.Value
    UserForm12.Label7.Caption = UserForm1.TextBox3Prenom.Value
     
    ' supprime donés existantes dans les combobox 1 et 2 de usf12
        UserForm12.ComboBox1.Clear
        UserForm12.ComboBox2.Clear
     
    ' je determine la derniere ligne de la colonne I (ville) de la feuille "DoublonsTemp"
    'With Worksheets("Doublonstemp")
        'DerLig = .Cells(.Rows.Count, "I").End(xlUp).Row
    'End With
     
     
    ' copie des colonnes I Ville et F Adresse1 de la feuille "DoublonsTemp"
    ' dans les colonnes A Ville et B Adresse1 de la feuille "Temp2"
    ' pour alimenter en cascade les combobox 1 et 2 de usf12
    Worksheets("DoublonsTemp").Range("I2:I100").Copy Worksheets("Temp2").Range("A2")
    Worksheets("DoublonsTemp").Range("F2:F100").Copy Worksheets("Temp2").Range("B2")
     
    ' tri des données de la feuille "Temp2" critère Ville ascendant
    With Worksheets("Temp2")
        .Range("A2:B100").Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2"), Order2:=xlAscending, Header:=xlGuess
    End With
     
     
    'Définit la feuille contenant les données pour alimenter les combobox de usf12
    With Worksheets("Temp2")
     
        Dim NbLignes As Integer
        Dim i As Integer
        'Dim Plage As String
        'Dim Cell As Range
        'Dim Var1 As Integer
        Dim Varcbx1 As String
        Dim j As Integer
     
        'Définit le nombre de lignes dans la colonne A
        NbLignes = .Range("A65536").End(xlUp).Row
     
     
        'Remplissage du ComboBox1 de usf12
        ' avec filtrage des doublons en en laissant une occurence
     
        ' il en découlera le remplissage de combobox2 usf12     le code dans le usf12
     
        For i = 1 To Sheets("Temp2").Range("A65536").End(xlUp).Row
        UserForm12.ComboBox1 = Sheets("Temp2").Range("A" & i)
        If UserForm12.ComboBox1.ListIndex = -1 Then UserForm12.ComboBox1.AddItem Sheets("Temp2").Range("A" & i)
        Next i
     
    ' ci dessous fonctionne mais ne filtre pas les doublons
    'Plage = .Range("A2:A" & .Range("A65536").End(xlUp).Row).Address
    'UserForm12.ComboBox1.RowSource = "Temp2!" & Plage
     
    End With
     
    'affichage de usf12
    UserForm12.Show
     
     
    End Sub

    code de l usf12 pour combobox en cascade

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Temp2")
        'Définit le nombre de lignes dans la colonne A
        NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        'Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    'Private Sub ComboBox2_Change()
        'Remplissage Combo3
        'Alim_Combo 3, ComboBox2.Value
    'End Sub
     
     
    'Private Sub ComboBox3_Change()
     
     
        'Remplissage Combo4
        'Alim_Combo 4, ComboBox3.Value
    'End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Obj As Control
     
        'Définit le ComboBox à remplir
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Obj.Clear
     
        'alimente le Combobox initial (Combobox1)
        If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            For j = 2 To NbLignes
                Obj = Ws.Range("A" & j)
                'Remplit le ComboBox sans doublons
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
            Next j
        Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
            For j = 2 To NbLignes
                If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       End If
     
       'Enlève la sélection dans le ComboBox
       Obj.ListIndex = -1
    End Sub
    voila je n'avais pas saisie la subtilité.
    je devais alimenter la combobox1 a partir de usf1, ensuite la ccombobox2 de usf12 est alimentée a partir du code de usf12.


    encore une fois merci a moi même pour avoir été aussi tenace


    PS je sais mon code est peut etre pas au top, je devrais pouvoir faire plus court, mais il fonctionne

  3. #3
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    bonjour, je suis toujours sur le sujet avec un nouveau pb en perspective

    voila pourquoi je n'ai pas notifié : sujet résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/12/2007, 15h31
  2. Problème avec les CASCADE
    Par figolu47 dans le forum DB2
    Réponses: 4
    Dernier message: 24/06/2007, 20h16
  3. CASCADE avec Innodb
    Par bigltnt dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/03/2007, 17h22
  4. [VBA-E] ComboBox en cascade avec correspondance dans matrice
    Par ViperSpy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2006, 17h01
  5. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo