Gérer les tableaux structurés en VBA

Bonjour à tous,

Je débute en VBA et ne trouvant pas comment finaliser mon code, je me suis décidée à poster sur ce forum.

Dans mon fichier Excel, j'ai un tableau structuré, c'est à dire que j'ai fait 'inserer -> 'tableau que j'ai appelé Base_donnees.

J'ai un programme VBA avec un VlookUp où je veux chercher une cellule dans ce tableau qui contient le numéro de la ligne où je suis. J'utilise ensuite ce numéro de ligne pour entrer une valeur "MaNote" dans une cellule (cette valeur n'a pas d'importance ici).

J'ai donc :

Dim Tableau As ListObject
Dim resultat as Variant
...
Set Tableau = ThisWorkbook.Worksheets("Base").ListObjects("Base_donnees")
ligne = Application.VLookup(Range("A1").Value, Tableau, 5, False)
Sheets("Base").Cells(Ligne, 6).Value = MaNote
...

Cependant, mon code ne marche pas... quand je le lance, VBA me renvoi l'erreur "incompatibilité de type" à la ligne "Sheets("Base").Cells(Ligne, 6).Value = MaNote" et quand je mets le curseur sur ligne, au lieu de me renvoyer le numéro de ligne, j'ai "erreur 2015".

Quelqu'un saurait-il m'aider ?

Merci

bonjour,

Il est illusoire d'espérer une réponse dans ces conditions.

Il faut joindre un embryon de fichier permettant de tester ton code.

A+

Voilà le fichier joint, mon code est sur le module "Ecritures". Merci

190test-code.xlsm (29.53 Ko)

Bonjour,

Faut dire que tu compliques à loisir !

Pour commencer, les variables se typent individuellement dans les déclarations. Quand tu ne type pas, le type est Variant. Donc quand tu veux du Variant, autant ne rien mettre...

Dans : Dim MaDateP, MaDateR As Variant les 2 sont Variant, mais la première parce que non typée ! Si tu avais mis As Date, MaDateR serait de type Date, mais MaDateP de type Variant...

Alors :

Dim Scan As Integer
Dim Tableau As Range
Dim Ligne As Integer

Ce serait mieux, parce que Scan As String pour chercher une valeur numérique... Tableau utilisé dans une fonction qui attend un objet Range... Et pour Ligne c'est mieux que Variant.

  MaDateP = CDate(.TB_date_pret.Value)
  MaDateR = CDate(.TB_date_retour.Value)

Ça, c'est si tu veux éviter les inversions Jour/Mois... Un classique (mais tu n'y a peut-être pas encore été confrontée).

Set Tableau = ThisWorkbook.Worksheets("Base").ListObjects("Base_donnees").Range

bé oui ! Tu affectes la plage correspondant au ListObject...

Ligne = Application.VLookup(Scan, Tableau, Colonne, False)

Si tu as initialisé Scan, c'est pour l'utiliser, non ?, pas pour le laisser de côté !

Mais version déjà un peu allégée :

tu supprimes :

Set Tableau = ThisWorkbook.Worksheets("Base").ListObjects("Base_donnees").Range

et :

Ligne = Application.VLookup(Scan, Tableau, Colonne, False)
Sheets("Base").Cells(Ligne, Colonne + 1).Value = MaDateP
Sheets("Base").Cells(Ligne, Colonne + 2).Value = MaDateR
Sheets("Base").Cells(Ligne, Colonne + 3).Value = MonNomE

ce qui supprime les variables Tableau et Ligne.

A la place :

With [Base_donnees]
    .Cells(Scan, Colonne + 1) = MaDateP
    .Cells(Scan, Colonne + 2) = MaDateR
    .Cells(Scan, Colonne + 3) = MonNomE
End With

Parce que :

Excel introduit automatiquement un nom dans le classeur pour chaque tableau (ListObject), qui correspond à la plage données dudit tableau (hors ligne d'en-tête). Et ce nom est utilisable dans les mêmes conditions que tout nom de plage nommée.

Et comme il correspond à la plage de données, Ligne et Scan se confondent, plus besoin de chercher la ligne.

Cordialement.

Merci beaucoup MFerrand ca marche nickel ! Effectivement c'était un peu lourd comme code, mais comme je gère pas trop le VBA je fais à taton

Si tu as encore 5 minutes à me consacrer, j'ai un autre problème mineur.

Quand j'ouvre l'userform, si je ne rempli pas une des case, j'ai un message d'erreur qui apparaît. Le problème est que quand je clic sur ok, ça me ferme tout alors que je souhaiterai garder l'userform ouvert. Sais-tu comment faire ?

Private Sub Bouton_Valider_Click()
    Call Ecrire_Pret
    Unload UF_Pret
End Sub

Tu décharges le userform de la mémoire à la validation... donc tu ne l'as plus.

Note déjà que tes vérifications au début de la procédure Ecrire_Pret seraient plus logiquement placées en tête de cette procédure.

Après l'exécution de Ecrire_Pret, au lieu de fermer, tu effaces les TextBox (=""), et tu peux poursuivre.

Tu réintitules (Caption) le bouton Annuler en Quitter, puisque ce sera alors le seul moyen de sortir du Userform (hormis croix de fermeture).

Cordialement.

Merci pour tout, ça marche très bien !

Bonne journée

Rechercher des sujets similaires à "gerer tableaux structures vba"