AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé!

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Bạn thử tìm trên Google mình cũng không hiểu sâu đâu
 
Upvote 0
Upvote 0
Thua không biết luôn ................:D
Có code nào liên quan tới *.dll và Excel viết = Delphi úp cho mình xin với nghiên cứu xem sao
Mình rảnh hay vô link sau coi code Delphi thấy cũng hay
http://mrxray.on.coocan.jp/Delphi/plSamples/000_CommandLineCompile.htm

Bạn đừng vào quá nhiều link nước ngoài quá mà phân tán kiến thức - tảu hỏa nhập ma , đặc biệt link trên, đó là code của một giải pháp khá phwucs tạp, dùng cả API.

Các bạn muốn dùng Delphi để viết Add-in cho Excel thì dùng thằng này "Add-in Express for Microsoft Office and Delphi VCL "
https://www.add-in-express.com/add-in-delphi/overview.php
Tôi chỉ các bạn cái đơn giản để tạo ra cái mình muốn như là tạo add-in ở link trên. Các add-in tôi viết thì không dùng đến các công cụ ngoài mà đã giới thiệu trên, vì do yêu cầu đặc biệt của phần mềm nên tôi tự viết add-in theo cách riêng.
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh Siêu tầm các hàm cơ bản của Delphi của người tây Lưu và dịch ra tiếng việt cho thuận tiện + link hướng dẫn xài hàm Delphi
Úp lên đây cho Bạn nào yêu thích Delphi tra cứu he ... phòng khi hay quậy máy tính nó xóa hết trơn vô đây tải về cho tiện :p:p

Link trang người tây
http://www.delphibasics.co.uk/ByType.asp?Type=Function
Bài đã được tự động gộp:

Bạn đừng vào quá nhiều link nước ngoài quá mà phân tán kiến thức - tảu hỏa nhập ma , đặc biệt link trên, đó là code của một giải pháp khá phwucs tạp, dùng cả API.

Các bạn muốn dùng Delphi để viết Add-in cho Excel thì dùng thằng này "Add-in Express for Microsoft Office and Delphi VCL "
https://www.add-in-express.com/add-in-delphi/overview.php
Tôi chỉ các bạn cái đơn giản để tạo ra cái mình muốn như là tạo add-in ở link trên. Các add-in tôi viết thì không dùng đến các công cụ ngoài mà đã giới thiệu trên, vì do yêu cầu đặc biệt của phần mềm nên tôi tự viết add-in theo cách riêng.

Như tôi vẫn lưu ý các bạn đang có định hướng về viết ứng dụng cho Excel. Các sản phẩm viết cho Excel đó là các hàm, Add-in XLL/DLL thì Delphi, C++ tôi cho là số 1 trên thế giới để giải quyết về tốc đồ và tính linh hoạt khi cài đặt sang các máy tính.
Cho mình hỏi chút khi mình khai báo như sau trong *.dll để sử dụng hàm từ Excel mà nó chạy làm đơ file luôn
Mã:
var
  fso: OleVariant;
begin
  fso := CreateOleObject('Scripting.FileSystemObject');
Phải chăng cách khai báo trên sai phương pháp mà chỉ áp dụng cho 1 ứng dụng chạy độc lập
Mong Bạn chỉ dùm
 

File đính kèm

  • Using Function In Delphi.xlsx
    26.9 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Mạnh Siêu tầm các hàm cơ bản của Delphi của người tây Lưu và dịch ra tiếng việt cho thuận tiện + link hướng dẫn xài hàm Delphi
Úp lên đây cho Bạn nào yêu thích Delphi tra cứu he ... phòng khi hay quậy máy tính nó xóa hết trơn vô đây tải về cho tiện :p:p

Link trang người tây
http://www.delphibasics.co.uk/ByType.asp?Type=Function
Bài đã được tự động gộp:


Cho mình hỏi chút khi mình khai báo như sau trong *.dll để sử dụng hàm từ Excel mà nó chạy làm đơ file luôn
Mã:
var
  fso: OleVariant;
begin
  fso := CreateOleObject('Scripting.FileSystemObject');
Phải chăng cách khai báo trên sai phương pháp mà chỉ áp dụng cho 1 ứng dụng chạy độc lập
Mong Bạn chỉ dùm

Khi làm việc với các Class, Object từ các thư viện ngoài (dll, ocx, exe) thì bạn dùng hàm CreateOleObject là chuẩn rồi. Việc không chạy có thể lỗi ở lý dó khác.

