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
Sommaire > Les cellules
        A quoi correspond la notation [A1] ?
        Peut on cacher les valeurs nulles sans écrire de formules ?
        Comment protéger une plage de cellules dans la feuille ?
        Comment gérer les erreurs dans les cellules ?
        Pourquoi passer par un tableau pour manipuler des plages de valeurs ?
        Comment fonctionnent les recopies de cellules ?
        Comment lister les cellules et plages nommées contenues dans une feuille spécifique ?
        Comment effacer une plage de cellules mais pas les formules qu'elle contient?
        Comment insérer rapidement la date et l'heure dans une cellule ?
        Comment définir un nombre maxi de caractères à saisir dans les cellules ?
        Comment limiter les saisies par le code ?
        Comment protéger les cellules qui contiennent des formules ?
        Comment retrouver les numéros des dernières lignes et dernières colonnes renseignées dans une feuille ?
        Comment transposer des colonnes en lignes ?
        Comment séparer les mots d'une phrase saisie dans une cellule ?
        Comment positionner une cellule dans le coin supérieur gauche de l'application ?
        Comment retrouver les cellules fusionnées ?
        Comment identifier les dépendants contenus sur d'autres feuilles ?
        Comment identifier rapidement la dernière cellule utilisée dans la feuille ?
        Comment faire clignoter une cellule ?
        Comment utiliser la bibliothèque DAO pour créer une requête SQL sur une plage de cellules ?
        Comment empêcher l'écriture dans une cellule ?
        Comment identifier par macro la dernière cellule utilisée dans la feuille spécifiée ?
        Comment récupérer le nom de la feuille correspondant à la déclaration d'un objet Range ?
        9.1. Les plages (17)
                Que représentent les objets Range et Cells ?
                Comment fonctionnent les références Excel ?
                Comment décaler une plage ?
                Comment redimensionner une plage ?
                Que représente l'objet Area ?
                Quelles différences entre UsedRange et CurrentRegion ?
                Comment sélectionner les cellules d'une colonne ?
                Peut-on récupérer une plage de cellules contenant les cellules en erreurs ?
                Comment savoir si une plage fait référence à une cellule ou à plusieurs, voire à plusieurs plages ?
                Comment récupérer la plage filtrée par AutoFilter ?
                Comment demander à l'utilisateur de sélectionner une plage de cellule ?
                Comment gérer les encadrements par le code ?
                Comment vérifier si une cellule appartient à une plage ?
                Comment définir un objet Range contenant les cellules qui ne sont pas à l'intersection entre deux plages ?
                Comment répéter la même donnée dans toutes les cellules sélectionnées ?
                Comment sélectionner les cellules vides d'une plage ?
                Comment créer un tableau d'une dimension à partir de cellules discontinues ?
        9.2. Les cellules et plages nommées (9)
                C'est quoi une cellule nommée ?
                Comment lister les cellules et les plages nommées, dans l'ordre d'index des feuilles ?
                Comment nommer des cellules non adjacentes issues d'un filtre automatique ?
                Comment supprimer tous les noms dans le classeur ?
                Comment modifier le nom d'une plage de cellules ?
                Comment nommer une plage de cellules dynamiquement ?
                Comment compter le nombre de cellules d'une plage nommée ?
                Pourquoi Target.Name ne renvoie rien lorsque les cellules sont fusionnées ?
                Comment ajouter ou modifier un commentaire dans cellule/plage nommée Excel 2007 ?
        9.3. Les commentaires (7)
                Comment créer un commentaire par macro ?
                Comment vérifier s'il y a un commentaire dans une cellule ?
                Comment identifier les cellules qui contiennent des commentaires ?
                Comment copier un commentaire dans une autre cellule ?
                Comment adapter la taille d'un commentaire en fonction du texte qu'il contient ?
                Comment insérer une image dans un commentaire ?
                Comment lister le contenu des commentaires dans un document Word ?
        9.4. Les listes de validation (6)
                C'est quoi une liste de validation ?
                Comment faire pour ne pas visualiser les cellules vides dans une liste de validation ?
                Comment créer des listes de validation conditionnelles et sans doublon ?
                Comment créer une liste de validation à partir de données contenues dans une autre feuille ?
                Comment afficher une info-bulle sur une cellule ?
                Comment vérifier si une liste de validation existe dans une cellule ?

