[ Python và ứng dụng ] Lập trình thư viện cho VBA bằng Python

Liên hệ QC

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
14,381
Được thích
19,361
Mình đọc tiêu đề là đã thấy hấp dẫn rồi á. :)

Mình có tìm hiểu qua vụ này thì thấy có vẻ rất ít thông tin, có thể Python vốn là mã nguồn mở, hoặc có thể đã dùng Python rồi thì không mấy ai để ý tới VBA nữa.
Đã có một số chương trình tích hợp Python với Excel, VBA nhưng đều cần cài đặt Python mới chạy được.

Mình vọc một hồi (hồi khá lâu...) ra cách tạo thư viện cho VBA bằng Python mà không khi phân phối không cần cài đặt Python trên máy tính sử dụng thư viện.
Đại khái một số thông tin như thế này:
* Đầu tiên, được gọi là "thư viện" vì không cần cài đặt Python trên máy tính sử dụng chúng.
* Bảo mật: tương đương Windows DLL.
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
* Tốc độ: tùy vào khả năng viết code. Về cơ bản nó là Python mà.

Mình vọc hồi khá lâu vì vụ bảo mật kia. Hình như chưa có ai làm, hoặc không có gì đáng quan tâm, hoặc ai đó làm rồi mà họ không đăng lên internet nên mình chưa tìm thấy.

Mình làm một ví dụ, coi như động lực để bạn nào có hứng thú thì tự tìm hiểu nha. Tự khám phá ra mới hay mà.

Bài ví dụ: Lấy dữ liệu tỷ giá ngoại tệ từ trang web Vietcombank theo khoảng thời gian.
(Tiếp ví dụ ở bài https://www.giaiphapexcel.com/diendan/threads/lập-trình-trong-power-query-và-các-ví-dụ.157214/)

Chạy thử lấy dữ liệu 01 tháng trên máy tính của mình hết cỡ 1.8 giây.
Ai biết code Delphi thử làm bài ví dụ này xem ra sao nhỉ.

Các bạn tải file về nhớ đọc và làm theo hướng dẫn nhé. >> Tải File.

1633165995368.png
 
Lần chỉnh sửa cuối:
Nghe rất hấp dẫn anh. Mà chưa biết bắt đầu Python từ đâu anh ạ.
 
Upvote 0
Upvote 0
Mình đọc tiêu đề là đã thấy hấp dẫn rồi á. :)

Mình có tìm hiểu qua vụ này thì thấy có vẻ rất ít thông tin, có thể Python vốn là mã nguồn mở, hoặc có thể đã dùng Python rồi thì không mấy ai để ý tới VBA nữa.
Đã có một số chương trình tích hợp Python với Excel, VBA nhưng đều cần cài đặt Python mới chạy được.

Mình vọc một hồi (hồi khá lâu...) ra cách tạo thư viện cho VBA bằng Python mà không khi phân phối không cần cài đặt Python trên máy tính sử dụng thư viện.
Đại khái một số thông tin như thế này:
* Đầu tiên, được gọi là "thư viện" vì không cần cài đặt Python trên máy tính sử dụng chúng.
* Bảo mật: tương đương Windows DLL.
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
* Tốc độ: tùy vào khả năng viết code. Về cơ bản nó là Python mà.

Mình vọc hồi khá lâu vì vụ bảo mật kia. Hình như chưa có ai làm, hoặc không có gì đáng quan tâm, hoặc ai đó làm rồi mà họ không đăng lên internet nên mình chưa tìm thấy.

Mình làm một ví dụ, coi như động lực để bạn nào có hứng thú thì tự tìm hiểu nha. Tự khám phá ra mới hay mà.

Bài ví dụ: Lấy dữ liệu tỷ giá ngoại tệ từ trang web Vietcombank theo khoảng thời gian.
(Tiếp ví dụ ở bài https://www.giaiphapexcel.com/diendan/threads/lập-trình-trong-power-query-và-các-ví-dụ.157214/)

Chạy thử lấy dữ liệu 01 tháng trên máy tính của mình hết cỡ 1.8 giây.
Ai biết code Delphi thử làm bài ví dụ này xem ra sao nhỉ.

Các bạn tải file về nhớ đọc và làm theo hướng dẫn nhé. >> Tải File.

View attachment 267108
hay đó lách nó qua EXE mà lỗi trên Office 365 x64
 
Upvote 0
Mình là gà về Python, nhưng mình xem sơ qua nội dung bên trong file thì nó vẫn chạy thư viện của "python37.dll" cái này mở trình quản lý process sẽ thấy, và cái này chắc chắn là ko phải mã máy nhe bạn ( vì vẫn có thể dịch thành code python)
Bài đã được tự động gộp:

lỗi này chắc bạn chưa chạy file đăng kí, hoặc UAC máy đang cao.
 
Upvote 0
Mình là gà về Python, nhưng mình xem sơ qua nội dung bên trong file thì nó vẫn chạy thư viện của "python37.dll" cái này mở trình quản lý process sẽ thấy, và cái này chắc chắn là ko phải mã máy nhe bạn ( vì vẫn có thể dịch thành code python)
Bạn tìm hiểu kỹ, tìm hiểu thật đi. Hiện giờ còn chưa biết code của mình ở chỗ nào ấy. :)
Mà chắc chưa đọc kỹ bài #1 rồi.
 
Upvote 0
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
mình chỉ chú ý đoạn này thôi, mà giải nén cái exe của bạn nó ra 1 nùi file, người dùng ko cài python nhưng nó đã nén tất cả thư viện để chạy python vô đó.
1633229189412.png
 
Upvote 0
mình chỉ chú ý đoạn này thôi, mà giải nén cái exe của bạn nó ra 1 nùi file, người dùng ko cài python nhưng nó đã nén tất cả thư viện để chạy python vô đó.
Nùi hay cả núi phai cũng không làm sao cả.
Không phải mình vì muốn giấu code mà phải cài Delphi tốn gần chục GB dung lượng ổ đĩa, rồi lọ mọ cốt các kiểu mà vẫn lỗi tùm lum ấy.
Một hay nhiều phai không quan trọng, quan trọng là kỹ thuật và thực chiến ra sao.
Mình cứ thong thả tìm hiểu.
Từ từ rồi mình sẽ nêu kỹ thuật ở bài #1 sao nó lại có tốc độ kinh hoàng thế.
 
Upvote 0
Công bằng mà nói Thì Mạnh nói như sau

1/ Nhanh hay chậm do chính chúng ta code ... thuật toán code + cách xử lý nó

2/ cùng 1 vấn đề và thuật toán + cách xử lý như nhau thì C++ Or Delphi là nhanh nhất
chưa ai nói Python nhanh hơn c++ Or Delphi .. cả

3/ Ngay code trên Delphi nhiều người viết còn chạy chậm hơn cả VBA đấy ==> vấn đề đó tại sao = tại trình của mình chưa đạt nên viết trên Delphi mà chạy còn thua cả VBA đấy ( chính Mạnh đã từng bị thế ... sau này code khá hơn chút mới nhìn ra cái đó )

chúc mọi người bàn tán vui vẻ
 
Upvote 0
file bài số 1 code + cách xử lý hay đó ... nghiên cứu thêm chút cho office x64 là viết Public ok rồi
tốc độ rất nhanh là do chính ta code
 
Upvote 0
Hôm nay mình sẽ nêu kỹ thuật ở bài #1 nhé.

Đó là kỹ thuật tạo và đăng ký một COM Server của Python.
Trong VBA (hay ứng dụng khác đều gọi được) gọi COM Server kia lên, cần dùng chức năng gì của COM Server đó thì cứ truyền tham số (nếu có) và gọi lên thôi.
Và kết quả là ta có một ứng dụng Python chạy độc lập và trả về kết quả mong muốn, vì vậy không hề ngạc nhiên về tốc độ xử lý của nó.

Cách này có ưu điểm vượt trội:

- Toàn bộ xử lý của phần "thư viện" là Python làm việc. Trong VBA (hay ở ứng dụng nào đó) chỉ đơn giản là gửi lệnh đi và nhận kết quả mà thôi.
Nó không hề phải chịu cảnh 'dưới trướng' như cách gọi từ *.dll.

- Không liên quan, không phụ thuộc gì vào ứng dụng sử dụng thư viện là 32-64bit gì cả. Bản thân tập lệnh Python được xuất ra *.exe là chạy hoàn toàn độc lập. Kỹ thuật này chỉ đơn giản là tạo ra một cây cầu mà thôi.

Mình làm một ví dụ minh họa cho dễ hiểu. Khi gọi lệnh thì msgbox là của Python, và bên VBA vẫn lấy được kết quả.

>> Tải file ví dụ
 
Upvote 0
Hôm nay mình sẽ nêu kỹ thuật ở bài #1 nhé.

Đó là kỹ thuật tạo và đăng ký một COM Server của Python.
Trong VBA (hay ứng dụng khác đều gọi được) gọi COM Server kia lên, cần dùng chức năng gì của COM Server đó thì cứ truyền tham số (nếu có) và gọi lên thôi.
Và kết quả là ta có một ứng dụng Python chạy độc lập và trả về kết quả mong muốn, vì vậy không hề ngạc nhiên về tốc độ xử lý của nó.

Cách này có ưu điểm vượt trội:

- Toàn bộ xử lý của phần "thư viện" là Python làm việc. Trong VBA (hay ở ứng dụng nào đó) chỉ đơn giản là gửi lệnh đi và nhận kết quả mà thôi.
Nó không hề phải chịu cảnh 'dưới trướng' như cách gọi từ *.dll.

- Không liên quan, không phụ thuộc gì vào ứng dụng sử dụng thư viện là 32-64bit gì cả. Bản thân tập lệnh Python được xuất ra *.exe là chạy hoàn toàn độc lập. Kỹ thuật này chỉ đơn giản là tạo ra một cây cầu mà thôi.

Mình làm một ví dụ minh họa cho dễ hiểu. Khi gọi lệnh thì msgbox là của Python, và bên VBA vẫn lấy được kết quả.

>> Tải file ví dụ
Vẫn lỗi như cũ trên Office 365 x64

trên VB6 ActiveX EXE cũng đăng ký COM Server y trang thế

1633340923168.png
 
Upvote 0
Upvote 0
Upvote 0
Tôi đang chạy Windows 64 + Office 2016 64 bình thường. Khoái cái món này đây.
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom