Comment récupérer l'adresse de la cellule située en haut à gauche d'une plage ?
Par formule :
=CELLULE("adresse";plage)
avec VBA :
With Range("Uneplage")
MsgBox Cells(.Row, .Column).Address
End With
ou encore
Range("maplage").cells(1).address
=CELLULE("adresse";plage)
avec VBA :
With Range("Uneplage")
MsgBox Cells(.Row, .Column).Address
End With
ou encore
Range("maplage").cells(1).address
Michel Samoey, GeeDee, Lsteph,
Ajouté ou modifié le 05/04/2008 (N°1995)
Ajouté ou modifié le 05/04/2008 (N°1995)
Comment savoir si une ligne est vide (avec et sans VBA)
En VBA :
MsgBox Application.WorksheetFunction.CountA(Rows(ActiveCell.Row)) = 0
Avec une formule :
=NBVAL(1:1)=0
=COUNTA(1:1)=0
Les deux te renvoient Vrai ou Faux
MsgBox Application.WorksheetFunction.CountA(Rows(ActiveCell.Row)) = 0
Avec une formule :
=NBVAL(1:1)=0
=COUNTA(1:1)=0
Les deux te renvoient Vrai ou Faux
FdeCourt,
Ajouté ou modifié le 05/04/2008 (N°1992)
Ajouté ou modifié le 05/04/2008 (N°1992)
Peut-on sans macro empêcher qu'un utilisateur supprime une ligne ?
Sur la ligne à protéger, sélectionne deux cellules ou plus, tape
="" et valide par ctrl+Maj+enter
si tu veux voir que cette ligne est protégée, saisis ="*" pour voir les cellules à effacer (toutezs d'une coup) pour faire sauter la protection.
="" et valide par ctrl+Maj+enter
si tu veux voir que cette ligne est protégée, saisis ="*" pour voir les cellules à effacer (toutezs d'une coup) pour faire sauter la protection.
Flo Cabon,
Ajouté ou modifié le 01/12/2007 (N°1940)
Ajouté ou modifié le 01/12/2007 (N°1940)
Peut-on sans macro empêcher qu'un utilisateur supprime une ligne ?
Sur la ligne à protéger, sélectionne deux cellules ou plus, tape
="" et valide par ctrl+Maj+enter
si tu veux voir que cette ligne est protégée, saisis ="*" pour voir les cellules à effacer (toutezs d'une coup) pour faire sauter la protection.
="" et valide par ctrl+Maj+enter
si tu veux voir que cette ligne est protégée, saisis ="*" pour voir les cellules à effacer (toutezs d'une coup) pour faire sauter la protection.
Flo Cabon,
Ajouté ou modifié le 01/12/2007 (N°1940)
Ajouté ou modifié le 01/12/2007 (N°1940)
J'utilise une macro pour supprimer des lignes dont la cellule en colonne A est vide mais certaines ne s'effacent pas.
Excel a la facheuse habitude de garder des traces de précédentes valeurs qui ont été effacées !
D'où le danger, maintes fois signalé ici, de l'utilisation des "UsedRange" et autres "SpecialCell (xlCellTypeLastCell)"
Pour ton cas, cette petite ligne
[A:A] = [A:A].Value
placée dans ta macro devant celle-ci
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
rétablira la situation. Si ce n'est pas le cas c'est que tes lignes vides ne le sont pas et contiennent par exemple des retour chariot invisibles.
D'où le danger, maintes fois signalé ici, de l'utilisation des "UsedRange" et autres "SpecialCell (xlCellTypeLastCell)"
Pour ton cas, cette petite ligne
[A:A] = [A:A].Value
placée dans ta macro devant celle-ci
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
rétablira la situation. Si ce n'est pas le cas c'est que tes lignes vides ne le sont pas et contiennent par exemple des retour chariot invisibles.
Alain Vallon,
Ajouté ou modifié le 12/07/2007 (N°1862)
Ajouté ou modifié le 12/07/2007 (N°1862)
Comment fait-on pour personnaliser le style de référence à l’ouverture d’un fichier ?
Voici une macro pour forcer Excel à reconnaître un usager et ouvrir ce classeur selon le style de référence L1C1 et non en A1.
S’assurer que au préalable de bien identifier l’UserName via Outils/Options/onglet Général : nom d’utilisateur « mettre le nom de l’usager ».
Vous devez mettre cette macro dans le module "ThisWorkbook" de votre classeur :
Option Explicit
Private Sub Workbook_Open()
With Application
If .UserName <> "Jocelyn Vaillancourt" Then
.ReferenceStyle = xlA1
Else
.ReferenceStyle = xlR1C1
End If
On Error GoTo Sortie
Exit Sub
Sortie:
End Sub
Si vous voulez qu’a l’ouverture Excel soient en style de référence L1C1, mettre cette macro dans VBAProject (Perso.xls) / Microsoft Excel Objets / ThisWorkbook.
S’assurer que au préalable de bien identifier l’UserName via Outils/Options/onglet Général : nom d’utilisateur « mettre le nom de l’usager ».
Vous devez mettre cette macro dans le module "ThisWorkbook" de votre classeur :
Option Explicit
Private Sub Workbook_Open()
With Application
If .UserName <> "Jocelyn Vaillancourt" Then
.ReferenceStyle = xlA1
Else
.ReferenceStyle = xlR1C1
End If
On Error GoTo Sortie
Exit Sub
Sortie:
End Sub
Si vous voulez qu’a l’ouverture Excel soient en style de référence L1C1, mettre cette macro dans VBAProject (Perso.xls) / Microsoft Excel Objets / ThisWorkbook.
Jocelyn Vaillancourt,
Ajouté ou modifié le 02/12/2006 (N°1780)
Ajouté ou modifié le 02/12/2006 (N°1780)

Comment ajuster précisemment la hauteur des lignes de ma feuille autrement qu'en tatonnant
pour obtenir une hauteur de 3cmpar exemple ?
Tu peux utiliser la propriété Height de l'objet Range en VBA pour déterminer la hauteur
d'une ligne particulière. Cette propriété est en lecture seule elle est de type variant.
Elle renvoie une hauteur en points.
Mais comme les choses avec excel ne sont jamais si simple... (des maudits informaticiens à
l'esprit tordu ;-)) ).
L'affichage à l'écran des dimensions tient compte des pixels en ce sens que la plus petite
majoration en plus ou en
moins de la hauteur affichée à l'écran correspond à 1 pixel. En conséquence, bien que l'on
puisse demander diverses hauteurs de lignes en point, l'affichage elle, se fera à l'unité
la plus proche(arrondi) de l'unité en pixel
correspondante. (des demis pixels ça n'existe pas ! )
un pixel = 0.75 points
72 points = 1 pouce
1 Pouce = 2.54 Centimètre
Tu peux utiliser ceci en VBA pour déterminer la hauter d'une ligne particulière
Sub HauteurUneLigne()
Dim LaLigne As Long
LaLigne = 5 ' unité de mesure le point
With Worksheets("Feuil1") ' Nom feuille à déterminer
.Rows(LaLigne & ":" & LaLigne).RowHeight = 25
End With
End Sub
Si tu vas vérifier après coup dans la feuille, il se peut qu'il y ait une toute légère
différence entre la mesure observée et celle de ta procédure car la plus petite majoration
que la hauteur peut accepter est de 1 pixcel soit 0.75 points. Dans ce cas, l'affichage se
fait au plus près de la valeur désirée en tenant compte de ce qui précède.
d'une ligne particulière. Cette propriété est en lecture seule elle est de type variant.
Elle renvoie une hauteur en points.
Mais comme les choses avec excel ne sont jamais si simple... (des maudits informaticiens à
l'esprit tordu ;-)) ).
L'affichage à l'écran des dimensions tient compte des pixels en ce sens que la plus petite
majoration en plus ou en
moins de la hauteur affichée à l'écran correspond à 1 pixel. En conséquence, bien que l'on
puisse demander diverses hauteurs de lignes en point, l'affichage elle, se fera à l'unité
la plus proche(arrondi) de l'unité en pixel
correspondante. (des demis pixels ça n'existe pas ! )
un pixel = 0.75 points
72 points = 1 pouce
1 Pouce = 2.54 Centimètre
Tu peux utiliser ceci en VBA pour déterminer la hauter d'une ligne particulière
Sub HauteurUneLigne()
Dim LaLigne As Long
LaLigne = 5 ' unité de mesure le point
With Worksheets("Feuil1") ' Nom feuille à déterminer
.Rows(LaLigne & ":" & LaLigne).RowHeight = 25
End With
End Sub
Si tu vas vérifier après coup dans la feuille, il se peut qu'il y ait une toute légère
différence entre la mesure observée et celle de ta procédure car la plus petite majoration
que la hauteur peut accepter est de 1 pixcel soit 0.75 points. Dans ce cas, l'affichage se
fait au plus près de la valeur désirée en tenant compte de ce qui précède.
Denis Michon,
Ajouté ou modifié le 05/03/2005 (N°1589)
Ajouté ou modifié le 05/03/2005 (N°1589)
Après avoir appliqué un fitre ou même manuellement, j'ai des lignes masquées. Comment ne
copier QUE les lignes visibles sur une autre feuille ?
Sélection plage > Edition > artteindre > Cellules > cocher cellules visibles
seulement > copier > coller ailleurs
seulement > copier > coller ailleurs
Alain vallon,
Ajouté ou modifié le 05/11/2004 (N°1520)
Ajouté ou modifié le 05/11/2004 (N°1520)

Soit une liste avec une ligne de totalisation en perpétuelle évolution.
Je souhaiterais qu'une nouvelle ligne vierge s'affiche dès que je saisis une
donnée sur la dernière ligne de la liste.
Mon tableau présente ainsi toujours une ligne vierge.
Voila une des rares améliorations de excel 2003, tu peux définir une "liste" et ajouter
une ligne de calcul.
Quand tu veux ajouter un ligne, Excel l'insère automatiquement avant la ligne de total,
comme dans une base de données par exemple.
Si tu n'as pas cette version utilise cette macro qui fait ce que tu souhaites dès
l'instant où tu te positionnes dans l'une quelconque des cellules de la ligne dans
laquelle tu viens de saisir...
Sub NouvelleLigneEnDessous()
' Insère une ligne sous la ligne qui contient la cellule active
' et y recopie les formules qu'elle contient
Dim ZtNumLig As Integer
Dim ZtDerCol As Integer
Dim i
ActiveCell.Range("A2").EntireRow.insert
ZtNumLig = ActiveCell.Row
ZtDerCol = ActiveCell.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(ZtNumLig, 1), Cells(ZtNumLig, ZtDerCol)).Copy _
Range(Cells(ZtNumLig + 1, 1), Cells(ZtNumLig + 1, ZtDerCol))
Application.ScreenUpdating = False
For i = 1 To ZtDerCol
If Not Cells(ZtNumLig + 1, i).HasFormula Then
Cells(ZtNumLig + 1, i).ClearContents
End If
Next i
ActiveCell.Range("A2").Select
End Sub
une ligne de calcul.
Quand tu veux ajouter un ligne, Excel l'insère automatiquement avant la ligne de total,
comme dans une base de données par exemple.
Si tu n'as pas cette version utilise cette macro qui fait ce que tu souhaites dès
l'instant où tu te positionnes dans l'une quelconque des cellules de la ligne dans
laquelle tu viens de saisir...
Sub NouvelleLigneEnDessous()
' Insère une ligne sous la ligne qui contient la cellule active
' et y recopie les formules qu'elle contient
Dim ZtNumLig As Integer
Dim ZtDerCol As Integer
Dim i
ActiveCell.Range("A2").EntireRow.insert
ZtNumLig = ActiveCell.Row
ZtDerCol = ActiveCell.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(ZtNumLig, 1), Cells(ZtNumLig, ZtDerCol)).Copy _
Range(Cells(ZtNumLig + 1, 1), Cells(ZtNumLig + 1, ZtDerCol))
Application.ScreenUpdating = False
For i = 1 To ZtDerCol
If Not Cells(ZtNumLig + 1, i).HasFormula Then
Cells(ZtNumLig + 1, i).ClearContents
End If
Next i
ActiveCell.Range("A2").Select
End Sub
Jacky,
Ajouté ou modifié le 20/05/2004 (N°1426)
Ajouté ou modifié le 20/05/2004 (N°1426)
Je récupère dans une macro un range. Disons A2:D20
comment récupérer :
preml= N° de la première ligne (2)
dernl= n° de la dernière ligne(20)
premc= N° de la première colonne (1) ou mieux, directement sa lettre, A
dernc= N° de la dernière colonne (4 ou D)
Parmi la foultitude de soluces :
Sub zoziau()
Set plg = [A2:D20]
preml = plg(1).Row '1° ligne de la plage
dernl = plg.Rows.Count +preml- 1 'der ligne
premc = Split(plg(1).Address, "$")(1) '1° colonne de la plage
dernc = Split(Cells(1, plg.Columns.Count + plg(1).Column - 1).Address, "$")(1)
'der colonne
MsgBox preml: MsgBox dernl: MsgBox premc: MsgBox dernc
End Sub
il y a aussi la méthode item
Set plg = Range("A2:D20")
preml = plg.Item(1).Row
dernl = plg.Item(plg.Count).Row
premc = plg.Item(1).Column
dernc = plg.Item(plg.Count).Column
MsgBox Range(Cells(preml, premc), Cells(dernl, dernc)).Address
ou bien,
Sub Macro1()
Set plg = Range("A2:D20")
preml = plg.Item(1).Row
dernl = plg.Item(plg.Count).Row
premc = LettreColonne(plg.Item(1).Column)
dernc = LettreColonne(plg.Item(plg.Count).Column)
End Sub
Function LettreColonne(c As Integer)
LettreColonne = Left(Cells(1, c).Address(0, 0), IIf(c < 27, 1, 2))
End Function
Sub zoziau()
Set plg = [A2:D20]
preml = plg(1).Row '1° ligne de la plage
dernl = plg.Rows.Count +preml- 1 'der ligne
premc = Split(plg(1).Address, "$")(1) '1° colonne de la plage
dernc = Split(Cells(1, plg.Columns.Count + plg(1).Column - 1).Address, "$")(1)
'der colonne
MsgBox preml: MsgBox dernl: MsgBox premc: MsgBox dernc
End Sub
il y a aussi la méthode item
Set plg = Range("A2:D20")
preml = plg.Item(1).Row
dernl = plg.Item(plg.Count).Row
premc = plg.Item(1).Column
dernc = plg.Item(plg.Count).Column
MsgBox Range(Cells(preml, premc), Cells(dernl, dernc)).Address
ou bien,
Sub Macro1()
Set plg = Range("A2:D20")
preml = plg.Item(1).Row
dernl = plg.Item(plg.Count).Row
premc = LettreColonne(plg.Item(1).Column)
dernc = LettreColonne(plg.Item(plg.Count).Column)
End Sub
Function LettreColonne(c As Integer)
LettreColonne = Left(Cells(1, c).Address(0, 0), IIf(c < 27, 1, 2))
End Function
Alain vallon, Isabelle, Michel Gaboly,
Ajouté ou modifié le 20/05/2004 (N°1422)
Ajouté ou modifié le 20/05/2004 (N°1422)
Comment déclencher une macro à chaque insertion de ligne ?
Cet événement n'est pas répertorié. Alors, une solution tordue :
sélectionne la ligne 1000 et nomme la "fin" (insertion / nom..)
insère un nouvel onglet dans le classeur dans lequel tu inscris n'importe où
=ligne(fin)
masque cet onglet
dans la page de code associée avec cet onglet, recopie :
Private Sub Worksheet_Calculate()
MsgBox "aïe"
Sub
à chaque insertion (ou suppression) d'une ligne au dessus de la ligne "fin",
la macro est lancée
sélectionne la ligne 1000 et nomme la "fin" (insertion / nom..)
insère un nouvel onglet dans le classeur dans lequel tu inscris n'importe où
=ligne(fin)
masque cet onglet
dans la page de code associée avec cet onglet, recopie :
Private Sub Worksheet_Calculate()
MsgBox "aïe"
Sub
à chaque insertion (ou suppression) d'une ligne au dessus de la ligne "fin",
la macro est lancée
Jacques Chaussard,
Ajouté ou modifié le 16/05/2004 (N°1397)
Ajouté ou modifié le 16/05/2004 (N°1397)
J'importe des données depuis un fichier texte. Certaines lignes restent vides mais je ne peux
pas les supprimer avec une procédure supprimelignevides car apparemment il y a quelque chose
(invisible) dedans. Comment accéder à ces caractères ?
Tu pourrais t'inspirer de cette macro. Tu as besoin de deux colonnes vides pour l'utiliser. Tu
devras adapter pour le nom de fichier. Cela fonctionne cellule par cellule.
Sub listecaracterescellule()
'mettre le curseur en haut à gauche de la zone où l'on
'veut avoir les résultats.
'Il faut deux colonnes de libres
Dim i As Integer
Open "c:\mes documents\coucou.txt" For Input As 1
i = 1
Do While Not EOF(1)
Line Input #1, donnee
Cells(i, 1).Value = donnee
i = i + 1
Loop
Close
celluleatester = InputBox("Indiquez l'adresse de la cellule à vérifier")
LaCellule = celluleatester
Set celluleatester = Range(celluleatester)
ActiveCell.Value = "Liste des caractères"
ActiveCell.Offset(1, 0).Value = "de la cellule " & LaCellule
ActiveCell.Offset(0, 1).Value = "Code de caractère"
For i = 1 To Len(celluleatester)
caractere = Mid(celluleatester, i, 1)
ActiveCell.Offset(i + 2, 0).Value = caractere
ActiveCell.Offset(i + 2, 1).Value = Asc(caractere)
Next
enbas = ActiveCell.Offset(i + 2, 1).Address
plage = ActiveCell.Address & ":" & enbas
Range(plage).Select
Selection.Columns.AutoFit
End Sub
devras adapter pour le nom de fichier. Cela fonctionne cellule par cellule.
Sub listecaracterescellule()
'mettre le curseur en haut à gauche de la zone où l'on
'veut avoir les résultats.
'Il faut deux colonnes de libres
Dim i As Integer
Open "c:\mes documents\coucou.txt" For Input As 1
i = 1
Do While Not EOF(1)
Line Input #1, donnee
Cells(i, 1).Value = donnee
i = i + 1
Loop
Close
celluleatester = InputBox("Indiquez l'adresse de la cellule à vérifier")
LaCellule = celluleatester
Set celluleatester = Range(celluleatester)
ActiveCell.Value = "Liste des caractères"
ActiveCell.Offset(1, 0).Value = "de la cellule " & LaCellule
ActiveCell.Offset(0, 1).Value = "Code de caractère"
For i = 1 To Len(celluleatester)
caractere = Mid(celluleatester, i, 1)
ActiveCell.Offset(i + 2, 0).Value = caractere
ActiveCell.Offset(i + 2, 1).Value = Asc(caractere)
Next
enbas = ActiveCell.Offset(i + 2, 1).Address
plage = ActiveCell.Address & ":" & enbas
Range(plage).Select
Selection.Columns.AutoFit
End Sub
Clément Marcotte, (N°1038)

Quelle formule dois-je mettre dans la cellule A1 de la feuille "Feuil2" pour obtenir
en la "tirant" vers le bas le contenu des cellules de la "Feuil1" 1 ligne
sur 3...
"=DECALER(Feuil1!A$1;LIGNE()*3-3;)
Et si maintenant sur la feuil2 je ne
fais pas partir ma formule de A1 mais de C4 ?
=DECALER(Feuil1!A$1;(LIGNE()-LIGNE(C$4))*3;)
Et si maintenant sur la feuil2 je ne
fais pas partir ma formule de A1 mais de C4 ?
=DECALER(Feuil1!A$1;(LIGNE()-LIGNE(C$4))*3;)
Laurent Longre, (N°1037)
J'ai des lignes de différentes couleurs - Comment regrouper les lignes ayant la même couleur ?
Sub TriParCouleurs()
'trie une plage de données soit sur la couleur d'une de ses cellules
'soit en regroupant ses lignes par couleurs
Dim cell As Range, Col1%, derCol%, Li1&, derLi&, couleur&, Msg$, choix%
Dim plage As Range
Msg = "Pour trier sur une couleur, cliquez sur ""Oui""" & vbLf
Msg = Msg & "Pour trier sur toutes les couleurs, cliquez sur
""Non""" & vbLf
Msg = Msg & "Pour abandonner, cliquez sur ""Annuler"""
choix = MsgBox(Msg, vbYesNoCancel)
Select Case choix
Case 2: Exit Sub
Case 6: GoSub SelectCell: GoSub SelectPlage
Case 7: GoSub SelectPlage
End Select
Li1 = plage.Range("A1").Row
Col1 = plage.Range("A1").Column
derLi = Li1 + plage.Rows.Count - 1
derCol = Col1 + plage.Columns.Count
Application.ScreenUpdating = False
Columns(derCol).Insert Shift:=xlToRight
Select Case choix
Case 6
couleur = cell.Interior.ColorIndex
For i = Li1 To derLi
If Cells(i, Col1).Interior.ColorIndex = couleur Then
Cells(i, derCol).Value = couleur
If Application.CountA(Cells(i, Col1), Cells(i, derCol - 1)) = 0 Then
Cells(i, derCol).Value = couleur + 1
End If
End If
Next
Case 7
For i = Li1 To derLi
couleur = Cells(i, Col1).Interior.ColorIndex
If couleur < 0 Then couleur = couleur * -1
Cells(i, derCol).Value = couleur
If Application.CountA(Cells(i, Col1), Cells(i, derCol - 1)) = 0 Then
Cells(i, derCol).Value = couleur + 1
End If
Next
End Select
Range(Cells(Li1, Col1), Cells(derLi, derCol)).Sort _
Cells(Li1, derCol), xlAscending
Columns(derCol).Delete Shift:=xlToLeft
Exit Sub
SelectCell:
Msg = vbLf & "Sélectionner une cellule de la couleur à trier :"
On Error Resume Next
Application.DisplayAlerts = False
Set cell = Application.InputBox(Msg, , , , , , , 8)
Application.DisplayAlerts = True
If Err <> 0 Then
Err.Clear: Exit Sub
End If
If cell.Count > 1 Then
MsgBox "Sélectionnez une seule cellule, SVP"
TriParCouleurs
End If
Return
SelectPlage:
Msg = "Sélectionnez la plage des données à trier"
On Error Resume Next
Application.DisplayAlerts = False
Set plage = Application.InputBox(Msg, , , , , , , 8)
Application.DisplayAlerts = True
If Err <> 0 Then
Err.Clear: Exit Sub
End If
If plage.Rows.Count = 1 Then
MsgBox "La plage à trier doit comporter au moins 2 lignes..."
TriParCouleurs
End If
Return
End Sub
'trie une plage de données soit sur la couleur d'une de ses cellules
'soit en regroupant ses lignes par couleurs
Dim cell As Range, Col1%, derCol%, Li1&, derLi&, couleur&, Msg$, choix%
Dim plage As Range
Msg = "Pour trier sur une couleur, cliquez sur ""Oui""" & vbLf
Msg = Msg & "Pour trier sur toutes les couleurs, cliquez sur
""Non""" & vbLf
Msg = Msg & "Pour abandonner, cliquez sur ""Annuler"""
choix = MsgBox(Msg, vbYesNoCancel)
Select Case choix
Case 2: Exit Sub
Case 6: GoSub SelectCell: GoSub SelectPlage
Case 7: GoSub SelectPlage
End Select
Li1 = plage.Range("A1").Row
Col1 = plage.Range("A1").Column
derLi = Li1 + plage.Rows.Count - 1
derCol = Col1 + plage.Columns.Count
Application.ScreenUpdating = False
Columns(derCol).Insert Shift:=xlToRight
Select Case choix
Case 6
couleur = cell.Interior.ColorIndex
For i = Li1 To derLi
If Cells(i, Col1).Interior.ColorIndex = couleur Then
Cells(i, derCol).Value = couleur
If Application.CountA(Cells(i, Col1), Cells(i, derCol - 1)) = 0 Then
Cells(i, derCol).Value = couleur + 1
End If
End If
Next
Case 7
For i = Li1 To derLi
couleur = Cells(i, Col1).Interior.ColorIndex
If couleur < 0 Then couleur = couleur * -1
Cells(i, derCol).Value = couleur
If Application.CountA(Cells(i, Col1), Cells(i, derCol - 1)) = 0 Then
Cells(i, derCol).Value = couleur + 1
End If
Next
End Select
Range(Cells(Li1, Col1), Cells(derLi, derCol)).Sort _
Cells(Li1, derCol), xlAscending
Columns(derCol).Delete Shift:=xlToLeft
Exit Sub
SelectCell:
Msg = vbLf & "Sélectionner une cellule de la couleur à trier :"
On Error Resume Next
Application.DisplayAlerts = False
Set cell = Application.InputBox(Msg, , , , , , , 8)
Application.DisplayAlerts = True
If Err <> 0 Then
Err.Clear: Exit Sub
End If
If cell.Count > 1 Then
MsgBox "Sélectionnez une seule cellule, SVP"
TriParCouleurs
End If
Return
SelectPlage:
Msg = "Sélectionnez la plage des données à trier"
On Error Resume Next
Application.DisplayAlerts = False
Set plage = Application.InputBox(Msg, , , , , , , 8)
Application.DisplayAlerts = True
If Err <> 0 Then
Err.Clear: Exit Sub
End If
If plage.Rows.Count = 1 Then
MsgBox "La plage à trier doit comporter au moins 2 lignes..."
TriParCouleurs
End If
Return
End Sub
Frédéric Sigonneau, (N°1036)
Comment supprimer toutes les lignes vides ?
Sub SuppLigneVides()
With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For r = derLi To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r
End Sub
Attention, il est important de toujours commencer par le bas et de remonter !
With ActiveSheet.UsedRange
derLi = .Row + .Rows.Count - 1
End With
Application.ScreenUpdating = False
For r = derLi To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r
End Sub
Attention, il est important de toujours commencer par le bas et de remonter !
Frédéric Sigonneau, (N°1035)
Je voudrais dans la plage (a1:a100 supprimer les lignes dont la cellule comprend un nombre et
laisser les lignes dont la cellule comprend du texte.
[A1:A100].SpecialCells(xlCellTypeConstants, xlNumbers).EntireRow.Delete
Laurent Longre, (N°1034)
Je souhaiterais supprimer la ligne complète si au début de cette ligne, dans la colonne A, il y
a le mot "toto".
Sub suppr_ligne_de_toto()
For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To 1
Step -1
If Cells(lin, 1) = "toto" Then Rows(lin).Delete Shift:=xlUp
Next lin
End Sub
je m'explique
ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row c'est le n° de
la dernière ligne utilisée dans la feuille
je balaie les lignes en partant de la dernière et en remontant (step -1)
pourquoi ? parce que si je descends, quand j'ôte une ligne, je me retrouve
décalé d'un cran et ça me fatique de remonter pour ne pas rater un toto.
cells(lin,1) est la première cellule de la ligne n° lin
For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To 1
Step -1
If Cells(lin, 1) = "toto" Then Rows(lin).Delete Shift:=xlUp
Next lin
End Sub
je m'explique
ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row c'est le n° de
la dernière ligne utilisée dans la feuille
je balaie les lignes en partant de la dernière et en remontant (step -1)
pourquoi ? parce que si je descends, quand j'ôte une ligne, je me retrouve
décalé d'un cran et ça me fatique de remonter pour ne pas rater un toto.
cells(lin,1) est la première cellule de la ligne n° lin
Jacques Chaussard, (N°1033)
Je voudrais sélectionner des lignes répondant à un critère donné pour les copier en bloc sur
une autre feuille...
En partant du principe que tout ça se passe dans la Feuille
"Feuil1", que le nombre de lignes à examiner soit 20 et que le
critère soit "MonCritère" à vérifier dans la cellule "A" de
chaque ligne (à remplacer par tes valeurs donc) :
Sub JeSelectionne()
i = 1
NombreLignes = 20
While i < NombreLignes + 1
If Cells(i, 1) = MonCritere Then
MesLignes = MesLignes & i & ":" & i & ","
End If
i = i + 1
Wend
MesLignes = Left(MesLignes, Len(MesLignes) - 1)
Sheets("Feuil1").Range(MesLignes).Select
End Sub
Attention tout de même aux limites du nombre de lignes
distinctes admises dans la sélection multiple (255 ?)
"Feuil1", que le nombre de lignes à examiner soit 20 et que le
critère soit "MonCritère" à vérifier dans la cellule "A" de
chaque ligne (à remplacer par tes valeurs donc) :
Sub JeSelectionne()
i = 1
NombreLignes = 20
While i < NombreLignes + 1
If Cells(i, 1) = MonCritere Then
MesLignes = MesLignes & i & ":" & i & ","
End If
i = i + 1
Wend
MesLignes = Left(MesLignes, Len(MesLignes) - 1)
Sheets("Feuil1").Range(MesLignes).Select
End Sub
Attention tout de même aux limites du nombre de lignes
distinctes admises dans la sélection multiple (255 ?)
Bernard Rey, (N°1032)

J'ai une colonne de valeurs. Je contrôle le contenu de chaque cellule, et selon certains
critères, je copie le contenu de la cellule dans une colonne X. Comment faire pour : 1-
vérifier que cette valeur n'existe pas déjà dans cette colonne X 2 - si elle n'existe pas,
trouver la 1ère cellule vide, pour y copier cette valeur.
Sub Ajout_dans_colonne()
Val_Ch = "zaza"
' recherche l'existence de Val_Ch dans la colonne C
n = EQUIVAL(Val_Ch, [C:C], 0)
' NOTA : on peut aussi écrire n = EQUIVAL(Val_Ch, Columns(3), 0)
If n = 0 Then
' valeur non trouvée ==> ajouter à la fin
Range("C:C").End(xlDown)(2) = Val_Ch
End If
End Sub
Function EQUIVAL(Val_Ch As Variant, Tableau As Range, Mode_Rech As Integer)As Variant
' fonctionnement identique à la fonction EQUIV de feuille de calcul
EQUIVAL = 0
On Error Resume Next
EQUIVAL = Application.WorksheetFunction.Match(Val_Ch, Tableau, Mode_Rech)
On Error GoTo 0
End Function
Val_Ch = "zaza"
' recherche l'existence de Val_Ch dans la colonne C
n = EQUIVAL(Val_Ch, [C:C], 0)
' NOTA : on peut aussi écrire n = EQUIVAL(Val_Ch, Columns(3), 0)
If n = 0 Then
' valeur non trouvée ==> ajouter à la fin
Range("C:C").End(xlDown)(2) = Val_Ch
End If
End Sub
Function EQUIVAL(Val_Ch As Variant, Tableau As Range, Mode_Rech As Integer)As Variant
' fonctionnement identique à la fonction EQUIV de feuille de calcul
EQUIVAL = 0
On Error Resume Next
EQUIVAL = Application.WorksheetFunction.Match(Val_Ch, Tableau, Mode_Rech)
On Error GoTo 0
End Function
Robert Dezan, (N°1031)
Est il possible d'insérer une colonne à l'aide d'un raccourci clavier ?
CTRL+"+" (le + du pavé numérique)
Ctrl + "-" tu supprimes la ligne ou la colonne.
si tu sélectionnes la ligne ou la colonne en entier tu évites la boîte de
dialogue.
Ctrl + "-" tu supprimes la ligne ou la colonne.
si tu sélectionnes la ligne ou la colonne en entier tu évites la boîte de
dialogue.
Michel Bedain, Bruno bdf, (N°1030)
Je travaille sur des fichiers Excel de type ''base de données''avec beaucoup de colonnes. Avec
un doigt je vérifie les données se trouvant sur une feuille papier et avec l'autre main je
descends de ligne sur le PC avec le bouton ''flèche vers le bas'' pour atteindre les lignes de
données à vérifier. Quelqu'un peut-il me donner un truc simple qui me permette de repérer
facilement où se trouve la ligne où se trouve le curseur?
Essaye cette procédure à recopier dans le module de la feuille qui t'intéresse
(clic droit sur son onglet puis 'Visualiser le code'). Elle surligne en jaune la
ligne de la cellule active lorsqu'on la déplace avec les flèches haut et bas :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target(0).EntireRow.Interior.ColorIndex = xlNone
Target.EntireRow.Interior.ColorIndex = 6
Target(2).EntireRow.Interior.ColorIndex = xlNone
End Sub
Dans la feuille de code de l'onglet où tu désires cette proc.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Cells.Interior.ColorIndex = xlNone
With ActiveCell
.EntireRow.Interior.ColorIndex = 36
' et si tu veux ajouter la sélection de la colonne
' .EntireColumn.Interior.ColorIndex = 36
End With
End Sub
(clic droit sur son onglet puis 'Visualiser le code'). Elle surligne en jaune la
ligne de la cellule active lorsqu'on la déplace avec les flèches haut et bas :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target(0).EntireRow.Interior.ColorIndex = xlNone
Target.EntireRow.Interior.ColorIndex = 6
Target(2).EntireRow.Interior.ColorIndex = xlNone
End Sub
Dans la feuille de code de l'onglet où tu désires cette proc.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Cells.Interior.ColorIndex = xlNone
With ActiveCell
.EntireRow.Interior.ColorIndex = 36
' et si tu veux ajouter la sélection de la colonne
' .EntireColumn.Interior.ColorIndex = 36
End With
End Sub
ChrisV, (N°1029)
Comment dimensionner les lignes et les colonnes en cm ?
La largeur des colonnes dans excel est définie dans une unité qui n'en n'est pas une :
elle dépend de la police par défaut... Du coup c'est pas si facile de dimensionner les Colonnes
en cm...
Pour imprimer, vous aurez peut-être un décalage. Ce décalage dépend de l'imprimante
choisie. Pas d'autre solution que de tatonner si vous avez besoin de quelque chose d'assez
précis.
1) pour les colonnes
Sub colonnesEnCentimetres()
Dim cm As Integer, points As Integer, savewidth As Integer
Dim count As Integer
Application.ScreenUpdating = False
cm = Application.InputBox("entrer la largeur de la colonne en cms",
"Largeur de la colonne souhaitée", Type:=1)
If cm = False Then Exit Sub
points = Application.CentimetersToPoints(cm)
savewidth = ActiveCell.ColumnWidth
ActiveCell.ColumnWidth = 255
If points > ActiveCell.Width Then
MsgBox "la largeur de" & cm & "est trop large" & Chr(10) &
_
"la valeur maxi est de " & _
Format(ActiveCell.Width / 28.3464566929134, _
"0.00"), vbOKOnly + vbExclamation, "largeur non valable"
ActiveCell.ColumnWidth = savewidth
Exit Sub
End If
lowerwidth = 0
upwidth = 255
ActiveCell.ColumnWidth = 127.5
curwidth = ActiveCell.ColumnWidth
count = 0
While (ActiveCell.Width <> points) And (count < 20)
If ActiveCell.Width < points Then
lowerwidth = curwidth
Selection.ColumnWidth = (curwidth + upwidth) / 2
Else
upwidth = curwidth
Selection.ColumnWidth = (curwidth + lowerwidth) / 2
End If
curwidth = ActiveCell.ColumnWidth
count = count + 1
Wend
End Sub
2) pour les lignes (nettement plus court car lignes et colonnes n'ont
pas, au départ, les mêmes unités de mesure
Sub lignesEnCentimetres()
Dim cm As Integer
cm = Application.InputBox("entrer la hauteur de la ligne en
centimetres", "Hauteur de la ligne souhaitée", Type:=1)
If cm Then
Selection.RowHeight = Application.CentimetersToPoints(cm)
End If
End Sub
signé : le grand du gouleyant beaujolais en personne:
elle dépend de la police par défaut... Du coup c'est pas si facile de dimensionner les Colonnes
en cm...
Pour imprimer, vous aurez peut-être un décalage. Ce décalage dépend de l'imprimante
choisie. Pas d'autre solution que de tatonner si vous avez besoin de quelque chose d'assez
précis.
1) pour les colonnes
Sub colonnesEnCentimetres()
Dim cm As Integer, points As Integer, savewidth As Integer
Dim count As Integer
Application.ScreenUpdating = False
cm = Application.InputBox("entrer la largeur de la colonne en cms",
"Largeur de la colonne souhaitée", Type:=1)
If cm = False Then Exit Sub
points = Application.CentimetersToPoints(cm)
savewidth = ActiveCell.ColumnWidth
ActiveCell.ColumnWidth = 255
If points > ActiveCell.Width Then
MsgBox "la largeur de" & cm & "est trop large" & Chr(10) &
_
"la valeur maxi est de " & _
Format(ActiveCell.Width / 28.3464566929134, _
"0.00"), vbOKOnly + vbExclamation, "largeur non valable"
ActiveCell.ColumnWidth = savewidth
Exit Sub
End If
lowerwidth = 0
upwidth = 255
ActiveCell.ColumnWidth = 127.5
curwidth = ActiveCell.ColumnWidth
count = 0
While (ActiveCell.Width <> points) And (count < 20)
If ActiveCell.Width < points Then
lowerwidth = curwidth
Selection.ColumnWidth = (curwidth + upwidth) / 2
Else
upwidth = curwidth
Selection.ColumnWidth = (curwidth + lowerwidth) / 2
End If
curwidth = ActiveCell.ColumnWidth
count = count + 1
Wend
End Sub
2) pour les lignes (nettement plus court car lignes et colonnes n'ont
pas, au départ, les mêmes unités de mesure
Sub lignesEnCentimetres()
Dim cm As Integer
cm = Application.InputBox("entrer la hauteur de la ligne en
centimetres", "Hauteur de la ligne souhaitée", Type:=1)
If cm Then
Selection.RowHeight = Application.CentimetersToPoints(cm)
End If
End Sub
signé : le grand du gouleyant beaujolais en personne:
Jean-Paul Sabatier, (N°1028)
Je voudrais par macro sélectionner toutes les lignes répondant à un critère donné. Ces lignes
sont discontinues.
En partant du principe que tout ça se passe dans la Feuille
"Feuil1", que le nombre de lignes à examiner soit 20 et que le
critère soit "MonCritère" à vérifier dans la cellule "A" de
chaque ligne (à remplacer par tes valeurs donc) :
Sub JeSelectionne()
i = 1
NombreLignes = 20
While i < NombreLignes + 1
If Cells(i, 1) = MonCritere Then
MesLignes = MesLignes & i & ":" & i & ","
End If
i = i + 1
Wend
MesLignes = Left(MesLignes, Len(MesLignes) - 1)
Sheets("Feuil1").Range(MesLignes).Select
End Sub
Attention tout de même aux limites du nombre de lignes
distinctes admises dans la sélection multiple (255 ?)
"Feuil1", que le nombre de lignes à examiner soit 20 et que le
critère soit "MonCritère" à vérifier dans la cellule "A" de
chaque ligne (à remplacer par tes valeurs donc) :
Sub JeSelectionne()
i = 1
NombreLignes = 20
While i < NombreLignes + 1
If Cells(i, 1) = MonCritere Then
MesLignes = MesLignes & i & ":" & i & ","
End If
i = i + 1
Wend
MesLignes = Left(MesLignes, Len(MesLignes) - 1)
Sheets("Feuil1").Range(MesLignes).Select
End Sub
Attention tout de même aux limites du nombre de lignes
distinctes admises dans la sélection multiple (255 ?)
Bernard Rey, (N°1027)
Comment faire pour inverser de haut en bas l'ordre des données dans une colonne ?
Le plus simple est de rajouter une série de 1 à n dans une colonne voisine
et de trier sur cette clé de tri par ordre décroissant.
et de trier sur cette clé de tri par ordre décroissant.
Eric Mermin, (N°1026)

J'ai une colonne qui contient des données du genre bonjour.merci.aurevoir. Je voudrais
récupérer chaque mot dans une colonne.
Méthode à la main :
tu sélectionnes ta colonne, menu Données - Convertir -
étape 1 type délimité.
étape 2 : séparateur autre . (le point).
Attention à l'étape3 sur la zone de destination (risque d'écrasement des colonnes voisines)
Par macro :
Sub InverConcatener()
Selection.TextToColumns
Destination:=[B1], DataType:=xlDelimited, _
Other:=True, OtherChar:="."
End Sub
tu sélectionnes ta colonne, menu Données - Convertir -
étape 1 type délimité.
étape 2 : séparateur autre . (le point).
Attention à l'étape3 sur la zone de destination (risque d'écrasement des colonnes voisines)
Par macro :
Sub InverConcatener()
Selection.TextToColumns
Destination:=[B1], DataType:=xlDelimited, _
Other:=True, OtherChar:="."
End Sub
ChrisV, (N°1025)
Quand je numérote mes lignes, en cas d'effacement de la ligne, j'aimerais que la ligne qui la
remplace porte le numéro que j'ai effacé.ex: si j'efface la ligne 5 la ligne 6 doit devenir 5
et la 7 devient 6 et ainsi de suite.
La solution que j'utilise est la suivante :
Dns la cellule A2 =NBVAL($1:A1)+1
puis recopie la formule dans toutes les lignes en dessous.
Seule ombre au tableau.
Si tu copies par exemple la ligne 8 et tu fais ensuite 'Insérer les cellules
copiées' tu auras la ligne 9 en double
'=ligne()' ou '=ligne()+n, te donneras toujours le bon numéro de ligne.
Quand j'insère une ligne je copie la formule dans les cases vides et la première qui est pleine pour éviter le problème que tu soulèves. L'utilisation de la fonction ligne() ne marche que si tu n'as pas de ligne vide au dessus. Il y a aussi un problème si tu insères des lignes vides que tu ne veux pas compter! (par exemple des lignes pour un titre).
Une solution à ce problème est d'utiliser la formule suivante pour la deuxième ligne et les suivantes (par copier/coller):
=NBVAL($1:DECALER(A2;-1;0))+1
Si la première cellule de la colonne doit être utilisée, il suffit de la mettre à 1.
Dns la cellule A2 =NBVAL($1:A1)+1
puis recopie la formule dans toutes les lignes en dessous.
Seule ombre au tableau.
Si tu copies par exemple la ligne 8 et tu fais ensuite 'Insérer les cellules
copiées' tu auras la ligne 9 en double
'=ligne()' ou '=ligne()+n, te donneras toujours le bon numéro de ligne.
Quand j'insère une ligne je copie la formule dans les cases vides et la première qui est pleine pour éviter le problème que tu soulèves. L'utilisation de la fonction ligne() ne marche que si tu n'as pas de ligne vide au dessus. Il y a aussi un problème si tu insères des lignes vides que tu ne veux pas compter! (par exemple des lignes pour un titre).
Une solution à ce problème est d'utiliser la formule suivante pour la deuxième ligne et les suivantes (par copier/coller):
=NBVAL($1:DECALER(A2;-1;0))+1
Si la première cellule de la colonne doit être utilisée, il suffit de la mettre à 1.
Philippe Tulliez, Xavier Rouchon, Romain Vercoutère, (N°1024)
Je cherche à rendre la colonne A d'une feuille de calcul toujours visible (A l'affichage)
pour afficher en permanence la colonne A :
sélectionnes la colonne B et fait Fenêtre / Figer les volets
sélectionnes la colonne B et fait Fenêtre / Figer les volets
Marco, (N°1023)
Colorier une ligne sur deux même lorsqu'un filtre est affiché ou que des lignes sont masquées.
Sub CouleurLignes()
Dim Ind As Boolean, Ligne As Range
Cells.Interior.ColorIndex = xlNone
For Each Ligne In
ActiveWorkbook.ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows
If Ind = True Then
Ligne.Interior.ColorIndex = 6
End If
Ind = Not Ind
Next Ligne
End Sub
Pour changer de couleur, utilisez le classeur : les roues chromatiques
de Geedee
ou celui de Jacques
Thiernesse.
Cette astuce est illustrée dans ces classeurs exemples :
gd-xlcolors (téléchargé 10866 fois)
jt-colors (téléchargé 12330 fois)
Dim Ind As Boolean, Ligne As Range
Cells.Interior.ColorIndex = xlNone
For Each Ligne In
ActiveWorkbook.ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows
If Ind = True Then
Ligne.Interior.ColorIndex = 6
End If
Ind = Not Ind
Next Ligne
End Sub
Pour changer de couleur, utilisez le classeur : les roues chromatiques
de Geedee
ou celui de Jacques
Thiernesse.
gd-xlcolors (téléchargé 10866 fois)
jt-colors (téléchargé 12330 fois)
Jacques Chaussard, (N°1022)
Je voudrais ajouter une ligne en recopiant les formules contenues dans la ligne du dessus mais
pas les valeurs
Sub NouvelleLigneEnDessous()
Dim ZtNumLig As Integer
Dim ZtDerCol As Integer
ActiveCell.Range("A2").EntireRow.Insert
ZtNumLig = ActiveCell.Row
ZtDerCol = ActiveCell.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(ZtNumLig, 1), Cells(ZtNumLig, ZtDerCol)).Copy _
Range(Cells(ZtNumLig + 1, 1), Cells(ZtNumLig + 1, ZtDerCol))
Application.ScreenUpdating = False
For i = 1 To ZtDerCol
If Not Cells(ZtNumLig + 1, i).HasFormula Then
Cells(ZtNumLig + 1, i).ClearContents
End If
Next i
ActiveCell.Range("A2").Select
End Sub
Dim ZtNumLig As Integer
Dim ZtDerCol As Integer
ActiveCell.Range("A2").EntireRow.Insert
ZtNumLig = ActiveCell.Row
ZtDerCol = ActiveCell.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(ZtNumLig, 1), Cells(ZtNumLig, ZtDerCol)).Copy _
Range(Cells(ZtNumLig + 1, 1), Cells(ZtNumLig + 1, ZtDerCol))
Application.ScreenUpdating = False
For i = 1 To ZtDerCol
If Not Cells(ZtNumLig + 1, i).HasFormula Then
Cells(ZtNumLig + 1, i).ClearContents
End If
Next i
ActiveCell.Range("A2").Select
End Sub
Jacky, (N°1021)
Je voudrais dans une colonne faire la somme d'une cellule sur deux.
Pour additionner les lignes de la plage A1:A5 dont le numéro de ligne est pair :
=SOMMEPROD((MOD(LIGNE(A1:A5);2)=0)*(A1:A5))
explications :
La fonction Ligne() : renvoie le numéro de la ligne
La fonction =Mod(ligne();2) :
Lorsque le résultat de cette fonction est égal à 1, le numéro de la ligne est impair, si le
résultat est égal à 0, le numéro de la ligne est pair.
Une autre façon d'écrire cette section de la formule : =MOD(LIGNE(A1:A5);2)=0
Sélectionne les cellules B1:B5 dans la cellule active b1 , écris la formule
suivante : =MOD(LIGNE(A1:A5);2)=0
Valide la saisie de la formule en B1
par ctrl+ Maj + Enter, la formule est transformée en formule matricielle.
Le résultat affiché en cellules B1:B5 est : Faux,Vrai,Faux,Vrai,Faux
Dans une feuille de calcul excel, la valeur d'une cellule affichant
"Vrai" = 1 , "Faux" = 0
L'autre façon d'écrire cette formule est : =MOD(LIGNE(A1:A5);2)=0
Ecris cette formule dans une cellule
Sélectionne dans la barre des formules le texte
LIGNE(A1:A5) de la formule, Appuies sur la touche F9, tu obtiens ce résultat:
LIGNE(A1:A5) est remplacé par une matrice des numéros de lignes de la plage de cellules.
{1;2;3;4;5}
La nouvelle formule est : =MOD({1;2;3;4;5};2)=0
Chaque élément de la matrice est testé par la fonction Mod()
Tu peux inscrire chacune de ces formules dans une cellule pour tester chaque élément de la
matrice par la fonction mod() et la valeur logique Faux ou Vrai s'affichera dans la cellule
Formule V.Logique V.Numérique
=Mod(1;2)=0 = Faux ou 0
=Mod(2;2)=0 = Vrai ou 1
=Mod(3;2)=0 = Faux ou 0
=Mod(4;2)=0 = Vrai ou 1
=Mod(5;2)=0 = Faux ou 0
La dernière section de la formule : (A1:A5)
Saisis ceci dans une formule =A1:A5
Sélectionne le texte A1:A5 et appuies sur F9
tu obtiens la matrice suivante : ={2;4;6;8;10}
Chaque élément de cette matrice représente la valeur
contenue dans chacune des cellules de la matrice.
La formule du début :
=SOMMEPROD((MOD(LIGNE(A1:A5);2)=0)*(A1:A5))
devient par simple substitution :
=SOMMEPROD(({0;1;0;1;0})*{2;4;6;8;10})
En multipliant chaque élément de la première matrice par
la valeur correspondante dans l'autre matrice on obtient:
Le produit des 2 matrices
= 0 * 2 = 0
= 1 * 4 = 4
= 0 * 6 = 0
= 1 * 8 = 8
= 0 * 10 = 0
La somme des produits :
=0 + 4 + 0 + 8 + 0 = 12
Résultat obtenu : 12
La définition de la fonction Sommeprod()
selon l'aide d'excel:
"Multiplie les valeurs correspondantes des matrices
spécifiées et calcule la somme de ces produits"
La fonction sommeprod() peut regrouper jusqu'à 30 arguments.
On pourrait remplacer le symbole * par le point virgule
comme séparateur d'arguments et on aurait ceci :
=SOMMEPROD(({0;1;0;1;0});{2;4;6;8;10})
Dernier élément : chacune des matrices doit avoir la même dimension.
=SOMMEPROD((MOD(LIGNE(A1:A5);2)=0)*(A1:A5))
explications :
La fonction Ligne() : renvoie le numéro de la ligne
La fonction =Mod(ligne();2) :
Lorsque le résultat de cette fonction est égal à 1, le numéro de la ligne est impair, si le
résultat est égal à 0, le numéro de la ligne est pair.
Une autre façon d'écrire cette section de la formule : =MOD(LIGNE(A1:A5);2)=0
Sélectionne les cellules B1:B5 dans la cellule active b1 , écris la formule
suivante : =MOD(LIGNE(A1:A5);2)=0
Valide la saisie de la formule en B1
par ctrl+ Maj + Enter, la formule est transformée en formule matricielle.
Le résultat affiché en cellules B1:B5 est : Faux,Vrai,Faux,Vrai,Faux
Dans une feuille de calcul excel, la valeur d'une cellule affichant
"Vrai" = 1 , "Faux" = 0
L'autre façon d'écrire cette formule est : =MOD(LIGNE(A1:A5);2)=0
Ecris cette formule dans une cellule
Sélectionne dans la barre des formules le texte
LIGNE(A1:A5) de la formule, Appuies sur la touche F9, tu obtiens ce résultat:
LIGNE(A1:A5) est remplacé par une matrice des numéros de lignes de la plage de cellules.
{1;2;3;4;5}
La nouvelle formule est : =MOD({1;2;3;4;5};2)=0
Chaque élément de la matrice est testé par la fonction Mod()
Tu peux inscrire chacune de ces formules dans une cellule pour tester chaque élément de la
matrice par la fonction mod() et la valeur logique Faux ou Vrai s'affichera dans la cellule
Formule V.Logique V.Numérique
=Mod(1;2)=0 = Faux ou 0
=Mod(2;2)=0 = Vrai ou 1
=Mod(3;2)=0 = Faux ou 0
=Mod(4;2)=0 = Vrai ou 1
=Mod(5;2)=0 = Faux ou 0
La dernière section de la formule : (A1:A5)
Saisis ceci dans une formule =A1:A5
Sélectionne le texte A1:A5 et appuies sur F9
tu obtiens la matrice suivante : ={2;4;6;8;10}
Chaque élément de cette matrice représente la valeur
contenue dans chacune des cellules de la matrice.
La formule du début :
=SOMMEPROD((MOD(LIGNE(A1:A5);2)=0)*(A1:A5))
devient par simple substitution :
=SOMMEPROD(({0;1;0;1;0})*{2;4;6;8;10})
En multipliant chaque élément de la première matrice par
la valeur correspondante dans l'autre matrice on obtient:
Le produit des 2 matrices
= 0 * 2 = 0
= 1 * 4 = 4
= 0 * 6 = 0
= 1 * 8 = 8
= 0 * 10 = 0
La somme des produits :
=0 + 4 + 0 + 8 + 0 = 12
Résultat obtenu : 12
La définition de la fonction Sommeprod()
selon l'aide d'excel:
"Multiplie les valeurs correspondantes des matrices
spécifiées et calcule la somme de ces produits"
La fonction sommeprod() peut regrouper jusqu'à 30 arguments.
On pourrait remplacer le symbole * par le point virgule
comme séparateur d'arguments et on aurait ceci :
=SOMMEPROD(({0;1;0;1;0});{2;4;6;8;10})
Dernier élément : chacune des matrices doit avoir la même dimension.
Denis Michon, (N°1020)
