Erreur à l'ouverture d'un UserForm
Bonjour à tous !!
Je fais face aujourd'hui à un problème lors de l'ouverture d'un UserForm sur un fichier créé il y a assez longtemps et pour lequel l'UserForm se lançait sans problème auparavant. Quelque chose ne fonctionne plus mais quoi ?
Je m'explique, lorsque je tente de lancer la macro :
Sub Synthèse_Risque_Par_Client()
Clients_Lignes.Show
End SubJ'obtiens le message suivant : "Erreur d'exécution '13' : Incompatibilité de type" faisant référence à la ligne "Clients_Lignes.Show"
Je précise que le nom Clients_Lignes est bien celui de l'UserForm.
Après quelques recherches sur Internet, cela pourrait être un problème de définition des variables dans userform_initialize()
Mon code est le suivant :
'=======> Procédure qui crée autant de checkbox que de clients <=======
Private Sub userform_initialize()
Dim Boite As Control
Dim i As Integer, j As Integer, k As Integer
Dim no As Integer, nbCTRL As Integer, Nb As Integer
Dim NomClient() As String
no = 0 'no est la variable d'incrémentation qui détermine la hauteur des checkbox
Nb = 0 'nb est la variable d'incrémentation qui permet de décaler d'une colonne toutes les 15 checkbox
nbCTRL = 0 'nbCTRL compte au fur et à mesure le nombre de checkbox créée afin de déterminer quand on doit changer de colonne
NbClientsLignes = 1
ReDim Preserve NomClient(NbClientsLignes)
NomClient(1) = ""
j = 2
For i = 1 To 10000
If Cells(i, 19).Value = "Actualiser les totaux" Then
If Not IsEmpty(Cells(i - 5, 19)) Then
If Cells(i - 5, 19).Value <> NomClient(j - 1) Then
NbClientsLignes = NbClientsLignes + 1
ReDim Preserve NomClient(NbClientsLignes)
NomClient(j) = Cells(i - 5, 19).Value
j = j + 1
End If
End If
End If
Next
For i = 2 To NbClientsLignes
no = no + 1
nbCTRL = nbCTRL + 1
If nbCTRL = 13 Then
Nb = 1
no = no - 12
End If
If nbCTRL = 25 Then
Nb = 2
no = no - 12
End If
If nbCTRL = 37 Then
Nb = 3
no = no - 12
End If
If nbCTRL = 49 Then
Nb = 4
no = no - 12
End If
If nbCTRL = 61 Then
Nb = 5
no = no - 12
End If
Set Boite = Clients_Lignes.Controls.Add("forms.checkbox.1")
With Boite
.Name = "checkbox" & i
.Caption = NomClient(i)
.Left = 30 + 115 * Nb
.Top = 60 + 15 * no
.WordWrap = False
'.AutoSize = True
.BackStyle = 0
.BackColor = &HFFFFFF
.ForeColor = &H0&
.Font.Bold = True
'.Value = False
End With
Next
End SubJe pourrais éventuellement joindre le fichier complet mais il contient de nombreuses données confidentielles, donc si quelqu'un voit directement une grosse bourde dans le code ci-dessus ...
Merci à ceux qui prendront un peu de temps pour essayer de m'aider à résoudre ce mystère !!
Bonne soirée
Bonjour
Sans ton fichier pas évident
Sinon regardes ces lignes
For i = 1 To 10000
If Cells(i, 19).Value = "Actualiser les totaux" Then
If Not IsEmpty(Cells(i - 5, 19)) Then
If Cells(i - 5, 19).Value <> NomClient(j - 1) Then
NbClientsLignes = NbClientsLignes + 1
ReDim Preserve NomClient(NbClientsLignes)
NomClient(j) = Cells(i - 5, 19).Value
j = j + 1
End If
End If
End If
NextAu départ i=1 et i-5 pas glop
Si d'autres problèmes, joins ton fichier
Bonjour !
Merci pour l'accueil
J'ai testé le "i" et "i-5" mais ça ne semble pas être la cause du problème.
Je te joins le fichier ça sera certainement plus pratique pour enquêter ^^
Bonjour
Je t'explique
Ta boucle For i = 1 To 10000 au départ i vaut 1 et après si tu fais Cells(i - 5, 19) c'est comme tu écrivais Cells(-4, 19)
Excel n'aime pas qu'on lui demande de trouver une ligne en dessous de 1
En plus avec une base vide aucune possibilité de faire des tests
Pourquoi tu te réfères 5 lignes en arrière ?
Rebonjour ,
Je ne suis pas l'auteur du fichier mais je pense que le "i - 5" est mis ici car
If Cells(i, 19).Value = "Actualiser les totaux" n'intervient pas avant la ligne 5 ou 10 donc on ne serait jamais en négatif.
Je t'ai mis un fichier avec un peu plus de données pour pouvoir tester le lancement de l'userform. De mon côté que ça soit avec i ou avec i - 5 même résultat
Bonjour
OK pour le décalage qui n'intervient pas de suite
Mais beaucoup de cellules avec une erreur
Testes cette modification
j = 2
For i = 1 To 10000
If Not IsError(Cells(i, 19).Value) Then
If Cells(i, 19).Value = "Actualiser les totaux" Then
If Not IsEmpty(Cells(i - 5, 19)) Then
If Cells(i - 5, 19).Value <> NomClient(j - 1) Then
NbClientsLignes = NbClientsLignes + 1
ReDim Preserve NomClient(NbClientsLignes)
NomClient(j) = Cells(i - 5, 19).Value
j = j + 1
End If
End If
End If
End If
NextEt ....... ça fonctionne parfaitement !! Merci beaucoup
Pour bien comprendre : d'où vient le problème !? Pourquoi
(Cells(i, 19).Value)retourne parfois une erreur, et donc pourquoi la ligne
If Cells(i, 19).Value = "Actualiser les totaux" Thenne peut pas simplement tester les cellules de la colonne 19 à la recherche de la mention "Actualiser les totaux" ?
Merci encore !
EDIT : Le #NOM? est-il considéré comme une erreur ??
Bonjour
Pour tester une valeur quelconque tu es obligé de comparer la cellule avec ce que tu cherches
Les cellules ayant une erreur provoque une erreur si on essaie de les comparer avec autre chose
Toutes les indications commençant par # sont des indications d'erreur
Une solution autre de ce que je t'ai indiquée, serait que les formules gèrent l'erreur éventuelle style =SI(ERREUR(Ma_Formule);"";Ma_Formule)
Comme cela dans le code VBA plus besoin de ce test
Merci pour l'explication, c'est très clair !
Une seule zone d'ombre pour moi, mes collègues ont les cellules #NOM? qui sont actualisées automatiquement via un logiciel relié à Excel. Ils ont donc des valeurs dans ces cellules, et pourtant avant l'ajout de la condition If Not IsError, ils avaient le même problème... Ce qui veut donc dire qu'il y avait comme même des erreurs. Je ne sais pas si tu as une intuition sur la cause possible ?
Bonjour
Je ne saisi pas trop le sens de ta question
#NOM? est un message d'erreur : La cause ?????? (je ne sais pas : une erreur de syntaxe ou autre)
Trouvé dans l'aide
L'erreur #NOM?
Survient lorsque Microsoft Excel ne reconnaît pas le texte dans une formule.
Causes possibles
- L'utilisation d'une fonction faisant partie de la macro complémentaire Utilitaire d'analyse sans que la macro complémentaire soit chargée
- L'utilisation d'un nom qui n'existe pas
- La mauvaise orthographe du nom
- L'utilisation d'une étiquette dans une formule alors que les étiquettes ne sont pas autorisées
- La mauvaise orthographe du nom d'une fonction
- La saisie de texte dans une formule, sans qu'il soit placé entre guillemets
- L'omission des deux-points (:) dans une référence de plage
- La référence à une autre feuille non placée entre des guillemets simples
Si la formule fait référence à des valeurs ou à des cellules d'autres feuilles de calcul ou d'autres classeurs dont le nom contient un caractère non alphabétique ou un espace, vous devez placer une apostrophe ( ' ) de part et d'autre du nom de cette feuille de calcul ou de ce classeur
Le test IF Not IsError() devrait pallier ce problème
Désolé je n'ai pas été compréhensif
J'ai compris que #NOM? est un message d'erreur. Ce que je ne comprends pas, c'est pourquoi mes collègues qui n'ont pas #NOM? mais des valeurs, ont le même problème sur l'ouverture de l'UserForm.
C'est juste pour la "culture", savoir si tu connais une autre cause d'erreur possible.
Mais pour le reste tout fonctionne parfaitement avec le IF Not IsError() !
Bonjour
C'est fort
Sans message d'erreur tes collègues ont le plantage, mais si il y a l'instruction If Not IsError plus de plantage
Es-tu sur de ça ?
Vérifies si il n'y a pas une MEFC qui masque les erreurs (en écrivant blanc sur blanc)
Si possible d'envoyer le fichier (anonymisé) d'un de tes collègue
Oui c'est ça qui est étonnant, le plantage à l'ouverture de l'UserForm mais la raison du #NOM? ne peut pas marcher sur leur fichier alors c'est un vrai mystère cette fois ^^
Le problème étant que leur fichier est le même que celui que je t'ai envoyé sauf qu'il s'ouvre avec un logiciel Excel relié à un logiciel internet actualisant les valeurs donc pas testable à distance.
Restons-en à ta solution qui marche
De nouveau merci et excellente journée !
Ps : Pour mon MP du coup plus besoin car ça fonctionne parfaitement