Trong VB các bạn dùng hàm CreateObject(), trong Delphi thì là CreateOleObject
Trong VB kiểu dữ liệu là Variant thì Delphi là OleVariant.
 
Upvote 0
Khi làm việc với các Class, Object từ các thư viện ngoài (dll, ocx, exe) thì bạn dùng hàm CreateOleObject là chuẩn rồi. Việc không chạy có thể lỗi ở lý dó khác.

Trong VB các bạn dùng hàm CreateObject(), trong Delphi thì là CreateOleObject
Trong VB kiểu dữ liệu là Variant thì Delphi là OleVariant.
Cảm ơn Bạn có lẻ làm đơ là do mấy dòng dưới
Nhờ Bạn chuyển dùm code sau sang Delphi dùm .... để mình hình dung ra cách duyệt mảng 2 chiều trong Delphi
Mình Có tìm google hoài nhưng nhiều trang nói mơ hồ quá ko hiểu
Xin cảm ơn
Mã:
Public Function TransArr(ByVal sArr As Variant) As Variant
    Dim tmpArr As Variant, x As Long, y As Long
    ReDim tmpArr(UBound(sArr, 2), UBound(sArr, 1))
    For x = 0 To UBound(sArr, 2)
        For y = 0 To UBound(sArr, 1)
            tmpArr(x, y) = sArr(y, x)
        Next y
    Next x
    TransArr = tmpArr
End Function
 
Upvote 0
Cảm ơn Bạn có lẻ làm đơ là do mấy dòng dưới
Nhờ Bạn chuyển dùm code sau sang Delphi dùm .... để mình hình dung ra cách duyệt mảng 2 chiều trong Delphi
Mình Có tìm google hoài nhưng nhiều trang nói mơ hồ quá ko hiểu
Xin cảm ơn
Mã:
Public Function TransArr(ByVal sArr As Variant) As Variant
    Dim tmpArr As Variant, x As Long, y As Long
    ReDim tmpArr(UBound(sArr, 2), UBound(sArr, 1))
    For x = 0 To UBound(sArr, 2)
        For y = 0 To UBound(sArr, 1)
            tmpArr(x, y) = sArr(y, x)
        Next y
    Next x
    TransArr = tmpArr
End Function
bạn xem đoạn này có giúp gì được cho bạn không, trong Delphi ko có Redim
Mã:
begin
  k := 0;
  dArr := E.Range[Rangenguon].Value;
  lcol := VarArrayHighBound(dArr, 2);
  sArr := VarArrayCreate([0, VarArrayHighBound(dArr, 1), 0, lcol + 1],varVariant);
  for i := VarArrayLowBound(dArr, 1) to VarArrayHighBound(dArr, 1) do
  begin // duyet qua dong trong dArr
    k := k + 1; // bien k tang len 1
    for j := VarArrayLowBound(dArr, 2) to lcol do
    begin // duyet qua cot
      tmp := tmp + ' ' + String(dArr[i, j]);
      sArr[k, j] := dArr[i, j]; // dua vao sarr
    end; // j
    sArr[k, lcol + 1] := tmp;
    tmp := '';
  end;
end;
 
Upvote 0
Cảm ơn Bạn có lẻ làm đơ là do mấy dòng dưới
Nhờ Bạn chuyển dùm code sau sang Delphi dùm .... để mình hình dung ra cách duyệt mảng 2 chiều trong Delphi
Mình Có tìm google hoài nhưng nhiều trang nói mơ hồ quá ko hiểu
Xin cảm ơn
Mã:
Public Function TransArr(ByVal sArr As Variant) As Variant
    Dim tmpArr As Variant, x As Long, y As Long
    ReDim tmpArr(UBound(sArr, 2), UBound(sArr, 1))
    For x = 0 To UBound(sArr, 2)
        For y = 0 To UBound(sArr, 1)
            tmpArr(x, y) = sArr(y, x)
        Next y
    Next x
    TransArr = tmpArr
End Function

