[Catégorie modifiée .Net --> VBA] Problème Combobox

Artoche Messages postés 1 Date d'inscription lundi 31 mai 2010 Statut Membre Dernière intervention 31 mai 2010 - 31 mai 2010 à 10:27
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 31 mai 2010 à 11:44
Bonjour à tous,
J'ai un problème avec la Base de Données que je souhaite créer en VBA sur Excel 2003. Cela fait plus d'une semaine que je bloque, que je potasse tous les tutoriels existants, les forums mais je n'arrive toujorus pas. J'ai recommencé depuis le début une fois et là je bloque à nouveau sur le même problème.
Lorsque je mets les "additem" pour ajouter des choix dans ma combobox, en simulation j'obtient toujours une erreur 91 avec la variable objet ou with non définie... Je ne comprends pas. Quelqu'un peut-il me corriger mon code s'il vous plait, je craque là. Merci à tous ceux qui prendront le temps,
Cordialement,


Option Explicit
Dim WS As Worksheet   'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de ce UserForm
Dim Nom As String     'Variable poyr récupérer l'ancienne valeur pour le Bouton Modif
Dim rgan As Range
Const T As String = "Ajout Nouvelles Données"

Private Sub BoutQuitte_Click()
Unload Me
Feuil1.Activate
End Sub

Private Sub CmbNom_Click()

