Erreur 424 objet requis
Bonjour à tous
Je rencontre un problème à l'ouverture d'un userform.
Depuis mon userform Menu, j'ouvre un 2nd userform mais j'ai un message d'erreur "Erreur 424 Objet requis". Je ne comprend pas le pb. C'est à l'ouverture du formulaire "frmCriteres"
Voici le code :
Private Sub CmdCriteres_Click()
frmCriteres.Show
End Sub
Private Sub CmdEmbauche_Click()
frmSaisie.Show
End Sub
Private Sub CmdFiche_Click()
frmFiche.Show
End Sub
Private Sub CmdQuitter_Click()
With ActiveWorkbook
.Save ' enregistre
Unload Me
End With
End Sub
Merci beaucoup de vos lumières.
Bonjour,
L'explication se trouve très certainement dans le code du formulaire "frmCriteres"
A+
Bonjour Frangy,
Merci pour ton aide.
Voici le code du formulaire frmCriteres
Private Sub UserForm_Initialize()
Label10.Caption = Format(Date, "dd/mm/yyyy")
Me.ListBox1.List = [liste].Value
Me.ListBox1.ColumnWidths = temp
With Sheets("bdd")
Me.ListBox1.List = .Range("A2:B" & .[A65000].End(xlUp).Row).Value
End With
a = Me.ListBox1.List
NbCol = UBound(a, 2) - LBound(a, 2) + 1 ' nb de colonnes
Call tri(a, LBound(a), UBound(a), NbCol, 0)
Me.ListBox1.List = a
CboStatut.AddItem "Titulaire"
CboStatut.AddItem "Non titulaire"
CboNatcontrat.AddItem "CDI"
CboNatcontrat.AddItem "CDD"
CboAffectation.RowSource = ("code!Affectacuisine")
CboAffectation.ListIndex = -1
CboPortage.RowSource = ("code!Affectacuisine")
CboPortage.ListIndex = -1
CboHorairecont.AddItem "5"
CboHorairecont.AddItem "6"
CboHorairecont.AddItem "7"
CboHorairecont.AddItem "151,67"
CboSS.RowSource = ("bdd!ss")
ComboBox3.AddItem "1"
ComboBox3.AddItem "5"
ComboBox4.AddItem "Française"
ComboBox4.AddItem "Union européenne"
ComboBox4.AddItem "Hors UE"
End Sub
Sub tri(a, gauc, droi, NbCol, colTri) ' Quick sort
ref = a((gauc + droi) \ 2, colTri)
g = gauc: d = droi
Do
Do While a(g, colTri) < ref: g = g + 1: Loop
Do While ref < a(d, colTri): d = d - 1: Loop
If g <= d Then
For c = 0 To NbCol - 1
temp = a(g, c): a(g, c) = a(d, c): a(d, c) = temp
Next
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi, NbCol, colTri)
If gauc < d Then Call tri(a, gauc, d, NbCol, colTri)
End Sub
Private Sub Optionpresents_Change()
Criteres = Criteres & "(bdd!Z2 = """ & "" & """) * "
Criteres = "=" & Criteres & "1"
Sheets("filtre").Range("A2").Value = Criteres
'on utilise ensuite les critères de choix dans un filtre élaboré sur une feuille masquée
Sheets("filtre").Activate
Range("zonebdd").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4:AS4"), Unique:=False
If Range("filtre!A5").Value <> "" Then
ActiveWorkbook.Names.Add Name:="Fiche", RefersToR1C1:= _
"=OFFSET(filtre!R5C2,,,COUNTA(filtre!C2)-1)"
Me.ListBox1.Clear
Me.ListBox1.List = [liste].Value
With Sheets("filtre")
Me.ListBox1.List = .Range("A5:B" & .[A65000].End(xlUp).Row).Value
End With
Me.ListBox1.ColumnWidths = temp
a = Me.ListBox1.List
NbCol = UBound(a, 2) - LBound(a, 2) + 1 ' nb de colonnes
Call tri(a, LBound(a), UBound(a), NbCol, 0)
Me.ListBox1.List = a
End If
End Sub
Private Sub TextBox1_Change()
TextBox1 = UCase(TextBox1)
Me.ListBox1.Clear
i = 0
For Each c In Application.Index([liste], , 1)
If UCase(c) Like UCase(Me.TextBox1) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(i, 0) = c.Value
Me.ListBox1.List(i, 1) = c.Offset(, 1).Value
i = i + 1
End If
Next c
End Sub
Private Sub ListBox1_Click()
'dès que l'on clique sur le titre de la recette, on affiche dans le formulaire usfaffiche
'les données de cette recette.
NumNom = ListBox1.Value
With Sheets("bdd").Range("a:a")
'on commence par rechercher dans la table de de données le N° de ligne correspondant
'au titre sélectionné
Set c = .Find(NumNom, LookIn:=xlValues, LookAt:=xlWhole)
'la variable Lig, correspondant au numéro de la ligne trouvée, est définie comme une variable
'publique dans le module général déclarations. Ceci permet de passer sa valeur d'un userform à un autre.
If Not c Is Nothing Then Lig = c.Row
End With
frmFiche.Caption = Range("bdd!A" & Lig).Value
frmFiche.ComboBox1.Value = Range("bdd!A" & Lig).Value
frmFiche.Show
End Sub
Private Sub CmdVoir_Click()
'on récupère les différents critères de choix demandés et on construit un critère composé
'qui sera utilisée dans un filtre élaboré,
'voyez la page pap-filtreelaboré sur excelabo pour comprendre l'utilisation du filtre élaboré.
'attention dans la construction du critère à bien indiquer sur quelle feuille est la base
'de données. N'oubliez pas que dans le filtre on fait référence à l'adresse de la première valeur
'de la colonne et non à celle de l'étiquette. Ici la table est en feuille "cuisine" avec les
'étiquettes de champ en ligne 1 et la première fiche en ligne 2. Le critère devra par conséquent
'faire référence à "cuisine!I2" pour un critère portant sur le temps de préparation.
'dans la construction du critère, on cherche tous les champs remplis et on va multiplier les
'critères entre eux pour imposer que toutes les conditions demandées soient remplies. d'où
'le signe * en fin de critère pour préparer le suivant.
'attention une même recette peut être utilisée dans plusieurs occasions
'il faut donc que le critère permette de trouver par exemple le mot buffet
'au milieu de plusieurs autres.
'On utilise pour cela la fonction trouve que l'on traduit en VBA
'Type de plat
If CboStatut.ListIndex <> -1 Then
statut = CboStatut.Value
Criteres = Criteres & "(bdd!H2 = """ & statut & """) * "
End If
'Type de contrat
If CboNatcontrat.ListIndex <> -1 Then
contrat = CboNatcontrat.Value
Criteres = Criteres & "(bdd!AA2 = """ & contrat & """) * "
End If
'Type de contrat
If CboAffectation.ListIndex <> -1 Then
Affectation = CboAffectation.Value
Criteres = Criteres & "(bdd!X2 = """ & Affectation & """) * "
End If
'Type de contrat
If CboPortage.ListIndex <> -1 Then
Portage = CboPortage.Value
Criteres = Criteres & "(bdd!X2 = """ & Portage & """) * "
End If
'Type de contrat
If CboHorairecont.ListIndex <> -1 Then
Horairecont = CboHorairecont.Value
Criteres = Criteres & "(bdd!Q2 = """ & Horairecont & """) * "
End If
'Type de contrat
If CboSS.ListIndex <> -1 Then
secu = CboSS.Value
Criteres = Criteres & "(bdd!G2 = """ & secu & """) * "
End If
'Type de contrat
If ComboBox3.ListIndex <> -1 Then
Ancienneté = ComboBox3.Value
Criteres = Criteres & "(bdd!AN2 = """ & Ancienneté & """) * "
End If
If OptionButton3.Value = True Then
Médaillés = OptionButton3.Value
Criteres = Criteres & "(bdd!AI2 <> """ & "" & """) * "
End If
If Optiontous.Value = True Then
tous = Optiontous.Value
Criteres = Criteres & "(bdd!A2 <> """ & "" & """) * "
Else
If Optionpresents.Value = True Then
presents = Optionpresents.Value
Criteres = Criteres & "(bdd!Z2 = """ & "" & """) * "
End If
End If
If OptionButton1.Value = True Then
Féminin = OptionButton1.Value
Criteres = Criteres & "(bdd!AH2 = """ & "Féminin" & """) * "
Else
If OptionButton2.Value = True Then
Masculin = OptionButton2.Value
Criteres = Criteres & "(bdd!AH2 = """ & "Masculin" & """) * "
End If
End If
'à ce stade le critère se termine par *... On ajoute donc un 1. Un critère renvoie normalement
'vrai ou faux. En le multipliant par 1 il renvoie 1 ou 0 ce qui est inter^rété de la même façon par excel.
Criteres = "=" & Criteres & "1"
Sheets("filtre").Range("A2").Value = Criteres
'on utilise ensuite les critères de choix dans un filtre élaboré sur une feuille masquée
Sheets("filtre").Activate
Range("zonebdd").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4:AS4"), Unique:=False
'Si aucune recette ne correspond aux critères
If Range("filtre!A5").Value = "" Then
MsgBox ("Aucun nom ne répond à tous vos critères")
'S'il y a plus d'une recette répondant au critère autrement dit si B6 non vide
'on réaffiche les recettes dans une zone de liste pour en faire choisir une à l'utilisateur
'pour cela on nomme "Fiches Filtrées" la plage contenant les titres sélectionnés.
'Il y a plusieurs façons de faire pour indiquer les coordonnées de cette plage. Ici j'ai choisi
'la fonction décaler (offset en VBA)
ElseIf Range("filtre!A5").Value <> "" Then
ActiveWorkbook.Names.Add Name:="Fiche", RefersToR1C1:= _
"=OFFSET(filtre!R5C2,,,COUNTA(filtre!C2)-1)"
Unload frmCriteres
frmSelect.Show
'sinon on récupère son numéro de ligne et on affiche la recette dans le userform UsfAffiche
Else
nom = Range("A5").Value
With Sheets("bdd").Range("A:A")
Set c = .Find(Titre, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then Lig = c.Row
End With
frmFiche.Show
End If
End Sub
Pour trouver la ligne de code où se situe le problème, tu te positionnes dans la procédure CmdCriteres puis tu déroules le programme en pas à pas avec la touche F8.
Si tu ne trouves pas, fais suivre ton classeur.
A+
Merci de ton aide.
En fait j'ai trouvé d'où venait le problème. Ce sont mes listes nommées qui s'étaient modifiées toutes seules. A la place de bdd!$A$2, j'avais bdd!#REF.
Comment cela se fait-il ? Juste pour info ?
Peut-être suite à une suppression de cellules, de ligne ou de colonne.
A+