Nếu bạn xử lý mảng trong Delphi thì có 2 hướng.
1. Mảng truyền vào là từ một DLL tạo ra thì kiểu dữ liệu là dạng SafeArray. Loại này thì phải dùng hàm API của Windows và với bất kỳ ngôn ngữ lập trình nào làm việc đều khá rắc rối. Kể cả người làm phần mềm khá thành thạo nhưng làm việc với mảng dạng này cũng sẽ thấy khó. Bạn mới học thì chắc chắn là rất khó. Tuy nhiên bạn chịu khó tìm Google với từ khóa "SafeArray + Delphi". Kiến thức này không nên lao vào vội nếu là người mới học Delphi!!!

2. Là hàm xử lý mảng trong nội tại Delphi - Mảng tạo ra từ Delphi thì sẽ dễ hơn rất nhiều - Nó sẽ giống VBA
 
Upvote 0
Nếu bạn xử lý mảng trong Delphi thì có 2 hướng.
1. Mảng truyền vào là từ một DLL tạo ra thì kiểu dữ liệu là dạng SafeArray. Loại này thì phải dùng hàm API của Windows và với bất kỳ ngôn ngữ lập trình nào làm việc đều khá rắc rối. Kể cả người làm phần mềm khá thành thạo nhưng làm việc với mảng dạng này cũng sẽ thấy khó. Bạn mới học thì chắc chắn là rất khó. Tuy nhiên bạn chịu khó tìm Google với từ khóa "SafeArray + Delphi". Kiến thức này không nên lao vào vội nếu là người mới học Delphi!!!

2. Là hàm xử lý mảng trong nội tại Delphi - Mảng tạo ra từ Delphi thì sẽ dễ hơn rất nhiều - Nó sẽ giống VBA
ý câu 2 thì mình hiểu còn câu 1 đọc nhiều lắm mà chưa thấy trang nào có đáp án hay

Ý mình muốn viết 1 cái Hàm Chuyển mảng 2dArray chung nhất như hàm TransArr ấy trong *.dll và truyền mảng từ Excel vào

bạn xem đoạn này có giúp gì được cho bạn không, trong Delphi ko có Redim
Mã:
begin
  k := 0;
  dArr := E.Range[Rangenguon].Value;
  lcol := VarArrayHighBound(dArr, 2);
  sArr := VarArrayCreate([0, VarArrayHighBound(dArr, 1), 0, lcol + 1],varVariant);
  for i := VarArrayLowBound(dArr, 1) to VarArrayHighBound(dArr, 1) do
  begin // duyet qua dong trong dArr
    k := k + 1; // bien k tang len 1
    for j := VarArrayLowBound(dArr, 2) to lcol do
    begin // duyet qua cot
      tmp := tmp + ' ' + String(dArr[i, j]);
      sArr[k, j] := dArr[i, j]; // dua vao sarr
    end; // j
    sArr[k, lcol + 1] := tmp;
    tmp := '';
  end;
end;
1/ Mai rảnh mình sẻ thử cái khúc này xem ... vì coi nhiêu tài liệu nó cũng nói gần như vậy

2/ Mình chưa hình dung ra cách duyệt mãng 2 chiều trong Delphi tương tự như Hàm TransArr trên VBA

3/ Ý Mình truyền Tham số Arr() từ Range Excel vào là mảng 2 chiều xong nó duyệt và chuyển cái mảng đó

4/ Hàm đó phải bao quát nhất vì Mãng Arr() từ Excel truyền vào ko xác định số dòng hay cột nên mới khó đang tìm hoài chưa ra

5/ Nếu ok thì mình sẻ vận dụng cho công việc của mình nhiều thứ thay vì cứ như dòng sau hoài thấy mệt quá
Mã:
begin
For iCol := 0 to 9 do
 
Upvote 0
ý câu 2 thì mình hiểu còn câu 1 đọc nhiều lắm mà chưa thấy trang nào có đáp án hay

1/ Ý mình muốn viết 1 cái Hàm Chuyển mảng 2dArray chung nhất như hàm TransArr ấy trong *.dll và truyền mảng từ Excel vào
2/

1/ Mai rảnh mình sẻ thử cái khúc này xem ... vì coi nhiêu tài liệu nó cũng nói gần như vậy

2/ Mình chưa hình dung ra cách duyệt mãng 2 chiều trong Delphi tương tự như Hàm TransArr trên VBA

3/ Ý Mình truyền Tham số Arr() từ Range Excel vào là mảng 2 chiều xong nó duyệt và chuyển cái mảng đó

4/ Hàm đó phải bao quát nhất vì Mãng Arr() từ Excel truyền vào ko xác định số dòng hay cột nên mới khó đang tìm hoài chưa ra

