J'ai besoin d'intimité. Non pas parce que mes actions sont douteuses, mais parce que votre jugement et vos intentions le sont.
5139 links
On veut calculer la somme des chiffres entrés dans la colonne $F
.
Le premier chiffre saisi dans cette colonne est à la ligne 5.
Dans une cellule, par exemple $XEL$4
(la cellule située sur la dernière colonne du tableau à la 4ème ligne), on entre la formule suivante :
=NB($F:$F)+4
NB
permet de calculer le nombre de cellules (dans une plage de cellules) qui contiennent des nombres. On y ajoute 4 car le premier nombre de la colonne $F
est à la ligne 5 (c'est à dire la ligne contenant le premier nombre, moins 1).
Ensuite, dans la case où l'on souhaite obtenir le résultat, on met la formule suivante :
=SOMME(INDIRECT("$F5:$F"&$XEL$4))
Excel va calculer la somme depuis la cellule $F5
jusqu'à la cellule de la colonne $F
dont l'indice de ligne est donné par le résultat situé dans $XEL$4
.
La formule =DECALER($A$5;0;0;NBVAL($A:$A)-1;1)
, à adapter selon les données, permet de retourner dynamiquement le contenu d'une plage de cellules dans une liste déroulante :
► la fonction DECALER
renvoie une référence à une plage de cellules qui contiennent la liste à afficher ;
► $A$5
fait référence à la première cellule de la liste source ;
► laisser 0;0;
pour n'appliquer aucun décalage horizontal ou vertical ;
► $A:$A
correspond à la colonne (A) où se trouve la liste source ;
► NBVAL
compte le nombre de cellules non vides dans cette colonne ;
► valeur -1
: on enlève 1 au nombre renvoyé par NBVAL si l'une des cellules contient une entête de liste, dont il ne faut pas tenir compte ;
► le dernier 1
correspond au nombre de colonnes de la référence renvoyée par DÉCALER (laisser la valeur 1).
On peut associer cette formule à un nom de plage que l'on utilisera ensuite pour créer une liste déroulante.
Pour ajouter un nom de plage, aller dans l'onglet Formules
puis Gestionnaire de noms
.
Dans la fenêtre qui s'ouvre, donner un nom à la plage de cellules dont souhaite voir afficher les valeurs dans la liste déroulante.
Dans la zone Fait référence à
, copier-coller la formule vue plus haut, c'est-à-dire =DECALER($A$5;0;0;NBVAL($A:$A)-1;1)
Valider l'enregistrement en cliquant sur le bouton OK.
Sélectionner la cellule où l'on souhaite voir s'afficher la liste déroulante. Dans l'onglet Données
, sélectionner Validation des données
.
Dans la fenêtre qui s'ouvre, placer le curseur dans le champ source. S'il y a déjà du texte, il faut le supprimer pour ne laisser que le signe =
.
Appuyer sur la touche F3
. Une deuxième fenêtre s'ouvre avec la liste des noms de plages précédemment enregistrés. Sélectionner la plage qui nous intéresse.
Maintenant, si la plage de cellules est modifiée (ajout ou suppression de données), la liste déroulante se mettra automatiquement à jour.
Les procédures sont évidement stockées dans le module ThisWorkbook du projet VBA, j'ai ici choisi d'utiliser mon classeur (.xlsb) de macros personnelles.
Sub resetmenu()
Application.CommandBars("cell").Reset
End Sub
'**********************************************************
Private Sub Workbook_Open()
resetmenu
'appel la macro qui effacera la commande du menu contextuel
'crée lors de la session précédente
Dim Cpop1 As CommandBarPopup
Dim Cbut As CommandBarButton
Dim MaBarre As CommandBar
Set MaBarre = Application.CommandBars("cell")
Set Cpop1 = MaBarre.Controls.Add(msoControlPopup)
'on ajoute le popup qui va comporté tout les boutons
With Cpop1
.Caption = "Modifier la casse" 'label du sous-menu
End With
'on ajoute un bouton au sous-menu contextuel
Set Cbut = Cpop1.Controls.Add(Type:=msoControlButton)
With Cbut
.FaceId = 403 ' bouton avec icône (référence à une table)
.Caption = "MAJUSCLE" ' label du bouton
.OnAction = "majuscule" 'appel de la macro associée
End With
'on répéte l'opération pour les deux autres boutons
Set Cbut = Cpop1.Controls.Add(Type:=msoControlButton)
With Cbut
.FaceId = 404
.Caption = "minuscule"
.OnAction = "minuscule"
End With
Set Cbut = Cpop1.Controls.Add(Type:=msoControlButton)
With Cbut
.FaceId = 306
.Caption = "Nom Propre"
.OnAction = "nompropre"
End With
End Sub
Les procédures sont stockées dans une feuille de module de code du projet VBA, du même classeur (.xlsb) de macros personnelles.
Dim Ch As Range
Sub majuscule()
For Each Ch In Selection
'Pour chaque cellule Ch de ma sélection Selection
'Selection permet de renvoyer l'objet sélectionné dans la fenêtre active
If Not Ch.HasFormula Then
'la propriété HasFormula de l'objet range permet de tester qu'aucune
' cellules de la plage ne contiennent de formule, dans ce cas la conversion est ignorée
Ch.Value = UCase(Ch.Value) 'Upper Case = MAJUSCULE
End If
Next Ch
End Sub
'*************************************************************
Sub minuscule()
For Each Ch In Selection
If Not Ch.HasFormula Then
Ch.Value = LCase(Ch.Value) 'Lower Case = minuscule
End If
Next Ch
End Sub
'*************************************************************
Sub nompropre()
For Each Ch In Selection
If Not Ch.HasFormula Then
Ch.Value = Application.Proper(Ch.Value)
'si une fonction Excel n'a pas d'équivalent en VBA
'utiliser le la fonction Excel (anglais) comme une méthode de l'objet application
End If
Next Ch
End Sub
Utiliser des tableurs (Excel, LibreOffice...) avec php.
En réponse à Yome au sujet du crack pour les mots de passe excel : j'ai une autre version qui fonctionne pas mal.
Voir ici
Il est possible de programmer en VBA sous OOCalc. Il suffit d'introduire préalablement l'instruction magique "Option VBASupport 1".
Pour alimenter une combobox avec les valeurs de plusieurs colonnes d'un tableau
Merci. C'est super puissant comme truc.
Ça va m'être utile je pense.
Merci Marc (http://www.ascadia.net/links/?MIKCkw)
"En gros, grâce à la puissance de VBA (ne rigolez pas, c'est ultra puissant), il a été capable d'appeler les API de Windows et donc celles utilisées par le Media Player pour lire, mettre en pause ou arrêter une vidéo (ou une playlist de vidéo) au sein d'Excel. Les formats vidéos supportés dépendent des codecs installés sur le système, mais les trucs basiques genre AVI, MPEG...etc sont lu à l'aise."
via Korben, via Idleman