Pour en apprendre plus sur les commandes du menu Edition, voir là : edition.html

Dans cette page figurent des exemples de sélection, copie, suppression d'objets et de cellules ; sont aussi traités les commentaires, les doublons, la manipulation du presse-papier, toutes les actions relatives aux cellules à l'exception de leur formatage (voir ici : xl_format.htm). La classification n'est pas aisée cependant j'espère que vous apprécierez mon découpage.

Avant cela, je vous donne pêle-mêle des pistes pour des problèmes qui reviennent souvent !

 

'Connaître la valeur d'une cellule : msgbox range("A1").text ou msgbox range("A1").value ou encore msgbox [A1], qui est un raccourci syntaxique
'Adresse d'une cellule : msgbox range("A1").address ou msgbox range("A1").address(0,0)
'Sélectionner la dernière cellule : ici
'Savoir si elle contient une formule : existence.htm
'En savoir plus sur la définition de nom : xl_nom.htm
'Faire clignoter une cellule : xl_format.htm
'En savoir plus sur les liaisons : xl_liaison.htm

'Valeur d'une cellule dans un fichier fermé :

news , astuce issue de cette page : web, ou encore
MsgBox ExecuteExcel4Macro("'[NomduClasseur.xls]nomdelafeuille'!R1C5")   (référence relative R1=ligne1, C5=colonne 5)

d'autres méthodes et des solutions plus abouties là
le site de Fréd
un classeur exemple d'une autre méthode ici : http://disciplus.simplex.free.fr

'Afficher les formules : Ctrl 3 ou Menu Outils>Options>Onglet Général> Case à cocher Formules
'Afficher une formule : mettre un apostrophe devant le signe =, ou encore utiliser une fonction personnalisée

Function FORMUL(cel As Range)
FORMUL = cel.FormulaLocal
End Function
Et dans la feuille de calcul : ==FORMUL(A1)

'Appliquer une opération (multiplication, division, etc) à toute une plage de cellule : edition.html

'Fusionner deux cellules :

dans la cellule A3, inscrivez la formule suivante =A2 & " " &A3  (un espace sépare les deux valeurs)
exemple par VBA en agissant sur la cellule active et sa voisine
Sub MergeCells()
Dim myStr As String
    myStr = activecell.Value & " " & activecell.offset(0, 1).Value
    activecell.Value = myStr
    activecell.offset(0, 1).ClearContents
End Sub


Méthodes de sélection classiques

Vous débutez sur Excel ?

Il existe un ou deux sites montrant à l'aide d'images animées comment se servir des menus et de la souris pour effectuer certaines opérations de copie, sélection et suppression, par exemple le site www.polykromy.com.

Ces opérations sont possibles à travers les menus d'Excel. Chaque menu d'Excel a une page sur mon site, vous retrouverez donc ces commandes notamment dans les pages suivantes : edition.html et insertion.html ou encore xl_format.htm. Bien évidemment, ces opérations sont possibles par le biais du langage VBA, et vous trouverez comment ci-dessous.

Si vous cherchez comment vous référrer à une cellule au sein d'une formule, voyez la page xl_fonction.htm où figure quelques explications sur DECALER, INDIRECT, ADRESSE, INDEX, EQUIV.



Méthodes de sélection VBA simplesf

Sélectionner une cellule de la feuille active

application.goto reference:=range("D5")
range("D5").select
cells(5,"D").select
cells(5,5).select

Sélectionner une plage de cellules

application.goto reference:=range("A1:A5")
range("A1:A5").select
range(cells(1,2),cells(5,3)).select

Sélectionner une plage de cellules nommée

application.goto reference:=range("maplage")
range("nomplage").select

Sélectionner une plage de cellules d'une feuille donnée

sheets("Feuil2").range("B4:D10").select 'on se réferre à la feuille par le nom que son onglet
feuil2.range("B4:D10").select 'appel 'on se réferre à la feuille par le nom de son objet dans le projet Visual Basic.

Sélectionner une plage avec ligne variable

range("B" & x & ":AZ" & x).select 'sélectionne les cellules Bx:AZx

Sélectionner une plage de cellules variables

'on utilise des variables pour stocker la ligne et la colonne des cellules de départ et d'arrivée
'ainsi voilà ce qu'il faut écrire pour sélectionner la plage A1:E5 à l'aide de variables

iStartRow=1 : iStartCol=1
iendRow=5 : iendCol=5
range(cells(iStartRow, iStartCol),cells(iendRow, iendCol)).select

Sélectionner la 34 ième cellule d'une plage

range("A1:A76").Item(34).select ou range("A1:A76")(34).select

range("A1:A76")(34).select est un raccourci syntaxique de la procédure Item, qui est l'accesseur par défaut de l'objet range. Item n'est pas vraiment équivalent dans son fonctionnement à la méthode offset (regarder la page d'aide dédiée à cette propriété). En général, il vaut mieux utiliser Item plutôt qu'offset, car l'emploi de cette propriété donne lieu à un code beaucoup plus rapide à l'exécution.

Sélectionner la 3 ième cellule d'une plage

'comparez le résultat de ces deux instructions :
range("B7:B15")(3).Select 'puis,
range("B7:C15")(3).Select

Sélectionner la dernière cellule d'une colonne

LastRow = range("A65536").end(xlUp).Row
'voir aussi sélections spéciales

Sélectionner une ligne

rows(6).select
application.goto feuil1.rows(6)

Sélectionner plusieurs lignes

rows("1:50").select

Sélectionner une plage de cellules d'une autre feuille

sheets("feuil2").activate : range("feuil2!a1").Select 'la feuille doit être d'abord activée/sélectionnée
 

Sélectionner la première cellule de la première ligne non masquée qui suit la ligne de la cellule active
Range(activecell.offset(1,0),activecell.End(xlDown)).SpecialCells(xlCellTypeVisible).Item(1).Select

Sélectionner la première cellule de la première colonne non masquée qui suit la colonne de la cellule active
Range(activecell.offset(0, 1),activecell.End(xlToRight)).SpecialCells(xlCellTypeVisible).Item(1).Select

=> par extension, en utilisant entirerow et entirecolumn (après Item(1)), vous pouvez sélectionner la ligne entière.Le bloc d'instructions qui suit montre comment se positionner sur la première cellule visible

do while activecell.offset(1, 0).entirerow.hidden = true
        activecell.offset(1, 0).select
loop
activecell.offset(1, 0).select

Autre exemple de sélection

