Voir aussi
WorksheetFunction ou Application.WorksheetFunction ?
Peut-on se contenter d'écrire WorksheetFunction au lieu de Application.WorksheetFunction ?
L'une et l'autre syntaxe sont correctes. L'avantage d'écrire "Application"
c'est que si la case "Complément automatique des instructions" est cochée,
sous "Outils" "Options", onglet "Editeur", la liste des objets, des
propriétés et méthodes disponibles avec Application s'affiche
automatiquement. En la sélectionnant ainsi on évite les fautes de frappe.

Dans l'aide, sous Application, on peut lire :

"Remarque

La plupart des propriétés et méthodes renvoyant les objets interface
utilisateur les plus courants tels que la cellule active (propriété
ActiveCell) peuvent être utilisées sans le qualificateur d'objet
Application. Par exemple, au lieu d'écrire Application.ActiveCell.Font.Bold
= True, vous pouvez écrire ActiveCell.Font.Bold = True."

On peut même se contenter d'écrire
Application.
On y perd les propositions de la complétion automatique de code mais on y gagne
en fiabilité pour certaines fonctions (notamment avec Excel 97 où, d'après ce
que j'ai pu lire sur le groupe us, l'objet WorksheetFunction n'était pas exempt
de petits bogues). Il y a eu des discussions à ce sujet ici aussi.
On peut de plus accéder à certaines fonctions avec la syntaxe
VBA.Math.
La complétion de code fonctionne avec cette syntaxe, ce qui permet de voir les
fonctions disponibles.

On peut même ajouter qu'outre les bugs éventuels l'écriture
Application.nom_de_la_fonction ne renvoie pas forcément la même chose
qu'Application.WorksheetFunction.nom_de_la_fonction parce qu'on ne fait pas
référence à la même fonction (respectivement VBA et Excel) !

Par exemple dans l'aide en ligne Excel, sous "Utilisation des fonctions de
feuille de calcul Microsoft Excel dans Visual Basic", on y lit :

Remarque Les fonctions Visual Basic n'utilisent pas le qualificateur
WorksheetFunction. Une fonction Visual Basic peut avoir le même nom qu'une
fonction Microsoft Excel tout en fonctionnant différemment. Par exemple,
Application.WorksheetFunction.Log et Log renvoient des valeurs différentes.

Pour reprendre cet exemple, la fonction log VBA renvoie le logarithme d'un
nombre de la base spécifiée.

Application.WorksheetFunction.Log(10) renvoie 1.

par contre :

Log(10) ou VBA.Math.Log(10) renvoie 2.302...

Raison :

La première écriture renvoie le logarithme d'un nombre de la base spécifiée.
(Sous-entendu 10, si pas spécifié).

La deuxième par contre renvoie une valeur indiquant le logarithme népérien
d'un nombre. Pour aboutir au même nombre, il faudra écrire :