5/ Nếu ok thì mình sẻ vận dụng cho công việc của mình nhiều thứ thay vì cứ như dòng sau hoài thấy mệt quá
Mã:
begin
For iCol := 0 to 9 do
Anh Tuân thì quá cao thủ rồi


Số cột không biết=VarArrayHighBound(dArr, 2);
Số dòng không biết =VarArrayHighBound(dArr, 1)
 
Upvote 0

Cái link của bạn thuyyeu99 trên là giúp các bạn hiểu cách vận hành của COM Add-in sẽ thấy bản chất hoạt động của nó. Nếu ai chưa hiểu thì cứ tải project đó về và thay tên ở các thành phần mình cần tạo là được. Còn nếu muốn ra nhanh add-in hơn nữa mặc dù chưa biểu bản chất thì dùng Add-in Express sẽ dễ dàng hơn rất nhiều.

Anh Tuân thì quá cao thủ rồi

Số cột không biết=VarArrayHighBound(dArr, 2);
Số dòng không biết =VarArrayHighBound(dArr, 1)

Cảm ơn bạn. Mình cũng tạm đủ dùng cho dự án đã và đang làm ấy :).

Đọc và tạo mảng theo chuẩn của OLE - tức là kiểu dữ liệu mảng của Windows API là PSafeArray rất phức tạp so với cách giải quyết trên VB6, VBA. Phải dùng một đống hàm API mới làm được. Mình hơi ngán khi bạn nào mới tiếp cận Delphi chơi ngay món này vì không biết giải thích thế nào cho có đầu cuối. Bạn nào lang thang trên mạng vô tình vào box Delphi này khéo chạy mất dép vì mới học Delphi mà làm phức tạp ghê người :).

Ví dụ sau của bạn thuyyeu99 là đọc và tạo mảng 2D, kiểu dữ liệu các phần tử mảng là VARIANT . Nhưng mình đang nghi ngờ dòng lệnh màu đỏ không biết chạy không vì mình chưa test.

Mã:
begin
  k := 0;
  dArr := E.Range[Rangenguon].Value;
  lcol := VarArrayHighBound(dArr, 2);
  sArr := VarArrayCreate([0, VarArrayHighBound(dArr, 1), 0, lcol + 1],varVariant);
  for i := VarArrayLowBound(dArr, 1) to VarArrayHighBound(dArr, 1) do
  begin // duyet qua dong trong dArr
    k := k + 1; // bien k tang len 1
    for j := VarArrayLowBound(dArr, 2) to lcol do
    begin // duyet qua cot
      tmp := tmp + ' ' + String(dArr[i, j]);
      sArr[k, j] := dArr[i, j]; // dua vao sarr
    end; // j
    sArr[k, lcol + 1] := tmp;
    tmp := '';
  end;
end;
 
Upvote 0
bạn xem đoạn này có giúp gì được cho bạn không, trong Delphi ko có Redim
Mã:
begin
  k := 0;
  dArr := E.Range[Rangenguon].Value;
  lcol := VarArrayHighBound(dArr, 2);
  sArr := VarArrayCreate([0, VarArrayHighBound(dArr, 1), 0, lcol + 1],varVariant);
  for i := VarArrayLowBound(dArr, 1) to VarArrayHighBound(dArr, 1) do
  begin // duyet qua dong trong dArr
    k := k + 1; // bien k tang len 1
    for j := VarArrayLowBound(dArr, 2) to lcol do
    begin // duyet qua cot
      tmp := tmp + ' ' + String(dArr[i, j]);
      sArr[k, j] := dArr[i, j]; // dua vao sarr
    end; // j
    sArr[k, lcol + 1] := tmp;
    tmp := '';
  end;
end;
Mình mới Copy code vào Build 1 cái nó báo lỗi dòng sau và cái Biến E là gì ko hiểu lắm ... Mong bạn giải thích dùm
Mã:
dArr := E.Range[Rangenguon].Value;
exc.PNG
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mới Copy code vào Build 1 cái nó báo lỗi dòng sau và cái Biến E là gì ko hiểu lắm ... Mong bạn giải thích dùm
Mã:
dArr := E.Range[Rangenguon].Value;
View attachment 204429
khai bao
uses Excel2000

Var
E:OLEVariant;



trong vode chay

try
E := GetActiveOleObject('Excel.Application');

ShowMessage('ok');
except
ShowMessage('kiem tra lai');
end;
 