Sub ZAZAfaitcompliquéaulieudefairesimple()
    set LeftCell = Cells(activecell.Row, 1)
    set RightCell = Cells(activecell.Row, 256)
    If IsEmpty(LeftCell) Then set LeftCell = LeftCell.End(xlToRight)
    If IsEmpty(RightCell) Then set RightCell = RightCell.End(xlToLeft)
    If LeftCell.Column = 256 And RightCell.Column = 1 Then activecell.Select
Else Range(LeftCell, RightCell).Select
End Sub

Méthode OFFSET & VBA
     range("A1").select : activecell.offset(ligne, colonne).select
     activecell.offset( 3, 4).select
     activecell.offset(-2,-1).select
     selection.offset(0,1).select
     range("A1").offset(0,1).select => myVal = range("A1").offset(0,1).value

Information complémentaire sur Méthode Select

elle permet de faire une sélection multiple des objets graphiques (dessins, boutons de la barre de formulaire) grâce à l'argument replace.

Exemple avec deux zones de texte :
activesheet.shapes("Zone de Texte 1").select:activesheet.shapes("Zone de Texte 2").select replace:=false

Différence entre select & activate : news

Explication sur les manipulations de plage de cellules et l'objet ITEM : news

 


Méthodes de sélection spéciale

Les plages "systèmes"

la Zone UsedRange

