Erreur code VBA
Bonjour a tous,
Je suis vraiment désolé de venir pour des choses qui sont pourtant basiques mais je suis vraiment bloqué..
J’ai une erreur 438 que je n’arrive pas à résoudre. Elle apparait lorsque je cliquer sur le bouton « Ajouter un incident » dans ma page « Formulaire », j’ai beau étudier le code vba dans tout les sens je n’arrive pas à trouver ce qui n’est pas bon.
Et dans ma feuille « Recherche » je n’arrive pas a comprendre ce qui ne fonctionne pas, j’ai pour tester recherché le N° de rapport « 5 » et au lieu de m’afficher dans la zone de résultat uniquement le rapport N°5 ca m’affiche tout. Mon but est qu’en fonction du critère de recherche ça m’affiche uniquement ceux qui correspondent à ce critère précis.
Pensez-vous que les erreurs viennent d’un souci de version ? Car ça serait très embêtant si c’était le cas.
Cdlt
T.M
Bonjour,
L’erreur 438 indique que vous appelez une fonction/propriété sur un objet qui ne l’a pas. Par exemple écrire “Range(“A1”).contenu” renvoie une erreur 438 car “.contenu” n’est pas une propriété de l’objet Range.
Pour revenir sur votre cas, vous avez écrit 2 With : le premier sur votre tableau BDD, et le 2e sur une cellule.
Sauf que, dans ce 2e with, vous faites appel au tableau du 1e with ! Mais entre temps vous avez fermé le bloc With du tableau, donc VBA ne comprends pas quand vous écrivez “.ListRows.Count” puisque cela renvoie sur votre range.
Il faut référencer complètement, càd, au lieu de :
indexRow = .ListRows.Count + 1écrire
indexRow = Sheets("Liste").ListObjects("BDD").ListRows.Count + 1De meme juste après,
If indexRow <= .ListRows.Count ThenEst
If indexRow <= Sheets("Liste").ListObjects("BDD").ListRows.Count ThenJe vous laisse corriger ces 2 lignes, tout à la fin de votre macro.
Une petite astuce : faites bien attention quand vous écrivez le code VBA, l’autocomplétition est votre amie. Si rien ne s’affiche quand vous écrivez “. Quelquechose” c’est que ce quelquechose ne colle pas. Vous pouvez faire apparaitre la liste des propriétés disponibles après un point en appuyant sur CTRL+ESPACE.
Bonjour,
Merci de votre réponse, j'ai fait les modifications que vous m'avez conseillé mais aie toujours les mêmes erreurs...
La modif fonctionne t-elle de votre côté ? Je n'arrive pas a comprendre..
Je découvre le VBA, l'IA m'aide pas mal mais c'est comme tout, tout a ses limites, il faut surtout le temps que j'arrive a bien comprendre le VBA.
Bonjour titipro
Sub Ajout_salarie()
' Ajout_salarié Macro
' Ajout d'un salarié dans la base de données
Dim nLig As Long, Réponse
With Sheets("Formulaire")
If .Range("D12") = "" Then MsgBox "Saisir le Nom et Prénom de la victime", vbExclamation: Exit Sub
If .Range("C15") = "" Then MsgBox "Saisir le N° de rapport", vbExclamation: Exit Sub
If .Range("C18") = "" Then MsgBox "Saisir date et heure sous le format JJ/MM/YY à HH:MM", vbExclamation: Exit Sub
If .Range("C21") = "" Then MsgBox "Saisir le Type", vbExclamation: Exit Sub
If .Range("C24") = "" Then MsgBox "Saisir le lieu normée", vbExclamation: Exit Sub
If .Range("C27") = "" Then MsgBox "Saisir l'Action normée", vbExclamation: Exit Sub
If .Range("E15") = "" Then MsgBox "Saisir le Siège 1", vbExclamation: Exit Sub
' Les champs E15, E18, et E21 sont maintenant facultatifs
If .Range("E27") = "" Then MsgBox "Saisir le nm de jours d'arret", vbExclamation: Exit Sub
End With
' Accès au tableau "BDD"
With Sheets("Liste").ListObjects("BDD")
Réponse = MsgBox("Validez-vous cette saisie ?", vbYesNo, "Attention !!!")
If Réponse = vbYes Then
.ListRows.Add
nLig = .ListRows.Count
.ListColumns("N^ sur le rapport").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("C15") ' N° Rapport
.ListColumns("Date Heure").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("C18") ' Date/heure
.ListColumns("Type").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("C21") ' Type
.ListColumns("Lieu").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("C24") ' Lieu Normé
.ListColumns("Action").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("C27") ' Action Normée
.ListColumns("Lésion 1").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("E15") ' Siège 1
.ListColumns("Lésion 2").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("E18") ' Siège 2
.ListColumns("Lésion 3").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("E21") ' Siège 3
.ListColumns("Lésion 4").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("E24") ' Siège 4
.ListColumns("Nbre de jours d'arrêt").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("E27") ' Nombre de Jours d'AT
.ListColumns("Action Détaillée").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("I19") ' Détail Action
.ListColumns("Lieu Exact").DataBodyRange(nLig).Value = Sheets("Formulaire").Range("I22") ' Détail Lieu
MsgBox "Saisie enregistrée !", vbInformation
Sheets("Formulaire").Range("C15,C18,C21,C24,C27,E15,E18,E21,E24,E27,I19,I22").ClearContents
End If
End With
End SubVous avez défini un tableau structuré (TS) ce qui est parfait mais vous vous pouvez en tirer partie dans votre code en utilisant les propriétés des TS, voir ci-dessous.
Pour la recherche, vous pourriez vous orienter vers powerquery, le seul code à écrire et à associer au bouton se résumerait à "ThisWorkbook.RefreshAll"
Cdlt,
Cylfo
Re,
Je me permets quelques suggestions (non exhaustives) par rapport à :
- l'onglet "Formulaire" : je vous préconise de mettre un format aux données à saisir et de contrôler le type de donnée avant l'enregistrement. Notamment dans "Date / Heure (format jj/mm/aaaa hh:mm)" vous pourriez mettre le format personnalisé "jj/mm/aaaa hh:mm" sans faire saisir le " à ", cela vous permettrait de renforcer le test lors de l'enregistrement en remplaçant
If .Range("C18") = "" Thenqui ne teste que la présence d'un caractère quelconque parIf IsDate(.Range('C18").Value) = False Thenqui testera que la valeur saisie est bien une date.
- L'onglet "Liste" :
- la colonne "Date" a un format de date, elle a l'apparence d'une date MAIS c'est du texte. Otez l'alignement "centrer" de la formule et la date se calera à gauche, une "vrai" date se calerait à droite comme les numériques (une date est un numérique). Si vous saisissez directement la date, elle se calera à droite.
- La formule "=SIERREUR(GAUCHE([@[Date Heure]];10);"Erreur") ne renverra jamais "Erreur", si la cellule contient une valeur quelconque, l'extraction ne provoquera pas d'erreur et si la cellule contient une valeur d'erreur celle-ci sera propagée
- Si vous avez absolument besoin de la partie entière de la date et heure =TRONQUE([@[Date Heure]]) vous renverra une valeur date sans les heures (date = partie entière, les heures = partie décimale). La colonne "Heure" =[@[Date Heure]]-[@Date].
- la colonne "Saison" utilise des SI imbriqués, SI.CONDITIONS offre une alternative qui permet de rendre plus lisible les formules, par exemple :
- =SI(C2="";"";SI(ET(MOIS(C2)=12; JOUR(C2)>=21) + OU(MOIS(C2)<3) + ET(MOIS(C2)=3; JOUR(C2)<20);"Hiver";
SI(ET(MOIS(C2)=3; JOUR(C2)>=20) + ET(MOIS(C2)<6) + ET(MOIS(C2)=6; JOUR(C2)<21);"Printemps";
SI(ET(MOIS(C2)=6; JOUR(C2)>=21) + ET(MOIS(C2)<9) + ET(MOIS(C2)=9; JOUR(C2)<22);"Été";
"Automne")))) - =SI.CONDITIONS(TEXTE([@Date];"MMJJ")<"0321";"Hiver";TEXTE([@Date];"MMJJ")<"0621";"Printemps";TEXTE([@Date];"MMJJ")<"0921";"Été";TEXTE([@Date];"MMJJ")<"1221";"Automne";1=1;"Hiver")
- =SI(C2="";"";SI(ET(MOIS(C2)=12; JOUR(C2)>=21) + OU(MOIS(C2)<3) + ET(MOIS(C2)=3; JOUR(C2)<20);"Hiver";
- la colonne "Date" a un format de date, elle a l'apparence d'une date MAIS c'est du texte. Otez l'alignement "centrer" de la formule et la date se calera à gauche, une "vrai" date se calerait à droite comme les numériques (une date est un numérique). Si vous saisissez directement la date, elle se calera à droite.
Cdlt,
Cylfo