IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

ListObjects.Name et doublons


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2018
    Messages : 1
    Par défaut ListObjects.Name et doublons
    Bonjour à tous
    j'ai besoin de nommer mes tableaux de type List Object de manière connue de façon de pouvoir après écrire par macro VBA des fonctions permettant de récupérer les données d'un tableau pour les remettre dans un autre (via une clef de recherche commune entre les tableau) pour faire des calculs de notes de frais
    J'utilise donc la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Set Plage2 = Sheets(nom_feuille_out).Cells(2, 1).Resize(nb_ligne, nb_col)
      Sheets(nom_feuille_out).ListObjects.Add(xlSrcRange, Plage2, , xlYes).Name = "SELECTION" & nom_feuille_out
      Set Tbl2 = Sheets(nom_feuille_out).ListObjects("SELECTION" & nom_feuille_out)
    Pour cela j'utilise un code du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Nom_tableau = Tbl2.Name
    calcul_data= _
            "=VLOOKUP([@[Numéro unique]]," & Nom_tableau & "[#All],8,0)*([@[Date fin mission]]-[@[Date début mission]])"
     
            With Range("$H" & (2 + i))
               .Value = calcul_data
               .Style = "Comma"
            End With
    Mon problème c'est de récupérer le nom de ce 2nd tableau
    j'ai tenté d’imposer un nom à ce tableau (par exemple Tab1), mais si le nom existe déjà sur une autre feuille, lorsque VBA me rend la main ce nom va être modifié en Tab1_ voire en Tab11
    Le problème c'est qu'à l'exécution de ma macro, le tableau Tab1 est bien créer un 2nd fois, que le nom est relue dans la suite de la macro comme Tab1
    C'est uniquement à la sortie que le nom se transforme
    et cette transformation fait que la formule saisie dans le tableau n°2 n'est plus correcte et donne comme résultat N/A

    Comment forcer Excel à rafraichir le cas échéant le nom du fichier pour que lorsque je le relise le nom soit réellement le nom qui sera ensuite utilisé par excel et non celui que j'ai essayé de mettre et qui doublonnait ?

    L'autre solution serait sinon de nommer mon tableau en y ajoutant systématiquement la date et l'heure en suffixe pour éviter tous les doublons... mais j'aurais préféré éviter d'avoir des noms à rallonge...

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je n'ai pas vraiment compris le problème exact.

    Je vais donc me concentrer sur la problématique "comment ne pas nommer un tableau par un nom déjà existant ?"

    Tu peux te créer une fonction qui va vérifier si le nom existe déjà ou pas

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function ListObjectExist(LeNom As String) As Boolean
    Dim MonTablo As ListObject, MaFeuille As Worksheet
        For Each MaFeuille In ThisWorkbook.Worksheets
            On Error Resume Next
                Set MonTablo = MaFeuille.ListObjects(LeNom)
            On Error GoTo 0
     
            If Not MonTablo Is Nothing Then
                ListObjectExist = True
                Exit Function
            End If
        Next MaFeuille
    End Function
    Si la feuille est connue, on peut ajouter un paramètre pour l'envoyer à la fonction et éviter de boucler sur toutes les feuilles.
    A l'inverse, si le classeur n'est pas celui contenant le code, il faudra ajouter ce paramètre

    Et ensuite on l'utilise facilement
    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub toto()
        If ListObjectExist("Tableau1") Then
            MsgBox "Le Tableau existe"
        Else
            MsgBox "Le Tableau n'existe pas"
        End If
    End Sub

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    Pourrais-tu expliquer plus globalement ton projet et placer soit un fichier exemple, soit des screenshots pour ue l'on puisse se rendre compte de l'organisation de tes données. J'avoue ne pas trop comprendre pourquoi générer des tableaux via VBA. Ne peux tu pas plutôt ajouter les nouvelles entrées dans un tableau existant quitte à placer dans celui-ci un champs te permettant ensuite de trier tes données.

    Je m'explique,
    Voila ce que je crois comprends de ton code. Tu ajoutes une feuille de frais dans le classeur et ton code VBa va chercher le tableau qu'il contient pour le transformer en tableau structuré. Par la suite tu récupère une partie de ces données pour les dispatcher dans d'autres tableau.

    Je suppose que tous les tableaux ont la même structure?
    Si c'est bien le cas, imaginons que sur une feuille tu crées un tableau structuré respectant la structure de ton tableau de note de frais. Appelons le Tab_ImportFrais
    Lorsqu'une nouvelle note de frais arrive, le code transfert son intégralité dans Tab_ImportFrais, puis traite les lignes qu'il contient et les supprime au fur et à mesure.

    Si mes explications ne sont pas claires, je peux développer mon propos.


    Pour ce qui est de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With ThisWorkbook.Sheets(nom_feuille_out)
        Set Plage2 = .Cells(2, 1).Resize(nb_ligne, nb_col)
        Set Tbl2 = .ListObjects.Add(xlSrcRange, Plage2, , xlYes)
        Tbl2.Name = "SELECTION" & nom_feuille_out
    End With
    Pour la suite je ne préfère pas me prononcer, je n'utilise jamais les formules en les incluant dans du code VBA, ici par exemple j'utiliserais plutôt la méthode Find de l'objet Range, tout en conservant l'utilisation des référence structurées fournies par le tableau structuré.

    Par contre j'attire ton attention sur cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Range("$H" & (2 + i))
    Tu ne précises ni le classeur, ni l'onglet sur lesquels tu travailles, en utilisant Range(), tu utilises implicitement le classeur actif et sa feuille active, c'est une "mauvaise" habitude qui risque de te créer des surprise dans le temps, il est préférable de préciser à Excel sur quoi tu veux qu'il travaille exactement.
    Pour limiter l'écriture, tu peux utiliser le CodeName des feuilles, avec le codeName, tu n'as plus besoin de préciser le classeur, il est déjà inclus
    Nom : 2015-01-18_134906.png
Affichages : 394
Taille : 14,2 Ko

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [XSL] insérer une balise <a name>
    Par guibong dans le forum XMLRAD
    Réponses: 2
    Dernier message: 01/08/2003, 15h04
  2. tri a bulle sans les doublons
    Par comme de bien entendu dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2003, 16h29
  3. TXMLModule.create - name = resource not found
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/03/2003, 10h54
  4. naming service
    Par manuel dans le forum CORBA
    Réponses: 6
    Dernier message: 09/12/2002, 17h43
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo