[ 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,383
Được thích
19,367
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:
Hình như tác giả ko có ý muốn hướng dẫn nên mình làm 1 video đơn giản cho những ai thích có thể vọc python làm thư viện cho excel
1. code python:
Mã:
import pythoncom, sys, win32com.server.register, win32com.server.localserver, logging
class Controller(object):
    _reg_progid_ = "TestController.Application"
    _reg_verprogid_ = "TestController.Application.1"
    _reg_class_spec_ = __name__ + ".Controller"
    _reg_desc_ = "Python Test COM Server"
    # generate your own UID via uuid.uuid4() or pythoncom.CreateGuid()
    _reg_clsid_ = '{4E391C4B-9A49-4826-BAF0-F1AFAFD1FB19}' 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _public_methods_ = ['hello']
    def __init__(self):
        pass
    def hello(self, name):
        return f'Hello, {name}'
if __name__ == '__main__':
    print(__name__)
    print(sys.argv)
    try:
        if '--register' in sys.argv or '--unregister' in sys.argv:
            win32com.server.register.UseCommandLine(Controller)
        else:
            win32com.server.localserver.serve([ Controller._reg_clsid_ ])
    except:
        logging.exception('Oops!')
        input()
2. Code lấy clsID
Mã:
import pythoncom
print(pythoncom.CreateGuid())
video hướng dẫn:
Liên kết: https://youtu.be/wR6nQwtEWeE
 
Upvote 0
Ai chỉ giúp mình chổ có tài liệu hướng dẫn để mình có thể làm đc giống trên với
 
Upvote 0
E có đăng ký thành công nhưng khi gọi dữ liệu thì lại bị lỗi là giá phải chạy file exe một lần nữa
 
Upvote 0
Viết thẳng trên Python lấy 1 tháng máy tôi trung bình có 0.5s, lấy từ đâu năm tới giờ thì khoảng 3s, python nó lập trình đa luồng được, VBA hay delphi phải lập trình đa luồng mới so được với Python khi crawl data web, dùng VBA để gọi có thể chậm hơn týView attachment 267308View attachment 267307
Hay quá ạ ! Lâu rồi không thấy anh xuất hiện trên diễn đàn ạ!
Bài đã được tự động gộp:

Tôi đã nói chạy thẳng trên Python, tức là dùng trình biên dịch của Python (đang dùng extension jupyter trong vs code) thì nó đạt tốc độ như vậy, bạn muốn kiểm tra thì cài Python mà thử chứ tôi chế làm gì, còn nén thành exe nó chạy chậm hơn cũng không chừng

Bạn chạy thử dữ liệu 2 năm xem máy tôi mất khoảng 9s, chạy đơn luông mất 142s , multithread khi dùng để crawl lấy càng nhiều thì tốc độ nó mói rõ rệt so với chạy đơn luồngView attachment 267326View attachment 267325
Cảm ơn anh vì biết được code hay ạ !
 
Upvote 0
Web KT
Back
Top Bottom