web-dev-qa-db-fra.com

Comment appeler la fonction VBA à partir de cellules Excel (2010)?

J'ai défini quelques fonctions dans un classeur à l'aide de VBA, et je m'attendais ensuite à pouvoir les utiliser dans une formule de cellule, mais Excel ne reconnaît pas la fonction. Je viens d'avoir #NAME?

A tenté:

  • Réalisant que j'avais créé un fichier XSLX, je l'ai converti en un fichier XSLM. N'a pas fonctionné.
  • Suppression de tous les types de la déclaration de fonction. N'a pas fonctionné.
  • Déplacé la fonction dans le module VBA de la feuille de calcul. N'a pas fonctionné.
  • Public ajouté à la déclaration. N'a pas fonctionné.

Qu'est-ce que je rate?

Ce n'est pas un code intelligent, non plus:

Function Square2(AnyNumber)

'return the square of any integer
Square2 = AnyNumber * AnyNumber

End Function
27
Mark Bertenshaw

Réponse

Placer la fonction dans la zone "ThisWorkbook" peut provoquer le problème #NAME?. Créez un nouveau module (clic droit sur le dossier VBAProject, Insert, New Module)

Pas

  1. Ouvrez l'éditeur VBA (Alt + F11 sous Windows/Fn + Option + F11 sur un Mac)
  2. Cliquez avec le bouton droit sur VBAProject
  3. Sélectionnez Insérer >> Module
  4. Créez une fonction Public dans Module1, par exemple:

    Public Function findArea(ByVal width as Double, _
                             ByVal height as Double) As Double
        ' Return the area
        findArea = width * height
    End Function
    
  5. Appelez-le depuis une cellule, comme n'importe quelle autre fonction: =findArea(B12,C12)

 Macro Screenshot

40
Adahus

J'ai rencontré le même problème, après avoir lutté pour suivre, qui a fonctionné pour moi:

Ma fonction était à l'intérieur d'un module de classeur de macros appelé Personal.XLSB. J'ai préfixé le nom de la fonction avec le nom de fichier du classeur de macros personnelles et!, Ainsi, si le nom de la fonction est la fonction (x, y), j'ai entré dans la cellule "= PERSONAL.XLSB! LaFonction (x, y).

Veuillez noter que PERSONAL.XLSB est toujours ouvert en mode caché pour moi.

5
Uttam

J'ai eu un problème identique, y compris une fonction qui a ensuite cessé de fonctionner, donnant une erreur #NAME. J'ai réussi à corriger les deux en m'assurant que le nom du module n'est pas le même que le nom de la fonction. J'avais une fonction de travail F_1 dans Module1, j'ai changé le nom du module en F_1 et cela a cessé de fonctionner; je suis maintenant revenu dans Module1 et la fonction est à nouveau opérationnelle. Ma deuxième fonction a également commencé à fonctionner lorsque j'ai changé le nom du module de F_2 à Module2.

4
Ross Hunter

Assurez-vous que vous n'êtes pas en mode conception. 

Il existe un bouton en mode Création dans l'onglet Développeur dans Excel et à côté des boutons Exécuter/Arrêter dans l'éditeur VBA. S'il est sélectionné et ne vous permet pas de le désélectionner, essayez de rouvrir le classeur avec les macros activées.

S'il est toujours activé ou ne laisse pas les macros s'exécuter, assurez-vous que les macros sont activées 

Activer les macros. 

- https://stackoverflow.com/a/20659823/258482

4
Arlen Beiler

Je pense qu'il pourrait y avoir un problème si votre module porte le même nom que votre fonction. Essayez de renommer votre module ou votre fonction.

1
Gustavo

Les fichiers XLSX et XLSM n’ont rien à voir avec cela. Le format joue le rôle lorsque vous enregistrez le fichier. (Dans XLSX, le code VBA sera supprimé lors de l'enregistrement du fichier).

Le code ci-dessous de http://office.Microsoft.com/en-us/Excel-help/creating-custom-functions-HA001111701.aspx fonctionne assez bien dans un nouveau module dans Excel.

Function Discount(quantity, price)
    If quantity >= 100 Then
        Discount = quantity * price * 0.1
    Else
        Discount = 0
    End If
    Discount = Application.Round(Discount, 2)
End Function

Étant donné que je ne peux pas voir votre code, pouvez-vous essayer si la fonction ci-dessous fonctionne pour vous aussi? Si tel est le cas, commencez à modifier la fonction ci-dessous afin qu'elle devienne votre fonction (par exemple, modifiez d'abord le nom et vérifiez si cela fonctionne, puis modifiez le nombre de paramètres et vérifiez si cela fonctionne, puis modifiez le nom des paramètres).

1
Niraj Nawanit

J'ai ouvert Excel, ouvert l'éditeur de code (Alt + F11), sélectionné le nouveau classeur, inséré un nouveau module, saisi

Function Decrement(i As Integer) As Integer
  Decrement = i - 1
End Function

puis retourné à mon classeur et en A1 tapé = Decrement (2) et appuyez sur Entrée, et cela a fonctionné. Decrement est apparu dans la liste déroulante des fonctions car j'ai tapé = Decr ... Il a été reconnu et a fonctionné. Je n'ai même pas eu à sauvegarder le classeur.

Je sais que ce n'est pas exactement une réponse à votre question, mais c'est la recette avec laquelle j'ai eu de la chance.

1
Jeff Maner

Activer les macros. 

0
SunnyRed

Si vous utilisez les dernières versions d'Excel, pour afficher les fonctions VBA dans un autre classeur, vous devez:

  1. Enregistrez vos classeurs au format .xlsm 
  2. Activer les macros comme suggéré ci-dessus
  3. Définir une référence. Dans VBA (Alt-F11), choisissez Outils/Références, puis naviguez jusqu'au classeur contenant la macro que vous souhaitez utiliser. Vérifiez cette référence dans la liste.

    Si vous obtenez un message d'erreur concernant le conflit des noms de modules, renommez-le d'abord dans l'explorateur de projet. 

0
PhilCoder