Erreur d'exécution 13 : Incompatibilité de type
Bonjour,
Je dois créer un formulaire de recherche UserForm, je suis confronter à une erreur impossible pour moi, chatgpt ou bingAi de le résoudre.
Mon erreur se produit dans l'initialisation du formulaire à la ligne :
Set TxtDiam = Me.TxtDiam
Set TxtRef = Me.TxtRef
Set TxtCode = Me.TxtCode
Set TxtCom = Me.TxtCoOption Explicit
' Déclaration des variables globales
Dim originalList As Variant
Dim feuilleTableau As Worksheet
Function UpdateListBoxWithFilters()
Dim ligne As Long
Dim i As Integer
Dim criteriaDesignation As String
Dim criteriaRainure As String
Dim criteriaBroche As String
Dim criteriaFiletage As String
Dim criteriaDiametre As String
Dim criteriaReference As String
Dim criteriaCodeInterne As String
Dim criteriaCommentaire As String
'Dim originalList As Variant
criteriaDesignation = CStr(selDesPin.Text)
criteriaRainure = CStr(selRainure.Text)
criteriaBroche = CStr(selBroche.Text)
criteriaFiletage = CStr(selFiletage.Text)
criteriaDiametre = CStr(TxtDiam.Text)
criteriaReference = CStr(TxtRef.Text)
criteriaCodeInterne = CStr(TxtCode.Text)
criteriaCommentaire = CStr(TxtCom.Text)
Me.ListBox1.Clear
Me.ListBox1.AddItem "Code interne"
For i = 1 To 7
Me.ListBox1.List(0, i) = Split("Référence;Désignation;Broche;Diamètre;Filetage;Rainure;Commentaire", ";")(i - 1)
Next i
For ligne = LBound(originalList, 1) To UBound(originalList, 1)
If MeetsFilterCriteria(originalList, ligne, criteriaDesignation, criteriaRainure, criteriaBroche, criteriaFiletage, criteriaDiametre, criteriaReference, criteriaCodeInterne, criteriaCommentaire) Then
Me.ListBox1.AddItem originalList(ligne, 0)
For i = 1 To UBound(originalList, 2)
Me.ListBox1.List(Me.ListBox1.listCount - 1, i) = originalList(ligne, i)
Next i
End If
Next ligne
End Function
Function MeetsFilterCriteria(dataArray As Variant, row As Long, criteriaDes As String, criteriaRainure As String, criteriaBroche As String, criteriaFiletage As String, criteriaDiametre As String, criteriaReference As String, criteriaCodeInterne As String, criteriaCommentaire As String) As Boolean
Dim designationColumn As Long
Dim rainureColumn As Long
Dim brocheColumn As Long
Dim filetageColumn As Long
Dim diametreColumn As Long
Dim codeInterneColumn As Long
Dim referenceColumn As Long
Dim commentaireColumn As Long
designationColumn = 2
rainureColumn = 6
brocheColumn = 3
filetageColumn = 5
diametreColumn = 4
codeInterneColumn = 0
referenceColumn = 1
commentaireColumn = 7
Dim meetsCriteria As Boolean
meetsCriteria = True
If criteriaDes <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, designationColumn) = criteriaDes)
End If
If criteriaRainure <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, rainureColumn) = criteriaRainure)
End If
If criteriaBroche <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, brocheColumn) = criteriaBroche)
End If
If criteriaFiletage <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, filetageColumn) = criteriaFiletage)
End If
If criteriaDiametre <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, diametreColumn) = criteriaDiametre)
End If
If criteriaReference <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, referenceColumn) = criteriaReference)
End If
If criteriaCodeInterne <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, codeInterneColumn) = criteriaCodeInterne)
End If
If criteriaCommentaire <> "" Then
meetsCriteria = meetsCriteria And (dataArray(row, commentaireColumn) = criteriaCommentaire)
End If
MeetsFilterCriteria = meetsCriteria
End Function
' --------------------------------- Initialisation des fonctions dans le formulaire --------------------------------
Private Sub UserForm_Initialize()
Dim feuilleTableau As Worksheet
Dim selDesPin As ComboBox
Dim selRainure As ComboBox
Dim selBroche As ComboBox
Dim selFiletage As ComboBox
Dim TxtDiam As TextBox
Dim TxtRef As TextBox
Dim TxtCode As TextBox
Dim TxtCom As TextBox
' Référence à la feuille de calcul
Set feuilleTableau = ThisWorkbook.Sheets("Tableau")
' Initialisation des contrôles
Set selDesPin = Me.Controls("selDesPin") ' Remplacez par le nom réel de votre ComboBox
Set selRainure = Me.Controls("selRainure")
Set selBroche = Me.Controls("selBroche")
Set selFiletage = Me.Controls("selFiletage")
Set TxtDiam = Me.TxtDiam
Set TxtRef = Me.TxtRef
Set TxtCode = Me.TxtCode
Set TxtCom = Me.TxtCom
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call listePince
Call UpdateListBoxWithFilters
' Ajouter les en-têtes à la ListBox
Me.ListBox1.AddItem "Code interne"
Me.ListBox1.List(0, 1) = "Référence"
Me.ListBox1.List(0, 2) = "Désignation"
Me.ListBox1.List(0, 3) = "Broche"
Me.ListBox1.List(0, 4) = "Diamètre"
Me.ListBox1.List(0, 5) = "Filetage"
Me.ListBox1.List(0, 6) = "Rainure"
Me.ListBox1.List(0, 7) = "Commentaire"
End Sub
' ------------------------------- Fonction de la liste de Pince ---------------------------
Function listePince()
Dim ligneCourante As Long
Dim R As Long
Dim feuilleTableau As Worksheet
Dim i As Integer
Dim colonne As Integer
colonne = 16
Dim valeurColonne15 As String
Dim valeurColonne16 As String
Dim valeurColonne17 As String
Dim valeurColonne18 As String
Dim valeurColonne1 As String
Dim valeurColonne22 As String
Dim valeurColonne23 As String
Dim valeurColonne24 As String
Set feuilleTableau = ThisWorkbook.Sheets("Tableau")
R = feuilleTableau.Cells(feuilleTableau.Rows.Count, colonne).End(xlUp).row
Me.ListBox1.Clear
Me.ListBox1.ColumnWidths = "100;100;100;50;50;100;50;500"
ReDim originalList(0 To R - 4, 0 To 7)
With Me.ListBox1
.AddItem "Code interne"
For i = 1 To 7
.List(0, i) = Split("Référence;Désignation;Broche;Diamètre;Filetage;Rainure;Commentaire", ";")(i - 1)
Next i
For ligneCourante = 4 To R
valeurColonne15 = feuilleTableau.Cells(ligneCourante, 15).Value
valeurColonne16 = feuilleTableau.Cells(ligneCourante, 16).Value
valeurColonne17 = feuilleTableau.Cells(ligneCourante, 17).Value
valeurColonne18 = feuilleTableau.Cells(ligneCourante, 18).Value
valeurColonne1 = feuilleTableau.Cells(ligneCourante, 1).Value
valeurColonne22 = feuilleTableau.Cells(ligneCourante, 22).Value
valeurColonne23 = feuilleTableau.Cells(ligneCourante, 23).Value
valeurColonne24 = feuilleTableau.Cells(ligneCourante, 24).Value
If Not IsError(valeurColonne15) And Not IsError(valeurColonne16) And Not IsError(valeurColonne17) _
And Not IsError(valeurColonne18) And Not IsError(valeurColonne1) And Not IsError(valeurColonne22) _
And Not IsError(valeurColonne23) And Not IsError(valeurColonne24) Then
If Left(valeurColonne15, 1) <> "C" Then
.AddItem CStr(valeurColonne15)
originalList(ligneCourante - 4, 0) = CStr(valeurColonne15)
For i = 1 To 7
.List(.listCount - 1, i) = CStr(feuilleTableau.Cells(ligneCourante, colonne + i - 1).Value)
originalList(ligneCourante - 4, i) = CStr(feuilleTableau.Cells(ligneCourante, colonne + i - 1).Value)
Next i
End If
End If
Next ligneCourante
End With
End Function
Sub RefreshData()
Call UpdateListBoxWithFilters
Call listePince
'Call MeetsFilterCriteria
End Sub
' ---------------------------------- Sélecteur Désignation Pince ---------------------------------------------
Private Sub selDesPin_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Sélecteur Rainure ----------------------------------------
Private Sub selRainure_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Sélecteur Broche ----------------------------------------
Private Sub selBroche_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Sélecteur Filetage ----------------------------------------
Private Sub selFiletage_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Texte Diamètre ----------------------------------------
Private Sub TxtDiam_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Texte Commentaire ----------------------------------------
Private Sub TxtCom_Changee()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' ----------------------------------- Texte Référence ----------------------------------------
Private Sub TxtRef_Change()
Call RefreshData
End Sub
' ----------------------------------- Texte Code interne ----------------------------------------
Private Sub TxtCode_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call RefreshData
End Sub
' --------------------------------------- Bouton Fermer -------------------------------------
Private Sub BoutonFermer_Click()
' Fermer le formulaire lorsque le bouton est cliqué
Unload Me
End SubJ'ai comme une impression que mon code de filtrage n'est pas adpaté pour les textBox mais uniquement pour les comboBox je ne suis pas sûr.
Merci pour votre aide par avance.
Cordialement,
Bonjour,
Fournir le classeur avec un UserForm en ordre de marche SVP.
A+
Voici le fichier, avec les interfaces macros pour la saisie et le tableau des données dans Tableau, le userform est visible dans le visualbasic.
Je passe la main.
A+
Je revois ma copie et regarde de plus près ce fouillis
J'ai revu plusieurs trucs et j'ai faits des changements, je n'ai plus mon problème 13 mais plus rien qui s'affiche dans la ListBox quand je sélectionne quelque chose dans mes sélecteurs
Re,
Je ne sais pas ce que tu veux faire au juste. Sur l'évènement Change des Listes déroulantes tu appelle La procédure UpdateListBoxWithFilters
Private Sub selDesPin_Change()
' Appelle la fonction listePince au moment de l'initialisation du formulaire
Call UpdateListBoxWithFilters
End SubJuque là OK, Mais dans cette procédure qui est apparemment dimensionné mais jamais remplis; A moins que je sois passé à côté de quelque chose.
' Ajoutez les données de la ligne à la nouvelle ligne
For colonne = LBound(originalList, 2) To UBound(originalList, 2)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, colonne - 1) = originalList(ligne, colonne)
Next colonneIl faut supprimer toutes ces variables publiques tu dois pouvoir faire sans. Il y a beaucoup de chose à revoir dans ce code.
Pense à utiliser Excel avant de passer par VBA.
Edit:
Mettre des entêtes de colonne en première ligne du tableau est à mon sens une erreur, cela alourdi le code pour pas grand chose, dès que tu touche à l’ascenseur tout disparait.
Bonjour,
Merci pour votre réponse et le temps que vous y accordez.
Je voulais créer un formulaire de recherche avec les données présentes dans mon tableau, je veux avoir dans l'onglet pince une listbox avec les pinces, et une autre dans l'onglet canon une listbox répertoriant tous les canons.
Les en-têtes c'étaient pour permettre à quelqu'un qui ne connait pas grand chose de pouvoir se repérer, mais si ça me fait perdre de l'espace je retire.
J'ai commencé le VBA parce que les formules deviennent très lourds, il fallait que je crée un tableau assez restrictif pour qu'un code et une référence soient crées automatiquement et éviter l'erreur humaine.
Mon tableau est destiné à grandir sur plusieurs années, je n'ai pas réussi à faire de formulaire de recherche avec des formules, un formulaire de recherche multicritères quand on regarde dans la feuille page recherche pinces j'ai réussi avec RECHERCHEX mais j'ai besoin de beaucoup plus.
Je ne suis pas du tout une experte sur Excel j'ai commencé il y a 2 ou 3 mois à faire des macros et du VBA.
Laissez moi savoir si je n'ai pas été claire sur certains points ou autres, je veux absolument pouvoir réussir mon projet et continuer d'apprendre de nouvelles choses sur Excel.
Merci d'avance et bonne journée à vous.
Bonjour
le code dans le userform n'a ni queue ni tête
rien que deja le début dans le initialise
tu m'expliquera a quoi te sert de variabiliser tes controls pour ne rien en faire dans le initialise(absurde)
tu m'expliquera pourquoi tu met une pseudo ligne d’entête sur ta listbox1 dans le initialise puisque de toute facon tu va la clear dans ta function listpince qui est appelée dans le initialise (absurde)
c'est tellement (j'ai pas les mots) qu'il est difficile de comprendre ton intention dans listepince
donc perso
de ce que crois comprendre de ton intention
tu veux ta listbox1 avec tes entêtes et la liste de la feuille tableau mais seulement les colonnes 15, 16, 17, 18, 1, 22, 23, 24 a condition que les cells de chaque ligne et colonne précédemment cité ne soit pas en erreur
si c'est ça tu n'a pas besoins de tout ce ramdam
tu confirme?
Bonjour,
Dans mon précédant post je cite :
Jusque là OK, Mais dans cette procédure qui est apparemment dimensionné mais jamais remplis; A moins que je sois passé à côté de quelque chose.
Je parlait du tableau originalList qui est dimensionné mais jamais rempli...
Puisque tu as 2021 essayes ce fichier qui est en partie modifié, et vois si cela peut te convenir, Tu dois faire le ménage est supprimer autant que tu le peux les variables publiques.
Si tu utilises les méthodes Change pour tes recherches n'oublie pas quelles seront exécutées à chaque changement dans les zones de texte ou listes déroulantes.
Sur cette version la recherche se fait sur pinces et broches, mais le principe est le même pour les autres.
Ne pas oublier de passer par Excel quand c'est possible avant VBA.
J'attends le retour...
Bonjour,
Merci de votre réponse.
J'ai essayé plusieurs codes et j'ai changé plusieurs fois de nouveaux trucs pour essayer de faire marcher mon formulaire, donc si il reste des choses inutiles c'est que je n'ai pas fait attention, en plus de ne pas connaître grands choses. Je le redis je suis une débutante je viens tout juste de commencer à coder.
Je veux que dans ma listbox1, il y est d'afficher les colonnes 15, 16, 17, 18, 1, 22, 23, 24 de "Tableau" mais sans les lignes qui contiennent CA dans le code interne ( car ce sera uniquement des pinces (qui commence par PI) qui seront présentes dans cette listbox1.
Je souhaite ensuite pouvoir filtrer mes données avec les multiples sélecteurs présents dans le formulaires.
Si je sélectionne Pince à nez long dans mon 1er sélecteur, il faut que dans ma lisbox1 il y est de présent que les Pince à nez long.
Si je sélectionne F25 dans mon 2e sélecteur, il faut que dans ma lisbox1 il y est de présent que les Pince à nez long F25.
Ainsi de suite, c'est ce que je n'arrive pas à faire.
Oui, j'imagine bien que je n'ai pas besoin de tout ça juste pour filtrer mais je ne sais pas comment faire.
Bonne journée à vous.
Cordialement,
Bonjour,
Merci Jean-Paul, c'est bien ce que je cherchais à faire, je vais continuer à supprimer ces variables.
Oui, c'est du reste de code également ce originalList, je n'ai pas supprimé une bonne partie des variables qui ne me servaient plus à rien...
Je vais continuer sur vos pas.
Bonne journée à vous.
Cordialement,
Rebonjour,
Oui c'est ça
re
bon ben moi je passe la main
a chaque fois que je travaille avec des fichier au dessus de 2013 et 2016 j'ai des soucis a la réouverture du fichier après enregistrement
trop dégouté j'avais tout refait au propre
maintenant j'ai erreur de chargement dll des que je veux aller dans le code du userform
vlizee
pourrait tu faire une copie de ton fichier
MAIS!!!!!
en faisant un copier coller valeur tans ta fauille tableau car moi j'ai pas les formule concat et tout y cointi
ce qui fait que des que j'active le contenu ben les formule donne des erreurs et c'est normal
tu peux faire ca ?
Pas de soucis, j'espère que ça marchera.
re
Bon maintenant tu a changé des trucs
dis moi un peu comment veux tu que je fasse correspondre les entetes avec les colonnes
regarde ce que tu fait
entetes = Split("Référence;Désignation;Broche;Diamètre;Filetage;Rainure;Commentaire", ";")
les colonne sont (15, 16, 17, 18, 1, 22, 23, 24)
autrement dit diamètre n'est pas a saplace (position 4 au lieu de 5
et en plus il m'en manque 1 (j'ai 7 titres et j'ai 8 colonnes) on a un soucis là
allez donne moi le bon array de titre please que je termine ce truc
allez j'ai trouvé tout seul en faisant le rapprochement avec les entêtes du tableau sur la feuille
donc voila
j'ai TOUT!!!!!! suprimé le code de l'userform(on redémarre à zero)
et j'ai commencé le remplissage à l'ouverture
est ce qu'on est bon pour les deux listbox ?
