Actions Sur Cellules, Lignes, Commentaires - Free

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 Cet 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

Tag » Activecell Sélectionner Plusieurs Cellules