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

VB.NET Discussion :

Comment utiliser les "Range" d'Excel 2010


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 71
    Points
    71
    Par défaut Comment utiliser les "Range" d'Excel 2010
    Bonjour à tous,

    Pour une application professionnelle je me trouve face à un soucis de déclaration et d'utilisation de variables.
    Je doit copier des valeurs d'une feuille d'un classeur Excel sur une feuille d'un autre classeur Excel.
    Les valeurs sont contenues dans des ranges nommés 'Titre_01' à 'Titre_10'.
    Je n'arrive pas à faire une déclaration conforme pour cette variable en Range pour une boucle "for each".
    J'ai bien lu à travers mes recherches que le 'name' du Range doit être un objet, mais je n'y arrive pas. Au secours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim sNomPlage As Excel.Range
    Dim TitrePlage As Object
    TitrePlage = "Test"
    Cette déclaration semble convenir, mais dès que je veux l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sNomPlage.Name = TitrePlage
    ce code est souligné en vert avec : "la variable 'sNomPlage' est utilisée avant qu'une valeur ne lui ait été assignée......." et si j’exécute quand même : une exception est levé avec un code d'erreur expliquant que le type n'est pas conforme pour l'opération.
    J'ai absolument besoin de récupérer ces ranges avec leur adresse pour les positionner aux mêmes endroits dans le classeur suivant.
    L'aide que je vous demande est de :
    Pouvoir déclarer ce range, faire la boucle "for each" et pouvoir donner un 'name' à ce Range.
    J'ai lu à peu près tout ce qui concerne les ranges grace à developpez.net et à notre ami google, mais pas de solution pour ce que je veux faire.
    En vba ou en VB6 je n'ai aucun problème pour ce type de code, l'ayant déjà réalisé, mais en VB.net !!! big problème.
    Merci à tous ceux qui voudront bien m'aider

    Farouk

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    C'est de mémoire et pas testé, mais, en gros, cela pourrait ressembler à cela.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    sub DunClasseurAlAutre()
        'instancier l'application Excel
        dim AppExcel as new Microsoft.interop.office.excel.apppication
        'instancier deux classeurs Excel
        'Mettre les bons chemins d'accès.
        dim ClasseurOrigine as Microsoft.interop.office.excel.workbook=  AppExcel.worbooks.open("c:\données\origine.xlsx" )
        dim ClasseurDestination as Microsoft.interop.office.excel.workbook =AppExcel.worbooks.open("c:\données\destination.xlsx" )
        'Ces deux-là on pourrait s'en passer en VBA, mais, je ne me souviens plus en VB.net
        'Définir les feuilles à utiliser
        Dim FeuilleOrigine as Microsoft.interop.office.excel.worksheet = ClasseurOrigine.sheets("Feuil1")
        Dim FeuilleDestination as Microsoft.interop.office.excel.worksheet = ClasseurDestination.sheets("Feuil1")
        'Définir les plages
        Dim PlageOrigine as Microsoft.interop.office.excel.range = FeuilleOrigine.range("A1:A10")
        Dim PlageDestination as Microsoft.interop.office.excel.range = FeuilleOrigine.range("A1:A10")
        'Copier la plage d'origine
        PlageOrigine.copy
        'Coller
        PlageDestination.paste
        ClasseurOrigine.save
        ClasseurDestination.save
        ClasseurOrigine.close
        ClasseurDestination close
        'surveiller qu'Excel est bien disparu du gestionnaire de tâche à la fin du programme.
        'C'est une vraie tête de cochon quand il s'agit de le fermer par automation.
        AppExcel.quit
    end sub
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 71
    Points
    71
    Par défaut Comment utiliser les "Range" d'Excel 2010
    Bonjour et merci pour votre temps
    @clementmarcotte : effectivement c'est ce que j'utilise en VBA et cela marche bien.
    Mon principal souci : les ranges ne sont pas connus autrement que par leur nom qui commence tous par Conso_Titre_xx.
    Ils peuvent être n'importe ou sur la feuille.
    D’où l'importance de boucler avec un 'for each' et une fois que le nom est trouvé, récupérer l'adresse avec un split.
    J'ai lu que le nom d'un range doit être passer par un "objet"
    Le problème majeur réside dans la définition du range et de la façon de le récupérer

    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
    17
    18
    19
    20
    21
    22
    23
    24
     
                Dim cptTitre As Byte = 0
                Dim NbTitre As Byte = 0
                Dim xlApp As New Excel.Application
                Dim wBookDst As Workbook = xlApp.Workbooks.Open(NomClasseurConsolidation)
                Dim wbookSrc As Workbook = xlApp.Workbooks.Open(NomClasseurSortie)
                Dim sheetDst As Worksheet = wBookDst.Worksheets(NomFeuilleDst)
                Dim sheetSrc As Worksheet = wbookSrc.Worksheets(NomFeuilleSrc)
                Dim Addr(4) As Object
                Dim ligDeb As Int32
                Dim AddrLig As Int32
                Dim sNomPlage As Excel.Range
                Dim TitrePlage As Object
                TitrePlage = "Test"
                Try
                    For Each sNomPlage In wbookSrc.Worksheets.Range  ' -----> quelle est la bonne méthode ici  ?
                        If Strings.Mid(sNomPlage.Name, 1, 11) = "Conso_Titre" Then
                            NbTitre = NbTitre + 1
                        End If
                    Next
                    For cptTitre = 1 To NbTitre
                        TitrePlage = "Conso_Titre_" & Strings.Right("0" & cptTitre, 2)
                        sNomPlage.Name = TitrePlage
                        Addr = Split(sheetSrc.Range(sNomPlage).Address, "$")

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Points : 71
    Points
    71
    Par défaut
    Bonjour à tous

    Mon problème est résolu.
    Ma réflexion à été perturbée car je suis passé de la dll 'SpreadSheetGear' à interop.excel
    Dans SpreadSheetGear il fautr travailler avec le mot 'Range' et dans Excel avec le mot "Name"
    Donc le code devient :
    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
    17
    18
    19
    20
    21
                Dim xlApp As New Excel.Application
                Dim wBookDst As Excel.Workbook = xlApp.Workbooks.Open(NomClasseurConsolidation)
                Dim wbookSrc As Excel.Workbook = xlApp.Workbooks.Open(NomClasseurSortie)
     
                Dim sheetDst As Excel.Worksheet = wBookDst.Worksheets(NomFeuilleDst)
                Dim sheetSrc As Excel.Worksheet = wbookSrc.Worksheets(NomFeuilleSrc)
     
                Dim Addr(4) As Object
                Dim ligDeb As Byte
     
                Dim AddrLig As Byte
                Dim NomDeRange As Name = Nothing
     
                Try
     
                    For Each NomDeRange In wbookSrc.Names
                        If Strings.Mid(NomDeRange.Name, 1, 11) = "Conso_Titre" Then
                            Addr = Split(sheetSrc.Range(NomDeRange).Address, "$")
     
                            ligDeb = CByte(Replace(Addr(2), ":", ""))
    'etc.....
    Merci à tous ceux qui ont passé du temps à chercher

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Comment utiliser les fonctions ESSBASE dans une macro excel ?
    Par kharon_rp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/04/2010, 14h17
  2. [VBA EXCEL]comment utiliser les boites a outils control sur une feuille excel
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/02/2007, 19h04
  3. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

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