Upvote 0
khai bao
uses Excel2000

Var
E:OLEVariant;



trong vode chay

try
E := GetActiveOleObject('Excel.Application');

ShowMessage('ok');
except
ShowMessage('kiem tra lai');
end;
vẫn thế nó thoát luôn file Excel
Mình mới tập tành Delphi mò code bạn gọi ý vậy nhiều khi ko biết chi luôn
làm phiền bạn cho xin cái Hàm đó hoàn chỉnh xem thì mình sẻ hình dung ra cách thức duyệt mảng 2dArray à
xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
uses Excel2000;
var  E:OLEVariant;


function TransArr(ssArr: OleVariant): OleVariant;
var
    tmpArr: OleVariant;
    x, y,lcol: integer;
begin
  lcol := VarArrayHighBound(ssArr, 2);
  tmpArr := VarArrayCreate([0, VarArrayHighBound(ssArr, 1), 0, lcol + 1],varVariant);
    for x:=VarArrayLowBound(ssArr, 2) to VarArrayHighBound(ssArr, 2) do begin
        for y:=VarArrayLowBound(ssArr, 1)  to VarArrayHighBound(ssArr, 1) do begin
            tmpArr[y, x] := ssArr[y, x];
        end; // y
    end; // x
    Result := tmpArr;
end;

procedure TForm1.Button22Click(Sender: TObject);
var tmpArr2: OleVariant;
begin
   try
    E := GetActiveOleObject('Excel.Application');

  except
   ShowMessage('khong lay duoc excel ?');
  end;
   tmpArr2:=TransArr(E.Range['A1:C5'].Value);
ShowMessage('lcol'+tmpArr2[1,1]);
ShowMessage('LowBound 2  '+IntToStr(VarArrayLowBound(tmpArr2,2)));
ShowMessage('HighBound 2  '+IntToStr(VarArrayHighBound(tmpArr2,2)));
end;
Bài đã được tự động gộp:

Mã:
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    E := GetActiveOleObject('Excel.Application');
  except
    try
    ShowMessage('Tao moi ?');
      E := CreateOleObject('Excel.Application');
    except
      ShowMessage('khong the tao ?');
      Exit;
    end;
  end;
  if not VarIsEmpty(E) then begin
    E.Visible := true;
    E.Workbooks.Add();
end;
end;

bạn tạo Project.exe test cho lẹ

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,ComObj,Excel2000, Vcl.StdCtrls,Math,
Vcl.ComCtrls, DateUtils, System.StrUtils;
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
uses Excel2000;
var  E:OLEVariant;


function TransArr(ssArr: OleVariant): OleVariant;
var
    tmpArr: OleVariant;
    x, y,lcol: integer;
begin
  lcol := VarArrayHighBound(ssArr, 2);
  tmpArr := VarArrayCreate([0, VarArrayHighBound(ssArr, 1), 0, lcol + 1],varVariant);
    for x:=VarArrayLowBound(ssArr, 2) to VarArrayHighBound(ssArr, 2) do begin
        for y:=VarArrayLowBound(ssArr, 1)  to VarArrayHighBound(ssArr, 1) do begin
            tmpArr[y, x] := ssArr[y, x];
        end; // y
    end; // x
    Result := tmpArr;
end;

procedure TForm1.Button22Click(Sender: TObject);
var tmpArr2: OleVariant;
begin
   try
    E := GetActiveOleObject('Excel.Application');

  except
   ShowMessage('khong lay duoc excel ?');
  end;
   tmpArr2:=TransArr(E.Range['A1:C5'].Value);
ShowMessage('lcol'+tmpArr2[1,1]);
ShowMessage('LowBound 2  '+IntToStr(VarArrayLowBound(tmpArr2,2)));
ShowMessage('HighBound 2  '+IntToStr(VarArrayHighBound(tmpArr2,2)));
end;
Bài đã được tự động gộp:

Mã:
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    E := GetActiveOleObject('Excel.Application');
  except
    try
    ShowMessage('Tao moi ?');
      E := CreateOleObject('Excel.Application');
    except
      ShowMessage('khong the tao ?');
      Exit;
    end;
  end;
  if not VarIsEmpty(E) then begin
    E.Visible := true;
    E.Workbooks.Add();
end;
end;

