NetForVBA: Thư viện .NET Framework dùng cho VBA

Liên hệ QC

thuanfun

Thành viên chính thức
Tham gia
7/2/09
Bài viết
83
Được thích
93
Giới tính
Nam
Chào các bác!

Em mới mày mò tìm ra cách sử dụng được các đối tượng .NET Framework trong lập trình VBA nên cho ra đời thư viện NetForVBA.
NetForVBA cung cấp cho code VBA một phương pháp để tận dụng sức mạnh của .NET Framework vào ứng dụng VBA của mình.
Các đối tượng được khai báo, xử lý giao diện, sự kiện, ... hoàn toàn bằng code VBA.

Hình dưới là Form có tên class là dnForm, so với VBA UserForm thì dnForm có nhiều điểm mạnh kế thừa từ .NET như có sẵn icon, các nút minimum, maximum, thay đổi kích thước bằng kéo chuột, … và dnForm có thể chứa tất cả các control thông thường của .NET , đặc biệt là ListView, DataGridView, DateTimePicker, MonthCalendar, ToolStrip, ContextMenuStrip, WebBrowser… thông qua các đối tượng dn*** tương ứng (dnListView, …).

Các bác tải về ở đây ạ! Download NetForVBA

Thư viện em mới phát triển nên chắc chắn còn nhiều thiếu sót, rất mong nhận được nhiều ý kiến góp ý của các bác.
Em xin cảm ơn!

PS: Em sẽ viết bài hướng dẫn code cụ thể dần dần phía dưới các bác nhé!

dnForm.png
 
Lần chỉnh sửa cuối:
Cài đặt NetForVBA

NetForVBA
yêu cầu hệ thống như sau:

  • Hệ điều hành Windows: WinXP, Win7, Win8, Win10, WinServer
  • Microsoft .NET Framework 4.0 (Tải về ở đây)
  • Microsoft Excel 2007 trở lên
Tải về: NetForVBA.zip và giải nén được thư mục như sau:

How%20to%20Install%20NetForVBA.png

(Thư mục cài đặt)


Để cài đặt, bạn click phải chuột vào file “Install (Run as administrator).bat” và chọn menu “Run as administrator“. Nếu hệ thống hỏi bạn có đồng ý chạy không thì bạn nhận nút Yes hoặc OK để chạy. Sau khi cài đặt thành công, cửa sổ thông báo hiện ra như hình dưới, trong đó có 2 dòng “successfully” => đã thành công.

How%20to%20Install%20NetForVBA-successfully.png

(successfully = thành công!)
Bài đã được tự động gộp:

Thêm thư viện NetForVBA vào code VBA của bạn

Tại cửa sổ code VBA (Alt+F11), bạn chọn menu Tools => References… như hình trên. Ở cửa sổ “References – VBAProject” bạn tick chọn .Net Framework for VBA và nhấn OK để thêm thư viện cho Workbook/file hiện tại của bạn.

How%20to%20Use%20NetForVBA.png

Sau khi Add reference như trên, nếu bạn gõ đoạn code “Dim app As New dn” mà nhìn thấy gợi ý các Class bắt đầu với chữ “dn…” (VD: dnApp, dnAppExcel, …) như hình dưới có nghĩa là bạn đã có thể dùng thư viện Net ForVBA trong code VBA của mình.

How%20to%20Use%20NetForVBA-2.png

(Gợi ý code nhìn thấy “dn***” là đã add thành công! )
 
Lần chỉnh sửa cuối:
Upvote 0
không biết có gì xuất sắc trong đó hay không nữa ????
Úp vậy keo mò mệt chết đó !!!
Úp cho cái Video quay hết nhưng thứ có thể xài trong cái DLL đó đi xem chút
 
Upvote 0
không biết có gì xuất sắc trong đó hay không nữa ????
Úp vậy keo mò mệt chết đó !!!
Úp cho cái Video quay hết nhưng thứ có thể xài trong cái DLL đó đi xem chút