precedent    sommaire    suivant   


A quoi correspond la notation [A1] ?
auteur : Bidou
C'est un appel implicite à la méthode Evaluate. Il s'agit en fait d'un interpréteur (le même que celui qui interprète les formules Excel). On peut faire des utilisations très complexes de cette méthode.

Par exemple:
Vba

MaValeur = Application.Evaluate("LOG(A1*3+2)")

Cela peut s'écrire aussi:
Vba

MaValeur = [LOG(A1*3+2)]

Notez qu'il n'y a pas de guillemets lorsqu'on utilise la notation crochets. L'interprétation des plages, dans notre cas A1, demande que le système de référence soit homogène. Si ma feuille était en référence LC j'obtiendrais une incompatibilité de type.



Peut on cacher les valeurs nulles sans écrire de formules ?
auteur : Bidou
Il faut utiliser les formats de cellules.

Vba
 
objSheet.UsedRange.NumberFormat = "0;-0;;@"

Comment protéger une plage de cellules dans la feuille ?
auteur : SilkyRoad
Sélectionnez toutes les cellules de la feuille.
Effectuez un Clic droit.
Sélectionnez l'option "format de cellule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Décochez l'option "Verrouillée".
Cliquez sur le bouton OK pour valider.

Ensuite, sélectionnez uniquement la plage de cellules que vous souhaitez protéger.
Effectuez un Clic droit.
Sélectionnez l'option "format de celllule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Cochez l'option "verrouillée".
Cliquez sur le bouton OK pour valider.

Ensuite, utilisez le menu Outils /Protection / Protéger la feuille .
Assurez vous que l'option "protéger la feuille et le contenu des cellules verrouillées" est cochée.
Saisissez votre mot de passe (en option).
Cliquez sur le bouton OK pour valider.



Comment gérer les erreurs dans les cellules ?
auteur : SilkyRoad
Des erreurs peuvent parfois apparaître dans les formules de calcul.
L'erreur peut être la conséquence d'une saisie erronée, mais peut parfois aussi être inévitable: Exemple des formules dans un tableau de bord prérempli et complété à chaque fin de mois. Les cellules contenant des formules pour les prochains mois peuvent logiquement renvoyer une erreur car les données ne sont pas encore renseignées.

Excel dispose de plusieurs outils qui permettent d'identifier et gérer ces erreurs. Il est intéressant de connaître la signification les codes d'erreur, de cerner la cause et pouvoir ainsi trouver une solution corrective plus facilement.

Consultez l'article sur la gestion des erreurs.



Pourquoi passer par un tableau pour manipuler des plages de valeurs ?
auteur : Bidou
Ce n'est pas toujours une nécessité, mais cela permet d'accélérer le code. Sur les grandes collections, il convient d'éviter l'énumération qui est très lente.

Comparez la rapidité d'exécution du code entre

Vba
 
Dim ObjCell As Range

For Each ObjCell In Range("A1:J65535").Cells
    ObjCell.Value = ObjCell.Value * 2 + 3
Next


et

Vba
 
Dim Montab As Variant, cmpt1 As Long, cmpt2 As Long

Montab = Range("A1:J65535").Value

For cmpt1 = LBound(Montab, 1) To UBound(Montab, 1)
    For cmpt2 = LBound(Montab, 2) To UBound(Montab, 2)
        Montab(cmpt1, cmpt2) = Montab(cmpt1, cmpt2) * 2 + 3
    Next cmpt2
Next cmpt1

Range("A1:J65535").Value = Montab


Le deuxième code s'exécute environ 20 fois plus vite.



Comment fonctionnent les recopies de cellules ?
auteur : Bidou
Il existe globalement deux types de recopies. La recopie incrémentée (AutoFill) et la non-incrémentée. Une recopie incrémentée consiste à recopier une plage en incrémentant une des propriétés suivantes

* xlFillDefault : laisse excel choisir l'incrément
* xlFillSeries : Recopie avec les paramètres de la série si ceux-ci existent
* xlFillCopy : Sans incrément (utilisez plutôt la méthode Fill)
* xlFillFormats : Recopie le format sans les valeurs
* xlFillValues : Utilise l'incrément par défaut, mais ne recopie pas les formules
* xlFillDays : Incrémente les jours
* xlFillWeekdays : Incrémente les noms de jours
* xlFillMonths : Incrémente les mois
* xlFillYears : Incrémente les années
* xlLinearTrend : Tendance linéaire
* xlGrowthTrend : Tendance géométrique

Evidemment la recopie doit pouvoir trouver la valeur de l'incrément, il faut donc que la source contiennent au moins deux cellules.

Vba

Range("F29:F30").AutoFill Destination:=Range("F29:F43"), Type:=xlGrowthTrend
Cells(29, 6).Resize(2).AutoFill Destination:=Cells(29, 6).Resize(10), Type:=xlFillDefault


La recopie non incrémentée utilise une des méthodes Fill directionnelles: FillDown, FillUp, FillLeft, FillRight. Il faut que la cellule opposée au sens contienne une valeur ou une formule.

Vba
 
Cells(29, 6).Resize(10).FillDown

Comment lister les cellules et plages nommées contenues dans une feuille spécifique ?
auteur : SilkyRoad
Cet exemple extrait la liste des noms contenus dans la Feuil1.

Vba

Dim Plage As Range
Dim Nm As Name
  
On Error Resume Next
'Boucle sur les noms du classeur
For Each Nm In ThisWorkbook.Names
    Set Plage = Nm.RefersToRange
    
    If Not Plage Is Nothing Then
        'Vérifie si le nom appartient à la feuille
        If Worksheets("Feuil1").Name = Plage.Worksheet.Name Then _
            MsgBox Nm.Name & ":" & Plage.Address
    End If

    Set Plage = Nothing
Next Nm

Comment effacer une plage de cellules mais pas les formules qu'elle contient?
auteur : SilkyRoad
Sélectionnez la plage de cellules.
Appuyez sur la touche F5 du clavier.
Cliquez sur le bouton "Cellules".
Sélectionnez "Constantes".
Cochez le ou les types de données à supprimer (texte, nombre ...).
Cliquez sur le bouton "Ok".
Les cellules correspondantes sont sélectionnées.
Vous pouvez alors appuyer sur la touche "Suppr" du clavier pour supprimer le contenu des cellules tout en conservant les formules dans la plage initialement sélectionnée.


La même solution par macro:

Vba

Range("A1:A10").SpecialCells(xlCellTypeConstants, 3).ClearContents

Comment insérer rapidement la date et l'heure dans une cellule ?
auteur : SilkyRoad
Pour insérer la date du jour rapidement, sélectionnez une cellule puis utilisez le raccourci clavier Ctrl + ; (Touche Ctrl et le point virgule).


Pour insérer l'heure, utilisez le raccourci clavier Ctrl + : (Touche Ctrl et les deux points).



Comment définir un nombre maxi de caractères à saisir dans les cellules ?
auteur : SilkyRoad
Sélectionnez la ou les cellules à paramétrer.
Ensuite, utilisez le menu Données/Validation.
Sélectionnez l'onglet Options.
Dans le champ Autoriser:, sélectionnez la ligne "Longueur du texte".
Dans le champ Données:, sélectionnez la ligne "inférieure ou égale à".
Dans le champ Longueur:, précisez le nombre de caractères à autoriser dans les cellules sélectionnées.
Cliquez sur le bouton OK pour valider.

Désormais, un message d'alerte s'affiche lorsque vous saisissez un nombre de caractères supérieur à la valeur paramétrée.



Comment limiter les saisies par le code ?
auteur : Bidou
On utilise les validations comme par le menu. L'exemple suivant restreint les valeurs saisissables de G1, entre 10 et 100

Vba

With Range("G1").Validation
        .Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="10", Formula2:="100"
        .IgnoreBlank = True
        .InCellDropdown = True
        .ErrorMessage = "La valeur doit être comprise entre 10 et 100"
        .ShowInput = True
        .ShowError = True
End With

Comment protéger les cellules qui contiennent des formules ?
auteur : SilkyRoad
Sans macro:

