XL 2016 Variable de tableau Excel nommé

troopers87

XLDnaute Occasionnel
Bonjour à tous,

Cette fois, si vous trouvez, je vous paye à tous le champagne !!! Enfin... du calme, quand même ^^ Je rencontre un souci sur lequel je bloque depuis pas mal d'heures :
- je dispose d'un formulaire avec des OptionButtons (boutons radio) pour sélectionner des catégories : si l'utilisateur clique sur le bouton "Frais fixes", alors la ListBox avec les différents frais fixes s'affiche, idem pour les "Frais occasionnels"...
- Chaque RowSource de ma ListBox est lié à un tableau Excel nommé "L_Fraisfixes" ou "L_Fraisocassionnels".

Tout fonctionne parfaitement, fin du sujet, merci pour votre lecture :)

Ah non, il y a quand même un souci : j'ai ajouté un petit bouton "+" qui permet d'ajouter un Frais fixe ou un Frais occasionnel en cas de besoin. Mon souci, c'est que je n'arrive pas à taper un code correct : je reçois un message d'erreur d'exécution 424 : objet requis.

J'espère être clair : je n'ai pas de fichier à vous fournir car celui sur lequel je travaille est juste... une énorme usine à gaz...

Voici le code auquel je suis parvenu :

VB:
Private Sub UserForm_Initialize()

'ici, je déclare ma variable à l'initialisation du UserForm comme étant String
Dim TABLEAU_FRAIS As String

End Sub

'ensuite, l'utilisateur clique sur l'OptionButton qu'il souhaite et la ListBox qui suit se met à jour
Public Sub OptionButton1_fraisfixes_Click()

'si la combobox "Frais fixes" est sélectionnée, alimenter la ListBoxD avec L_fraisfixes
If OptionButton1_fraisfixes.Enabled = True Then
    ListBoxD.RowSource = "L_fraisfixes"
    ComboBox_tiersdepenses.RowSource = "TIERS_fraisfixes"
End If

End Sub

Public Sub OptionButton1_fraisponctuels_Click()

'si la combobox "Frais ponctuels" est sélectionnée, alimenter la ListBoxD avec L_fraisponctuels
If OptionButton1_fraisponctuels.Enabled = True Then
    ListBoxD.RowSource = "L_fraisponctuels"

End If

End Sub

'jusque là, tout va bien ! C'est ensuite que le drame survient !

Dim NOUVEAU_FRAIS As String
 
NOUVEAU_FRAIS= InputBox("Saisissez le nouveau type de frais.", "Nouveau frais")

    If NOUVEAU_FRAIS <> "" Then
        If OptionButton1_fraisfixes.Enabled = True Then
            [TABLEAU_FRAIS].End(xlDown)(2) = NOUVEAU_FRAIS
        End If
   
    End If
 
End Sub

Je pensais qu'il fallait que je déclare l'OptionButton, mais en fait, c'est au niveau de [TABLEAU_FRAIS].End(xlDown)(2) que le VBA se plante.

Merci d'avance pour votre aide :)
 

Lone-wolf

XLDnaute Barbatruc
Bonjour troopers

Il y a quelque chose que je ne comprend pas, tu veux ajouter un frais fixe à la dernière ligne du tableau?
Si c'est le cas alors tu déclare une variable (Dim lig As Long) par exemple, ensuite

With Sheets("xxx")
lig = .Range("a" & Rows.Count).end(xlUp).Row + 1
.Cells(lig, "A") = xxx
.Cells(lig, "B") = yyyy
.Cells(lig, "C") = zzz
etc
End With
 

troopers87

XLDnaute Occasionnel
Bonjour Lone-Wolf et merci pour ton intérêt,

Oui, tout à fait : le tableau nommé "L_fraisfixes" (créé en faisant Insertion, Tableau) est juste un tableau à une seule colonne. De fait, le code dont je me suis inspiré pour ajouter une nouvelle valeur sous le tableau est :

VB:
[L_fraisfixes[Frais fixes]].End(xlDown)(2) = NOUVEAU_FRAIS

La difficulté est que je cherche à alimenter l'un ou l'autre de mes tableaux nommés selon une condition qui est dans un autre Sub.

J'espère être clair ? Sinon, je te ferai une prise d'écran :)
 

Lone-wolf

XLDnaute Barbatruc
Re

Si L_fraisfixes est le tableau, pourquoi lui ajouter Frais fixes?? o_O


La difficulté est que je cherche à alimenter l'un ou l'autre de mes tableaux nommés
Ok. Dans ce cas, essaie de procéder ainsi, un exemple; oubien ajoute un OptionButton

VB:
    If OptionButton1.Enabled = True Then
        With Sheets(1)
            lig = .Range("a" & Rows.Count).End(xlUp).Row + 1
            .Cells(lig - 1, "A") = "xxx"
            .ListObjects("L_fraisfixes").ListRows.Add
        End With
    End If

    If OptionButton2.Enabled = True Then
        With Sheets(1)
            lig = .Range("f" & Rows.Count).End(xlUp).Row + 1
            .Cells(lig - 1, "F") = "yyyy"
            .ListObjects("L_Fraisocassionnels").ListRows.Add
        End With
    End If
 