Static Function Log10(X)
Log10 = Log(X) / Log(10#)
End Function

Ou tout simplement utiliser Log10(10).

L'équivalent, donc, de Application.WorksheetFunction.Log(10) n'est pas
Log(10) ou VBA.Math.Log(10), mais est Log10(10) (VBA.Math.Log10(10) n'existe
pas). (Par contre, Application.WorksheetFunction.Log10(10) existe. Bon,
j'arrête).

(Toujours tiré de l'aide).

Donc une seule solution, lire attentivement l'aide et tester. (En fin de
compte utiliser la fonction que l'on a l'habitude d'utiliser si celle-ci
renvoie le résultat attendu et correct).
Frédéric Sigonneau, Claude Mani,
Ajouté ou modifié le 06/08/2004 (N°1470)
Traduction rapide d'une fonction en VBA
Comment trouver rapidement la traduction d'une formule en anglais pour l'utiliser dans VBA ?
Clique sur un onglet avec le bouton droit (Controle + clic sur Mac) et insère
une "Macro intl MS Excel 4.0".

Cela correspond aux macros internationales avec l'ancien langage, qui sont
en anglais.

Entre dans une cellule d'une feuille normale une formule quelconque, puis
fais un copier coller vers la feuille macro internationale. La formule y est
traduite en anglais.
Michel Gaboly,
Ajouté ou modifié le 06/08/2004 (N°1465)
Affecter une fonction personnalisée à une catégorie
Comment fait-on pour qu'une fonction personnalisée soit disponible à chaque ouverture d'Excel et apparaisse dans une catégorie personnalisé ?
Si tu veux ajouter ta fonction dans la catégorie "Finance", il suffit d'écrire:
Application.MacroOptions Macro:="MaFonction", Category:=1
La liste des catégories est la suivante :

0 No category (appears only in All)
1 Financial
2 Date & Time
3 Math & Trig
4 Statistical
5 Lookup & Reference
6 Database
7 Text
8 Logical
9 Information
10 Commands (cette catégorie est normalement cachée)
11 Customizing (cette catégorie est normalement cachée)
12 Macro Control (cette catégorie est normalement cachée)
13 DDE/External (cette catégorie est normalement cachée)
14 User Defined (par défaut)
15 Engineering (cette catégorie n'est disponible que si l'utilitaire d'analyse est
installé)

tu peux mettre la fonction soit dans le perso ou l'enregistrer dans un xla.

Pour une fonction qui s'insère dans une catégorie vraiment perso, utilise funcustomize
que tu peux télécharger
ici
. Elle permet de créer ses propres catégories, mais aussi d'ajouter des textes
d'aide aux
arguments des fonctions.
Laurent Longre,
Ajouté ou modifié le 02/05/2004 (N°1375)
Unir les valeurs contenues dans deux cellules
J'utilise souvent l'opérateur d'intersection. Quand je mets =toto tata, il me donne le chiffre à l'intersection. je voudrais maintenant écrire toto dans A1 et tata dans A2 et faire une formule ailleurs qui irait chercher le contenu de A1 et de A2 donc, j'essaie =a1 a2, pensant que lui va faire =toto tata, mais il essaie de faire l'intersection de A1 et A2, et non pas l'intersection des noms à l'intérieur...
A priori, pas d'autre solution que par VBA :

Function INTERS(P1 As String, P2 As String) As Range

Application.Volatile
Set INTERS = Intersect(Range(P1), Range(P2))
End Function

Et dans la feuille : =INTERS(A1;A2)
Laurent Longre, (N°761)
Evaluation d'expression
J'ai dans une cellule (disons A1) une formule écrite sous forme de texte, par exemple : 1.2*3.5*4.5 je voudrais, dans une autre cellule (disons B1) mettre une formule qui soit tout simplement équivalente à = 1.2*3.5*4.5
Function EVAL(Expression As String)
EVAL = Evaluate(Expression)
End Function

Et dans la feuille de calcul : =EVAL(A1)
Laurent Longre, (N°760)
[toto] ou evaluate(range("toto").value) ?
La variable Toto est affectée à une cellule La commande Range("Toto") ou Range("Toto").value envoi une erreur 1004 de façon aléatoire ce qui oblige à la remplacer par l'équivalent interprété[Toto] L'inverse est aussi assez fréquent. Connaissez vous une raison possible à ce "bug" ?
La syntaxe [Toto] équivaut à (si j'ai bien appris les leçons de Laurent)
Evaluate(Range("Toto").Value)
Va voir là si ça peut t'aiguiller
http://longre.free.fr/pages/prog/accvba.php#Evaluate ?

Il y a aussi une autre piste éventuelle à piocher, qui me semble du même
tonneau que ton problème : l'omission de .value n'est pas tolérée partout
tout le temps, je ne sais pas pourquoi.
Catherine et Sainte Zaza, (N°759)
Traduction des fonctions de l'utilitaire d'analyse
J'utilise sur une version d'excel en français une des fonctions de l'utitaire d'analyse : hex2dec. Ce classeur ne fonctionne pas sur un classeur en français.
Les fonctions de l'utilitaire d'analyse, contrairement aux
fonctions de base d'excel ne sont pas traduites automatiquement.
Tu as deux solutions pour cela :
1) traduire les fonctions. Tu trouveras des classeurs de traduction
sur excelabo.
2) utiliser une fonction qui te renvoie le code du pays (1 pour
l'anglais, 33 pour le français) et en fonction du résultat appeller
ta fonction. L'avantage de cette méthode est qu'elle te permet de ne
maintenir qu'une seule version de ton classeur ce qui est plus simple
pour les mises à jour.

Public Function CountryCode() As Long
Static TheCC As Long
If TheCC = 0 Then
TheCC = Application.International(xlCountryCode)
End If
CountryCode = TheCC
End Function

Ensuite appelle ta fonction :
=SI(CountryCode()=33, hexdec(A1) , hex2dec(A1) )

Une variation de cette solution :
Tu définis (insertion/nom/définir) dans ton classeur le nom "mylanguage"
et tu lui attribues la valeur 33 pour le classeur en français

Tu appelles ensuite tes fonctions de la façon suivante :

=SI(MyLanguage=33, hexdec(A1) , hex2dec(A1) )

Quand tu distribues le classeur à des anglais, tu changes juste la valeur
de Mylanguage pour 1. Tu peux gérer ce changement par une macro dans le
Workbook_Open.
Daniel Maher,
Ajouté ou modifié le 25/10/2003 (N°758)
Ma fonction dans la liste des fonctions d'excel
Comment faire apparaître une fonction personnalisée que j'ai créée dans le menu des fonctions d'excel ?
La procédure ci-dessous (reprise d'un code de LL sur un sujet voisin) te permet
de récupérer dans une feuille ajoutée au classeur actif les noms et index des
catégories de fonctions de ta version d'Excel. Tu peux ensuite les utiliser pour
"inscrire" une fonction de ton cru dans la catégorie de ton choix. Par exemple,
pour inscrire une fonction dans la catégorie "texte" :

Function MaFonction()
MaFonction = "coucou"
End Function

Sub InscrireMaFonction()
'exécuter une fois suffit
Application.MacroOptions Macro:="MaFonction", Category:=7
End Sub

Pour la supprimer de la liste des fonctions de la catégorie (ici "texte"), il
suffit de supprimer la fonction (MaFonction), de fermer puis réouvrir Excel.
Les fonctions sont rangées par ordre alphabétique. Pour que la tienne soit en
tête de liste, il suffit que tu l'appelles aMaFonction ou aaMaFonction...


'============dans un module standard
Sub RecupCategoriesFonctions()
'récupérer liste et index des catégories de fonctions d'Excel
'd'après Laurent Longre
Sheets.Add
LCat = 0
Do
LCat = LCat + 1
Application.ExecuteExcel4Macro _
"DEFINE.NAME(""Djzh" & LCat & """,0,2,,," & LCat & ")"
cat = Names("Djzh" & LCat).Category
Cells(LCat, 1).Value = cat & "(" & LCat & ")"
Loop While cat <> "User Defined" And cat <> NomCat

For I = 1 To LCat
Application.ExecuteExcel4Macro "DELETE.NAME(""Djzh" & I & """)"
Next I
End Sub
Frédéric Sigonneau, (N°757)
Comment connaître le nom anglais des fonctions ?
L'aide VBA sur les fonctions de feuille de calcul est curieusement documentée : il faut connaître le nom anglais de la fonction pour avoir accès à l'aide en français : la liste alphabétique est établie sur les noms anglais...
D'où l'intérêt de cette petite fonction qui donne par défaut
le nom anglais de la fonction feuille de calcul :

Usage :
= LireFormule(A1)

Function LireFormule(RéférenceCellule As Range, Optional LangageLocal As
Boolean) As String
'Adapté par Patrick Penet d'après Modeste GeeDee sur MPFE
If LangageLocal = True Then
If RéférenceCellule.HasArray Then
LireFormule = "{" & RéférenceCellule.FormulaLocal & "}"
Else
LireFormule = " " & RéférenceCellule.FormulaLocal
End If
Else
If RéférenceCellule.HasArray Then
LireFormule = "{" & RéférenceCellule.Formula & "}"
Else
LireFormule = " " & RéférenceCellule.Formula
End If
End If
End Function
Patrick Penet, (N°756)
Liste et traduction des fonctions VBA
Où trouver la liste des fonctions de VBA avec leur traduction ?
Les fichier Listevba.xls pour Excel97 ou Vbalist.xls pour Excel200,
installés par excel sur ton disque dur ont 3 onglets :
- Mots clés VisualBasic
- Fonction macro MSExcel 4.0
- Fonctions de feuille de calcul
Pour ceux qui n'auraient pas ce fichier, vous pouvez le télécharger ici..
Microsoft, (N°754)