Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo

precedent    sommaire    suivant   


Que représentent les objets Range et Cells ?
auteur : Bidou
Toute la difficulté de la programmation Excel se retrouve dans ces concepts. Il n'existe pas d'objet Cell. Cells donne accès à une collection de cellules représentant les cellules de tout objet contenant une ou plusieurs cellules. L'objet Range représente un ensemble de cellules. Il peut en contenir une ou plusieurs, contiguës ou non. De ce fait un objet Range peut contenir plusieurs objets Range. De nombreuses propriétés / méthodes de l'objet Range renvoient un Objet Range. Un objet Range contient toujours une collection Cells. La plupart des Q/R de cette FAQ portent sur la manipulation des objets Range .


Comment fonctionnent les références Excel ?
auteur : Bidou
Excel gère deux systèmes de références. La notation A1 est telle que les lignes sont représentées par des nombres croissants, du haut vers le bas, et les colonnes par des lettres croissantes, de gauche à droite. La notation L1C1 est telle que les lignes sont des nombres précédés de 'L' et les colonnes des nombres précédés de 'C'. Utiliser l'un ou l'autre de ces systèmes ne change rien. Il faut juste utiliser le même que celui dans lequel Excel est. C'est pour cela que généralement on force le mode d'Excel par le code. Quelle que soit le type de référence, Excel gère aussi une notation absolue et une notation relative. Celle-ci peut être différente pour les lignes et les colonnes.



Comment décaler une plage ?
auteur : Bidou
On utilise généralement la méthode OffSet Ainsi:

Vba

Range("A1:C1").Offset(1, 1)

Renvoie la plage (Range) "B2:D2".

Dans certains cas particuliers, on peut utiliser les méthodes Next ou Previous pour décaler vers des cellules adjacentes.
Par exemple:

Vba
 
MsgBox Range("A1").Next.Address(True, True, xlA1, False)


Renvoie $B$1



Comment redimensionner une plage ?
auteur : Bidou
On utilise la méthode Resize pour redimensionner une plage quand on connaît le nombre de lignes et de colonnes de la nouvelle plage.

Vba
 
MsgBox Range("A1").Resize(3, 2).Address(True, True, xlA1)

Renvoie $A$1:$B$3.

Notons que comme dans le cas de Offset, l'objet renvoyé est un Range. Il est donc possible de combiner plusieurs de ces ordres.

Vba
 
Range("A1").Resize(3, 2).Offset(,1).ClearContents

Que représente l'objet Area ?
auteur : Bidou
L'objet Area n'existe pas. Il existe une collection Areas qui renvoie l'ensemble des plages continues d'un objet Range. En lui-même, tout objet Range possède au moins un élément dans sa collection Areas, qui peut être lui même si Range est une plage continue. En générale on énumère la collection.

Vba
  
Dim objRange As Range

For Each objRange In Range("A3:A12,D10:E21,I1:I16").Areas
    objRange.Merge False
Next

Quelles différences entre UsedRange et CurrentRegion ?
auteur : Bidou
UsedRange est la plage des cellules utilisées dans une feuille. CurrentRegion est la plage rectangulaire de cellules non vides qui entourent l'objet Range sur lequel on fait l'appel de CurrentRegion. CurrentRegion doit être utilisé avec précaution car il a parfois un comportement piégeux. Imaginons qu'il existe un tableau rempli en A1:C3 et que toutes les autres cellules soit vides, alors

Vba

MsgBox Cells(2, 4).CurrentRegion.Address(True, True, xlR1C1)

Renvoie R1C1:R3C4



Comment sélectionner les cellules d'une colonne ?
auteur : Bidou
Plusieurs cas:

Sélectionner toute la colonne

Vba

Range("A1").EntireColumn.Select



Sélectionner les cellules non vides de la colonne

Vba

Range("A1").EntireColumn.SpecialCells(xlCellTypeConstants).Select



Attention, si vous voulez compter dans les cellules non vides, celles qui contiennent une formule il faut

Vba

Application.Union(Range("A1").EntireColumn.SpecialCells(xlCellTypeConstants), Range("A1").EntireColumn.SpecialCells(xlCellTypeFormulas)).Select



Sélectionner une plage de valeurs continues

Vba

Range("A1", Range("A1").End(xlDown)).Select



