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.TxtCo
Option 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 Sub

J'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+

Edit,
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 Sub

Juque 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 colonne

Il 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,

re

est ce que c'est bien ça que tu souhaite au départ (quand tu ouvre le userform)

image

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 ?

Rechercher des sujets similaires à "erreur execution incompatibilite type"