c'est une des zones de cellules qu'Excel manipule. Elle couvre la plage de cellules d'une feuille qui englobe la dernière cellule la plus lointaine jamais modifiée sur cette feuille dans la session ouverte d'Excel (avant sauvegarde d'un fichier).

d'après cette définition, vous avez dû réaliser qu'Excel ne vous retourne pas la dernière cellule pleine, lorsque vous lui demandez par exemple de sélectionner la dernière cellule via la commande Atteindre du menu Edition (puis bouton "Cellules").

vous trouverez ci-après quelques autres informations sur cette zone et des informations sur comment la réinitialiser et déterminer la zone allant jusqu'à la dernière cellule pleine.

Afficher l'adresse de la zone UsedRange

msgbox worksheets("feuil2").usedrange.address
msgbox activesheet.usedrange.address

Sélectionner la zone UsedRange

Activesheet.usedrange.select

Article sur UsedRange : web

Réinitialiser la zone UsedRange

Normalement, elle se réinitialise à chaque sauvegarde
Pour la réinitialiser sans sauvegarde, l'instruction suivante doit suffire : activesheet.usedrange
Si ce n'est pas le cas, utiliser le code fourni ci-contre : news

Sélection de la dernière cellule

'la première macro ci-dessous permet de sélectionner la véritable dernière cellule de la feuille
Sub Last_of_Cells()
Dim rg_plage As Range
LastL = Cells.Find("*", [A1], , , , xlPrevious).Row
LastC = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
Cells(LastL, LastC).Select
End Sub

'cette seconde applique le même principe à une plage donnée
Sub Last_of_Range()
Dim rg_plage As Range
set rg_plage = Range("A15:B40")
With rg_plage 'ou encore : with Range("A15:B40")
LastL = .Find("*", .Item(1), , , xlByRows, xlPrevious).Row
LastC = .Find("*", .Item(1), , , xlByColumns, xlPrevious).Column
End With
Cells(LastL, LastC).Select
End Sub

ci-contre deux messages issus de la même conversation, la gestion de cette problématique dans le second message est très intéressante : news, news


La zone adjacente ou région courante

Son nom d'objet VBA est CurrentRegion, c'est un objet plage de cellules.

Manuellement, vous pouvez sélectionner la région adjacente à une cellule active ou à une plage de cellules sélectionnée à l'aide du raccourci Ctrl * ou bien à l'aide de la commande Atteindre du menu Edition

Sélection en VBA

activecell.currentregion.select
selection.currentregion.select


Les sélections de cellules particulières ou spéciales

Informations générales ci-contre, page du menu Edition

Sélection de cellules contenant des formules : activesheet.usedrange.specialcells(xlcelltypeformulas).select
Sélection de cellules contenant des formules : activesheet.cells.specialcells(xlcelltypeformulas).select
Sélection de cellules contenant des constantes : activesheet.cells.specialcells(xlcelltypeconstants, 23).select
Sélection de cellules contenant des commentaires : activesheet.cells.specialcells(xlcelltypeComments).select
Sélection de cellules contenants des annotations : activesheet.cells.specialcells(xlcelltypeNotes).select
Sélection de cellules vides : activesheet.cells.specialcells(xlcelltypeBlanks).select
Sélection de la dernière cellule : activesheet.cells.specialcells(xlcelltypeLastcell).select
Sélection des cellules visibles : activesheet.cells.specialcells(xlcelltypeVisible).select
Sélection des cellules conditionnellement formatées : activesheet.cells.specialcells(xlcelltypeAllformatconditions).select
Sélection de cellules au contenu non vide : union(selection.SpecialCells(xlCellTypeFormulas), selection.SpecialCells(xlCellTypeConstants, 23)).Select

Les types xlcelltypeconstants et xlcelltypeformulas peuvent avoir un argument value permettant de déterminer les types de cellules à inclure dans le résultat. L'argument value peut être l'une des constantes Xlspecialcellsvalues suivantes : xlErrors, xlLogical, xlNumbers, xlTextvalues, xlAllformatconditions ou xlSameformatconditions.

Sélectionner les précédents directs d'une sélection : selection.directprecedents.select
Sélectionner les précédents : selection.precedents.select
Sélectionner les dépendents : selection.dependents.select
Sélectionner les valeurs différentes : selection.columndifferences(activecell).select

La procédure suivante boucle sur les constantes de la colonne 3 et colorie les cellules paires

Sub Boldcells()
set rng = Columns(3).Specialcells(xlConstants): i = 1
for each cell In rng
if i Mod 2 = 0 then cell.Font.Bold = true 'contrôle de la parité & coloration de la cellule
i = i + 1
next
end sub



Union & Intersection de plages

L'union de plage est possible manuellement, il suffit de cliquer sur les plages de cellules désirées tout en maintenant la touche CTRL enfoncée. L'intersection n'est pas possible manuellement à ma connaissance (à moins qu'il y ait une solution à l'aide de formules & de définitions de plages nommées).

Sélectionner les cellules à l'intersection de deux plages

un exemple : dim myrange As range : set myrange = intersect(range("B1:C30"), rows(11)) : myrange.select
un autre : intersect([F:F,H:H], range("H6", [F6].End(xldown).EntireRow)).Select

Sélectionner les cellules à l'intersection de deux valeurs

msgbox Intersect(Rows("1:1").Find(What:="week 3").EntireColumn, Columns("A:A").Find(What:="27").EntireRow).Address
'par Eric J. (salut Eric !) le 25/11/1999 à 21h13 sur le groupe de discussion microsoft.public.excel.programming
'cette instruction cherche la chaîne "week 3" dans la ligne 1 de la feuille courante et le nombre 27 dans la colonne A, puis retourne l'adresse de la cellule à l'intersection de ces lignes et colonnes.
'penser à la gestion d'erreur au cas où la recherche n'aboutie pas

Sélection multiple de cellules, ou autrement dit union de plusieurs plages
Exemple 1
With activecell
  Union(.Cells, .Item(1, 6), .Item(1, 8), .Item(1, 10)).Select
End With
Exemple 2 : sélection de cellules d'une couleur donnée
dim rCell as range, rSelect as range :set rSelect=nothing
for each rCell in activesheet.usedrange
   if rCell.font.bold=true or rCell.interior.color=rgb(255,0,0) then set rSelect=application.union(rSelect,rCell)
next rCell
Exemple combinant Union & Intersect

Sub TryItNow()
Dim b, d, myCell As Range
set d = Union(Range("A1:B20"), Range("D1:D20")) ':d.select
set myCell = Range(Range("C1").Value)
set b = Intersect(myCell, d)
If Not (b Is Nothing) Then
MsgBox "In Union Range"
Else: MsgBox "Not in Union Range"
End If
End Sub


Recherche de valeurs & sélections de plages

Sélection avec la méthode FIND

Dim FoundCell As Range
set FoundCell = Range("A1:A10").Find(what:="XXX")
If Not FoundCell Is Nothing Then
    FoundCell.Select
End If

Sélectionner la première cellule de la colonne B contenant le mot "Zaza"

[B:B].Find("Zaza", Range("B1")([B:B].Count), xlValues, xlWhole, , xlNext, False).Select

Sélectionner la dernière cellule de la colonne B contenant le mot "Zaza"

[B:B].Find("Zaza", [B1], xlValues, xlWhole, , xlPrevious, False).Select
'à combiner par exemple avec on error resume next, pour éviter qu'une erreur surgisse
'd'autres exemples d'emploi de la méthode FIND dans cette page et la page xl_aide.htm

Sélectionner une plage de cellule contenant une valeur particulière dans la colonne B
Exemple : ne sélectionner que la plage contenant 2000 dans B:B si la colonne est triée (le 18/05/2000 par L.L sélection conditionnelle de plage)
Exemple 1

with range(IIf([B1] = 2000, [B1], [B:B].find(2000, [B1])), "B65536")
range(.Item(1), .ColumnDifferences(.Item(1))(0)).Select
end with

Exemple 2

application.screenupdating = false
with range("B1", range("B:B").find("*", [B1], , xlPrevious))
.autofilter 1, 2000
Intersect(.cells, .offset(1)).Specialcells(xlCellTypeVisible).Select
.autofilter
end with

Exemple 3

function Zone(Plage As range, Critère) As range
On Error Resume Next
with Plage.find("*", Plage(1), , , , xlPrevious)
If Plage(1) = Critère Then set Zone = range(Plage(1), .cells) Else _
set Zone = range(Plage.find(Critère, Plage(1), , xlWhole), .cells)
If .cells <> Critère Then set Zone = range(Zone.Item(1), _
Zone.ColumnDifferences(Zone.Item(1))(0))
end with
end function
'msgbox Zone([A:A],2000).address:Zone([A:A],2000).Select
'retourne un objet plage/range qui correspond à la plage étendue contenant le critère

 

L'exemple ci-dessous boucle sur la plage sélectionnée, et regarde dans la formule s'il y a une string "vlook" (recherche)

Par C DeLand, sujet : Re: shade cells with specific formula, le vendredi 5 novembre 1999 20:14

Option Compare Text
Option Explicit
Sub colorchange1()

dim s As String
dim cell As range
application.screenupdating = false
with selection
for each cell In selection
s = cell.formula
'an external link
if s Like "*vlook*" then
cell.Interior.ColorIndex = 36 'formats interior as yellow color
end if
next cell
end with
application.screenupdating = true
end Sub

Mettre en gras les cellules pairs de la colonne 3

Sub Boldcells()
set rng = Columns(3).Specialcells(xlConstants): i = 1
for each cell In rng
if i Mod 2 = 0 then cell.Font.Bold = true
i = i + 1
next
end sub

 


 

Autres problématiques de sélection de cellules

Rédéfinition ou redimensionnement d'une plage de cellules
Méthode Resize pour redimensionner une zone

'exemple pour sélectionner zone adjacente à A1 sans la ligne de titre
set Tableau = Range("A1").CurrentRegion
Tableau(2, 1).Resize(Tableau.Rows.Count - 1, Tableau.Columns.Count).Select
'ou Range("A2", Range("A2").End(xlDown).End(xlToRight)).Select
'ou Intersect(Range("A1").CurrentRegion, Range("A1").CurrentRegion.Offset(1)).Select

Garder en mémoire la sélection actuelle pour y revenir plus tard, par Chip Pearson : limites.html#22

Désélection zones non adjacentes/ Deselecting cells in discontiguous range : news

 


 

Objet Range & Variable Range

Exemple de Laurent L., Objet: Re: Optimiser le passage des valeurs d'un tableau dans une plage Date : samedi 5 août 2000 03:42

Dim Tableau(1 To 50, 1 To 1) As Integer, I As Integer
For I = 1 To 50: Tableau(I, 1) = I: Next I
Range("A1:A50") = Tableau

Les tableaux affectés à des plages doivent suivre certaines règles :

- Ils doivent toujours comporter deux dimensions, à moins qu'ils soient destinés à remplir des plages d'une seule ligne de hauteur (par exemple, s'il s'agit de remplir la plage A1:J1, le tableau doit être déclaré par (1 To 10), sans deuxième dimension).
- Ils doivent toujours être basés sur 1.
 

Connaître l'adresse d'une cellule contenue dans une variable range

Sub test 1
dim Array1 as Object
dim Adr22 as String
set Array1 = Range("A1:C4")
Adr22 = Array1(2,2).Address
end sub

Connaître les valeurs d'une plage de cellule contenu dans une variable

Sub test2()
Dim rArray As Variant
rArray = ActiveSheet.Range("A1:G1").Value
For i = 1 To UBound(rArray, 2)
MsgBox rArray(1, i)
Next i
End Sub

Connaître les valeurs d'une plage à plusieurs colonnes

Sub tester1()
Dim StationIDs As Variant
StationIDs = Worksheets("feuil1").Range("A2:B10").Value
For i = LBound(StationIDs, 1) To UBound(StationIDs, 1)
For j = LBound(StationIDs, 2) To UBound(StationIDs, 2)
MsgBox "StationIDs(" & i & ", " & j & ")= " & StationIDs(i, j)
Next j
Next i
End Sub


Méthodes de copie & de collage

La méthode VBA Copy s'applique à de nombreux éléments d'excel : ses feuilles, ses cellules, ses graphiques, ses boutons ....
Excel vous offre :

les moyens de sélectionner rapidement les éléments que vous voulez copier. Voir : la partie Atteindre de la page edition.html ma page sur les raccourcis la partie sur les méthodes de sélection de cette page pour les syntaxes VBA différentes méthodes de copie copier en tant qu'image une plage de cellules : sélectionner la plage, et appuyez sur Shift en même temps que vous affichez le menu Edition, vous avez alors la possibilité de "copier une image" copie d'une sélection multiple différentes méthodes de collage coller en tant qu'image coller que le format, que le contenu, que la formule ... [commande collage spécial] coller avec liaison

Ci-dessous, vous trouverez des syntaxes VBA pour copier des feuilles et des cellules.

Copies classiques

Copier le contenu d'une plage dans la cellule active : range("B5:C6").Copy activecell Spécifier la plage de destination d'une copie : range("A1:A100").EntireRow.Copy destination:=ladresseouvousvoulez Copier une plage sur une autre : worksheets("Feuil2").rows("3:3") = worksheets("Feuil1").rows("1:1").value Autre exemple :

* worksheets("Feuil2").range(C3").value = worksheets("Feuil1").range("A1").value
* Range("A1:B1") = [{"Objet","Macro"}]

Copier le contenu de cellules d'un classeur à l'autre
     workbooks("otherbook.xls").worksheets("Sheet1").range("B6:C31").copy destination:=workbooks("targetbook.xls").worksheets("Sheet6").range("R34")

Copier plusieurs feuilles : worksheets(array("Sheet1","Sheet2")).copy

Copier le contenu d'une feuille et coller avec liaison : news

Copier une plage d'une feuille au bas de la plage d'une autre : news

Recopier une cellule ou des lignes dans plusieurs feuilles en même temps
       1. sheets.fillacrosssheets worksheets("Feuil1").rows("1:20")
      2. worksheets.fillAcrosssheets range("B1"), xlfillwithcontents

Copies particulières

Copier les formules uniquement : news1, news2

Copier en gardant le format des colonnes : news

Copier le contenu d'une cellule à chaque ouverture du classeur (jeudi 30 mars 2000 05:56)
       Dans le module de thisworkbook...
      Private Sub Workbook_Open()
      sheets("Feuil2").[A65536].end(xlUp).offset(1, 0) = sheets("Feuil1").[A1]
      sheets("Feuil2").[B65536].end(xlUp).offset(1, 0) = Date
      end Sub

Programmer une copie à intervalle régulier : news

Copier et transposer par valeurs : voici une macro complémentaire XLA à recopier dans le dossier Macrolib (XL97) ou addIns (XL2000) et à installer ensuite par le menu Outils -> Macros complémentaires. Elle ajoute une commande "Collage transposé par valeur" au menu contextuel des cellules, juste en-dessous de "Coller". Si aucune plage n'est en cours de copie, cette commande est désactivée.

Copier une plage et la sauvegarder en tant qu'image
Cet exemple créée un nouveau classeur pour y coller la plage du classeur actif qu'il a copiée en tant qu'image, puis coller celle-ci dans un graphique et l'exporter au format image.

Dim Plage As Range
set Plage = ActiveSheet.Range("A1:I25") ' Exportation en .gif de la plage A1:I25 (feuille active)
Application.ScreenUpdating = False
Workbooks.Add
Plage.CopyPicture
ActiveSheet.Paste
With ActiveSheet.ChartObjects.Add(0, 0, selection.Width, selection.Height).Chart
.Paste
.Export "C:\Temp\Test.gif", "GIF"
End With

Copier les cellules non vides
C
et exemple copier les cellules non vides de la plage I1:J2000 sur la feuille 2

set feuil_src = Worksheets("feuil1")
set feuil_dest= Worksheets("feuil2")
With feuil_src.Range("I1:J2000")
    .AutoFilter Field:=1,Criteria1:="<>"
    .AutoFilter Field:=2, Criteria1:="<>"
    .SpecialCells(xlVisible).Copy feuil_dest.[A1]
    .AutoFilter
End With

Copie de cellules filtrées

Sub NonVides()
Application.ScreenUpdating = False
With Range("A1", Cells(Range("A1")([A:A].Count).End(xlUp).Row,
[A1].End(xlToRight).Column))
set toto = Worksheets.Add
.AutoFilter 1, "E": .Copy toto.[A1]
.AutoFilter 1, "B": .Offset(1, 0).Copy
toto.Columns(1).Cells(xlCellTypeLastCell).Offset(1, 0)
End With
End Sub

Autoriser la copie d'une cellule uniquement vers une autre par Harald S.

Sub CopyFromJ()
Dim Copyrange As Range, Pasterange As Range
On Error Resume Next
set Pasterange = Cells(11, 4) 'la cellule cible
set Copyrange = Application.InputBox _
    (Prompt:="Pick a Fund in Column J", _
    Title:="Copy Subaccount to D11", _
    Default:="J" & activecell.Row, _
    Type:=8)
If Copyrange Is Nothing Then Exit Sub
'no need to select, just copy a value like this:
Pasterange.Value = Cells(Copyrange(1).Row, 10).Value
End Sub

Copier la première page d'une feuille sur un autre classeur, suite à une discussion sur un forum allemand le 20.09.99, pour XL5 , XL7, XL8.
Question originale : Wie kann ich exakt die erste Druckseite des aktiven Blattes in ' eine neue Arbeitsmappe kopieren ?

Sub ErsteSeiteKopieren()
Dim rngCopy As Range
Dim intRow As Integer, intCol As Integer, intCounter As Integer
Application.ScreenUpdating = False
intRow = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),1)") - 1
intCol = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(65),1)") - 1
set rngCopy = Range(Cells(1, 1), Cells(intRow, intCol))
Workbooks.Add
rngCopy.Copy Range("A1")
For intCounter = 1 To rngCopy.Columns.Count
Columns(intCounter).ColumnWidth = rngCopy.Columns.ColumnWidth
Next intCounter
For intCounter = 1 To rngCopy.Rows.Count
Rows(intCounter).RowHeight = rngCopy.Rows.RowHeight
Next intCounter
ActiveSheet.Buttons(1).Delete
End Sub

