Saya seorang pemula VBA, dan saya mencoba menulis fungsi yang dapat saya panggil dari sel Excel, yang dapat membuka buku kerja yang' ditutup, mencari nilai sel, dan mengembalikannya.
Sejauh ini saya tahu cara menulis makro seperti ini:
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
Makro OpenWorkbook () berjalan dengan baik, tetapi ketika saya mencoba memanggil OpenWorkbookToPullData (...) langsung dari sel Excel, itu tidak berhasil. Pernyataan tersebut:
Set openWb = Workbooks.Open(path, , True)
tidak mengembalikan apa-apa.
Adakah yang tahu cara mengubahnya menjadi fungsi VBA yang berfungsi yang dapat dipanggil dari sel Excel?
Langkah-langkah yang harus diikuti:
Buka Editor Visual Basic. Di Excel, tekan Alt+F11 jika di Windows, Fn+Option+F11 jika di Mac.
Masukkan modul baru. Dari menu: Masukkan -> Modul (Jangan lewati ini!).
Buat sebuah fungsi Public
. Contoh:
Fungsi Publik findArea(ByVal lebar sebagai Double, _
ByVal tinggi sebagai Double) As Double
' Kembalikan area
findArea = lebar * tinggi
Akhiri Fungsi
Kemudian gunakan dalam sel apa pun seperti yang Anda lakukan pada fungsi lainnya: =findArea(B12,C12)
.
Masalah yang Anda temui adalah bahwa UDF
tidak dapat mengubah lingkungan Excel, mereka hanya dapat mengembalikan nilai ke sel pemanggilan.
Ada beberapa alternatif
Untuk contoh yang diberikan, Anda sebenarnya tidak memerlukan VBA. Rumus ini akan bekerja
='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2
Gunakan cara yang agak berantakan: Lihat jawaban ini
Anda bisa menggunakan ExecuteExcel4Macro
atau OLEDB
Fungsi tidak akan berfungsi, dan juga tidak diperlukan:
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