Sélectionner de la première à la dernière cellule non vide en prenant les cellules vides incluses

Vba

Range("A1", Range("A1").EntireColumn.Find(What:="*", SearchDirection:=xlPrevious)).Select

Peut-on récupérer une plage de cellules contenant les cellules en erreurs ?
auteur : Bidou
C'est assez simple :

Vba

Dim objWorksheet As Worksheet, objRange As Range
Set objWorksheet = ThisWorkbook.Worksheets(1)
Set objRange = objWorksheet.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)


C'est assez logique puisque seules les cellules contenant une formules peuvent être en erreur.



Comment savoir si une plage fait référence à une cellule ou à plusieurs, voire à plusieurs plages ?
auteurs : Etienne Bar, Bidou
Il faut utiliser la propriété Count des collections visées. C'est la collection Cells pour le nombres de cellules, Areas pour le nombre de plages. Un code Exemple pourrait être.

Vba
 
Dim Msg As String, objRange As Range

With ThisWorkbook.Worksheets(1).Range("A3:A11,D7:E14,G1:G4,I15:J23,C22:F22")
    Msg = "La plage contient " & .Cells.Count & " cellules dans " & .Areas.Count & " plages continues" & vbCrLf
    For Each objRange In .Areas
        Msg = Msg & "La plage " & objRange.AddressLocal(False, False, xlA1) & " contient " & objRange.Cells.Count & " cellules" & vbCrLf
    Next
End With
MsgBox Msg

Comment récupérer la plage filtrée par AutoFilter ?
auteur : Bidou
Excel masque les lignes ne répondant pas au filtre, il suffit donc de récupérer la plage des cellules visibles.

Vba

Range("A2:C21").AutoFilter Field:=1, Criteria1:=">10",
Range("A2:C21").SpecialCells(xlCellTypeVisible).Copy Destination:=Range("A24")

Comment demander à l'utilisateur de sélectionner une plage de cellule ?
auteur : Bazoom
Vous connaissez surement la fonction InputBox, mais connaissez-vous la méthode InputBox de l'objet Application ?
Pour tous les détails sur cette méthode, reportez-vous à l'aide en ligne de VBA Excel, mais voici un exemple pour générer une boite de dialogue qui attend une cellule ou un groupe de cellules :

Vba

    Dim P As Range
    
	On Error Resume Next
    Set P = Application.InputBox("Sélectionnez une cellule ou une plage :", Type:=8)
    On Error GoTo 0
    If P Is Nothing Then MsgBox "Sélection annulée"



Pour information, les autre types disponibles pour la méthode InputBox:
0 : Formule
1 : Nombre
2 : String
4 : Booléen
8 : Range
16 : Erreur
64 : Tableau



Comment gérer les encadrements par le code ?
auteur : Bidou
Il existe deux approches. On veut encadrer le contour externe de la plage, on utilise BordersAround.

Vba

objRange.BorderAround xlContinuous, xlMedium, xlColorIndexAutomatic



On souhaite mettre des bordures particulières, on passe par l'élément de la collection Borders:

Vba

Dim objWorksheet As Worksheet, objRange As Range

Set objWorksheet = ThisWorkbook.ActiveSheet
Set objRange = objWorksheet.Range(objWorksheet.Cells(1, 1), objWorksheet.Cells(10, 10))
With objRange.Borders
    With .Item(xlInsideHorizontal)
        .ColorIndex = 5
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With
End With



On veut tout encadrer:

Vba

With objRange.Borders
    .ColorIndex = 5
    .LineStyle = xlContinuous
    .Weight = xlThin
End With

Comment vérifier si une cellule appartient à une plage ?
auteur : SilkyRoad
Utilisez la méthode Intersect:

Vba

Sub Test()
    VerifIntersection Range("A1")
    VerifIntersection Range("B10")
End Sub


Sub VerifIntersection(Cellule As Range)
    Dim Plage As Range
    
    'Définit la plage de référence
    Set Plage = Range("A5:B15")
    
    If Not Intersect(Plage, Cellule) Is Nothing Then
         MsgBox Cellule.Address & " appartient à la plage " & Plage.Address
        Else
         MsgBox Cellule.Address & " n'appartient pas à la plage " & Plage.Address
    End If
End Sub