bạn tạo Project.exe test cho lẹ

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,ComObj,Excel2000, Vcl.StdCtrls,Math,
Vcl.ComCtrls, DateUtils, System.StrUtils;
Không biết nói gì hơn ... tuyệt vời 1 cái hàm đó giảm đi bao nhiêu code khi làm việc với mảng và quan trọng nhất là mình hình dung ra cách duyệt Mảng trong Delphi mà viết các hàm khác nữa khi làm việc với ADO & DAO lấy dữ liệu từ TableName Access lên mảng tính toán vvv...
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh mới test lại các kiểu thì thấy hàm đó viết lộn một chút Mạnh điều chỉnh lại như sau mới chạy OK khi ta sử dụng ADO lấy dữ liệu từ 1 Sheet vào Mảng sử dung Phức thức GetRows ... xong dùng hàm chuyển mảng gán lên Range
Mã:
function TransArr(ssArr: OleVariant): OleVariant; stdcall;
var
    tmpArr    : OleVariant;
    x, y    : integer;
    lcol,lRows  : integer;
begin
  lcol := VarArrayHighBound(ssArr, 2); //Cot
  lRows := VarArrayHighBound(ssArr, 1); //dong
  tmpArr := VarArrayCreate([1, lcol + 1, 1, lRows + 1],varVariant);
    for x:= 0 to lcol do begin
        for y:= 0  to lRows do begin
            tmpArr[x + 1, y + 1] := ssArr[y, x];
        end; // y
    end; // x
    Result := tmpArr;
end;
Mô tả sơ bộ 1 chút
1/ Nếu ta ko + thêm 1 trong hàm thì khi lấy lên ta phải cộng thêm 1 khi Resize
Mã:
Range("A2").Resize(UBound(dArr, 1) + 1, UBound(dArr, 2) + 1) = dArr
2/ Còn nếu ta đã cộng thêm 1 trong Hàm TransArr thì khi ta lấy lên gán dữ liệu ko + thêm 1 nữa
Mã:
Range("A2").Resize(UBound(dArr, 1), UBound(dArr, 2)) = dArr
3/ 1 ở đây là 1 cột và 1 dòng

Cảm ơn thuyyeu99 Viết cho Mạnh cái Hàm hay và hay hết tất cả là Mạnh biết xài mảng 2dArray trong Delphi
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh mới test lại các kiểu thì thấy hàm đó viết lộn một chút Mạnh điều chỉnh lại như sau mới chạy OK khi ta sử dụng ADO lấy dữ liệu từ 1 Sheet vào Mảng sử dung Phức thức GetRows ... xong dùng hàm chuyển mảng gán lên Range
Mã:
function TransArr(ssArr: OleVariant): OleVariant; stdcall;
var
    tmpArr    : OleVariant;
    x, y    : integer;
    lcol,lRows  : integer;
begin
  lcol := VarArrayHighBound(ssArr, 2); //Cot
  lRows := VarArrayHighBound(ssArr, 1); //dong
  tmpArr := VarArrayCreate([1, lcol + 1, 1, lRows + 1],varVariant);
    for x:= 0 to lcol do begin
        for y:= 0  to lRows do begin
            tmpArr[x + 1, y + 1] := ssArr[y, x];
        end; // y
    end; // x
    Result := tmpArr;
end;
Mô tả sơ bộ 1 chút
1/ Nếu ta ko + thêm 1 trong hàm thì khi lấy lên ta phải cộng thêm 1 khi Resize
Mã:
Range("A2").Resize(UBound(dArr, 1) + 1, UBound(dArr, 2) + 1) = dArr
2/ Còn nếu ta đã cộng thêm 1 trong Hàm TransArr thì khi ta lấy lên gán dữ liệu ko + thêm 1 nữa
Mã:
Range("A2").Resize(UBound(dArr, 1), UBound(dArr, 2)) = dArr
3/ 1 ở đây là 1 cột và 1 dòng

Cảm ơn thuyyeu99 Viết cho Mạnh cái Hàm hay và hay hết tất cả là Mạnh biết xài mảng 2dArray trong Delphi

Nếu bạn nhận mảng từ GetRows rồi sau đó lại tạo mảng để lưu mới là mất 2 lần làm việc tốc độ sẽ chậm. Giải pháp là không dùng GetRows mà hãy duyệt từng dòng của Recordset rồi lấy vào mảng luôn tốc độ sẽ nhanh.
 
Upvote 0
Web KT
Back
Top Bottom