Cảm ơn anh! Em sẽ chuyển dần san Video cho được nhiều nội dung.

Thư viện NetForVBA có thể nói là clone lại các đối tượng thường dùng của .NET Framework để dùng trong VBA, do đó nó mang tính "Framework".
Các điểm đặc biệt em sẽ giới thiệu dần anh Mạnh nhé! :D
 
Upvote 0
Thiết kế các control trên Form đều dùng code VBA hết phải không bạn? giống thiết kế web chứ không có kéo thả như Userform của Excel?
Tôi mới test thử mấy cái control datagridview, button...nhìn bắt mắt lắm.
 
Upvote 0
Clone chứ không phải Wrapper hả?

Bác dùng chuẩn thuật ngữ rồi đó! Em sợ dùng Wapper nhiều người không hiểu ngay nên dùng Clone cho quen :D
Bài đã được tự động gộp:

Thiết kế các control trên Form đều dùng code VBA hết phải không bạn? giống thiết kế web chứ không có kéo thả như Userform của Excel?
Tôi mới test thử mấy cái control datagridview, button...nhìn bắt mắt lắm.

Chuẩn bác! Phần kéo thả sau này em nghiên cứu tiếp :D
Bài đã được tự động gộp:

Hướng dẫn cơ bản về dnForm

dnForm
kế thừa từ Form (System.Windows.Forms.Form) trong .NET Framework.

dnForm.png

So với VBA UserForm thì dnForm có nhiều điểm mạnh kế thừa từ .NET như có sẵn icon, các nút minimum, maximum, thay đổi kích thước bằng kéo chuột, … và dnForm có thể chứa tất cả các control thông thường của .NET , đặc biệt là ListView, DataGridView, DateTimePicker, MonthCalendar, ToolStrip, ContextMenuStrip, WebBrowser… thông qua các đối tượng dn*** tương ứng (dnListView, …).

Để tạo mới một dnForm và hiển thị, trong VBE bạn code như sau:
Mã:
Dim frm As New dnForm
frm.Show

Thêm Button vào Form:
Mã:
frm.AddButton "btnOK", "OK", 100, 100 
frm.AddButton("btnCancel", "Cancel", 200, 100).DialogResult = dnDialogResult_Cancel

Với các Control cơ bản như Label, TextBox, Button, … thì các hàm Add đã được dựng sẵn tương ứng. Đối với các control khác bạn làm theo cách tổng quát theo ví dụ sau:
Mã:
'# add dnListView to dnForm 
Dim lv As New dnListView 
lv.View = dnListViewViews_Details 
lv.Gridlines = True 
lv.Columns.Add "colId", "Id", 50 
lv.Columns.Add "colName", "Name", 200 
lv.Columns.Add "colValue", "Value", 90 
frm.ControlAddAtRect lv, 8, 8, 300, 200 'Location:(8,8), Size:(300,200)


PS: em có đính kèm file Excel Demo về Form chứa ListView.
 

File đính kèm

  • ListView.xlsm
    20.6 KB · Đọc: 36
  • demo-listview-in-form.png
    demo-listview-in-form.png
    58.4 KB · Đọc: 48
Lần chỉnh sửa cuối:
Upvote 0
Gắn sự kiện của Form Control với Sub VBA

Để bắt được sự kiện của các Control trên Form và xử lý bằng code VBA bạn cần gắn sự kiện với sub/function VBA.

Trong NetForVBA cấu trúc đăng ký một Event của control như sau:

Mã:
control.regEvent_{eventName} ThisWorkbook, "macroName"

Trong đó {eventName} tùy theo control sẽ có giá trị khác nhau, macroName là tên sub/function macro sẽ nhận sự kiện.

Cấu trúc của sub/function nhận sự kiện phải có 2 parameters (dạng tổng quát là Object), ví dụ:

Mã:
Sub myControl_Click(sender As Object, e As Object)
   'do something
