Tạo, sử dụng Automation Add-in trong Excel bằng Visual C#

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

nguyendang95

Thành viên chính thức
Tham gia
25/5/22
Bài viết
87
Được thích
81
Automation Add-in là một trong nhiều phương pháp bổ sung tính năng mới cho Excel. Thông qua nó, người dùng có thể bổ sung thêm công thức tính toán trên bảng tính, triển khai hàm RTD của Excel lấy dữ liệu theo thời gian thực hay (tùy chọn) triển khai thêm giao diện (interface) IDTExtensibility2 để tùy biến Excel sâu hơn. Phạm vi bài viết này chỉ đề cập đến chức năng chính mà Automation Add-in hướng đến: Tạo hàm do người dùng định nghĩa (user-defined functions).

Để tạo Automation Add-in, người dùng cài đặt Visual Studio (khuyến nghị nên cài đặt phiên bản mới nhất là Visual Studio 2022 Community Edition miễn phí), sau đó tạo một dự án (project) mới là Class Library (.NET Framework) như hình dưới.
1727924887046.png
Để đăng ký với hệ thống, người dùng cần tạo hai phương thức dưới đây, lần lượt gắn thuộc tính (attribute) là [ComRegisterFunction] và [ComUnregisterFunction]. Đây chính là cơ sở để Excel có thể xác định danh tính của Automation Add-in mà người dùng muốn sử dụng trong Excel.
C#:
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ExcelUserDefinedFunctions
{
    [Guid("6353A1BB-3DBD-4B0D-A55B-19C0490E4911")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class Class1
    {
        public Class1() { }
        [ComRegisterFunction]
        public static void RegisterFunction(Type type)
        {
            Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
            RegistryKey Key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
            Key.SetValue("", Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
        }
        [ComUnregisterFunction]
        public static void UnregisterFunction(Type type)
        {
            Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
        }
        private static string GetSubKeyName(Type type, string SubKeyName)
        {
            StringBuilder Sb = new StringBuilder();
            Sb.Append(@"CLSID\{");
            Sb.Append(type.GUID.ToString().ToUpper());
            Sb.Append(@"}\");
            Sb.Append(SubKeyName);
            return Sb.ToString();
        }
    }
}
Sau khi đăng ký với tiện ích Regasm, thông tin của add-in sẽ được ghi nhận trên Registry Editor.

Chúng ta hãy thử viết hai hàm đơn giản dưới đây, hàm Hello lấy một đối số kiểu chuỗi và trả về giá trị "Hello " + Name, và hàm còn lại SumTwoNumbers trả về kết quả là phép cộng hai số.
C#:
public string Hello(string Name)
{
    return $"Hello {Name}";
}
public double SumTwoNumbers(double A, double B)
{
    return A + B;
}
Sau khi viết xong, người dùng cần chọn Project - <tên_dự_án> Properties. Trong tab Build, chọn Register for COM interop, sau đó lưu lại và tiến hành Build ra DLL. Lưu ý: Cần phải chạy Visual Studio với quyền quản trị viên (Run as Administrator), ngoài ra cần Build với Platform cụ thể (vd: Excel bản 32 bit thì chọn x86 và Excel bản 64 bit thì chọn x64).
1727925734277.png
Để sử dụng Automation Add-in mà người dùng vừa viết, từ Excel người dùng mở tab Developer - Excel Add-ins. Mở ra hộp thoại Add-ins, người dùng chọn tiếp Automation và tìm tên của add-in, sau đó nhấn OK để đóng hộp thoại lại.
1727925969179.png
Sử dụng công thức trong sheet:
1727927459715.png
Nhược điểm của Automation add-in so với xll add-in truyền thống:
  • Không hỗ trợ gợi ý hàm, đối số của hàm.
  • Hiệu năng kém hơn.
(Bổ sung) Bên cạnh việc sử dụng Automation add-in để tạo công thức tính toán cho sheet, người dùng còn có thể thiết lập và sử dụng hàm RTD thông qua add-in này nhằm cập nhật dữ liệu lên sheet theo thời gian thực.
Để thiết lập hàm RTD, người dùng cần triển khai giao diện (interface) IRtdServer của Excel. Chi tiết cách thực hiện người dùng có thể tham khảo bài viết dưới đây của Microsoft.
How to set up and use the RTD function in Excel
How to create a RealTimeData server for Excel
IRtdServer Interface
Hoặc, người dùng có thể tra cứu và tìm một vài code mẫu trên internet ở diễn đàn nổi tiếng như Stack Overflow.
Code đính kèm theo bài viết này tạo một automation server cho phép Excel cập nhật dữ liệu theo thời gian thực về bảng giá mã chứng khoán, nguồn dữ liệu lấy từ trang SSI, cứ năm giây cập nhật một lần.
1727929363764.png
Video thực tế:
 

File đính kèm

Tuyệt vời. Có khi em chuyển từ VBNet sang C# luôn.
 
Nếu chuyển được thì bạn nên chuyển sang C# ngay và luôn, VB.NET bây giờ bị Microsoft bỏ rơi rồi, rơi vào tình trạng giống như VB6 trước đây, giờ con cưng của Microsoft là C#.
Chỉ những Project lớn mới quan trọng. Project lớn cho thấy rõ hiệu quả của cách code theo Hướng Đối Tượng (Object Oriented Programming/OOP).

VB.Net chỉ là cố gắng "backward compatibility", mở rộng nền tảng dot net cho dân thủ cựu. Tới một mức độ HĐT nảo đó thì dòng ngôn ngữ BASIC lộ rõ ra rằng chúng đã quá cũ (dòng BASIC là tiền sử, ngang hàng với FORTRAN, COBOL, ...). Ngày xưa dùng làm giao diện với hệ thống thì rất tiện và dễ, nhưng bảo chúng theo thời đại mà thay đổi thì quá kém hiệu quả. MS giữ được đến VB6 là đã cố gắng lắm rồi.

C# đi theo chiều hướng mới của Java. Đừng lầm với C/C++, chính MS nói rằng C# gần Java hơn C/C++. Và cũng như Java, C# đáp ứng nhu cầu HĐT khoảng trên 95%. Cộng với chiều hướng mới, dùng cái nhìn một lệnh như một hàm là ảnh hưởng của Unix. Rất hiệu quả.
 
Cái vụ Automation Add-Ins thì tui chưa thử chứ tui dùng C# và sử dụng Excel DNA làm được nhiều thứ trong môi trường Excel, từ việc tạo hàm, tương tác object, bắt sự kiện, tạo giao diện, tạo Ribbon, tạo TaskPane,... Hầu như VBA làm được thì tui đều làm được bằng C# (Cái này là tự nhận thấy không biết chính xác không, vì những cái tui từng làm ở VBA thì C# làm được hết đến thời điểm hiện tại) thậm trí có những cái VBA không làm được nhưng C# làm ngon luôn.
 
Cái vụ Automation Add-Ins thì tui chưa thử chứ tui dùng C# và sử dụng Excel DNA làm được nhiều thứ trong môi trường Excel, từ việc tạo hàm, tương tác object, bắt sự kiện, tạo giao diện, tạo Ribbon, tạo TaskPane,... Hầu như VBA làm được thì tui đều làm được bằng C# (Cái này là tự nhận thấy không biết chính xác không, vì những cái tui từng làm ở VBA thì C# làm được hết đến thời điểm hiện tại) thậm trí có những cái VBA không làm được nhưng C# làm ngon luôn.
ExcelDna so với Automation Add-in thì hơn nhiều về hiệu năng (xll add-in truyền thống) lẫn hỗ trợ giao diện, nói chung là tác giả hỗ trợ người dùng tận răng rồi, chỉ tiếc là phiên bản mới nhất hiện giờ vẫn kẹt ở .NET 6.
 
ExcelDna so với Automation Add-in thì hơn nhiều về hiệu năng (xll add-in truyền thống) lẫn hỗ trợ giao diện, nói chung là tác giả hỗ trợ người dùng tận răng rồi, chỉ tiếc là phiên bản mới nhất hiện giờ vẫn kẹt ở .NET 6.
Liệu có phải vì thế mà em chọn Net 8.0 thì build lỗi không nhỉ.....
 
Để sử dụng Automation Add-in mà người dùng vừa viết, từ Excel người dùng mở tab Developer - Excel Add-ins. Mở ra hộp thoại Add-ins, người dùng chọn tiếp Automation và tìm tên của add-in............. chức Năng sử dụng hàm kiểu này trên Delphi viết quá đơn giản Luôn .. ai có tham khảo lục cái thớt Delphi của GPE này vài năm trước có rồi

để Viết Hàm RTD trên Delphi bao quát nhất cho người sử dụng tuỳ chỉnh có lẻ quá khó ...

và mã trên Google gần như không có chỉ gợi ý vài dòng ... còn mã C# tràn ngập Google ... chỉ Copy sơ chế là có thể sử dụng (
còn được hay không thì phụ thuộc vào chính khả năng của ai đó xào nấu nó )

Thử chơi Hàm Automation Add-in
1728180992082.png
 
Lần chỉnh sửa cuối:
Cái vụ Automation Add-Ins thì tui chưa thử chứ tui dùng C# và sử dụng Excel DNA làm được nhiều thứ trong môi trường Excel, từ việc tạo hàm, tương tác object, bắt sự kiện, tạo giao diện, tạo Ribbon, tạo TaskPane,... Hầu như VBA làm được thì tui đều làm được bằng C# (Cái này là tự nhận thấy không biết chính xác không, vì những cái tui từng làm ở VBA thì C# làm được hết đến thời điểm hiện tại) thậm trí có những cái VBA không làm được nhưng C# làm ngon luôn.
Thoải mái nhất là viết hàm bằng ExcelDna, tận dụng tính năng xử lý song song (parallel processing) mà nền tảng .NET mang lại để tính toán.
Ví dụ: Sử dụng phương thức Parallel.For để tính tổng giá trị của các ô với kích thước 2000 dòng x 2000 cột. Cái hàm này hao hao giống với hàm List.Accumulate của Power Query M.
C#:
using ExcelDna.Integration;
using ExcelDna.ComInterop;

namespace ParallelCalculation
{
    public class Class1
    {
        public static double Accumulate(object[,] Input)
        {
            int RowCount = Input.GetLength(0);
            int ColumnCount = Input.GetLength(1);
            double Result = 0;
            Parallel.For<double>(0, RowCount,
                () => 0,
                (current, state, local) =>
                {
                    for (int i = 0; i < ColumnCount; i++)
                    {
                        object Value = Input[current, i];
                        if (Value != null && (!Value.GetType().Equals(typeof(String))))
                        {
                            local += (double)Value;
                        }
                    }
                    return local;
                },
                (FinalResult) =>
                {
                    static double Add(ref double Location1, double Value)
                    {
                        double NewCurrentValue = Location1;
                        while (true)
                        {
                            double CurrentValue = NewCurrentValue;
                            double NewValue = CurrentValue + Value;
                            NewCurrentValue = Interlocked.CompareExchange(ref Location1, NewValue, CurrentValue);
                            if (NewCurrentValue.Equals(CurrentValue))
                                return NewValue;
                        }
                    }
                    Add(ref Result, FinalResult);
                }
                );
            return Result;
        }
    }
}
Trong Excel:
1728275702819.png
Nếu viết bằng VBA thuần túy, duyệt qua tuần tự từng phần tử trong mảng để tính cộng dồn thì sẽ rất lâu.
 
Lần chỉnh sửa cuối:
Hình như nó giống nhau hay Tôi nhầm lẫn chăng :p

1728285160184.png

Còn trích đoạn sau của Em GPT

Cách bạn viết macro trong VBA với hàm `MotDong_MotGiay` có sự khác biệt so với cách tiếp cận C# mà bạn đã đề cập trước đó về cả hiệu suất lẫn cách thức xử lý. Dưới đây là sự khác biệt cụ thể giữa hai cách:

### 1. **Ngôn ngữ và môi trường:**
- **VBA (Visual Basic for Applications)**: Macro của bạn được viết trong VBA và chạy trực tiếp trong Excel. VBA là ngôn ngữ kịch bản gắn liền với Excel, rất dễ để thực hiện các tác vụ liên quan đến bảng tính.
- **C# với Excel-DNA**: Đây là cách tiếp cận dựa trên một add-in được viết bằng C#. Add-in này tích hợp với Excel thông qua thư viện Excel-DNA, cho phép sử dụng các tính năng của ngôn ngữ C# như xử lý song song (parallel processing), điều này không có sẵn trong VBA.

### 2. **Xử lý song song:**
- **VBA**: Cách của bạn không tận dụng bất kỳ xử lý song song nào, vì VBA không hỗ trợ các kỹ thuật đa luồng. Nó xử lý toàn bộ dữ liệu trong một luồng duy nhất, nên nếu phạm vi dữ liệu lớn (ví dụ 3000x3000 ô), nó có thể mất nhiều thời gian.
- **C# với Parallel Processing**: Trong mã C# của bạn, bạn đã sử dụng `Parallel.For`, giúp chia việc tính toán thành nhiều luồng để xử lý song song. Điều này có thể cải thiện hiệu suất khi xử lý tập dữ liệu lớn, đặc biệt là với những máy tính có nhiều lõi xử lý.

### 3. **Phạm vi dữ liệu:**
- **VBA**: Macro của bạn tính tổng tất cả giá trị từ một phạm vi cụ thể trên Sheet1 (`A1:CU3000`), bằng cách dùng `Application.Sum` để xử lý dữ liệu một cách trực tiếp.
- **C#**: Mã C# cũng thực hiện tương tự, nhưng bạn phải thực hiện thủ công việc duyệt qua từng phần tử của mảng 2D (object[,] Input) và kiểm tra kiểu dữ liệu cũng như tính toán.

### 4. **Hiệu suất:**
- **VBA**: Nếu phạm vi dữ liệu lớn, cách sử dụng VBA có thể chậm do chỉ xử lý trên một luồng duy nhất và không có tối ưu hoá về mặt xử lý song song.
- **C# với Parallel.For**: Với C#, việc xử lý song song giúp mã của bạn nhanh hơn, đặc biệt là khi có các phép tính phức tạp hoặc dữ liệu lớn. Tuy nhiên, mã của bạn yêu cầu phải viết nhiều hơn và phức tạp hơn.

### 5. **Kiểm tra kiểu dữ liệu:**
- **VBA**: `Application.Sum` tự động bỏ qua các giá trị không phải số, nên bạn không phải xử lý kiểm tra kiểu dữ liệu một cách thủ công.
- **C#**: Trong mã C#, bạn phải kiểm tra kiểu dữ liệu thủ công (để tránh ngoại lệ khi cố gắng cộng các giá trị không phải số).

### Tóm lại:
- **VBA** rất thuận tiện cho các tác vụ đơn giản và nhỏ, nhưng khi xử lý dữ liệu lớn, nó có thể gặp khó khăn về hiệu suất.
- **C# với xử lý song song** có thể tối ưu hóa hiệu suất khi xử lý dữ liệu lớn, nhưng yêu cầu phải lập trình phức tạp hơn và môi trường chạy add-in (Excel-DNA).
 
Hình như nó giống nhau hay Tôi nhầm lẫn chăng :p

View attachment 304513

Còn trích đoạn sau của Em GPT

Cách bạn viết macro trong VBA với hàm `MotDong_MotGiay` có sự khác biệt so với cách tiếp cận C# mà bạn đã đề cập trước đó về cả hiệu suất lẫn cách thức xử lý. Dưới đây là sự khác biệt cụ thể giữa hai cách:

### 1. **Ngôn ngữ và môi trường:**
- **VBA (Visual Basic for Applications)**: Macro của bạn được viết trong VBA và chạy trực tiếp trong Excel. VBA là ngôn ngữ kịch bản gắn liền với Excel, rất dễ để thực hiện các tác vụ liên quan đến bảng tính.
- **C# với Excel-DNA**: Đây là cách tiếp cận dựa trên một add-in được viết bằng C#. Add-in này tích hợp với Excel thông qua thư viện Excel-DNA, cho phép sử dụng các tính năng của ngôn ngữ C# như xử lý song song (parallel processing), điều này không có sẵn trong VBA.

### 2. **Xử lý song song:**
- **VBA**: Cách của bạn không tận dụng bất kỳ xử lý song song nào, vì VBA không hỗ trợ các kỹ thuật đa luồng. Nó xử lý toàn bộ dữ liệu trong một luồng duy nhất, nên nếu phạm vi dữ liệu lớn (ví dụ 3000x3000 ô), nó có thể mất nhiều thời gian.
- **C# với Parallel Processing**: Trong mã C# của bạn, bạn đã sử dụng `Parallel.For`, giúp chia việc tính toán thành nhiều luồng để xử lý song song. Điều này có thể cải thiện hiệu suất khi xử lý tập dữ liệu lớn, đặc biệt là với những máy tính có nhiều lõi xử lý.

### 3. **Phạm vi dữ liệu:**
- **VBA**: Macro của bạn tính tổng tất cả giá trị từ một phạm vi cụ thể trên Sheet1 (`A1:CU3000`), bằng cách dùng `Application.Sum` để xử lý dữ liệu một cách trực tiếp.
- **C#**: Mã C# cũng thực hiện tương tự, nhưng bạn phải thực hiện thủ công việc duyệt qua từng phần tử của mảng 2D (object[,] Input) và kiểm tra kiểu dữ liệu cũng như tính toán.

### 4. **Hiệu suất:**
- **VBA**: Nếu phạm vi dữ liệu lớn, cách sử dụng VBA có thể chậm do chỉ xử lý trên một luồng duy nhất và không có tối ưu hoá về mặt xử lý song song.
- **C# với Parallel.For**: Với C#, việc xử lý song song giúp mã của bạn nhanh hơn, đặc biệt là khi có các phép tính phức tạp hoặc dữ liệu lớn. Tuy nhiên, mã của bạn yêu cầu phải viết nhiều hơn và phức tạp hơn.

### 5. **Kiểm tra kiểu dữ liệu:**
- **VBA**: `Application.Sum` tự động bỏ qua các giá trị không phải số, nên bạn không phải xử lý kiểm tra kiểu dữ liệu một cách thủ công.
- **C#**: Trong mã C#, bạn phải kiểm tra kiểu dữ liệu thủ công (để tránh ngoại lệ khi cố gắng cộng các giá trị không phải số).

### Tóm lại:
- **VBA** rất thuận tiện cho các tác vụ đơn giản và nhỏ, nhưng khi xử lý dữ liệu lớn, nó có thể gặp khó khăn về hiệu suất.
- **C# với xử lý song song** có thể tối ưu hóa hiệu suất khi xử lý dữ liệu lớn, nhưng yêu cầu phải lập trình phức tạp hơn và môi trường chạy add-in (Excel-DNA).
Hai cái này chẳng liên quan gì đến nhau.
 
Hai cái này chẳng liên quan gì đến nhau.
1/ Parallel.For<double>(0, RowCount, Trên Delphi cũng có cách này

2/ Bản thân C# cũng có sao lại phải sử dụng qua DNA

3/ điều là tính tổng các Ô lại với nhau

4/ nếu trên Delphi viết Hàm sử dụng Parallel.For<double>(0, RowCount, xong [A1] = TenHam( DataRange) xong nó cũng ra tông Sum của các Ô
 
1/ Parallel.For<double>(0, RowCount, Trên Delphi cũng có cách này

2/ Bản thân C# cũng có sao lại phải sử dụng qua DNA

3/ điều là tính tổng các Ô lại với nhau

4/ nếu trên Delphi viết Hàm sử dụng Parallel.For<double>(0, RowCount, xong [A1] = TenHam( DataRange) xong nó cũng ra tông Sum của các Ô
2. Parallel là static class của .NET chứ không phải của riêng ExcelDna. Xem thêm ở đây: Parallel Class. ExcelDna trong trường hợp này chỉ là công cụ triển khai hàm do người dùng tự định nghĩa lên Excel.
3. Cái này chỉ là mô phỏng cách triển khai tính toán song song, hàm ở trên tương đương với hàm SUM của Microsoft. Thực tế có nên triển khai tính toán song song hay không và triển khai nó như thế nào thì tùy thuộc vào bài toán cần giải quyết có phức tạp và đòi hỏi khối lượng tính toán nhiều hay không. Không phải lúc nào cứ dùng nhiều thread là tốc độ tính toán sẽ nhanh.
Ví dụ hàm trên chia các dòng dữ liệu cho các thread, thread 1 đảm nhiệm dòng 1, thread 2 đảm nhiệm dòng 2, v.v., mỗi dòng gồm hai nghìn ô dữ liệu. Tính toán xong thì cộng dồn hết lại ra kết quả cuối cùng. Tất nhiên là số thread chạy song song phụ thuộc vào ThreadPool và số nhân số luồng của CPU.
1. và 4. Tôi không biết gì về Delphi và cách thức triển khai thread của Delphi như thế nào nên không bàn luận.
 
2. Parallel là static class của .NET chứ không phải của riêng ExcelDna. Xem thêm ở đây: Parallel Class. ExcelDna trong trường hợp này chỉ là công cụ triển khai hàm do người dùng tự định nghĩa lên Excel.
3. Cái này chỉ là mô phỏng cách triển khai tính toán song song, hàm ở trên tương đương với hàm SUM của Microsoft. Thực tế có nên triển khai tính toán song song hay không và triển khai nó như thế nào thì tùy thuộc vào bài toán cần giải quyết có phức tạp và đòi hỏi khối lượng tính toán nhiều hay không. Không phải lúc nào cứ dùng nhiều thread là tốc độ tính toán sẽ nhanh.
Ví dụ hàm trên chia các dòng dữ liệu cho các thread, thread 1 đảm nhiệm dòng 1, thread 2 đảm nhiệm dòng 2, v.v., mỗi dòng gồm hai nghìn ô dữ liệu. Tính toán xong thì cộng dồn hết lại ra kết quả cuối cùng. Tất nhiên là số thread chạy song song phụ thuộc vào ThreadPool và số nhân số luồng của CPU.
1. và 4. Tôi không biết gì về Delphi và cách thức triển khai thread của Delphi như thế nào nên không bàn luận.
Parallel trên Delphi ứng dụng khá nhiều thứ... hôm lâu Tôi lang thang Google thấy họ keo IDM tải file đa luồng song song ... song đang lúc rảnh Tôi à

ơi với Em ChatGPT loanh quanh mất buổi sáng vừa bán hàng vừa tiếp khách và vừa dò thế là xong ...

nó tải file đa luồng song song Một file chia nhỏ ra nhiều phần ví dụ 10 phần cùng một thời điểm về PC khi tải xong hết các file thì nó ghét lại thành 1 file

Ban đầu nhìn thấy vậy tưởng OK vì mở file lên sử dụng tốt ... khi ghi log thấy ko chính xác xong bỏ qua

sang ngày hôm sau dò lại fix code + ghi log thì mới chính xác chia nhỏ file ra nhiều phần xong tải các phần về ghép lại thành một file
 
Tôi ngỡ quý vị không ngại làm việc theo kiểu HĐT cho nên tôi mới góp ý về C#.
Một trong những điểm lớn nhất của HĐT là "code viết một lần, sử dụng nhiều lần".
Với C# có khả năng HĐT cao, cái gì phức tạp thì chịu khó viết thành vài hàm, cho vào một class.
Cho nên so sánh độ khó viết code ứng dụng thì C# mà không biết HĐT thì không nên học.
 
để lại đây vài dòng cho những ai đến sau có thể kiểm nghiệm mà viết code
xong test chơi trên bất cứ ngôn ngữ lập trình nào ''''''''''''''''''


1/ Ban đầu tôi viết code trên Delphi chạy đa luồng song song tại một thời điểm . Ví dụ chia ra 10 luồng song song khi chạy ra kết quả đúng xem như là mừng :p


2/ Hãy thử mực số 1 ghi log hay gì đó = Tuỳ cách ai đó làm

- Ghi số luồng bắt đầu

- ghi các luồng thực thi dữ liệu từ khúc nào tới khúc nào cho mỗi luồng trong 10 luồng

- ghi số luồng kết thúc


Xong xem lại nó đã đúng với các luồng song song tại cùng một thời điểm hay chưa ...
Hay cứ viết code cho đa luồng ra kết quả xong chốt nó là đa luồng song song tại một thời điểm ...??????????????!!!!!!!!!!!!!!!!!!!!! --=0_)()(-
 
Thoải mái nhất là viết hàm bằng ExcelDna, tận dụng tính năng xử lý song song (parallel processing) mà nền tảng .NET mang lại để tính toán.
Ví dụ: Sử dụng phương thức Parallel.For để tính tổng giá trị của các ô với kích thước 2000 dòng x 2000 cột. Cái hàm này hao hao giống với hàm List.Accumulate của Power Query M.
C#:
using ExcelDna.Integration;
using ExcelDna.ComInterop;

namespace ParallelCalculation
{
    public class Class1
    {
        public static double Accumulate(object[,] Input)
        {
...}
Vấn đề là nếu theo HĐT thì cái code này không quan trọng.
Tôi chỉ cần biết giao diện của Class1 là gì, và những hàm tôi cần có cho tôi đúng kết quả mong muốn?
Kế đó tôi viết một cái ClassTui1 thừa kế (hoặc interface) Class1 và viết thêm những gì tôi thích.
Đó là cách sử dụng tính chất thừa kế của LTHĐT. Nó dùng để viết code như Class1 1 lần, sử dụng nhiều lần.
Muốn code căn bản đa luồng cũng vậy. Chỉ cần lên Cậu Chat GPT nhờ viết cái lõi. Từ đó cứ thừa kế ra những phương án sử dụng.
Dân C# phải biết làm chuyện này.
 
Tôi thấy trên GPE này đâu đó đang sử dụng từ đa luồng song song tại cùng một Thời điểm

Tôi vẻ tiếp ra câu hỏi cho các cháu Em bé sau này có đọc được thì hỏi ngược lại các chú ... xem các chú trả lời sao

Chắc chắn sẻ có chú làm được trả lời được ... nhưng rất ít thôi còn lại thấy họ nói vậy cũng bắt trước keo cho sang mà thôi
,,,,,,,


Chú keo code của chú chạy đa luồng song song tại một thời điểm vậy cháu xin hỏi và chú giải thích dùm cháu

1/ Có 100 dòng x 10 cột vậy cháu tạm chia ra 10 luồng cho dễ tính

2/ vậy chú ghi log cho cháu xem số luồng bắt đầu

3/ Ghi log từng luồng dữ liệu trong 10 luồng .. Ví dụ luồng 1 chạy từ dòng 1 tới dòng 10 ... luồng 2 từ 11 tới 20 và cứ như vậy tới hết 10 luồng

4/ ghi log các luồng hoàn thành
.....
chuẩn bị câu hỏi sau này sẻ có người hỏi kẻo không sẻ có nhiều chú ngậm hột thị xong giải thích kiểu con gà chạy quanh cái cối xay lúa --=0--=0--=0_)()(-_)()(-_)()(-

Vì bài kiểu này tôi đã đọc trên 1 Web nước ngoài rồi ... tay kia không thể giải thích và không làm được ...

xong có tay khác vào viết mã chứng minh ok Thôi tới đó thui ................... chào và tạm dừng thế mới vui
 
Cái vụ Automation Add-Ins thì tui chưa thử chứ tui dùng C# và sử dụng Excel DNA làm được nhiều thứ trong môi trường Excel, từ việc tạo hàm, tương tác object, bắt sự kiện, tạo giao diện, tạo Ribbon, tạo TaskPane,... Hầu như VBA làm được thì tui đều làm được bằng C# (Cái này là tự nhận thấy không biết chính xác không, vì những cái tui từng làm ở VBA thì C# làm được hết đến thời điểm hiện tại) thậm trí có những cái VBA không làm được nhưng C# làm ngon luôn.
Chào bác, em đang muốn tìm hiểu về cách sử dụng Excel DNA, bác có thể chia sẻ giúp em tài liệu/video hướng dẫn vào địa chỉ mail: dovandungktxd@gmail.com được không ạ (nếu phải trả phí thì bác cứ nhắn giùm ạ).

Thank bác và chúc bác sức khỏe!
 
Web KT

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

Back
Top Bottom