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?
Étapes à suivre:
Ouvrez l'éditeur Visual Basic. Dans Excel, appuyez sur Alt+F11 si sous Windows, Fn+Option+F11 si sur un Mac.
Insérer un nouveau module. Dans le menu: Insérer -> Module.
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
Puis utilisez-le dans n'importe quelle cellule comme n'importe quelle autre fonction: =findArea(B12,C12)
.
Le problème que vous avez rencontré est que UDF
s ne peut pas modifier l'environnement Excel, ils peuvent uniquement renvoyer une valeur à la cellule appelante.
Il y a plusieurs alternatives
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
Utilisez un travail plutôt désordonné autour de: Voir cette réponse
Vous pouvez utiliser ExecuteExcel4Macro
ou OLEDB
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