Dernière édition:

troopers87

XLDnaute Occasionnel
Bonjour Lone-Wolf, bonjour Staple,

Merci tous deux pour vos réponses : effectivement, il vaut mieux que je vous transmette un fichier afin que ce soit plus clair : le voici en pièce jointe.
J'attache une grande importance à utiliser les tableaux nommés (et non le nom des feuilles qui les contiennent), afin de préserver la plus grande agilité possible au classeur : si je décide de renommer la feuille qui contient les tableaux, je ne voudrais pas avoir à modifier le code :)
En fait, j'essaye de faire le code le plus simple possible afin que chacun s'y retrouve si un jour je devais passer la main sur ce sujet.

J'espère que cela vous aidera à m'aiguiller sur la marche à suivre ? Merci d'avance ! :)
 

Pièces jointes

  • Test.xlsm
    24.5 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Bonjour
Vous ne pouvez pas utiliser d'expression à évaluer par VBA entre crochets droits. L'équivalent strict serait Evaluate(LExpression) mais ça revient à Range(LExpression)
Tout au début du module il faut :
VB:
Option Explicit
Private TABLEAU_FRAIS As String
Après vous pourrez utiliser une des deux formes :
VB:
With Range(TABLEAU_FRAIS): .Rows(.Rows.Count + 1).Value = NOUVEAU_FRAIS: End With
…
Range(TABLEAU_FRAIS).ListObject.ListRows.Add.Range.Value = NOUVEAU_FRAIS
Mais il vaudrait même mieux à mon avis travailler avec un Private RngTabFrais As Range
et faire Set RngTabFrais = [L_fraisoccasionnels]: ListBox_frais.List = RngTabFrais.Value
 
Dernière édition:

troopers87

XLDnaute Occasionnel
Bonjour Dranreb et merci pour votre réponse,

Je ne maîtrise pas suffisament le VBA pour savoir positionner correctement le "Option Explicit" et en comprendre l'intérêt : d'après mes recherches, cela permet de simplifier l'utilisation des variables, mais je ne comprends pas en quoi...

En ce qui concerne les deux options que vous proposez ensuite, cela me paraît accessible : je tenterai dans cette direction. En revanche, le " Private RngTabFrais As Range" est totalement opaque pour moi :/
 

Dranreb

XLDnaute Barbatruc
De même que les déclarations globales Public et Private, en tête du module avant toute procédure. Facilite la mise au point grâce à des message plus clairs en évitant de tenter une exécution si la déclaration d'une variable a été oubliée ou est mal orthographiée par rapport à sa déclaration.
Il vaut mieux d'une façon générale noter un objet lui même plutôt qu'une info permettant de le reconstituer.
 

troopers87

XLDnaute Occasionnel
Ok, j'ai compris et ça fonctionne parfaitement ! Merci pour votre aide :)

Ci-joint, le fichier avec les corrections, et ci-dessous, le code final.

VB:
Option Explicit
Private TABLEAU_FRAIS As String

Public Sub OptionButton_fraisfixes_Click()

'si la combobox "Frais fixes" est sélectionnée, alimenter la ListBox_frais avec L_fraisfixes
    If OptionButton_fraisfixes.Enabled = True Then
    ListBox_frais.RowSource = "L_fraisfixes"
    TABLEAU_FRAIS = "L_fraisfixes"            'cette ligne a pour but de stocker le nom du tableau cible (L_fraisfixes) dans la variable
End If

End Sub

Public Sub OptionButton_fraisoccasionnels_Click()

'si la combobox "Frais occasionnels" est sélectionnée, alimenter la ListBox_frais avec L_fraisponctuels
    If OptionButton_fraisoccasionnels.Enabled = True Then
    ListBox_frais.RowSource = "L_fraisoccasionnels"
    TABLEAU_FRAIS = "L_fraisoccasionnels"     'cette ligne a pour but de stocker le nom du tableau cible (L_fraisoccasionnels) dans la variable
End If

End Sub

Sub CommandButton_ajoutfrais_click()

'selon l'optionbutton sélectionné en amont, alimenter l'une ou l'autre des listes
   
Dim NOUVEAU_FRAIS As String
   
NOUVEAU_FRAIS = InputBox("Saisissez le nouveau frais.", "Nouveau frais")

    If NOUVEAU_FRAIS <> "" Then
   
        If OptionButton_fraisfixes.Enabled = True Then
        With Range(TABLEAU_FRAIS): .Rows(.Rows.Count + 1).Value = NOUVEAU_FRAIS: End With
   
        End If

    End If
   
End Sub


Sub commandbutton_fermer_click()

'fermer le formulaire et vider la mémoire
Unload Me

End Sub

Merci pour votre aide à tous ! :)
 

Pièces jointes

  • Test.xlsm
    27.1 KB · Affichages: 23

Statistiques des forums

Discussions
314 633
Messages
2 111 404
Membres
111 124
dernier inscrit
presa54