Khi viết code em muốn sử dụng một số hàm có sẵn trong VBA (bình phương, căn bậc hai,giá trị tuyệt đối,..)thì cách thức gọi như thế nào các bác nhỉ. Để tham khảo tên các hàm sẵn có thì em cần xem ở đâu nhỉ. Xin cảm ơn và hậu tạ các bác
Sub UseFunction()
Dim myRange As Range
Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = [B][COLOR="Red"]Application.WorksheetFunction.[/COLOR][/B][COLOR="Yellow"][B]Min[/B][/COLOR](myRange)
MsgBox answer
End Sub
Bạn chú ý là dùng Application hay Application.WorksheetFunction ở trước tên hàm nhé.
Dưới đây tôi sẽ liệt kê những hàm dùng được.
List of Worksheet Functions Available to Visual Basic
A
Acos
Acosh
And
Asin
Asinh
Atan2
Atanh
AveDev
Average
Khi viết code em muốn sử dụng một số hàm có sẵn trong VBA (bình phương, căn bậc hai,giá trị tuyệt đối,..)thì cách thức gọi như thế nào các bác nhỉ. Để tham khảo tên các hàm sẵn có thì em cần xem ở đâu nhỉ. Xin cảm ơn và hậu tạ các bác
2. Nếu các tham số của của hàm Sumproduct có điều kiện thì không thể sử dụng theo cách trên được (Mình cũng ko rõ là tại sao nữa!).
- Lúc đó phải sử dụng thêm hàm Evaluate:
Mã:
[LEFT]Sub Tinhtoan()
Dim gtri
gtri = Evaluate("=SUMPRODUCT((A1:A11=""a"")*(B1:B11))")
MsgBox gtri
End Sub[/LEFT]
- hoặc:
Mã:
gtri = CDbl([SumProduct((A1:A11="a")*1,B1:B11)])
nhưng nếu vùng mà bác đã đặt tên rồi thì sử dụng như sau:
Mã:
gtri = CDbl([SumProduct((data1="a")*1,data2)])
Bác chú ý cái dấu [, ] nhé và data1 và data2 là Names nhưng lại không dùng Range("data1") như cách thông thường.
oh, có một số hàm cả VBA và Excel đều có (chẳng hạn như hàm sin ...)
Lúc đó ta sử dụng luôn hàm của VBA thôi ---> không cần Application.WorksheetFunction.
Có ngay đây!
Trong cửa sổ VBA, bác nhấn F2, chọn VBA trong combobox Project/Library.
VBA đã phân loại các hàm theo kiểu: Conversion, DateTime, FileSystem, Math, String.... Biểu tượng của hàm VBA là cái hình màu xanh trước tên hàm đó!
Một số hàm trong Worksheet có tên giống như trong hàm trong VBA nhưng chúng có thể làm việc khác nhau. Ví dụ như: Application.WorksheetFunction.Log và Log cho kết quả khác nhau như ở dưới đây (ô D2 có giá trị là 2).
Mã:
Sub Log_in_Excel()
Answer=Application.WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
MsgBox "Excel: Gia tri Log(" & Range("D2").Value & ") = " & Answer
End Sub
và
Mã:
Sub Log_in_VBA()
Dim myRange As Range
Set myRange = Worksheets("Sheet3").Range("D2")
MsgBox "VBA: Gia tri Log(" & myRange & ") =" & Log(myRange)
End Sub
Môi trường lập trình VBA trong Excel cho phép chúng ta sử dụng 2 thành phần đối tượng:
- Excel
- VB
Khi muốn dùng các thành phần đối tượng (các đối tượng, các thủ tục, hàm,...) của Excel ta khai báo Application.
Ví dụ
Dim fn as WorksheetFunction
Set fn = Application.WorksheetFunction
x = fn.HamExcel(DoiSo)
Các DoiSo dùng trong HamExcel tương như khi ta dùng lập công thức trên Sheet, riêng đối tượng là một tham chiếu thì trong VBA phải là Range
Trên sheet ta có công thức:
= Vlookup("KH001",DMKH,2,0)
Trong VBA phải là
x = fn.Vlookup("KH001",Application.Range("DMKH"),2,0)
Hoặc
x = fn.Vlookup("KH001",Range("DMKH"),2,0)
Cú pháp chuẩn khi muốn khai thác thành phần của Excel đối tượng đầu tiên (mẹ) là Application, tuy nhiên trong Excel biến này được đặt dạng GLOBAL nên không cần phải khai báo. Tất cả các ứng dụng trong Office đều như vậy.
Nếu các bạn lập trình từ một ngôn ngữ khác, ví dụ như VB6 thì phải làm thế này
Dim oApp as Object
Dim fn as Object
Set oApp = CreateObject(,"Excel.Application")' Application
'Nếu Excel đã đang chạy thì
'Set oApp = GetObject(,"Excel.Application")
'Trong VBA chính là Set oApp = Application
Set fn = oApp.WorksheetFunction
x = fn.Vlookup("KH001",oApp.Range("DMKH"),2,0)
Nếu chúng ta không khai báo oApp thì VB sẽ không hiểu gì cả
Thành phần thứ 2 chúng ta có thể khai thác là VB. VB cung cấp các đối tượng, các hàm và thủ tục.
Để nhận các đối tượng, các hàm, các thủ tục ta chỉ cần khai báo VBA.
Thường thì ta không khai báo đối tượng này vì Excel đã nhận nó là một biến GLOBAL.
Ví dụ format màu nền của ô (Cell) hiện thời
Sub Test1()
Application.ActiveCell.Interior.Color = VBA.ColorConstants.vbBlue
End Sub
Sub Test2()
ActiveCell.Interior.Color = vbBlue
End Sub
Test1 và Test2 đều cho kết quả như nhau, chỉ khác là Test2 không cần phải khai báo đối tượng kiểu GLOBAL sẽ ngắn gọn hơn.
Khi bạn soạn thảo thì lưu ý cách làm nhanh. Cứ sau dấu chấm (.) bạn sẽ có một danh sách để chọn rồi. Nếu không hiện danh sách thì nhấn CTRL+Space bar.
Để tìm hiểu cách sử dụng các thành phần trong VB. Trong môi trường VBE, nhấn F1 để nhận help.
Mặc dù ta hiểu trong VBA ta có thể nhận các hàm của Excel theo cách làm trên nhưng không phải hàm nào cũng có, ví dụ như hàm MOD không có trong VBA.
Hàm MOD cho ta phần lẻ của phép chia
=MOD(2,7) kết quả là 2 (2 chia cho 7 thì sẽ dư 2)
=IF(MOD(YEAR(TODAY()),4)=0,"Năm nhuận","Không nhuận")
Với hàm MOD trong VBA ta phải tự viết thôi. Gửi các bạn hàm tôi viết đơn giản.
Mã:
Function VBA_MOD(ByVal Tuso, ByVal Mauso)
x = Tuso / Mauso
VBA_MOD = (x - Int(x)) * Mauso
End Function