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 plage de cellulesapplication.goto reference:=range("D5")
range("D5").select
cells(5,"D").select
cells(5,5).select
Sélectionner une plage de cellules nomméeapplication.goto reference:=range("A1:A5")
range("A1:A5").select
range(cells(1,2),cells(5,3)).select
Sélectionner une plage de cellules d'une feuille donnéeapplication.goto reference:=range("maplage")
range("nomplage").select
Sélectionner une plage avec ligne variablesheets("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 de cellules variablesrange("B" & x & ":AZ" & x).select 'sélectionne les cellules Bx:AZx
Sélectionner la 34 ième cellule d'une plage'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 3 ième cellule d'une plagerange("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 dernière cellule d'une colonne'comparez le résultat de ces deux instructions :
range("B7:B15")(3).Select 'puis,
range("B7:C15")(3).Select
Sélectionner une ligneLastRow = range("A65536").end(xlUp).Row
'voir aussi sélections spéciales
Sélectionner plusieurs lignesrows(6).select
application.goto feuil1.rows(6)
Sélectionner une plage de cellules d'une autre feuillerows("1:50").select
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 plagesSélectionner les cellules à l'intersection de deux valeursun 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élection multiple de cellules, ou autrement dit union de plusieurs plagesmsgbox 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
Exemple 1Exemple combinant Union & Intersect
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
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 FINDSélectionner la première cellule de la colonne B contenant le mot "Zaza"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 derniè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 une plage de cellule contenant une valeur particulière dans la colonne B[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
Exemple 1with range(IIf([B1] = 2000, [B1], [B:B].find(2000, [B1])), "B65536")
range(.Item(1), .ColumnDifferences(.Item(1))(0)).Select
end withExemple 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 withExemple 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
Mettre en gras les cellules pairs de la colonne 3Option 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
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
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
Connaître l'adresse d'une cellule contenue dans une variable rangeDim 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") = TableauLes 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 les valeurs d'une plage de cellule contenu dans une variableSub 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 à plusieurs colonnesSub 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
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.
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
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.
Copier les cellules non videsDim 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
Copie de cellules filtréesset 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
Autoriser la copie d'une cellule uniquement vers une autre par Harald S.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
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.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
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 à gaucheDe 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 = falseMé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 :
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éralesselection.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)
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
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
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
Déclencher une macro si A1 est sélectionnée et SUPERIEURE à 0Sub Mergecells()
dim myStr As String
myStr = activecell.value & " " & activecell.offset(0, 1).value
activecell.value = myStr
activecell.offset(0, 1).Clearcontents
end Sub
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)
Infos par Chip Pearson (page Duplicate And Unique Items In Lists)
La formule matricielle ci-dessous affiche si oui ou non il y a des doublons:=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
'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
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
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 feuilleSub 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 cEnd 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
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 longSub 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 papierSendMessage form1.RichTextBox1.hWnd, WM_PASTE, 0, 0
' Colle l'image du presse papier dans le RichTextBox1Dans 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 longPublic Const WM_PASTE = &H302
Autres informations
Voir aussi sur le site de Chip Pearson : le site
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