Artoche
Messages postés1Date d'inscriptionlundi 31 mai 2010StatutMembreDernière intervention31 mai 2010
-
31 mai 2010 à 10:27
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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