Comment définir un objet Range contenant les cellules qui ne sont pas à l'intersection entre deux plages ?
auteur : SilkyRoad
Les méthodes Union et Intersect renvoient la fusion ou l'intersection de deux objets Range.
La procédure suivante renvoie un objet Range inverse (contenant les cellules qui sont différentes entre deux plages).

Vba

Dim A As Range, B As Range, C As Range
Dim Cell As Range, Commun As Range, PlageResultat As Range

Set A = Range("A1:A10")
Set B = Range("A7:A15")

Set Commun = Application.Intersect(A, B)

For Each Cell In Union(A, B)
    If Intersect(Cell, Commun) Is Nothing Then
        If PlageResultat Is Nothing Then
            Set PlageResultat = Cell
            Else
            Set PlageResultat = Union(PlageResultat, Cell)
        End If
    End If
Next Cell

MsgBox PlageResultat.Address

Comment répéter la même donnée dans toutes les cellules sélectionnées ?
auteur : SilkyRoad
Sélectionnez la plage de cellule.
Saisissez la donnée à recopier. Pour valider, utilisez simultanément les touches clavier Ctrl+Entrée.
Le texte saisi apparaît dans chaque cellule de la sélection.



Comment sélectionner les cellules vides d'une plage ?
auteur : SilkyRoad
Dans les versions antérieures d'Excel,
Sélectionnez la plage de cellules.
Menu 'Edition'
Bouton 'Atteindre'
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Cellules vides'


Dans Excel2007,
Onglet Accueil
Groupe Edition
Cliquez sur la commande 'Rechercher et sélectionner'
Bouton 'Atteindre'
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Cellules vides'




Comment créer un tableau d'une dimension à partir de cellules discontinues ?
auteurs : Microsoft, SilkyRoad
La procédure crée un tableau d'une dimension, à partir des données passées dans la fonction.
Une fonction qui retourne un tableau doit impérativement être déclarée en type Variant.

Vba

Function CreationTableau(ParamArray Cellules1()) As Variant
    'Adapté de:
    'http://support.microsoft.com/?kbid=213403
    '
    Dim VarTab() As Variant
    Dim Temp As Variant
    Dim i As Integer
    Dim w As Integer, X As Integer, y As Integer, z As Integer
    
    i = 1
    
    'Boucle sur les éléments du tableau de paramètres.
    For X = 0 To UBound(Cellules1)
        If TypeName(Cellules1(X)) = "Range" Then
            Set Temp = Cellules1(X)
            'Vérifie si le paramètre passé à la fonction est une cellule simple
            'ou une plage.
            If IsArray(Temp) Then
                'Intègre chaque cellule de la plage dansle tableau.
                For y = 1 To UBound(Temp.Value)
                    For z = 1 To UBound(Temp.Value, 2)
                        'Permet de filtrer les cellules vides.
                        'If Not IsEmpty(Temp(y, z).Value) Then
                            ReDim Preserve VarTab(1 To i)
                            VarTab(i) = Temp(y, z).Value
                            i = i + 1
                        'End If
                    Next z
                Next y
                Else
                    'Permet de filtrer les cellules vides.
                    'If Not IsEmpty(Temp) Then
                        'Intègre la cellule dans le tableau.
                        ReDim Preserve VarTab(1 To i)
                        VarTab(i) = Temp
                        i = i + 1
                    'End If
            End If
        Else
            ReDim Preserve VarTab(1 To i)
            VarTab(i) = Cellules1(X)
            i = i + 1
        End If
    Next X
    
    CreationTableau = VarTab
End Function


Vous pouvez indiquer des cellules uniques (E1), des plages (A1:A10, C1:C10) ou des données (80) lorsque vous appelez la fonction:

Vba

Sub Test()
    Dim Tb As Variant, xTab As Variant
    
    Tb = CreationTableau(Range("A1:A10"), Range("C1:C10"), Range("E1"), 80)
    
    '--- Vérifie si le tableau est vide ---
    On Error Resume Next
    'xTab va prendre la valeur Empty si le tableau est vide.
    xTab = UBound(Tb)
    On Error GoTo 0
    
    'Renvoie le nombre d'éléments du tableau
    If Not IsEmpty(xTab) Then MsgBox UBound(Tb)
End Sub



lien : Utiliser les variables tableaux en VBA Excel

precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2008  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com