web-dev-qa-db-fra.com

Comment appeler la fonction VBA à partir de cellules Excel?

Je suis un débutant dans VBA et j'essaie d'écrire une fonction que je peux appeler à partir de cellules Excel, qui peut ouvrir un classeur fermé, rechercher une valeur de cellule et la renvoyer.

Jusqu'à présent, je sais comment écrire une macro comme celle-ci:

Sub OpenWorkbook()
    Dim path As String
    path = "C:\Users\UserName\Desktop\TestSample.xlsx"

    Dim currentWb As Workbook
    Set currentWb = ThisWorkbook


    currentWb.Sheets("Sheet1").Range("A1") = OpenWorkbookToPullData(path, "B2")
End Sub


Function OpenWorkbookToPullData(path, cell)

    Dim openWb As Workbook
    Set openWb = Workbooks.Open(path, , True)

    Dim openWs As Worksheet
    Set openWs = openWb.Sheets("Sheet1")

    OpenWorkbookToPullData = openWs.Range(cell)

    openWb.Close (False)

End Function

La macro OpenWorkbook () fonctionne parfaitement, mais lorsque j'essaie d'appeler OpenWorkbookToPullData (...) directement à partir d'une cellule Excel, cela ne fonctionne pas. La déclaration:

    Set openWb = Workbooks.Open(path, , True)

ne renvoie rien. 

Est-ce que quelqu'un sait comment en faire une fonction VBA fonctionnelle pouvant être appelée à partir d'une cellule Excel?

13
user780069

voici la réponse

Étapes à suivre:

  1. Ouvrez l'éditeur Visual Basic. Dans Excel, appuyez sur Alt+F11 si sous Windows, Fn+Option+F11 si sur un Mac.

  2. Insérer un nouveau module. Dans le menu: Insérer -> Module.

  3. Créez une fonction Public. Exemple:

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

28
FloatingRock

Le problème que vous avez rencontré est que UDFs ne peut pas modifier l'environnement Excel, ils peuvent uniquement renvoyer une valeur à la cellule appelante.

Il y a plusieurs alternatives

  1. Pour l'échantillon donné, vous n'avez pas réellement besoin de VBA. Cette formule fonctionnera
    ='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2 

  2. Utilisez un travail plutôt désordonné autour de: Voir cette réponse

  3. Vous pouvez utiliser ExecuteExcel4Macro ou OLEDB 

1
chris neilsen

Une fonction ne fonctionnera pas, ni n'est nécessaire:

Sub OpenWorkbook()
    Dim r1 As Range, r2 As Range, o As Workbook
    Set r1 = ThisWorkbook.Sheets("Sheet1").Range("A1")
    Set o = Workbooks.Open(Filename:="C:\TestFolder\ABC.xlsx")
    Set r2 = ActiveWorkbook.Sheets("Sheet1").Range("B2")
    [r1] = [r2]
    o.Close
End Sub
0
Gary's Student