Erreur VBA incompréhensible

Bonjour le forum

Voilà mon problème. J'utilise un code VBA trouvé sur le site de Boisgontier Jacques qui fonctionne très bien à un détail près

Si dans une cellule il y a un trop grand nombre de caractère il est impossible d'effectuer l'initialisation du Userform. J'ai un code erreur exécution 13 : Incompatibilité de type.

L'erreur arrive à l’exécution de cette ligne :

 Titre = Application.Index(Rng.Offset(-1).Value, 1) 

Voilà le code complet :

Option Compare Text
Dim f, NomTableau, BD, Titre(), TabBD(), ColCombo(), colVisu(), NcolVisu, NcolBD, Decal, NbCol, choix(), témoin

Private Sub UserForm_Initialize()
 Set f = Sheets("Feuil1")
 Set Rng = f.Range("A2:AG" & f.[A65000].End(xlUp).Row)         ' à adapter
 Titre = Application.Index(Rng.Offset(-1).Value, 1)           ' Titres de la BD
 NomTableau = "Tableau1"
 ActiveWorkbook.Names.Add Name:=NomTableau, RefersTo:=Rng
 'B_tout_Click
 NbCol = Range(NomTableau).Columns.Count
 TabBD = Range(NomTableau).Resize(, NbCol + 1).Value                 ' Array: + rapide
 For i = 1 To UBound(TabBD): TabBD(i, NbCol + 1) = i: Next i         ' No enregistrement
 '---- A adapter
 colVisu = Array(1, 2, 3, 4, 5, 6, 7, 9, 12, 13) ' Colonnnes  ListBox (à adapter)
 '----
 Me.ListBox1.List = TabBD
 '-- en têtes de colonne ListBox
 Me.ListBox1.ColumnCount = NbCol + 1
 'EnteteListBox   ' supprimer version Excel 2013
 '-- labels textbox
 'LabelsTextBox
' For i = NbCol + 1 To 35: Me("textbox" & i).Visible = False: Next i
 '-- colTri
 Me.ComboTri.List = Application.Transpose(Range(NomTableau).Offset(-1).Resize(1))  ' Ordre tri
 Me.ComboChoixCol.List = Me.ComboTri.List
 témoin = True
 Me.ComboChoixCol.ListIndex = 0
 'Affiche
 'B_ajout_Click
End Sub

Merci par avance à l’intérêt porté à ce sujet

16forum.xlsm (58.41 Ko)

Bonjour GGautier,

Quelle est la longueur du texte qui fait planter le code?

Bonjour,

Ben supprime cette variable, tu ne t'en sers pas...

eric

@GVIALLES le nombre max est de 255 caractères après ça plante

@ eriiic Justement je me sert de cette variable, je n'ai pas mis tout le code pour éviter de "surcharger" le poste

Merci de vos réponses !

Titre est lié avec l'action du clic dans un combobox dont voici le code :

Private Sub ComboChoixCol_click()     ' choix de la colonne de recherche
  If IsNumeric(Me.ComboChoixCol) Then tmp = Val(Me.ComboChoixCol) Else tmp = Me.ComboChoixCol
  colClé = Application.Match(tmp, Titre, 0)
  Me.LabelFiltre.Caption = ComboChoixCol & " (Frapper les premières lettres)"
  Set d1 = CreateObject("Scripting.Dictionary")
  For i = LBound(TabBD) To UBound(TabBD) ' liste des choix de la colonne choisie sans doublons
     d1(TabBD(i, colClé)) = ""
  Next i
  choix = d1.keys: Tri choix, LBound(choix), UBound(choix): n = d1.Count
  Me.ComboFiltre.List = choix
  colFiltre = Me.ComboChoixCol.ListIndex + 1
  ListeCol colFiltre
End Sub

Je me demande si l'erreur est due car un combobox ne peux contenir que 255 caractères max sur une ligne ?

bonjour,

