|  | 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 .
 
  |  
  |  | 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. 
  
 
  |  
  |  | 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
	
  
 
  |  
  |  | 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
  |  
  |  
  |  | 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
  |  
  |  
  |  | 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 
  
 
  |  
  |  | 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
  |  
  |  
  |  | 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. 
  
 
  |  
  |  | 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
  |  
  |  
  |  | 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")
  |  
  |  
  |  | 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
  |  
  |  
  |  | 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
    
    
    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
  |  
  |  
  |  | 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
  |  
  |  
  |  | 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.
  
 
  |  
  |  | 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' 
  
 
  |  
  |  | 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
    
    
    
    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
    
    
    For X = 0 To UBound(Cellules1)
        If TypeName(Cellules1(X)) = "Range" Then
            Set Temp = Cellules1(X)
            
            
            If IsArray(Temp) Then
                
                For y = 1 To UBound(Temp.Value)
                    For z = 1 To UBound(Temp.Value, 2)
                        
                        
                            ReDim Preserve VarTab(1 To i)
                            VarTab(i) = Temp(y, z).Value
                            i = i + 1
                        
                    Next z
                Next y
                Else
                    
                    
                        
                        ReDim Preserve VarTab(1 To i)
                        VarTab(i) = Temp
                        i = i + 1
                    
            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)
    
    
    On Error Resume Next
    
    xTab = UBound(Tb)
    On Error GoTo 0
    
    
    If Not IsEmpty(xTab) Then MsgBox UBound(Tb)
End Sub
  |  
 
				
  	
				 
  |  
							lien : Utiliser les variables tableaux en VBA Excel
  |  
 
 
 
						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. 
												 |