Sélectionnez toutes les cellules de la feuille
Clic droit dans la feuille
Format de cellule
Onglet Protection
Décochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider

Menu Edition
Atteindre
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Formules'
Cliquez sur le bouton OK pour valider

Clic droit dans la feuille (assurez vous que les cellules contenant des formules sont toujours sélectionnées)
Format de cellule
Onglet Protection
Cochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider
Ensuite, protégez la feuille. Seules les formules seront protégées en écriture.

Nota:
Pour sélectionner les cellules contenant des formules 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 'Formules'


Par macro:

Vba

Sub Test()
    ProtectionCellules_Formules Worksheets("Feuil3"), "DVP"
End Sub


Sub ProtectionCellules_Formules(Ws As Worksheet, PassWord As String)
    On Error Resume Next
    
    With Ws
        .Unprotect PassWord 'Le mot de passe est en option
        .Cells.Locked = False
        .Cells.SpecialCells(xlCellTypeFormulas).Locked = True
        .EnableSelection = xlUnlockedCells
        .Protect PassWord
    End With
End Sub



Et si vous souhaitez déprotéger la feuille :

Vba

Sub Deprotege()
    Worksheets("Feuil3").Unprotect "DVP"
End Sub

Comment retrouver les numéros des dernières lignes et dernières colonnes renseignées dans une feuille ?
auteur : Ouskelnor
UsedRange (premier exemple).
Cet exemple envoie le nombre de lignes renseignées dans la feuille, où qu'elles soient.
Si les lignes 1 à 10 et 17 à 19 sont vides, mais que les lignes 11 à 16 et 20 à 24 sont renseignées, le résultat est 11 (6 + 5).

Vba

Dim NbLignes As Integer    
NbLignes = ActiveSheet.UsedRange.Rows.Count


Nota:
Pensez à adapter le type de variable utilisé. Dans l'exemple précédent, un message d'erreur (dépassement de capacité) survient si la procédure renvoie plus de 32767 lignes.

UsedRange (2eme exemple).
Renvoie le numéro de la première ligne renseignée dans la feuille.

Vba

Dim LaPremiereLigne As Integer    
LaPremiereLigne = ActiveSheet.UsedRange.Row



CurrentRegion (premier exemple).
Cette propriété Définit une plage de toutes les cellules contiguës, délimitées par les premières lignes et colonnes vides.
Ici la procédure renvoie la dernière ligne de la Plage. S'il n'y a pas de ligne vide dans la plage de données, que la cellule "Cel" se trouve dans la plage de données, la macro renvoie la dernière ligne de la plage de données, non de la feuille.

Vba

Dim DerniereLigne As Integer    
DerniereLigne = Range(Cel).CurrentRegion.End(xlDown).Row


CurrentRegion (deuxième exemple).
Renvoie l'adresse de la plage des cellules contiguës:

Vba

Dim strPlage As String    
strPlage = Range("A15").CurrentRegion.Address(False, False)  
'Exemple : "A4:N25"



Range(Col 65536).End(xlUp)
Renvoie la dernière ligne renseignée dans la colonne spécifiée.
Pour connaître le numéro de la dernière ligne absolue renseignée dans la colonne A, utilisez:

Vba

Dim DerniereLigne As Integer    
DerniereLigne = Range("A65536").End(xlUp).Row



Range("A1").End(xlDown)
Renvoie le numéro de la dernière ligne, avant la première cellule vide, en descendant à partir de la cellule spécifiée.

Vba

Dim DerniereLigne As Integer    
DerniereLigne = Range("A1").End(xlDown).Row


Un autre exemple qui renvoie le numéro de la dernière ligne, avant la première cellule vide de la colonne C, en partant de la cellule C15:

Vba

Dim DerniereLigne As Integer    
DerniereLigne = Range("C15").End(xlDown).Row



Range(...).SpecialCells(xlCellTypeLastCell)
Renvoie la dernière ligne absolue non vide dans la feuille.
Attention: Si des lignes sont supprimées dans la plage, enregistrez préalablement le fichier pour que la procédure renvoie la réelle dernière ligne (idem pour les colonnes supprimées).

