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 :

attribuer a une variable a un objet range non contigue


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut attribuer a une variable a un objet range non contigue
    bonsoir,

    souvent pour acceler mes codes
    j utilise un variant pour boucler sur des plages de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim vplage
    vplage = range("a1:b100")
    cette fois j ai voulu faire la meme chose mais avec une plage de cellules non contigues
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub essais()
    Dim var
    Dim a
    var = Range("a1:a3,c1:c3")
    For Each a In var
    MsgBox a
    Next
    End Sub
    et la surprise !!!
    la variable contient uniquement les valeurs de la colonne a (ici pour l exemple)
    peut on affecter un variant sur une plage non contigue ??? SANS PASSER PAR 2 VARIABLES

  2. #2
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    bonjour

    essaye ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub essais()
    Dim var as range
    Dim a as range
    set var = Range("a1:a3,c1:c3")
    For Each a In var
    MsgBox a
    Next
    End Sub
    la declaration des variable est importante, meme si elle n'est pas necessaire puisque par defaut le declaration est faite en Variant, la declaration en variant prend plus de place en memoire.

    Toute affectation d'un objet dans une variable demande un SET

    enfin tu peux aussi ecrire comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub essais()
    Dim a as range
    For Each a In Range("a1:a3,c1:c3")
    MsgBox a
    Next
    End Sub
    Bonne soirée

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    merci pour la reponse wilfried 42

    mais entre utiliser un variant et un objet range je ne suis pas sur de gagner en
    memoire.

    de plus l interet est la facilité de l utilisation du variant (tableau ligne/colonne)
    pour les boucles

  4. #4
    Membre Expert Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Auto-entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Par défaut
    re:

    libre à toi mais sache qu'un type variant en numerique prend 16 octets

    un integer (colonnes) : 2 octets (8 fois moins)
    un Long (lignes) : 4 Octets (4 fois moins)
    une Date avec son Heure : 8 Octets (2 fois moins)

    Un objet : prend 4 Octet (4 Fois moins)

    En string : Variant prend 22 Octets + les caracteres
    un String ne prend que les caracteres

    Voir Aide Excel sur Dim (detail des types)

    Bonne soirée

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    en fait j ai 2 solutions alternatives :
    1/ selection la plage complete meme si des cellules sont vides au milieu
    2/passer par une collection de variant

    la 2eme solution
    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
     
    Option Explicit
    Option Base 1
    Dim c_var As Collection
    Sub essais()
    Dim var1, var2
    Dim a, b
    Dim i As Integer, j As Integer
    var1 = Range("a1:b3")
    var2 = Range("e1:f3")
    Set c_var = New Collection
    c_var.Add var1
    c_var.Add var2
    For Each a In c_var
        i = i + 1 'pour identifier la collection var1 = item1 var2 = item2 etc
            For j = 1 To UBound(a, 1)
                MsgBox a(j, 1)
            Next j
    Next a
    End Sub

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    pour voir l utilité des variants

    1/ un code qui genere des valeurs aleatoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub gener_aleatoire()
    Dim a As Range
    For Each a In Range("a1:f10000")
    Randomize
    a = Int((1000 * Rnd) + 1)
    Next a
    End Sub
    2/ test des tps d execution
    1test a = objet range
    2test a = variant
    3test a = tableau

    dans un module
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    Private Declare Function GetTickCount Lib "Kernel32" () As Long
    
    Sub tps_execution1()
    Dim depart, tps_exe
    depart = GetTickCount()
    Dim a As Range
    For Each a In Range("a1:f10000")
        a = a + 1
    Next a
    tps_exe = GetTickCount() - depart
    MsgBox tps_exe
    End Sub
    
    
    Sub tps_execution2()
    Dim depart, tps_exe
    Dim cmpt1 As Long, cmpt2 As Long
    depart = GetTickCount()
    Dim a as variant
    
     a = Range("a1:f10000")
    For cmpt1 = LBound(a, 1) To UBound(a, 1)
        For cmpt2 = LBound(a, 2) To UBound(a, 2)
            a(cmpt1, cmpt2) = a(cmpt1, cmpt2) + 1
        Next cmpt2
    Next cmpt1
    Range("a1:f10000") = a
    
    tps_exe = GetTickCount() - depart
    MsgBox tps_exe
    End Sub
    
    Sub tps_execution3()
    Dim plage(10000, 6)Dim depart, tps_exe
    Dim i  As Integer, j As Integer
    depart = GetTickCount()
    For i = 1 To 6
        For j = 1 To 1000
            plage(j, i) = Cells(j, i)
        Next j
    Next i
    For i = 1 To 6
        For j = 1 To 1000
            plage(j, i) = plage(j, i) + 1
        Next j
    Next i
    For i = 1 To 6
        For j = 1 To 1000
            Cells(j, i) = plage(j, i)
        Next j
    Next i
    tps_exe = GetTickCount() - depart
    MsgBox tps_exe
    End Sub

Discussions similaires

  1. Problème avec une variable de type objet
    Par mrocks dans le forum C#
    Réponses: 7
    Dernier message: 09/05/2009, 22h27
  2. Accéder à une variable d'un objet contenu dans une collection
    Par derlone dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/04/2009, 16h50
  3. Réponses: 15
    Dernier message: 30/04/2008, 16h50
  4. [VBA-E]PB attribuer classeur à une variable
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/07/2006, 17h05
  5. Réponses: 4
    Dernier message: 19/06/2006, 17h02

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