Lập trình Excel có thể dùng ngôn ngữ lập trình nào? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

Tuanba1992

Thành viên mới
Tham gia
8/12/15
Bài viết
45
Được thích
42
1.Visual Basic : VBA viết luôn không cần cài gì nhưng thiếu thư viện, phải viết nhiều
2.C#, Vb.net, F
3.Python
4.Delphi, C++, Go, Rust....
Mọi người còn biết ngôn ngữ nào lập trình cho excel?
Nên chọn cái nào để tối ưu?
 
Dưới đây là danh sách các ngôn ngữ lập trình có thể được sử dụng để tạo add-in và lập trình cho Excel, bao gồm cả việc phát triển add-in (như Office Add-ins hoặc COM Add-ins) và các tác vụ lập trình chung để tự động hóa, xử lý dữ liệu, hoặc tích hợp với Excel. Tôi sẽ chia rõ hai mục đích này để bạn dễ hiểu:

1. Ngôn ngữ lập trình để tạo Add-in cho Excel
Add-in là các tiện ích mở rộng (extensions) được tích hợp vào Excel để thêm chức năng tùy chỉnh. Các ngôn ngữ phổ biến bao gồm:

- JavaScript/TypeScript (với Office.js):

Mô tả: Sử dụng để phát triển Office Add-ins (Web Add-ins) cho Excel, chạy trên Excel Online, Excel desktop (Windows/Mac), và các nền tảng khác. Office.js là API chính thức của Microsoft.
Ứng dụng: Tạo giao diện web, tích hợp API bên ngoài, hoặc thêm chức năng như biểu đồ tùy chỉnh, xử lý dữ liệu thời gian thực.
Ưu điểm:

Đa nền tảng (Excel Online, Windows, Mac).
Tích hợp với công nghệ web (HTML, CSS, React, Angular, Vue.js).
Dễ dàng phân phối qua Microsoft AppSource.


Nhược điểm:

Hạn chế khi truy cập sâu vào một số tính năng cục bộ của Excel.
Yêu cầu kiến thức phát triển web.


Công cụ: Visual Studio Code, Yeoman generator, Node.js.
Ví dụ: Add-in lấy dữ liệu từ API thời tiết và hiển thị trong Excel.


- C# (với VSTO - Visual Studio Tools for Office):

Mô tả: Dùng để tạo COM Add-ins hoặc VSTO Add-ins, chủ yếu cho Excel desktop trên Windows.
Ứng dụng: Phát triển add-in doanh nghiệp phức tạp, tích hợp với cơ sở dữ liệu hoặc hệ thống nội bộ.
Ưu điểm:

Hiệu suất cao, phù hợp cho ứng dụng lớn.
Tạo giao diện phức tạp với Windows Forms hoặc WPF.


Nhược điểm:

Chỉ hoạt động trên Windows, không hỗ trợ Excel Online hoặc Mac.
Yêu cầu cài đặt VSTO và kiến thức .NET.


Công cụ: Visual Studio.
Ví dụ: Add-in đồng bộ dữ liệu Excel với SQL Server.


- VBA (Visual Basic for Applications):

Mô tả: Có thể dùng để tạo COM Add-ins hoặc macro tùy chỉnh, nhưng không phải add-in web hiện đại. Thường dùng cho các giải pháp nội bộ.
Ứng dụng: Tự động hóa tác vụ, tạo giao diện đơn giản trong Excel.
Ưu điểm:

Tích hợp sẵn trong Excel, dễ sử dụng cho người mới.
Phù hợp cho các add-in đơn giản.


Nhược điểm:

Chỉ hoạt động trên Excel desktop, không hỗ trợ Excel Online.
Hạn chế về bảo mật và phân phối.


Công cụ: VBA Editor trong Excel.
Ví dụ: Macro tự động định dạng bảng tính.


- C++:

Mô tả: Dùng để tạo COM Add-ins, nhưng hiếm khi được sử dụng do độ phức tạp cao.
Ứng dụng: Add-in hiệu suất cao hoặc tích hợp với hệ thống cũ.
Ưu điểm: Hiệu suất vượt trội, tùy chỉnh sâu.
Nhược điểm:

Phức tạp, khó phát triển và bảo trì.
Chỉ hỗ trợ Windows, không hoạt động trên Excel Online.


Công cụ: Visual Studio.
Ví dụ: Add-in xử lý dữ liệu lớn trong môi trường doanh nghiệp.




2. Ngôn ngữ lập trình để làm việc với Excel (ngoài Add-in)
Ngoài việc tạo add-in, các ngôn ngữ sau đây có thể được sử dụng để lập trình và tự động hóa các tác vụ trong Excel (như đọc/ghi tệp, phân tích dữ liệu, hoặc tích hợp với hệ thống khác):

- VBA (Visual Basic for Applications):

Mô tả: Ngôn ngữ tích hợp sẵn trong Excel, dùng để tạo macro và tự động hóa tác vụ.
Ứng dụng: Xử lý dữ liệu, tạo báo cáo, tự động hóa quy trình lặp lại.
Ưu điểm: Dễ học, tích hợp chặt chẽ với Excel.
Nhược điểm: Hạn chế với dữ liệu lớn, không hỗ trợ Excel Online.
Ví dụ: Macro tự động lọc dữ liệu theo điều kiện.


- Python:

Mô tả: Sử dụng các thư viện như openpyxl, pandas, xlwings, hoặc pywin32 để làm việc với tệp Excel.
Ứng dụng: Phân tích dữ liệu lớn, tự động hóa xử lý tệp Excel, tích hợp với các công cụ khác.
Ưu điểm:

Mạnh mẽ, linh hoạt, hỗ trợ phân tích dữ liệu phức tạp.
Có thể xử lý dữ liệu lớn và tích hợp với machine learning.


Nhược điểm: Cần cài đặt môi trường Python và thư viện.
Ví dụ: Dùng pandas để phân tích và tổng hợp dữ liệu từ nhiều tệp Excel.


- R:

Mô tả: Dùng với các gói như readxl hoặc xlsx để đọc/ghi tệp Excel.
Ứng dụng: Phân tích thống kê, trực quan hóa dữ liệu, xử lý tệp Excel.
Ưu điểm: Mạnh về thống kê và biểu đồ.
Nhược điểm: Ít phổ biến hơn Python cho các tác vụ chung.
Ví dụ: Tạo biểu đồ thống kê từ dữ liệu Excel.


- Java:

Mô tả: Sử dụng thư viện Apache POI để đọc/ghi tệp Excel (.xlsx, .xls).
Ứng dụng: Xử lý tệp Excel trong các ứng dụng doanh nghiệp lớn.
Ưu điểm: Độc lập nền tảng, phù hợp cho dự án lớn.
Nhược điểm: Phức tạp hơn Python hoặc VBA.
Ví dụ: Tự động tạo báo cáo Excel từ hệ thống Java.


- Power Query (M):

Mô tả: Ngôn ngữ truy vấn dữ liệu tích hợp trong Excel, không phải ngôn ngữ lập trình truyền thống nhưng mạnh mẽ cho tự động hóa.
Ứng dụng: Nhập, chuyển đổi, và mô hình hóa dữ liệu từ nhiều nguồn.
Ưu điểm: Thân thiện với người dùng không chuyên, không cần mã hóa phức tạp.
Nhược điểm: Hạn chế trong các tác vụ lập trình phức tạp.
Ví dụ: Tự động nhập dữ liệu từ CSV vào Excel và làm sạch dữ liệu.




So sánh và khuyến nghị

Tạo Add-in:

JavaScript/TypeScript (Office.js): Lựa chọn tốt nhất cho add-in hiện đại, đa nền tảng, và phân phối thương mại (qua Microsoft AppSource). Phù hợp cho Excel Online và desktop.
C# (VSTO): Tốt cho add-in doanh nghiệp phức tạp, nhưng chỉ chạy trên Windows.
VBA: Chỉ nên dùng cho các giải pháp nội bộ đơn giản, không khuyến khích cho add-in phân phối rộng.
C++: Chỉ dùng cho các trường hợp đặc biệt cần hiệu suất cao.


Lập trình cho Excel (tự động hóa, xử lý dữ liệu):

VBA: Phù hợp cho các tác vụ đơn giản, tích hợp sẵn trong Excel.
Python: Lựa chọn mạnh mẽ cho phân tích dữ liệu lớn, tích hợp với các công cụ hiện đại.
Power Query (M): Lý tưởng cho người không chuyên, tập trung vào xử lý dữ liệu.
R và Java: Phù hợp cho các ứng dụng chuyên biệt (thống kê hoặc hệ thống lớn).




Hướng dẫn thêm

Nếu bạn muốn phát triển add-in đa nền tảng, hãy bắt đầu với JavaScript/TypeScript và tham khảo tài liệu Office.js tại: https://learn.microsoft.com/en-us/office/dev/add-ins/.
Nếu bạn cần tự động hóa đơn giản, dùng VBA hoặc Power Query.
Nếu bạn làm việc với dữ liệu lớn hoặc tích hợp với hệ thống khác, hãy chọn Python.
Nếu bạn có nhu cầu cụ thể (ví dụ: mẫu code, hướng dẫn chi tiết, hoặc loại add-in cụ thể), hãy cho mình biết để mình hỗ trợ thêm!
 
Lần chỉnh sửa cuối:
1.Visual Basic : VBA viết luôn không cần cài gì nhưng thiếu thư viện, phải viết nhiều
2.C#, Vb.net, F
3.Python
4.Delphi, C++, Go, Rust....
Mọi người còn biết ngôn ngữ nào lập trình cho excel?
Nên chọn cái nào để tối ưu?
C++ cho những ai muốn tự tay làm tất tần tật từ đầu đến cuối mà không có tâm lý chờ ăn sẵn từ một số ngôn ngữ lập trình khác như ngôn ngữ nền .NET, Delphi hay Python. Để lập trình một COM add-in chạy được trên Excel bằng C++ phải vận dụng hết cỡ kiến thức từ COM cho đến Win32 API, thứ mà ngay cả mấy chuyên gia trong GPE còn ú ớ ậm ực sai lên sai xuống, chưa kể phải tự biết cách quản lý bộ nhớ và phải viết code cực kỳ cẩn thận nhằm tránh sập (crash) Excel, tất cả chỉ code và code thôi không có bất cứ công cụ kéo thả trực quan nào.
Để biết thêm chi tiết về cách vận dụng lập trình C++ tạo giải pháp cho Excel, người đọc có thể tham khảo một số bài viết dưới đây:
Tạo COM Add-In bằng Visual C++
Một ví dụ về XLL add-in: Tương tác với Google Gemini dưới dạng công thức bảng tính
Tạo, sử dụng thư viện liên kết động DLL (Standard DLL) trong VBA
 
Cá nhân em từng thử qua
1.VBA thì nhẹ nhưng thiếu thư viện
2.Net em có thử c# và vb.net(Excel DNA) không dùng vsto thì thấy nó tiện gần như làm mọi thứ c# làm được thì nó cũng ok mỗi tội chỉ yêu win thôi
3.Python nếu mua thì em thấy ngon như pxll hoặc xlwings hoặc không muốn mua có thể dùng pythonCom
4.Delphi, Go.. thì phải viết wrapper Chuyển code vào
E thấy nếu tiện nhanh chuyên .Net nên dùng C# hoặc .net muốn bảo mật hơn thì viết base Delphi, Go gọi qua .net cho nhàn còn không viết wapper.
C++ em cũng thích đấy nhưng để học nó thì khó thực sự nên em bỏ qua nó viết nhóc nào dễ hơn thôi.
 