Vba

Dim DerniereLigne As Integer    
DerniereLigne = Range("A1").SpecialCells(xlCellTypeLastCell).Row



Range(...).SpecialCells(xlCellTypeLastCell).Address
Renvoie l'adresse absolue de la dernière cellule renseignée dans la feuille:

Vba

Dim AdresseAbsolue As String    
AdresseAbsolue = Range("A1").SpecialCells(xlCellTypeLastCell).Address



Le principe est identique pour les colonnes:

Vba

    DerniereColonne = ActiveSheet.UsedRange.Columns.Count
    DernièreColonne = Selection.CurrentRegion.End(xlToRight).Column
    DerniereColonne = Range("A1").End(xlToRight).Column
    DerniereColonne = Range("IV1").End(xlToLeft).Column
    ' IV est la dernière colonne d'une feuille de calculs => 256)
    DerniereColonne = Range("A1").SpecialCells(xlCellTypeLastCell).Column



Identifier des plages de cellules.
Toutes les combinaisons sont possibles.
Exemple:

Vba

Dim strPlage As String
strPlage = Range(Cells(1,1), Cells(Range("A65536").End(xlUp).Row, _
                Range("IV1").End(xlToLeft).Column)).Address


Ou en tant qu'objet, avec une instance :

Vba

Dim objPlage As Range
Set objPlage = Range(Cells(1,1), Cells(Range("A65536").End(xlUp).Row, _
                Range("IV1").End(xlToLeft).Column))
Vba

Dim strPlage As String
srtPlage = Range("A1:" & Range("A1").SpecialCells(xlCellTypeLastCell).Address).Address


Pour sélectionner la plage, utilisez:

Vba

Range("A1:" & Range("A1").SpecialCells(xlCellTypeLastCell).Address).select

Comment transposer des colonnes en lignes ?
auteur : SilkyRoad
Pour transformer une plage verticale de cellules sous forme de plage horizontale:
Sélectionnez votre tableau.
Effectuez un "Copier".
Sélectionnez ensuite une cellule vide sous le tableau.
Menu Edition/Collage spécial
Cochez l'option "Transposé" dans la boîte de dialogue.
Cliquez sur le bouton OK pour valider.



Comment séparer les mots d'une phrase saisie dans une cellule ?
auteur : SilkyRoad
Chaque mot séparé par un espace sera inséré dans une cellule différente.

Sélectionnez la cellule ou la plage de données sources.
Utilisez le menu Données/Convertir.
Sélectionnez l'option "Largeur fixe".
Cliquez sur le bouton "Suivant".
A l'étape suivante, vous pouvez modifier manuellement la scission entre les données.
Cliquez sur le bouton "Suivant".
Paramétrez le type de données et la cellule de destination.
Cliquez sur le bouton "Terminer".


Vous pouvez aussi créer des formules pour extraire les mots contenu dans la cellule.
Si par exemple les données sont en A1, saisissez cette formule en B1, puis utilisez la poignée de recopie vers la droite.

=SI(COLONNE()-1>NBCAR($A$1)-NBCAR(SUBSTITUE($A$1;" ";""));DROITE($A$1;NBCAR($A$1)-TROUVE("^^";SUBSTITUE($A$1;" ";"^^";NBCAR($A$1)-NBCAR(SUBSTITUE($A$1;" ";"")))));SI(COLONNE()-1=1;STXT($A$1;1;TROUVE("^^";SUBSTITUE($A$1;" ";"^^";1))-1);STXT($A$1;TROUVE("^^";SUBSTITUE($A$1;" ";"^^";COLONNE()-1-1))+1;TROUVE("^^";SUBSTITUE($A$1;" ";"^^";COLONNE()-1))-TROUVE("^^";SUBSTITUE($A$1;" ";"^^";COLONNE()-1-1))-1)))


Une autre solution par macro:

Vba

'Extrait les données séparées par un espace dans la cellule A1
Sub extractionMots()
    Dim Tableau() As String
    Dim i As Integer
    
    'découpe la chaine en fonction des espaces " "
    'le résultat de la fonction Split est stocké dans un tableau
    Tableau = Split(Range("A1"), " ")
    
    'boucle sur le tableau pour visualiser le résultat
    For i = 0 To UBound(Tableau)
        'Le résultat s'affiche dans la premiere ligne, à
        'partir de la cellule B1.
        Range("A1").Offset(0, i + 1) = Tableau(i)
    Next i
