Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
Mình nhớ không lầm hình minh co lang thang trên mạng tìm hiểu thì thấy có bài chỉ cách tạo DLL cho excel bằng Delphi ấy, tự mình không quan tâm nên không có lưu về, bạn thử tìm xem minh nhớ là có đó.
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.
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
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.
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
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.
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
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;
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
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
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;
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.
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;
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;
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
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;
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;
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...
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ạ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
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.