Cá nhân em từng thử qua
1.VBA thì nhẹ nhưng thiếu thư viện
2.Net em có thử c# và vb.net(Excel DNA) không dùng vsto thì thấy nó tiện gần như làm mọi thứ c# làm được thì nó cũng ok mỗi tội chỉ yêu win thôi
3.Python nếu mua thì em thấy ngon như pxll hoặc xlwings hoặc không muốn mua có thể dùng pythonCom
4.Delphi, Go.. thì phải viết wrapper Chuyển code vào
E thấy nếu tiện nhanh chuyên .Net nên dùng C# hoặc .net muốn bảo mật hơn thì viết base Delphi, Go gọi qua .net cho nhàn còn không viết wapper.
C++ em cũng thích đấy nhưng để học nó thì khó thực sự nên em bỏ qua nó viết nhóc nào dễ hơn thôi.
Nói chung là khi lập trình với C++ bạn phải làm tất cả mọi thứ, vd: Trong .NET bạn tạo một ứng dụng WinForm, chỉ với vài thao tác kéo thả là có thể giúp bạn tạo ra một ứng dụng Windows truyền thống một cách nhanh gọn lẹ, tuy nhiên với C++ bạn phải nắm được tất cả những thông điệp (message) cần phải xử lý, các hàm Win32 API tương ứng để tạo cửa sổ, control (CreateWindow hoặc CreateWindowEx), các hàm Win32 API để xử lý các thông điệp do cửa sổ hoặc control trả về (có thể xem đây là sự kiện (event) của control trong .NET vậy).
VD: Create a window
Khi lập trình COM add-in, bên .NET đã có sẵn giải pháp VSTO add-in giúp lập trình viên có thể dễ dàng tạo ra một add-in với đầy đủ chức năng như ý muốn một cách nhanh gọn, tuy nhiên với C++ bạn phải nắm được cách thức làm việc với đối tượng COM (IUnknown, IDispatch, cấp phát và giải phóng bộ nhớ đúng cách, thread, v.v.,), cũng may là Microsoft cung cấp giải pháp ATL Project giúp đơn giản hóa quá trình viết COM DLL, tuy vậy những công việc mà VSTO add-in ngầm thực hiện giúp bạn thì bạn phải tự làm lấy, nói chung là rất nhiều thứ phải lo xử lý.
 
Nói chung là khi lập trình với C++ bạn phải làm tất cả mọi thứ, vd: Trong .NET bạn tạo một ứng dụng WinForm, chỉ với vài thao tác kéo thả là có thể giúp bạn tạo ra một ứng dụng Windows truyền thống một cách nhanh gọn lẹ, tuy nhiên với C++ bạn phải nắm được tất cả những thông điệp (message) cần phải xử lý, các hàm Win32 API tương ứng để tạo cửa sổ, control (CreateWindow hoặc CreateWindowEx), các hàm Win32 API để xử lý các thông điệp do cửa sổ hoặc control trả về (có thể xem đây là sự kiện (event) của control trong .NET vậy).
VD: Create a window
Khi lập trình COM add-in, bên .NET đã có sẵn giải pháp VSTO add-in giúp lập trình viên có thể dễ dàng tạo ra một add-in với đầy đủ chức năng như ý muốn một cách nhanh gọn, tuy nhiên với C++ bạn phải nắm được cách thức làm việc với đối tượng COM (IUnknown, IDispatch, cấp phát và giải phóng bộ nhớ đúng cách, thread, v.v.,), cũng may là Microsoft cung cấp giải pháp ATL Project giúp đơn giản hóa quá trình viết COM DLL, tuy vậy những công việc mà VSTO add-in ngầm thực hiện giúp bạn thì bạn phải tự làm lấy, nói chung là rất nhiều thứ phải lo xử lý.
Cái đúng là C++ phải làm từ đầu hết mọi cái, cái này bước đầu đã rất khó, khó thêm cái là giải phóng bộ nhớ thủ công không cẩn thận là đi cả chương trình nên thôi em chọn ngôn ngữ nào nó dễ chút học chứ học anh c++ này ong thủ lắm
 