End Sub

Comment positionner une cellule dans le coin supérieur gauche de l'application ?
auteur : SilkyRoad
Vba

Sub Test()
    Deplace Range("K20")
End Sub
 
 
'Positionne la cellule spécifiée dans le coin supérieur gauche
'de l'application.
Sub Deplace(Cellule As Range)
    Dim Ligne As Integer, Colonne As Integer
    
    Ligne = Cellule.Row
    Colonne = Cellule.Column
    
    With ActiveWindow
        .ScrollRow = Ligne
        .ScrollColumn = Colonne
    End With
End Sub

Comment retrouver les cellules fusionnées ?
auteur : SilkyRoad
Cet exemple applique une couleur jaune dans les cellules fusionnées de la feuille nommée Feuil1.

Vba

Sub VisualiserCellulesFusionnees()
Dim Cell As Range

'Boucle sur les cellules utilisées dans la feuille
For Each Cell In Worksheets("Feuil1").UsedRange.Cells
    'Si la cellule est fusionnée
    'Colorie en jaune si la cellule est fusionnée
    If Cell.MergeCells Then Cell.MergeArea.Interior.ColorIndex = 6
Next Cell
End Sub

Comment identifier les dépendants contenus sur d'autres feuilles ?
auteur : SilkyRoad
La propriété d'identification des dépendants fonctionne uniquement sur la feuille active et ne peut pas suivre les références distantes (sur les autres feuilles).
La procédure suivante recherche les dépendants d'une cellule dans toutes les feuilles du classeur.

Nota:
Cet exemple ne gère pas les cellules et les plages nommées.

Vba

Option Explicit
 
Sub Test()
    'Liste les dépendants de la cellule D4, dans la Feuil2
    ListeDependents Worksheets("Feuil2").Range("D4")
End Sub
 
 
Sub ListeDependents(Cellule As Range)
    Dim Ws As Worksheet
    Dim Plage As Range, Cell As Range, DirectDep As Range
    Dim i As Integer, x As Integer
    Dim Cible As String, strDepenDent As String, strRefer As String
    'La liste des dépendants  va être stockée dans une collection
    Dim Un As New Collection
    
    
    'Active la feuille contenant la cellule à contrôler
    Cellule.Parent.Activate
    
    strDepenDent = Cellule.Parent.Name & "!" & Cellule.Address(0, 0)
        
        
    'Vérifie s'il y a des dépendants directs dans la feuille:
    On Error Resume Next
    'Définit la plage de cellules dépendantes, dans la feuille active
    Set Plage = Cellule.DirectDependents.Cells
    On Error GoTo 0
    
    If Not Plage Is Nothing Then
        'Boucle sur les dépendants contenus dans la feuille active
        For Each DirectDep In Cellule.DirectDependents.Cells
            Un.Add Cellule.Parent.Name & "!" & DirectDep.Address, _
                Cellule.Parent.Name & "!" & DirectDep.Address
        Next DirectDep
    End If
    
    Set Plage = Nothing
    
    
    
    'Boucle sur les autres feuilles du classeur:
    For Each Ws In ThisWorkbook.Worksheets
        'Si la feuille est différente de la feuille active
        If Ws.Name <> Cellule.Parent.Name Then
            
            On Error Resume Next
            'Définit la plage de cellules contenant des formules
            Set Plage = Ws.UsedRange.SpecialCells(xlCellTypeFormulas)
            On Error GoTo 0
            
            
            'Vérifie si la feuille contient des formules
            If Not Plage Is Nothing Then
                
                'Boucle sur les cellules contenant des formules
                For Each Cell In Plage
                        
                    'Gestion des références relatives et absolues
                    Cible = Replace(Cell.Formula, "$", "")
                        
                        
                    'Vérifie si le nom de la feuille apparait dans la formule.
                    If InStr(1, Cible, Cellule.Parent.Name) > 0 Then
                        
                        'Vérifie si la formule contient une référence correspondant à la
                        'cellule à contrôler
                        i = 0
                        i = InStr(1, Cible, strDepenDent)
                        
                        'Si la référence est trouvée on l'intègre dans la collection
                        If i > 0 And Not IsNumeric(Mid(Cible, i + Len(strDepenDent), 1)) Then
                            
                            Un.Add Ws.Name & "!" & Cell.Address, Ws.Name & "!" & Cell.Address
                        
                        Else
                            
                            'Recherche des références dans les plages de cellules
                            For x = 1 To Len(Cible)
                                i = 0
                                i = InStr(1, Cible, ":")
                                
                                If i > 0 Then
                                    strRefer = ExtractionReferences(Cible)
                                    
                                    'Si la cellule à contrôler se trouve dans la plage,
                                    'on l'intègre dans la collection.
                                    If VerifIntersect(Cellule, Range(strRefer)) And _
                                        InStr(1, Cible, Cellule.Parent.Name & "!" & strRefer) > 0 Then
                                        
                                        On Error Resume Next
                                        Un.Add Ws.Name & "!" & Cell.Address, Ws.Name & "!" & Cell.Address
                                        On Error GoTo 0
                                        
                                        Exit For
                                    End If
                                    
                                    Cible = Mid(Cible, i + 1)
                                Else
                                    Exit For
                                End If
                            Next x
                            '--------------
                        
                        
                        End If
                    End If
                Next Cell
                
            End If
        End If
    
        Set Plage = Nothing
    Next Ws
 
    
    'Boucle sur la collection qui contient la liste des dépendants
    For i = 1 To Un.Count
        'Affiche le résultat dans la fenêtre d'exécution (Ctrl+G)
        Debug.Print Un.Item(i)
    Next i
End Sub
 
 
 
 
'Extrait les références spécifiées dans les formules
Function ExtractionReferences(Chaine As String) As String
    Dim i As Integer, j As Integer
    Dim strPlage As String, Caract As String
    
    i = InStr(1, Chaine, ":")
                        
                        
    'Renvoie la référence avant les deux points ":"
    For j = i - 1 To 1 Step -1
        Caract = Mid(Chaine, j, 1)
        
        Select Case Asc(Caract)
            Case 48 To 57, 65 To 90, 97 To 122
            strPlage = Caract & strPlage
            Case Else: Exit For
        End Select
    Next j
    
    strPlage = strPlage & ":"
    
    'Renvoie la référence après les deux points ":"
    For j = i + 1 To Len(Chaine)
        Caract = Mid(Chaine, j, 1)
        
        Select Case Asc(Caract)
            Case 48 To 57, 65 To 90, 97 To 122
            strPlage = strPlage & Caract
            Case Else: Exit For
        End Select
    Next j
    
    ExtractionReferences = strPlage
End Function
 
 
 
'Vérifie si la référence extraite dans la formule a une intersection
'avec la cellule dont on contrôle les dépendances.
Function VerifIntersect(objDepend As Range, objReference As Range) As Boolean
    Dim objRange As Range
    
    Set objRange = Intersect(objDepend, objReference)
    
    If objRange Is Nothing Then
        VerifIntersect = False
        Else
        VerifIntersect = True
    End If
End Function

Comment identifier rapidement la dernière cellule utilisée dans la feuille ?
auteur : SilkyRoad
Utilisez simultanément sur les touches clavier Ctrl+Maj+Fin.
Vous remarquerez que la dernière cellule est parfois au-delà de la plage de données utilisée. Supprimer tous ces lignes et colonnes, entre cette cellule et la plage de données utile, permet:
* De ne pas imprimer des pages vides supplémentaires.
* De libérer de l'espace mémoire et donc de diminuer sensiblement la taille de votre classeur.



Comment faire clignoter une cellule ?
auteur : DarkVader
Cet exemple renvoie alternativement Vrai/Faux dans la cellule A1, toutes les secondes.

Vba

' --- Dans le module objet du classeur:
Option Explicit

'évènement ouverture du classeur.
Private Sub Workbook_Open()
    'Lance la procédure
    GetTempo
End Sub