tu peux limiter le nombre de caractères à 255 (à toi de voir si c'est acceptable)

Titre = left(Application.Index(Rng.Offset(-1).Value, 1),255)

edit : à voir ton dernier message, ce n'est probablement pas acceptable. alternative réduit le titre de tes colonnes à 255 caractères max.

Je ne veux pas limité l'utilisateur à 255 caractères mais justement lui permettre d'en saisir d'avantage ! Le soucis c'est que au delà de 255 le code plante..

bonjour,

essaie ceci

Titre = Rng.Offset(-1, 0).Resize(, 33).Value 

h2so4 C'est un bon début ! Le problème (toujours une incompatibilité de type) se trouve sur la deuxième ligne de code de Private Sub ComboChoixCol_click() dont le code se trouve dans mon poste précédent.

EDIT

Je ne sais pas si c'est une piste mais Titre est déclaré comme ci dessous :

Option Compare Text
Dim f, NomTableau, BD, Titre(), TabBD(), ColCombo(), colVisu(), NcolVisu, NcolBD, Decal, NbCol, choix(), témoin

bonjour,

ce code ne se trouve pas dans le fichier que tu as fourni

Si l'erreur était due au combobox tu aurais l'erreur à ce moment là, et tu l'as avant (ce qui ne veut pas dire que tu n'en auras pas une autre plus loin).

Tu as déclare Titre en tableau de variant.

On ne sait pas trop si c'est un tableau Range ou de String que tu attends. Excel non plus, et si tu le laisses choisir il risque de faire un mauvais choix.

Toutes tes variables devraient être typée, commence par typer Titre

eric

Je met le fichier avec tout le code (j'efface toute la mise en forme du userform pour des raisons de confidentialités)

8forum.xlsm (70.86 Ko)

Merci Eric mais je craint de ne pas être capable de faire ça tout seul Qu'entend tu par "typer" ?

Dans le doute j'ai essayé ça : (les quartes de manière indépendantes)

Dim Titre As String
Dim Titre As Range
Dim Titre() As String
Dim Titre() As Range

Si tu n'auras que des chaines dans ce tableau il faut le typer ainsi :

Dim Type() as String

Si ça peut-être des chaines ou des nombres il faut le laisser variant, et ajouter le .Value comme indiqué par h2so4.

Si c'est la référence de plage qui t'intéresse il faut le typer ainsi :

Dim Type() as Range

tu devrais regarder les cours VBA dans le menu en haut de ce site, il y en a un sur les variables.

eric

Okey c'est bien ce que je viens de testé... Toujours l'erreur . Mais le problème ne viens pas du type de chaine de caractère mais de sa longueurs. Le code fonctionne très bien si dans une cellule le nombre de caractère est inférieure ou égale a 255

Je pense aussi que la longueur des données contenues dans une cellule n'est pas en cause:

Je propose la modification suivante :

 'Titre = Application.Index(Rng.Offset(-1).Value, 1)           ' Titres de la BD
 Titre = f.UsedRange.Rows(1).Value

Mais c'est parfait ! Un grand merci Gerard ! Pourrais tu m'expliquer la différence et comment fonctionne les deux codes ?

Okey c'est bien ce que je viens de testé... Toujours l'erreur

tu n'as pas toujours l'erreur puisque c'est une autre plus loin maintenant. Un peu de rigueur ne fait pas de mal

Le .Value proposé par h2so4 traitait également l'erreur signalée en imposant la valeur et en ne laissant plus le choix d'interprétation à vba.

Ce qui n'empêche pas de typer ses variables au plus près de l'utilisation prévue.

eric

Ggautier,

Différence entre les 2 codes:

La méthode Index revoie une référence à une cellule.

Dans ton cas, ce que tu cherches à faire c’est à charger un tableau (array) avec le contenu de la 1ere ligne de ton excel. L’incompatibilité de type provient de là.

Ceci dit, erriic a raison d’insister sur l’intérêt qu’il y a à déclarer les variables de façon le plus typé possible. J’ajouterai de toutes les déclarer et pour être sûr de ne pas en oublier, de faire figurer en tête de tout module la clause « Option Explicit ». La compilation donne alors les erreurs de non déclaration ou de déclarations incompatibles lorsqu’il les détecte.

Ok merci pour l'explication, il est vrai que la gestion et la compréhension des variables en VBA est encore un point à travailler pour moi Encore merci à vous deux pour votre aide et pour vos bon conseils

Rechercher des sujets similaires à "erreur vba incomprehensible"