Đâ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.
Ai rảnh thì vô mà dòm coi nó Sao: Delphi Tips
Mạnh nói xong quên liền mai mốt lại nhớ .. xong lại quên ... khi nhớ lại là nhớ rất chi là lâu ... Lưu vào đây cho tiện
Làm xong lâu rồi, mà nó ảnh hưởng tốc độ Group chưa tìm ra hướng giải quyết, (có thời gian em bận việc nhà bỏ bê từ đó tới giờ. Hiện tại bây giờ em chưa bắt kịp nhịp độ hhiiiii)
Làm xong lâu rồi, mà nó ảnh hưởng tốc độ Group chưa tìm ra hướng giải quyết, (có thời gian em bận việc nhà bỏ bê từ đó tới giờ. Hiện tại bây giờ em chưa bắt kịp nhịp độ hhiiiii)
Lâu nay mạnh cũng bận lắm lu xu bu đủ việc ... nhớ Code két vào GPE à ơi tẹo đó mà
mấy ngày trước lang thang trên Google tìm ra cái Help đó cho Excel đang coi thấy có đủ thứ hết ... lưu sử dụng khi cần thiết quên lại mở ra coi như cẩm nang cơ bản vậy... nhiều lúc nghĩ có 1 dòng code mò cả tháng mới ra thấy vãi kinh
Coi thấy VBA và Delphi code nó gần gủi ghê
Mã:
Sub VBA()
Range("A1:C10").Interior.PatternColor = RGB(255, 0, 0)
End Sub
Sub Delphi()
Range['A1', 'C10'].Interior.PatternColor := RGB(255,0,0);
End Sub
Sub VBA()
Range("A1:C10").Interior.PatternColor = RGB(255, 0, 0)
End Sub
Sub Delphi()
Range['A1', 'C10'].Interior.PatternColor := RGB(255,0,0);
End Sub
procedure Delphi()
begin
Range['A1:C10', EmptyParam].Interior.PatternColor := RGB(255,0,0);
end;
Class RANGE trong Excel có hai tham số, phần lớn mọi người chỉ biết đến tham số thứ nhất, trong VBA tham số thứ hai được bỏ qua nếu không khai báo. Nhưng trong Delphi nó không bỏ qua vì thế phải đưa vào EmptyParam. Vẫn có cách bỏ qua nếu dùng thông qua biến OleVariant.
Bác Tuân nói mình mới để ý tới vụ missing param này. Trước giờ cứ nghĩ thằng VBA compiler nó thông minh, với các hàm có tham số Optional hay ParamArrays thì khi gọi, tùy hàm truyền tham số thế nào nó sẽ push stack thế ấy chứ. Còn gọi xuống API của C/C++ dll thì sao ? Xem trong VBEx.dll, vd hàm InStr thôi thì lại thấy 1 mớ pVariant truyền vào.
Hì hì, xem kỹ, debug ra ngoài vào VBA thì phát hiện ra, ông ta truyền tất tần tật, optional, params array mà coder không gõ tường mình thì ông VBA cũng truyền tường minh pVariant với field vt = VT_MISSING luôn (= VBA IsMissing) hết. Nói chung là đầy đủ, chả có lợi hơn tẹo nào.
Với keyword ParamArray như của hàm Array (rtcArray in VBEx.dll) thì VBA truyền xuống pointer to 1 Variant chứa array của các Variant nhé (SAFEARRAY of VARIANT field).
Lập trình tạo XLL Add-in cho Excel bằng Delphi giúp tạo các hàm chạy tốc độ chiêu nhanh và bảo mật. C/C++, Delphi được biết đến là ngôn ngữ lập trình hay trình biên dịch ra mã máy (Native code) nên tốc độ rất nhanh (không tính đến thuật toán). Sản phẩm XLL Add-in này mình đã tạo ra từ rất nhiều...
www.giaiphapexcel.com
Mấy ngày nay khi nào rảnh Mạnh tìm tài liệu hay code mẫu trên Delphi cũng bắt trước làm theo 1 cái mà thấy quá khó luôn
Tìm trên Google thì thấy người ta toàn viết C/c++ Or DNA ... vvv còn tài liệu hay code mẫu trên Delphi rất ít
mà thấy họ hướng dẫn kiểu nữa vời vậy coi tới lui vẫn tịt toàn tập luôn ...
vậy Mạnh muốn hỏi bạn nào biết chỉ dùm mạnh chỉ cơ bản như sau:
1/ khai báo trong Delphi làm sao khi mình Build *.XLL xong thì check trên Excel nó load vào luôn và ngược lại khi Uncheck nó
2/ Viết 1 cái hàm đơn giản như GetSum() trong *.XLL khi load trên Excel Gõ =Getsum() là nó chạy ok
Với mong muốn rất cơ bản và đơn giản vậy ai biết chỉ dùm ( nếu có code mẫu trên Delphi càng tốt hay tài liệu chỉ dùm )
Xin cảm ơn
Mạnh đã viết được Add-ins trên Delphi *.XLL chạy rất tốt ........... Trân trọng thông báo với cả nhà vậy
Ai thích nghiên cứu vào link bài #869 nghiên cứu kỹ nhiều bài trong đó là viết ok ....
Nó quá đơn giản luôn .... trong đó nó chỉ cà Viết Menu Ribbon đó he ....
Google như tàng kinh các vậy .... chia sẻ link đó ai có đam mê là viết quá ngon luôn ko Phải C/c++ Or DNA làm cái chi cho mệt
Em Cảm ơn Anh ... Em ko ngờ nó dễ thế ... giờ cứ thế mà triển khai code thôi Anh
trong link đó nó chỉ cả tạo Menu Ribbon nữa đó .... Google mà nó như tàng kinh các vậy
Trong VBA có hàm TypeName() để lấy tên của class hay tên của lớp khai báo control hay các object. Khi các bạn lập trình Delphi cho Excel muốn dùng hàm TypeName không thể được vì nó không cùng môi trường VBA. Giải pháp chúng ta phải biết hàm API nào trong thư viên VBAxxx xuất nó ra đồng thời phải biết tham số để sử dụng. Chúng ta thực sự khó nếu không có tài liệu cung cấp từ nhà lập trình ra vbaxxx.
Nhân chủ đề Undocument API VBA ở bài số #10 tại đây
Cái laptop hư lâu lắc, phải gởi vào thành hồ chứa mưa sữa, mới lấy về. Nên quay lại tiếp với cái gọi là "rờ chxx em" Windows và VBA. Topic này tui sẽ đăng lần lượt những gì cu anh tui phát hiện ra trong quá trình "rờ em" Windows API, DLLs và VBAxxx.dll. Các tips, tricks này sẽ bảo đảm không có...
www.giaiphapexcel.com
Code mà bác CU Anh moi ra nó là C và rất phức tạp đây:
Điều quan trọng là bác @ThangCuAnh đã giúp lấy được tên hàm API của hàm TypeName cùng prototype, tôi viết lại code để chúng ta dùng trong Delphi như sau.
1. Các bạn thao khảo cách dùng bên VB/VBA (mang tính học tập vì trong VBA hàm TypeName đã có.
Option Explicit
#If VBA7 Then
Declare PtrSafe Function rtcTypeName Lib "VBE7.DLL" (v As Variant) As String
#Else
Declare Function rtcTypeName Lib "VBE6.DLL" (v As Variant) As String
#End If
Sub TestTypeNameAPI()
Dim sName As String
sName = rtcTypeName(ActiveCell)
MsgBox StrConv(sName, vbFromUnicode)
End Sub
2. Cách khai báo API hàm rtcTypeName() để dùng trong Delphi. Nếu chúng ta tạo Add-in thì đây là tư liệu quý.
Code dưới đây tôi viết trong chương trình chính dạng Console (màn hình đen trắng). Các bạn làm trình tự như sau.
1. Từ Delphi, tạo application dạng Console (nếu ai có add-in rồi thì chỉ cần code chính của nó).
2. Paste đoạn code dưới đây.
3. Chạy Excel với quyền "Run as administrator"
4. Chạy progam trong Delphi (F9)
Mã:
program Test_VBA_API.dproj;
//This code call function API in VBAxxx "rtcTypeName()". In VBA its name is TypeName()
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
ComObj,
System.Variants;
type
TFuncVBAPI_rtcTypeName = function(var v: OleVariant): PWideChar; stdcall;
var sName: WideString;
h: HMODULE;
pFunc: TFuncVBAPI_rtcTypeName;
App: OleVariant;
v: OleVariant;
begin
try
App := GetActiveOleObject('Excel.Application');
Writeln('Ung dung da ma la', ': ', App.Name);
h := LoadLibrary('C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7\VBE7.DLL');
try
pFunc := GetProcAddress(h, 'rtcTypeName');
v := App.ActiveCell;
sName := PWideChar(TFuncVBAPI_rtcTypeName(pFunc)(v));
Writeln('Gia tri bien la', ': ', sName);
finally
FreeLibrary(h);
App := Unassigned;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Vì mình dùng hàm TypeName trong DLL nên bắt buộc phải loadlibrary mới lấy được con trỏ hàm đó. Nếu tự viết hàm này đùng như TypeName mình chưa tự viết được
Phải kiểm tra xem thằng lạ ở ngoài load nó chịu lên kg, DllMain nó return False là xong. Đồ MS nó khôn, quái lắm. Vì nó được viết riêng để dùng cho Office.
Mà load lên được chắc gì nó chạy đúng kg, vì nó có share, set chung gì với apps Office thì sao ?
khổ ghê chưa biết chi đang mò mà thằng nào cười thằng đó như con bò ... mới sinh ra có thằng nào ăn bắp ngay được ... bú sữa đã xong mới ăn cơm chứ quy luật lẻ thường vậy mà ko hiểu thì ko = con Bò
Lập trình XLL tài liệu C/C++ thì Microsoft có và update bản mới nhất. Các bạn muốn tự tay làm trên Delphi thì cần học C/C++ rồi viết lại trên Delphi. Và món này không dễ ăn như lập trình trên VCL đâu. Trong Delphi phải hiểu lập trình hàm API, kiểu dữ liệu, đặc biệt pointer,