If Me.CmbNom.ListIndex = -1 Then Exit Sub 'ON sort si pas de sélection
Txt11 = WS.Range("B" & Me.CmbNom.ListIndex + 2) 'On alimente les données correspondant à la ligne
Txt12 = WS.Range("C" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt1 = WS.Range("D" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt2 = WS.Range("E" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt3 = WS.Range("B" & Me.CmbNom.ListIndex + 2) 'On alimente les données correspondant à la ligne
Txt4 = WS.Range("C" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt5 = WS.Range("D" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt6 = WS.Range("E" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt7 = WS.Range("B" & Me.CmbNom.ListIndex + 2) 'On alimente les données correspondant à la ligne
Txt8 = WS.Range("C" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt9 = WS.Range("D" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille
Txt10 = WS.Range("E" & Me.CmbNom.ListIndex + 2) 'de l'index de la Combobox + 2 pour la ligne de Feuille

'ici on initialise les Variable pour mémoriser le valeur précédente en cas de Modif
With Me
Nom = .CmbNom
End With
End Sub

Private Sub CmdAjout_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Integer 'Variable pour connaitre le numéro de derniere ligne vide
Dim X As Integer, i As Integer 'Variables pour faire la boucle de checking de Duplication
Dim Response As Byte
Dim Match As Byte


L = WS.Range("A65536").End(xlUp).Row + 1 ' On identifie la dernière ligne vide en partant du bas

'ici un Control de Duplication
For X = 2 To L
If CmbNom = WS.Range("A" & X) Then
Match Match + 1: i X
End If
Next X

'Si il y a Duplication on demande en montrant les détails de la Duplication
If Match > 0 Then
    Response = MsgBox("Duplication trouvée dans la Database pour : " & CmbNom & vbCrLf & _
                  "Nom : " & vbTab & vbTab & WS.Cells(i, 1) & vbCrLf & _
                  "Voulez-Vous Intégrer cet enregistrement ?", vbQuestion + vbOKCancel, T)
                  
            If Response = 1 Then
            GoTo Suite 'On suit le déroulement si réponse OK
            Else: GoTo Fin                  'Sinon On sort
            End If
End If

Suite:
'ici avec la Feuille on va faire :
With WS
    .Range("A" & L) = CmbNom            ' On écrit dans chaque colonne les valeurs des différents controls
    .Range("B" & L) = Txt11              ' Idem
    .Range("C" & L) = Txt12             ' Idem
    .Range("D" & L) = Txt1
    .Range("E" & L) = Txt2             ' Idem
    .Range("f" & L) = Txt3              ' Idem
    .Range("G" & L) = Txt4             ' Idem
    .Range("H" & L) = Txt5
    .Range("I" & L) = Txt6             ' Idem
    .Range("J" & L) = Txt7              ' Idem
    .Range("K" & L) = Txt8            ' Idem
    .Range("L" & L) = Txt9
    .Range("M" & L) = Txt10             ' Idem

End With
Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

Fin:

End Sub

Private Sub CmdEdit_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim i As Integer
Dim Response As Byte



'Si le User tente de change le nom de la ComboBox en Mode Modification
If Me.CmbNom.ListIndex = -1 Then
Exit Sub 'ON sort si pas de sélection
End If

'Ici un message demandant d'accepter les changement en les listant
Response = MsgBox("Acceptez vous les changements ? ", vbQuestion + vbOKCancel, T & " Modification de : " & Nom)
'Si Réponse OK on continue
If Response = 1 Then

    'ici avec la Feuille on va faire :
With WS
     .Range("A" & Me.CmbNom.ListIndex + 2) = CmbNom            ' On écrit dans chaque colonne les valeurs des différents controls
     .Range("B" & Me.CmbNom.ListIndex + 2) = Txt11              ' Idem
     .Range("C" & Me.CmbNom.ListIndex + 2) = Txt12             ' Idem
     .Range("D" & Me.CmbNom.ListIndex + 2) = Txt1
     .Range("E" & Me.CmbNom.ListIndex + 2) = Txt2             ' Idem
     .Range("F" & Me.CmbNom.ListIndex + 2) = Txt3              ' Idem
     .Range("G" & Me.CmbNom.ListIndex + 2) = Txt4             ' Idem
     .Range("H" & Me.CmbNom.ListIndex + 2) = Txt5
     .Range("I" & Me.CmbNom.ListIndex + 2) = Txt6             ' Idem
     .Range("J" & Me.CmbNom.ListIndex + 2) = Txt7              ' Idem
     .Range("K" & Me.CmbNom.ListIndex + 2) = Txt8             ' Idem
     .Range("L" & Me.CmbNom.ListIndex + 2) = Txt9
     .Range("M" & Me.CmbNom.ListIndex + 2) = Txt10             ' Idem

End With 'On evoie un message de confirmation
MsgBox "Opération accomplie", vbInformation, T

Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

'Si Réponse Annulation on envoie un message et on a rien fait
Else: MsgBox "Opération annulée", vbInformation, T
End If

End Sub

Private Sub CmdSup_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim i As Integer
Dim Response As Byte
If Me.CmbNom.ListIndex = -1 Then Exit Sub

'Ici un message demandant d'accepter la suppression en les listant
Response = MsgBox("Les coordonnées de " & vbCrLf & vbCrLf & _
                   "Nom : " & vbTab & vbTab & CmbNom & vbCrLf & vbCrLf & _
                   "Vont être définitivement Supprimées ? ", vbCritical + vbOKCancel, T)

'Si Réponse OK on continue
If Response = 1 Then

    'ici avec la Feuille on va faire :
    With WS
     .Rows(Me.CmbNom.ListIndex + 2).EntireRow.Delete
    End With
'On evoie un message de confirmation
MsgBox "Opération accomplie", vbInformation, T
Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

'Si Réponse Annulation on envoie un message et on a rien fait
Else: MsgBox "Opération annulée", vbInformation, T
End If

End Sub

Private Sub CommandButton1_Click()
Ini
End Sub



Private Sub Txt11_Change()

End Sub

Private Sub Txt12_Change()

End Sub

Private Sub Txt4_Change()

End Sub

Private Sub Txt5_Change()

End Sub

' A l'activation on démarre le focus sur la Première Combobox
Private Sub UserForm_Activate()
Me.CmbNom.SetFocus

    With CmbNom
    .AddItem "Ingrédients"
    .AddItem "Emballages"
    .AddItem "Techniques"
    End With
    
End Sub


Private Sub Ini()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Integer    'Variable pour connaitre le numéro de derniere ligne
Dim i As Integer    'Variable pour connaitre incrémenter les Data
'On Vide tous les Controls
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
CTRL = ""
End If
Next CTRL
Me.CmbNom.Clear 'On vide les précédentes données
Set WS = ThisWorkbook.Sheets("Base") 'On identifie l'objet pour la feuille de travail
L = WS.Range("A65536").End(xlUp).Row    'On identifie la dernière ligne en partant du bas

'Pour éviter les fash d'écran pour le select ci dessous
Application.ScreenUpdating = False
    WS.Select 'On sélectionne la feuille sinon bug si elle ne l'est pas
    WS.Range("A2").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess 'Le Sort



Application.ScreenUpdating = True
End Sub

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mai 2010 à 11:29
Salut
Et où se situe l'erreur ?

Je vois beaucoup d'à peu près qui peuvent gêner le compilateur :
Txt11 =  WS.Range("B" & Me.CmbNom.ListIndex + 2)
-1- Il est très dangereux d'utiliser une syntaxe qui pointe sur l'index actuel + 2 : Et si ListIndex est le dernier ? --> Erreur assurée
+ On est bien d'accord, Me.CmbNom.ListIndex + 2 fournira un chiffre et pas le contenu de l'item pointé
-2- Que représentent Txt11 ?
Une TextBox ? --> Dans ce cas, la syntaxe est Txt11 .Text
-3- La syntaxe Range est incomplète --> Range(...).Value
-4- Tel que tu l'as dimensionnée, WS est sensé représenter une feuille, mais laquelle ?
Manque un Set WS = ActiveSheet
ou Set WS = Sheets("le nom de ma feuille")

With Me
Nom = .CmbNom
End With
-1- Faire un With pour une seule instruction, je ne vois pas trop l'intérêt
-2- La syntaxe est incomplète : Nom = .CmbNom.Text

Fais ces corrections dans tout ton code et dis nous où se situe l'erreur

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mai 2010 à 11:39
Je n'avais pas tout lu.
WS est bien défini, dans la Sub Ini
Es-tu sûr d'être passé dans cette Sub avant de l'utiliser ailleurs ?

Dans cette même Sub Ini :
CTRL = ""
n'a aucun sens : Tu t'adresse à un objet, pas à une chaine.
Que veux-tu faire ?
Supprimer cet Item ? --> Me.Controls.Remove CTRL.Name
mais ça supprimera toutes tes TextBox et tes ComboBox : Si ensuite tu tentes de t'adresser à CmbNom, tu auras des surprises.
Si tu dois vider leur contenu, il faut utiliser une syntaxe complète :
CTRL.Text = "" pour les TextBox
CTRL.Clear pour les ComboBox
Il te faudra donc séparer ton If en deux
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mai 2010 à 11:44
Mieux vaut utiliser les constantes de VB = clarté du code :
If Response = vbOk Then
0
Rejoignez-nous