Cái đúng là C++ phải làm từ đầu hết mọi cái, cái này bước đầu đã rất khó, khó thêm cái là giải phóng bộ nhớ thủ công không cẩn thận là đi cả chương trình nên thôi em chọn ngôn ngữ nào nó dễ chút học chứ học anh c++ này ong thủ lắm
Nói chung là, với VBA chỉ cần gõ vài dòng lệnh là xong.

1756524669955.png
1756524679919.png
Còn với C++ thì phải viết cả đống code, nhiều khi gặp mấy hàm Win32 API ít khi dùng, lúc động đến lại quên thế là phải tra lại tài liệu cho chính xác.
C++:
#include <Windows.h>
#include <strsafe.h>

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) {
    const WCHAR wszClassname[] = L"My Window Class";
    WNDCLASS wndClass = {};
    wndClass.hCursor = (HCURSOR)LoadImage(hInstance, IDC_CROSS, IMAGE_CURSOR, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTSIZE);
    wndClass.lpfnWndProc = WindowProc;
    wndClass.lpszClassName = wszClassname;
    wndClass.hInstance = hInstance;
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wndClass.hIcon = (HICON)LoadImage(hInstance, IDI_APPLICATION, IMAGE_ICON, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTSIZE);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    if (!RegisterClass(&wndClass))
        return 1;
    HWND hWnd = CreateWindow(wszClassname, L"My Window", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 305, 158, NULL, NULL, hInstance, NULL);
    if (!hWnd)
        return 1;
    MSG msg = {};
    BOOL bRetVal = FALSE;
    while ((bRetVal = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRetVal == -1) {
            //Handle error

        }
        else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hButton = NULL, hTxt = NULL, hLbl = NULL;
    static HINSTANCE hInstance = NULL;
    switch (uMsg) {
        case WM_CREATE:
        {
            hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
            hButton = CreateWindow(L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD, 108, 84, 72, 24, hWnd, (HMENU)1, hInstance, NULL);
            if (!hButton) return -1;
            hTxt = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_VISIBLE | WS_CHILD, 96, 48, 150, 18, hWnd, (HMENU)2, hInstance, NULL);
            if (!hTxt) return -1;
            hLbl = CreateWindow(L"STATIC", L"Ngày giờ hiện tại", WS_VISIBLE | WS_CHILD, 114, 18, 140, 18, hWnd, (HMENU)3, hInstance, NULL);;
            if (!hLbl) return -1;
            return 0;
        }
        case WM_PAINT:
        {
            PAINTSTRUCT ps = {};
            HDC hdc = BeginPaint(hWnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
            EndPaint(hWnd, &ps);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
        case WM_COMMAND:
        {
            switch (HIWORD(wParam)) {
                case BN_CLICKED:
                {
                    switch (LOWORD(wParam)) {
                        case 1:
                        {
                            SYSTEMTIME systemTime = {};
                            GetLocalTime(&systemTime);
                            wchar_t wszBuffer[30]{};
                            HRESULT hr = StringCchPrintf(wszBuffer, 30, L"%u/%u/%u %u:%u:%u", systemTime.wMonth, systemTime.wDay, systemTime.wYear, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
                            if (SUCCEEDED(hr)) {
                                if (!SendMessage(hTxt, WM_SETTEXT, 0, (LPARAM)wszBuffer)) MessageBox(hWnd, L"WM_SETTEXT failed", L"Error", MB_OK | MB_SETFOREGROUND);
                            }
                            return 0;
                        }
                    }
                    return 0;
                }
            }
            return 0;
        }
        case WM_CTLCOLORSTATIC:
        {
            return (INT_PTR)GetStockObject(WHITE_BRUSH);
        }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Nếu viết bằng C++ thì tự do hơn, tùy biến thoải mái không bị gò bó như VBA, có thể tối ưu hiệu năng nhất có thể.
VD: VBA không hỗ trợ đa luồng, nhưng với C++ thì thoải mái.

1756524838119.png
 
Lần chỉnh sửa cuối:
Nói chung là, với VBA chỉ cần gõ vài dòng lệnh là xong.

View attachment 309474
View attachment 309475
Còn với C++ thì phải viết cả đống code, nhiều khi gặp mấy hàm Win32 API ít khi dùng, lúc động đến lại quên thế là phải tra lại tài liệu cho chính xác.
C++:
#include <Windows.h>
#include <strsafe.h>

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) {
    const WCHAR wszClassname[] = L"My Window Class";
    WNDCLASS wndClass = {};
    wndClass.hCursor = (HCURSOR)LoadImage(hInstance, IDC_CROSS, IMAGE_CURSOR, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTSIZE);
    wndClass.lpfnWndProc = WindowProc;
    wndClass.lpszClassName = wszClassname;
    wndClass.hInstance = hInstance;
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wndClass.hIcon = (HICON)LoadImage(hInstance, IDI_APPLICATION, IMAGE_ICON, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTSIZE);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    if (!RegisterClass(&wndClass))
        return 1;
    HWND hWnd = CreateWindow(wszClassname, L"My Window", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 305, 158, NULL, NULL, hInstance, NULL);
    if (!hWnd)
        return 1;
    MSG msg = {};
    BOOL bRetVal = FALSE;
    while ((bRetVal = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRetVal == -1) {
            //Handle error

        }
        else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hButton = NULL, hTxt = NULL, hLbl = NULL;
    static HINSTANCE hInstance = NULL;
    switch (uMsg) {
        case WM_CREATE:
        {
            hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
            hButton = CreateWindow(L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD, 108, 84, 72, 24, hWnd, (HMENU)1, hInstance, NULL);
            if (!hButton) return -1;
            hTxt = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_VISIBLE | WS_CHILD, 96, 48, 150, 18, hWnd, (HMENU)2, hInstance, NULL);
            if (!hTxt) return -1;
            hLbl = CreateWindow(L"STATIC", L"Ngày giờ hiện tại", WS_VISIBLE | WS_CHILD, 114, 18, 140, 18, hWnd, (HMENU)3, hInstance, NULL);;
            if (!hLbl) return -1;
            return 0;
        }
        case WM_PAINT:
        {
            PAINTSTRUCT ps = {};
            HDC hdc = BeginPaint(hWnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
            EndPaint(hWnd, &ps);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
        case WM_COMMAND:
        {
            switch (HIWORD(wParam)) {
                case BN_CLICKED:
                {
                    switch (LOWORD(wParam)) {
                        case 1:
                        {
                            SYSTEMTIME systemTime = {};
                            GetLocalTime(&systemTime);
                            wchar_t wszBuffer[30]{};
                            HRESULT hr = StringCchPrintf(wszBuffer, 30, L"%u/%u/%u %u:%u:%u", systemTime.wMonth, systemTime.wDay, systemTime.wYear, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
                            if (SUCCEEDED(hr)) {
                                if (!SendMessage(hTxt, WM_SETTEXT, 0, (LPARAM)wszBuffer)) MessageBox(hWnd, L"WM_SETTEXT failed", L"Error", MB_OK | MB_SETFOREGROUND);
                            }
                            break;
                        }
                    }
                    break;
                }
            }
        }
        case WM_CTLCOLORSTATIC:
        {
            return (INT_PTR)GetStockObject(WHITE_BRUSH);
        }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Nếu viết bằng C++ thì tự do hơn, tùy biến thoải mái không bị gò bó như VBA, có thể tối ưu hiệu năng nhất có thể.
VD: VBA không hỗ trợ đa luồng, nhưng với C++ thì thoải mái.ái n
Cái này thì đúng nhưng mà c++ quá là chua khi viết nên thôi bỏ qua dùng ngôn ngữ nào nhẹ hơn để viết như Go + Python + C# chẳng hạn để viết ra 1 addins hoặc cái gì đó
 

Bài viết mới nhất

Back
Top Bottom