'Avant la fermeture du classeur:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Désactive la procédure de temporisation
    Application.OnTime EarliestTime:=Now, Procedure:="GetTempo", Schedule:=False
End Sub
Vba

' --- Dans un module standard:
Option Explicit

Dim vTempo As Boolean
 
Sub GetTempo()
    vTempo = Not vTempo
    Application.OnTime Now + TimeValue("00:00:01"), "GetTempo"
    [Feuil1!A1] = vTempo
End Sub

Comment utiliser la bibliothèque DAO pour créer une requête SQL sur une plage de cellules ?
auteur : Cafeine
Vous devez activer la référence Microsoft DA0 3.6 Object Library pour utiliser la bibliothèque DAO:
Dans l'éditeur de macros,
Menu Outils
Références
Cochez la ligne "Microsoft DA0 3.6 Object Library".
Cliquez sur le bouton OK pour valider.

Vba

Sub DoCmdRunSQL(ByVal sql As String, ByVal rDest As Range)
 
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Set db = DAO.OpenDatabase(ActiveWorkbook.FullName, False, False, "Excel 8.0;HDR=YES;")
    Set rs = db.OpenRecordset(sql, DAO.dbOpenSnapshot)
    rDest.CopyFromRecordset rs
    Set rs = Nothing
    Set db = Nothing
    
End Sub



Un exemple d'appel de la procédure:

Vba

DoCmdRunSQL "SELECT * FROM [feuil1$A3:D600] WHERE age > 18", sheets("Résultat").range("A1")


La table s'écrit [NomOnglet$PlageCellules].
Dans cet exemple, le résultat de la requête est affiché dans la cellule A1 de la feuille "Résultat".


lien : Plus d'informations sur la Bibliothèque DAO

Comment empêcher l'écriture dans une cellule ?
auteur : SilkyRoad
Sélectionner la (les) cellule(s).
Menu Données.
Validation
Dans la liste déroulante "Autoriser:", choisissez "Personnaliser".
Dans le champ "Formule:", saisissez =""
Cliquez sur le bouton OK pour valider.

Nota:
Dans Excel2007, le menu validation est accessible depuis l'onglet "Données" dans le ruban. Ensuite cliquez sur le bouton "Validation de données" dans le groupe "Outils de données".



Comment identifier par macro la dernière cellule utilisée dans la feuille spécifiée ?
auteur : SilkyRoad
Vba

Sub Test()
    Dim Cible As Range
    
    'Effectue la recherche dans la feuille active
    Set Cible = DerniereCellule(ActiveSheet)
    
    If Not Cible Is Nothing Then
        MsgBox Cible.Address & vbCrLf & Cible.Value
        Else
        MsgBox "La feuille est vide."
    End If
End Sub


Function DerniereCellule(Ws As Worksheet) As Range
    Dim NumLigne As Double, NumCol As Integer
    
    'Vérification si la feuille est totalement vide
    If Ws.UsedRange.Cells.Address = "$A$1" And _
        IsEmpty(Ws.Range("A1")) Then Exit Function
    
    With Ws
        'Identifie le numéro de ligne
        NumLigne = .Cells.Find("*", .Range("A1"), , , xlByRows, xlPrevious).Row
        'Identfie le numéro de colonne
        NumCol = .Cells.Find("*", .Range("A1"), , , xlByColumns, xlPrevious).Column
        
        Set DerniereCellule = .Cells(NumLigne, NumCol)
    End With
End Function

Comment récupérer le nom de la feuille correspondant à la déclaration d'un objet Range ?
auteurs : SilkyRoad, Bidou
Vba

Dim Plage1 As Range
Set Plage1 = Range("A1").CurrentRegion
MsgBox Plage1.Parent.Name & "!" & Plage1.Address


Remarque:
Parent renvoie Object, donc vous perdez l'intellisense et vous passez en liaison tardive.

Privilégiez l'utilisation de Worksheet qui renvoie un objet Worksheet. Donc vous gardez l'intellisense et en cas de pilotage vous restez en liaison précoce:

Vba

Dim Plage1 As Range
Set Plage1 = Range("A1").CurrentRegion
MsgBox Plage1.Worksheet.Name & "!" & Plage1.Address

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