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 :

On en apprend tous les jours


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut On en apprend tous les jours
    Bonjour a tous,

    En faisant des recherches sur net, je suis tombé sur cet article: https://analystcave.com/vba-queue-us...a-queue-excel/

    Ma première réaction a été: "On peut instancier des objets .Net en VBA ? WTF ?"

    Après quelques test rapide, effectivement, c'est possible (pour peut que le .Net framework soit installé sur votre système, ce qui est commun de nos jours).

    J'ai poussé mes recherches un peut plus loin, et parmi les classes de l'ensemble System.Collections, il est possible d'instancier les objets suivants:
    System.Collections.ArrayList (un tableau dynamique).
    System.Collections.Hashtable (un dictionnaire, Equivalent de Scripting.Dictionnary ?).
    System.Collections.Queue (une pile, ou FIFO).
    System.Collections.SortedList (Une liste triée).
    System.Collections.Stack (une file, ou LIFO).
    Leur documentation est accessible à partir de cette page: https://github.com/dotnet/platform-c...docs/DE0006.md

    Avez-vous trouvé d'autres "surprises" en provenance du .Net framework ?

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 023
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 023
    Par défaut
    Bonjour,
    Pour ma part je conseille System.Collections.ArrayList qui est bien plus complet et pratique, à mon avis, que le classique Scripting.Dictionnary que l'on retrouve souvent dans les codes présentés sur ce forum.
    Un site résume cela : https://excelmacromastery.com/vba-arraylist/
    Ou ce site qui donne peut-être plus de détails : http://www.snb-vba.eu/VBA_Arraylist_en.html
    Mais chacun à ses habitudes de programmation et je n'impose rien à personne.

    Je travaille justement en ce moment à mon temps perdu pour faire des fonctions génériques qui utilisent System.Collections.ArrayList sur plusieurs dimensions.
    Reste à savoir ce que cela peut apporter de plus, en pratique, par rapport aux tableaux structurés.

    Bonne continuation.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Attention,

    ArrayList et Dictionnaires (Hashtable ou Dictionary) ne sont pas comparables.
    Le premier fonctionne par index numérique uniquement,
    le second par clef (numérique ou textuelle).

  4. #4
    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,

    des outils complémentaires dans la besace en effet, souvent négligés malgré le fait qu'ils évitent bien souvent de réinventer la roue.

    Attention toutefois, problème de compatibilité avec MAC (peut-être corrigé depuis)

    https://www.developpez.net/forums/d1...tes-d-colonne/

  5. #5
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    bonjour,
    personnellement j'ignore si les ordinateurs Macintosh dispose d'un bouton March/Arrêt

    Étapes pour créer, compiler et utiliser une bibliothèque .NET en VB.NET dans VBA

    1. Créer et Compiler ta Bibliothèque .NET en VB.NET


    1. Créer une Bibliothèque de Classes dans Visual Studio :
      • Ouvre Visual Studio.
      • Crée un nouveau projet de type "Class Library (.NET Framework)".
      • Donne un nom à ton projet, par exemple "MyVbNetLibrary".

    2. Définir ta Classe et ton Espace de Nom :
      • Dans le fichier Class1.vb généré par défaut, définis ta classe et les méthodes souhaitées. Par exemple :

        Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        Imports System
         
        Namespace System.LogPublic 
        Class Logger
                Public Sub LogMessage(message As String)
                    Console.WriteLine(message)
                End Sub
            End Class
        End Namespace

    3. Compiler le Projet :
      • Compile le projet en sélectionnant Build -> Build Solution dans le menu.
      • Le fichier DLL sera généré dans le répertoire bin\Debug ou bin\Release de ton projet. Par exemple, C:\Path\To\Your\Project\bin\Debug\MyVbNetLibrary.dll.

    2. Enregistrer la Bibliothèque .NET avec Regasm


    1. Ouvrir une Invite de Commandes en Mode Administrateur :
      • Clique sur le bouton Démarrer, tape cmd, fais un clic droit sur Invite de commandes, et sélectionne Exécuter en tant qu'administrateur.

    2. Enregistrer la DLL :
      • Exécute la commande suivante pour enregistrer ta DLL :

        Code cmd.exe : Sélectionner tout - Visualiser dans une fenêtre à part
        regasm "C:\Path\To\Your\Project\bin\Debug\MyVbNetLibrary.dll" /codebase
      • L'option /codebase spécifie que l'assembly doit être enregistré avec un chemin complet.

    3. Utiliser la Bibliothèque .NET dans VBA


    1. Ajouter une Référence à la Bibliothèque .NET :
      • Ouvre Excel et accède à l'éditeur VBA (Alt + F11).
      • Dans l'éditeur VBA, va dans Tools -> References.
      • Clique sur Browse, navigue jusqu'à MyVbNetLibrary.dll dans le répertoire bin\Debug, et sélectionne-la.

    2. Instancier et Utiliser l'Objet .NET dans VBA :
      • Maintenant, tu peux instancier et utiliser ta classe .NET dans VBA. Par exemple :

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub TestLogger()
     Dim logger As Object
    Set logger = CreateObject("System.Log.Logger")
    logger.LogMessage "Hello from .NET!"
    End Sub


    Remarques


    • Débogage et Release : Assure-toi d'utiliser la version correcte de la DLL (Debug ou Release) selon ton environnement.
    • Dépendances : Si ta bibliothèque .NET dépend d'autres assemblies, assure-toi qu'ils sont également accessibles.
    • Sécurité : Sois conscient des implications de l'utilisation de /codebase, car il expose le chemin complet de l'assembly.

    En suivant ces étapes, tu devrais être en mesure de créer, compiler, enregistrer et utiliser efficacement ta bibliothèque .NET en VBA.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    @Thumb down:
    Intéressant, mais n'est-ce pas plutôt regsvr32 qu'il faut utiliser pour enregistrer la dll ?

    Cette divergence à part, il est préférable de focaliser ce sujet sur les librairies standard,
    tous le monde n'a pas la chance de travailler sur un poste avec des droits d'admins.

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Pour ce qui concerne les droits admistrateur je suis d'accord. Notes quand même au passage que les dictionnary, les arraylist etc. Dépende des framework qui ne sont pas toujours installer par défaut.

    Pour le reste je vais faire le test, car ce que j'ai écrit est issu d'une recherche pas de mon expérience.

    Ceci dit j'utilise couramment des libraires dans excel mais en ajoutant l'assembli dans mes références du projet.

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    Citation Envoyé par Thumb down Voir le message
    Notes quand même au passage que les dictionnary, les arraylist etc. Dépende des framework qui ne sont pas toujours installer par défaut.
    Quelques précisions :
    - l'objet dictionary se situe dans le Microsoft Scripting Runtime (sccrun.dll) et ne provient pas d'un assemblage dotnet.
    - les objets comme le ArrayList Queue Hastable se situe dans l'assemblage dotnet mscorlib.dll qui est présent sur tous les windows depuis windows xp.
    Pour utilisation de dotnet dans Excel voir aussi Excel DNA (sous forme d'extension) et l'interfaçage par dll classique ( genre d'API) avec des assemblages dotnet.

    Ami calmant, J.P

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    voici des exemples de ce qu'on peut faire avec Excel DNA à partir du VBA.
    J'ai créé un Addin Excel DNA qui contient des fonctions pour gérer des commandes PowerShell, pour faire certaines commandes Regex comme le RegexReplace ou le RegexSplit, pour gérer tous les contenus du pressepapier etc..
    Nom : XlDnaLibJP.png
Affichages : 151
Taille : 8,4 Ko


    Voici un premier code qui exécute une commande powerShell qui liste tous les processus et les affichent dans une feuille Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub ListeProcess()
    Dim Resultat, x As Integer, arrCol, LenTabRes As Integer, TabRes() As String
    Dim Pwsh As Object, Utils As Object
    Set Pwsh = CreateObject("XlDnaLibJP.ClPowerShell")
    Set Utils = CreateObject("XlDnaLibJP.Utils")
    Resultat = Pwsh.ExecuteCmd("Get-Process | Format-Table -HideTableHeaders Id, Name | out-String")
    TabRes = Split(Resultat, vbCrLf)
    LenTabRes = UBound(TabRes) - LBound(TabRes) + 1
    ReDim arrRes(1 To LenTabRes, 1 To 2)
    For x = LBound(TabRes) To UBound(TabRes)
      arrCol = Utils.RegexSplit(Trim(TabRes(x)), "\s+")
      If UBound(arrCol) = 1 Then arrRes(x, 1) = arrCol(0): arrRes(x, 2) = arrCol(1)
    Next x
    Feuil1.[A2:A1000].Value = ""
    Feuil1.[A2].Resize(LenTabRes, 2) = arrRes
    End Sub
    Temps d'exécution de la commande powershell : 140 ms
    Voici un autre code qui copie une plage de cellules et l'écrit dans un fichier png en utilisant le presse-papier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TestPressepapier()
    Dim pp As Object
    Set pp = CreateObject("XlDnaLibJP.PressePapier")
    Sheets("Feuil1").Range("A1:D11").Copy
    Debug.Print pp.ContainsImage
    pp.SaveImage "d:\temp\range.png", 0
    End Sub
    et Voici un code qui transforme tous les multiples espaces dans une chaîne en simple espace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TestRegexReplace()
    Dim Resultat
    Dim Utils As Object
    Set Utils = CreateObject("XlDnaLibJP.Utils")
    Resultat = Utils.RegexReplace("ceci    est  un            test", "\s+", " ")
    Debug.Print Resultat
    End Sub
    Ami calmant, J.P

  10. #10
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 200
    Par défaut re
    bonsoir
    perso j'ai toujours connu les
    System.Collections.ArrayList (un tableau dynamique).
    arrayList tuto 1.pdf

    System.Collections.SortedList (Une liste triée).
    sortedlist tuto 1.pdf

    tout deux disponibles des la version 3.0xx de netframework déjà en 2009

    les 3 suivants sont plus obscures
    System.Collections.Hashtable (un dictionnaire, Equivalent de Scripting.Dictionnary ?).
    System.Collections.Queue (une pile, ou FIFO).
    System.Collections.Stack (une file, ou LIFO).
    Leur documentation est accessible à partir de cette page: https://github.com/dotnet/platform-c...docs/DE0006.md

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/08/2006, 15h32
  2. Comment lancer un programme tous les jours à 2h? savoir la procédure
    Par condor_01 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 28/07/2006, 09h35
  3. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 16h10
  4. Numéro Auto qui se réinitialise à 1 tous les jours!
    Par R0cKW|LDeR dans le forum Access
    Réponses: 11
    Dernier message: 02/02/2006, 22h05
  5. décrémenter un compteur tous les jours
    Par Art19 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 11h07

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