Copie automatique et incrémentée

Deux méthodes, AUTOFILL & FILLDOWN

recopier jusqu'à la hauteur de la cellule à gauche
Range([C1], Range("C1")(1, 0).End(xlDown)(1, 2)).FillDown, ou
Range([C1], Range("C1")(1, 0).End(xlDown)(1, 2)).FormulaLocal =[C1].FormulaLocal autre exemple de recopie : Range("G2:G" & [F2].End(xlDown).Row).FillDown voir là : http://members.aol.com/dmcritchie/excel/fillempt.htm exemple de recopie incrémentée avec des dates : news

De façon plus générale : quand une copie par la poignée incrémente par défaut (les dates par exemple), le fait de maintenir Ctrl enfoncée en même temps empêche l'incrémentation.
Et quand une copie par la poignée n'incrémente pas par défaut(1 par exemple), maintenir Ctrl enfoncée en même temps provoque l'incrémentation (1 2 3 Soleil).

Désactivation de la possibilité de copier

Désactiver le copier coller : news1, Désactiver le couper coller, mais pas le copier coller : news Désactivation du mode copie (stoppe le mode clignotant & enlève l'objet copié du presse-papier) : application.cutcopymode = false
Remplacer les fonctions Copier & Coller par les votres : news

Méthodes de collage & de déplacement

L'instruction VBA pour le collage est Paste ou PasteSpecial pour un collage spécial ; l'instruction VBA pour couper est Cut. L'enregistreur de macros & l'aide renseigne bien c'est pourquoi je serais très bref, et puis j'ai dû donner des bouts de code par ailleurs.

Pour couper une cellule et la coller à une autre "adresse", procéder comme suit :

selection.Cut destination:=selection.offset(2,0).address
' l'exemple ci-dessus coupe la sélection et la déplace deux lignes en-dessous (dans la même colonne)

voir la partie Collage avec liaison de la page xl_liaison.htm voir la partie Collage de la page Edition pour des explications générales

Méthodes de suppression & d'effacement

Méthodes d'effacement

Effacer tout : selection.clear
Effacer le format : selection.clearformats
Effacer le contenu : selection.clearcontents

'il en manque mais l'enregistreur de macros vous les fournira.


Méthodes de suppression

Supprimer la sélection & décaler les cellules vers la gauche : selection.delete shift:=xltoLeft
Supprimer la sélection & décaler les cellules vers le haut : selection.delete shift:=xlUp

Supprimer les lignes entières : selection.EntireRow.delete
Supprimer les colonnes entières : selection.Entirecolumn.delete

ou encore : range("A5").entirerow.delete

Supprimer lignes paires de la signe 2 à 500 '(à tester), par L.L.
     Sub SuppLignpaires
     dim R As range, L As Integer
     set R = rows(2)
     for L = 4 to 500 Step 2
     set R = Union(R, rows(L))
     next L
     R.delete
     end sub
     'retrouver le message ci-contre : news

Supprimer une ligne sur deux manuellement
     Insérer une nouvelle colonne A.
     La remplir avec la formule =si(MOD(LIGNE();2) =0;Vrai;1)et l'incrémenter avec un drag & drop jusqu'à la dernière ligne
     Puis, Edition/Atteindre/Cellule/formules : valeur logique
     Et, Edition/Supprimer [raccourci : ctrl "-" ] /Ligne entière Supprimer la col A.      Attention les deux méthodes ci-dessous détermine si une ligne est vide juste en se basant sur le contenu de la première cellule.

Suppression des lignes vides (avec boucle while) : news

Suppression de lignes pour lesquelles la valeur dans la colonne A est 0 (avec méthode filtre) : news

Suppression des colonnes vides : news

Effacer cellules contenant un mot

dim Cellule As range, Dep As String
set Cellule = cells.find("Zaza", lookat:=xlWhole, MatchCase:=true)
if Cellule Is Nothing then Exit Sub
Dep = Cellule.address
On Error Resume next
do
Cellule(1, -1).Clearcontents
set Cellule = cells.findnext(Cellule)
loop Until Cellule.address = Dep

'retrouver le message ci-contre : news



Quelques exemples d'insertion

Insérer une ligne avant la ligne i où i=4 : rows(4).insert
Insérer deux lignes avant la ligne i où i=4 :rows("4:5").insert
Insérer une ligne toutes les deux lignes
: news
Insérer en gardant les formules : news

Copier / Dupliquer avec insertion de lignes

Sub DuplicateRows()
    Dim lRow As Long
    Dim lLastRow As Long
    lLastRow = ActiveSheet.UsedRange.Rows.Count
    For lRow = lLastRow To 1 Step -1
        With ActiveSheet
            .Cells(lRow, 1).EntireRow.Copy
            .Range(.Cells(lRow, 1), .Cells(lRow + 1, 1)).Insert
        End With
    Next lRow
    Application.CutCopyMode = False
End Sub


Insertion & copie d'une plage de cellules

'l'insertion se fait par rapport à la plage A1:B10, cette sélection ne correspond pas à une sélection de lignes entières.

Dim FromRange As Range
set FromRange = Range("A1:B10")
With FromRange
activecell.Resize(.Rows.Count, .Columns.Count).Insert shift:=xlDown
.Copy activecell
End With

Cet exemple là insère une ligne entière grâce la propriété "entirerow"

Dim FromRange As Range
set FromRange = Range("A1:B10")
With FromRange
activecell.Resize(.Rows.Count, .Columns.Count).EntireRow.Insert shift:=xlDown
.Copy activecell
End With



Infos diverses sur les cellules

La plage de cellule est-elle vide : news, (par extension toutes les cellules) ? => emploi d'une fonction
Le type d'une cellule : news

Fusionner deux cellules

Sub Mergecells()
dim myStr As String
myStr = activecell.value & " " & activecell.offset(0, 1).value
activecell.value = myStr
activecell.offset(0, 1).Clearcontents
end Sub

Déclencher une macro si A1 est sélectionnée et SUPERIEURE à 0

Private Sub Worksheet_Change(ByVal Target As Excel.range)
if Not Intersect(Target, range("$a$1")) Is Nothing And Target.value > 0 then
msgbox ("bonjour")
end Sub

Egaliser deux cellules

Private Sub Worksheet_Change(ByVal Target As Excel.range)
if Target.address = "$A$1" then
range("B1") = range("A1")
end if
if Target.address = "$B$1" then
range("A1") = range("B1")
end if
end Sub

Nombre de modifications apportées à une cellule (emploi d'une procédure évènementielle)

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If IsError([nb_modif]) Then ActiveWorkbook.Names.Add Name:="nb_modif",RefersToR1C1:=0
If Not Intersect(Target, Range("c3:c33")) Is Nothing Then
ActiveWorkbook.Names.Add Name:="nb_modif", RefersToR1C1:=[nb_modif] + 1
End If
End Sub


Est-ce que la sélection est entière (sélection soit d'une colonne ou ligne entière, soit de seulement quelques cellules)
Fonction à utiliser dans VBA

Function FullRowOrColumn() As Boolean
If TypeOf Selection Is Excel.Range Then
    FullRowOrColumn = (selection.Rows.Count = Rows.Count) Or  (selection.Columns.Count = Columns.Count)
Else
    FullRowOrColumn = False
End If
End Function

Retourner l'adresse de la cellule appelante d'une fonction
     function TEST() As String
     TEST = application.caller.address
     end function

     ' essayez aussi avec les paramètres suivants :
     Application.Caller.Address(0, 0, , 1) 'Address(External:=True)
     Application.Caller.Address(0, 0, , 0)


Doublons

Infos par Chip Pearson (page Duplicate And Unique Items In Lists)

indiquer les doublons par formatage conditionnel : =si(nb.si(A5:A10; A5)>1;vrai;faux) inscrire le mot duplicat à côté d'un duplicat : =si(nb.si(A5:A10;A5)>1;"Duplicate";"") afficher les valeurs uniques d'une colonne, en incrémentant la cellule suivante dans une colonne adjacente : =si(nb.si($A$1:A1;A1)=1;A1;"") extraire les valeurs communes à deux listes : =si(nb.si($A$1:$A$10;B1)>0;B1;"") extraire les valeurs qui sont dans une liste mais pas dans l'autre :=si(nb.si($A$1:$A$10;B1)=0;B1;"") Repérer les lignes identiques dans la plage A2:D15 : après sélection de la plage, créer un formatage conditionnel en  utilisant : "la formule est" =EXACT($A2:$D2;$A1:$D1) (astuce par B. Mazas) Une valeur X est-elle en double dans une plage
y = Application.WorksheetFunction.CountIf(Range("A:A"), x): If y >= 2 Then MsgBox ("On retrouve le chiffre " & x & "plus d'une fois !") Par Robert D., en assumant que tes données à vérifier sont dans les colonnes A et B. Dans la colonne C (ou toute autre colonne que A ou B), entrer :

=SI(ESTERREUR(EQUIV(A1;$B$1:$B$5;0));"";A1) pour trouver les doublons ENTRE les colonnes A et B
=SI(NB.SI($B$1:$B$5;B3)>1;"*";"") pour trouver les doublons DANS la colonnes B

La formule matricielle ci-dessous affiche si oui ou non il y a des doublons:
=IF(counta(range1)<>SUM(IF(FREQUENCY(IF(LEN(range1)>0,MATCH(range1,range1, 0),""),IF(LEN(range1)>0,MATCH(range1,range1,0),""))>0,1)),
"You Have Duplicates","No Duplicates")
Remplacer les doublons (sauf la première occurence) : exemple par Chip Pearson Masquer les doublons : news Suppression de doublons, voici les trois messages d'une conversation récente :1, 2, 3
Insérer valeurs uniques dans listbox ou combobox : news

'Voir aussi sur site de Laurent Longre : le site

' Liste des données existantes dans la colonne A mais pas dans la B, le résultat s'inscrit en colonne C
'De: Eric R., objet: "Re: l'UNION fait la force ?", date : dimanche 9 juillet 2000 09:43

Sub CompareTwoColonnes()
Dim Cell As range, Plage As range, I As long
set Plage = range("B1", [B1].End(xldown))
Application.screenupdating = False
For Each Cell In range("A1", [A1].End(xldown))
If Plage.find(Cell, Plage(1), xlValues, xlWhole) Is Nothing Then
I = I + 1
Cells(I, 3) = Cell
End If
Next Cell
End Sub

Empêcher la saisie de deux nombres identiques dans une colonne par validation de données

De: ChrisV, objet: "Re: données uniques par validation de données", date : samedi 22 juillet 2000 23:39
Par ex. dans la colonne A (après l'avoir sélectionnée): =NON(NB.SI(A:A;A1)>1)

Empêcher les doublons dans la plage A1:A20, en affichant l'adresse des valeurs déjà saisies

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim Cell As Range, Plage As Range
set Plage = Intersect(Target, Range("A1:A20"))
If Plage Is Nothing Or IsEmpty(Target(1)) Then Exit Sub
set Cell = Range("A1:A20").Find(Target(1), Target(1))
If Cell.Address <> Target(1).Address Then
MsgBox "Cette valeur a déjà été saisie dans la cellule " _
& Cell.Address, vbCritical
Application.EnableEvents = False
Plage.ClearContents
Application.EnableEvents = True
SendKeys "{F2}+{HOME}"
End If
End Sub

Contrôler si une valeur a déjà été saisie dans le classeur : news


Les commentaires


Voir aussi insertion.html.
Un commentaire est un objet au même titre que les graphiques ou les objets dessinés avec la barre d'outils Dessins. Avec VBA, il est possible de manipuler les commentaires de plusieurs manières notamment à travers la collection d'objets (Shapes) ou la collection de commentaires (Comments).

Lorsque les commentaires sont crées, leur nom est définit sur le modèle suivant "Commentaire 1", "Commentaire 2", "Commentaire 3".

Il n'est pas nécessaire de sélectionner un commentaire afin de le manipuler, toutefois cela peut rendre plus simple la manipulation. Pour cela, il vous faut au préalable rendre visible le commentaire comme vous le montre les instructions ci-dessous.

activesheet.shapes("Commentaire 1").visible=true
activesheet.shapes("Commentaire 1").select

'ensuite, vous pouvez directement faire :
selection.font.size = 8

Une autre manière de procéder est de boucler sur les commentaires, la manière d'accéder à ses propriétés est moins directe.

dim cmt as comment
for each cmt in activesheet.comments
with cmt.shape.textframe.characters.font
.size = 9
end with
next


'Police des commentaires

Si vous êtes curieux de savoir comment changer la police d'un ou de tous les commentaires, les codes ci-dessus et le suivant devraient vous aider. Si vous cherchez à changer la couleur ou la police par défaut des commentaires, vous verrez que cela est possible, mais je ne vous le recommande pas.

'Changement de la police des commentaires

'voir l'article de microsoft suivant : http://support.microsoft.com/support/kb/articles/q173/7/98.asp
'ou utiliser la macro suivante pour changer la police des commentaires d'une feuille

Sub changeCommentFont()
for each cmt In activesheet.Comments
with cmt.Shape.TextFrame.Characters.Font
.name = "Arial"
.Italic = true
.Size = 9
end with
next
end Sub
il est possible de formater différemment différentes portions de texte, c'est plus compliqué, un enregistrement de macros, l'aide VBA et la page xl_format.htm pourront vous apporter des compléments d'information.

'Changement de la police par défaut des commentaires

ou encore : accéder aux propriétés du bureau (clic droit sur l'écran), aller sur l'onglet apparence, et choisissez Info-Bulle dans la liste déroulante "Element", vous pouvez alors modifier la couleur, la police des commentaires.


'Taille d'un commentaire

Elle peut être automatiquement déterminé par Excel. Pour cela, il faut que la propriété AutoSize du commentaire soit activée. Manuellement, il faut cocher la case "Taille automatique" dans l'onglet "Alignement" de la boîte de dialogue "Format de commentaire". Voilà ci-dessous un exemple d'instruction VBA permettant d'activer cette adaptation automatique de la taille :

activecell.comment.shape.textframe.autosize = true

Cependant, cette adaptation automatique ne donne pas un bel effet visuel, vous trouverez alors ci-après un message qui vous donnera une autre solution pour intervenir sur cette taille : news. La solution proposée change la taille des commentaires pour laquelle l'option "Taille automatique" est activée.


'Positionnement d'un commentaire, de la cellule qui l'héberge & texte du commentaire

La macro ci-dessous est à exécuter sur une feuille contenant quelques commentaires

Sub demo()

set cmt = Worksheets("Feuil1").Comments
For Each c In cmt
MsgBox "La cellule hébergeant ce commentaire est la suivante : " & c.Parent.Address
MsgBox "L'angle supérieur gauche de la boîte de commentaire est situé dans cette cellule " & c.Shape.TopLeftCell.Row
MsgBox "Le texte du commentaire est le suivant" & vbcrlf & c.Text
Cells(c.Parent.Row, c.Parent.Column + 1).Value = c.Text' inscrire le commentaire d'une cellule dans la cellule d'à côté
'c.Shape.topLeftCell.value = c.Text    'inscrire inscrire le commentaire d'une cellule dans la cellule de son coin gauche
c.Shape.Placement = xlFreeFloating ' l'objet ne sera pas affecté par tout changement de la taille des cellules
c.Shape.TextFrame.AutoSize = True 'la taille s'ajuste automatiquement
'c.Shape.OLEFormat.Object.AutoSize = True 'autre manière de l'écrire
Next c

End Sub


'Création d'un commentaire

sub creation_commentaire_simple
activecell.addcomment
activecell.comment.visible = False
activecell.comment.text text:="Votre nom :" & vbcr & "1° ligne" & vbcr & "2° ligne"
end sub


Création d'un commentaire sans le nom de l'utilisateur

sub creation_commentaire_sans_nom_user
nomuser = application.username 'stockage du nom de l'utilisateur
range("B2").select
application.username = "" 'effacement du nom pour pas qu'il n'apparaisse dans le commentaire
range("B2").addcomment
range("B2").comment.visible = false
range("B2").comment.text text:="1° ligne" & Chr(10) & "2° ligne" & Chr(10) & "3° ligne" & Chr(10) & ""
application.username = nomuser
end Sub

Création d'un commentaire avec la date et l'heure, par Jacky sur microsoft.public.fr.excel, sujet: "Re: ajout date et heure dans commentaire", le mercredi 9 août 2000 10:41

Sub AjoutCommentaire()
    Dim ZtToto As String
    ZtToto = activecell.AddressLocal
    With activecell.addcomment.shape.OLEFormat.object
         .Text = Format(Now(), "dd/mm/yy hh:mm:ss")
         .Font.Name = "Times New Roman"
         .Font.Size = 14
    End With
    Range(ZtToto).Select
    'SendKeys "%IM"
end sub

Création de triangles indicateurs personnalisés : news

Le code proposé dans ce message a été écrit par Stratos. Vous pouvez insérer dans les cellules de petits objets triangulaires à la couleur de votre choix, qui masqueront le triangle rouge d'Excel. L'action est effectuée dès lors où le commentaire contient votre nom d'utilisateur (retrouvez-le dans la boîte de dialogue Options du menu Outils).


Afficher le commentaire associé à une cellule à l'aide d'une formule

Function Commentaire(Plage As Range) As String
Application.Volatile
On Error GoTo zut
Commentaire = Plage.Comment.Text
Exit Function
zut:
Commentaire = ""
End Function

'Suppression de commentaires

Sub SupprimeCommentaires()
    For i = ActiveSheet.Comments.Count To 1 Step -1 : ActiveSheet.Comments(i).Delete
    Next i
End Sub

'Contrôle de la présence d'un commentaire

'Exemple basé sur procédure évènementielle selectionchange d'une feuille de calcul

Private Sub Worksheet_selectionChange(ByVal Target As Excel.range)
dim HasComment As Boolean
HasComment = Len(Target.NoteText)
if HasComment = true then
msgbox ("voici le commentaire" & Chr(13) & Target.NoteText)
Else
msgbox ("pas de commentaires")
end if
end Sub

'Exemple en contrôlant s'il existe un objet comment dans une celllule
'proposé le samedi 2 octobre 1999 11:07, dans vb.vba)

dim cmtComment As Comment 'as excel.comment
set cmtComment = xl.range("D10").Comment
if Not cmtComment Is Nothing then
strComment = cmtComment.Text
end if

'Exemple où l'absence de commentaires est révélée par une erreur
'la macro ci-dessous boucle sur les cellules A1 à A3 pour afficher leur contenu, s'il n'y a pas de commentaires, l'erreur généré a pour index 91 et la macro vous indique l'adresse de la cellule concernée.

Sub lireCommentaire()
For Each c In ActiveSheet.Range("A1:A3")
On Error Resume Next
MsgBox c.Address & " = " & c.Comment.Text
bug = Err.Number
If Err.Number = 91 Then MsgBox "Pas de commentaire en " & c.Address
Next c
End Sub

'Autres méthodes là : existence.htm#exis_commentaire

Liste des commentaires d'une feuille

voir sur le site de Frédéric S. le fichier appelé : "RecupererCommentaires"


Afficher un commentaire : activesheet.shapes("Commentaire 1").visible=true

Afficher / Masquer tous les commentaires

Sub Commentshow()
set cmt = worksheets("Feuil1").Comments
if commentcache = true then
   for each c In cmt
   c.Visible = true
   next
   commentcache = false
Else
   for each c In cmt
   c.Visible = false
   next
   commentcache = true
end if
end Sub

'Basculer entre affichage et masquage de tous les commentaires

Sub ToggleCommentDisplay()
With Application
If .DisplayCommentIndicator = 1 Then
   .DisplayCommentIndicator = -1
Else
   .DisplayCommentIndicator = 1
End If
End With
End Sub

'Afficher / Masquer les indicateurs de commentaires

Application.DisplayCommentIndicator = Not Application.DisplayCommentIndicator


'Autres sujets relatifs aux commentaires

'Déclencher une action à la création d'un commentaire : news
'Transférer la formule dans un commentaire et vice-versa : voir sur le site de Frédéric S. le fichier appelé "FormulesDansCommentaires"

Associer un commentaire à une cellule lorsque elle est modifiée et égale à une certaine valeur

***Avec une procédure événementielle, par ex à la saisie dans la plage A1:A10

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
If Target = 10 Then
With Range(Target.Address)
.AddComment
.Comment.Text Text:="La valeur de la
cellule est égale à 10"
End With
Else: Range(Target.Address).ClearComments
End If
End If
End Sub

Voir limites.html#20 pour imprimer le contenu des commentaires dans un fichier texte
Voir
Affichage.html#Commentaires pour plus d'infos & d'astuces

 


Presse-Papiers

Vide ou Plein

Exemple 1

Sub CheckClipboard()
dim MyString as String
set MyData = New DataObject
MyData.GetFromClipboard
MyString = MyData.gettext
if MyString = "" then
msgbox ("Clipboard is empty.")
Else
msgbox MyString
end if
end Sub

Exemple 2

declare function countClipboardformats Lib "User32" () As long
Sub Test()
if countClipboardformats = 0 then msgbox "Presse-papiers vide"
end Sub


Effacer le presse-papiers

Exemple 1

Public declare function CloseClipboard Lib "user32" () As long
Public declare function EmptyClipboard Lib "user32" () As long
Public declare function OpenClipboard Lib "user32" (ByVal hwnd As long) As long

Sub ClipboardClear()
dim rtn As long
rtn = OpenClipboard(0&)
rtn = EmptyClipboard
rtn = CloseClipboard
end Sub

Exemple 2

Sub ClearCB()
set Dummy = New DataObject
Dummy.setText ""
Dummy.PutInClipboard
end Sub

Afficher la barre d'outils Presse-Papiers

Sub showClipboardAtBottom2()
with CommandBars("Clipboard")
.Visible = true
.Position = msoBarFloating
.Left = 200
.top = 500
end with
end Sub

Renommer une feuille avec le contenu du presse-papier

dim DObj As New DataObject
DObj.GetFromClipboard
activesheet.name = DObj.gettext(1)

Connaître chaque ligne du texte contenue dans le presse-papier
( de Laurent L., sujet : "Re: VBA, manipulation du pressepapier", le samedi 18 septembre 1999 14:39)

Sub clipboard_rows()
dim Texte As String, Ligne As String
dim I As Integer, J As Integer
dim DObj As New DataObject
DObj.GetFromClipboard
Texte = DObj.gettext(1)
do
I = J + 1
J = InStr(I, Texte, vbCr)
Ligne = Mid$(Texte, I, Iif(J, J - I, Len(Texte) - I + 1))
msgbox Ligne
loop While J
end sub

Récupérer le contenu du clipboard (lorsqu'il contient une image et non du texte) pour l'insérer dans un controle RichTextBox.

Clipboard.setData form1.Picture1.Image ' Capture l'image
' dans Picture1 et la colle dans le presse papier

SendMessage form1.RichTextBox1.hWnd, WM_PASTE, 0, 0
' Colle l'image du presse papier dans le RichTextBox1

Dans un module:
declare function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd
As long, ByVal wMsg As long, ByVal wParam As long, lParam As Any) As long

Public Const WM_PASTE = &H302

Autres informations

Voir aussi sur le site de Chip Pearson : le site



Sélection d'objets

Sélectionner un objet : activesheet.shapes("nomobjet").select
Atteindre un objet et non pas le sélectionner (Laurent L.) : activesheet.shapes("Zone de texte 1").topleftcell.select
Sélectionner tous les objets : activesheet.shapes.selectall ou activesheet.drawingobjects.select

Sélectionner plusieurs objets

activesheet.shapes.range(array("objet1", "Objet2")).select autre exemple par L.L. :
Dim Arr(), Sh As Shape, I As Integer, Nom As String
ReDim Arr(0 To ActiveSheet.Shapes.Count - 2)
For Each Sh In ActiveSheet.Shapes
  Nom = Sh.Name
  If Nom <> "Zaza" Then Arr(I) = Nom: I = I + 1
Next Sh
ActiveSheet.Shapes.Range(Arr).Select  autre exemple par L.L
Dim Sh As Shape
Dim Prem As Boolean
Prem = True
On Error Resume Next
For Each Sh In ActiveSheet.Shapes
  If IsError(Application.Match(Sh.Name, _
  [{"Zozo","Zaza","Zuzu"}], 0)) Then
    Sh.Select Prem
    If Prem Then Prem = False
  End If
Next Sh
On Error Goto 0

Sélection de tous les objets d'une zone (séléction conditionnelle), par moi-même le 07/09 sur microsoft.public.fr.excel, objet : "Re: sélection d'images par  macro"

'La macro boucle sur chaque objet de la feuille et contrôle si la cellule "BottomRightCell", cellule  qui accueille le coin droit de ton objet, est à l'intersection de la zone prédéfinie
Sub SelectionObjets()
For Each sh In ActiveSheet.Shapes: If Not Intersect([A1:G120],sh.BottomRightCell) Is Nothing Then sh.Select Replace:=False
Next sh
End Sub

Boucler sur des boutons ou tout autre objet dessiné avec la barre d'outils Contrôles ou Commandes

Dim Obj As Object
For Each Obj In ActiveSheet.OLEObjects
  If TypeOf Obj.Object Is MSForms.CommandButton Then Obj.Height = 20
Next Obj

Lister les objets et macros associées !!! : news (ne listent pas les sous-objets d'un groupe)

Retourner le nom de l'objet sélectionné (qui appelle la macro)

       Sub ShapeAction()
       msgbox application.Caller & " " & _
       activesheet.Shapes(application.Caller).ZOrderPosition
       end Sub

Type de l'objet sélectionné

       If TypeName(Selection) = "range" Then
      MsgBox "Type = " & TypeName(Selection) & "Name = " & selection.Address
      Else
      MsgBox "Type = " & TypeName(Selection) & "Name = " & selection.Name
      End If