End Sub

Ví dụ về Timer:
Mã:
Sub Button1_Click()
    Dim timer As New dnTimer
    timer.Interval = 500 'ms
    timer.regEvent_Tick ThisWorkbook, "timer_Tick"
    timer.Start
End Sub
Sub timer_Tick(sender As Object, e As Object)
    ActiveCell.Value = app.Now.Millisecond
    If app.Now.Second = 0 Then sender.Stop ' sender is timer
End Sub
 
Upvote 0
macroName là tên sub/function macro sẽ nhận sự kiện
Nếu gọi được function thì có thể tạo được "hàm co giãn" không bạn?
Như ở chủ đề này:

Cấu trúc của sub/function nhận sự kiện phải có 2 parameters
Tại sao lại phải có 2 đối số? Không có hoặc có khác 2 được không bạn?
 
Upvote 0
Trước đây để viết hàm trả kết quả là mảng ta phải đau đầu tính toán, đếm số ô, Evlauate... rất phức tạp nhưng tới đây MS sẽ đơn giản hóa công thức mảng, không cần bấm CSE nữa, nếu UDF cứ đơn giản gán kết quả là mảng vẫn được.
 
Upvote 0
Nếu gọi được function thì có thể tạo được "hàm co giãn" không bạn?
Như ở chủ đề này:


Tại sao lại phải có 2 đối số? Không có hoặc có khác 2 được không bạn?

#1 Vụ hàm mảng thì em chưa tích hợp bác nhé
#2 Các Sub nhận Event từ Control được chuẩn hóa có 2 biến: biến thứ nhất sender chính là cái control có event, biến thứ hai e (EventArgs) chứa các tham số của sự kiện. VD: với sự kiện KeyDown thì e sẽ chứa các tham số như: nhấn phím gì? các phím Ctrl/Alt/Shift có nhấn không? ... Bác tham khảo KeyEventArgs ở đây.


PS: Đính kèm ví dụ bắt sự kiện KeyDown vào TextBox và chặn các phím không cần thiết. Cụ thể là chỉ cho nhập số vào TextBox.
 

File đính kèm

  • KeyDownEvent.xlsm
    17.6 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Khá hay, nếu mở ra hơn nữa thì sẽ có lợi ích cho nhiều người lập trình VBA không chuyên
 
Upvote 0
Untitled.png
Cái chi đây, giờ muốn gở ra làm sao ? ===\.
 
Upvote 0
ý mình hỏi giờ muốn gỡ ra luôn ý (Intal rồi giờ muốn Rmove thì seo)
 
Upvote 0
Người ta hay viết COM Delphi thì người ta khắc biết Register và UnRegister DLL .... có điều cứ giả vờ là sao ta ??!! :p :D
 
Upvote 0
Tính thử mà sao thấy thiên hạ sờ-ổ tờ-ây quá. Lạnh muón chết.

Nhắn với mấy vị muốn thử:

Mấy cái controls của đót nét chúng có hai phần:
- phần giao diện thìn quý vị chắc đã thấy rồi.
- phần kết nối với CSDL (đặc biệt là cái DataGridview, và mấy cái drill down combobox)
Muốn thử thì phải biết cách kết nối CSDL. Mấy cái OLE có hơi he-ri (xổ tây chơi)

Mấy cái tiện nghi (tools) của đót nét chúng có từ căn bản đến mấy cái lớp (class) đủ sức tranh với STL của C++
 
Lần chỉnh sửa cuối:
Upvote 0
Để trả về mảng thì
Người ta hay viết COM Delphi thì người ta khắc biết Register và UnRegister DLL .... có điều cứ giả vờ là sao ta ??!! :p :D
Theo mình nhớ không nhầm thì để đăng ký dll delphi thì dùng regsvr còn .NET thì dùng regasm. Hủy đăng ký thì thêm /u vào.
 
Upvote 0
Web KT
Back
Top Bottom