Mã nguồn Add-Ins *.xll trên Delphi cho Excel (1 người xem)

Liên hệ QC

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

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,133
Giới tính
Nam
1/ Thông qua 1 người bạn trên GPE này cho Tôi file dXLCall.pass đã chuển từ C++ qua

2/ Trước khi úp lên đây tôi cũng đã hỏi ý kiến có nên công bố hay ko thì họ đồng ý công bố úp cho ai cần thì sử dụng nó

3/ để sử dụng nó các bạn vào linh sau tải các file mẫu về sử dụng trên đó là File DCU xóa đi và thay 2 file tôi úp phía dưới vào là sử dụng

4/ còn quá trình code để sử dụng được hay ko thì phụ thuộc vào chính các bạn

5/ Tham khảo chỉ dẫn của Ms

Chúc ai đó yêu thích Delphi viết thành công xll trên Delphi
 

File đính kèm

Năm mới ai có đam mê Delphi muốn chinh phục xll của chủ đề này ... thì vào đây ta bàn chuyện

1/ Khó nhất là xuất hàm Call nó cho sự kiện trên Cells
2/ tạo XML xuất Menu Ribbon cho Excel
.....
Chinh phục thành công 2 mục trên viết Addins là ngon nhất mà ko cần đăng ký sử dụng với Windows ... chỉ Add vào là dùng

Anh @UltraExcel + ... mà chịu hổ trợ khai thông dòng chảy ... Tôi tin là ta làm được ... khó và rất khó cái khai hoang này thôi :p:D

Trên này tôi biết hết đấy có điều nói Or không thôi :::"""><
 
Lần chỉnh sửa cuối:
Em tạo addin xll bằng C++, chuyển qua máy cài Visual Studio mới dùng được, còn máy k có Visual Studio là lỗi luôn
còn call trong vba chưa thử. E cũng có thử tạo xll bằng delphi qua video của a Tuân hướng dẫn mà hoàn toàn không thành công :unknw:
 
Em tạo addin xll bằng C++, chuyển qua máy cài Visual Studio mới dùng được, còn máy k có Visual Studio là lỗi luôn
còn call trong vba chưa thử. E cũng có thử tạo xll bằng delphi qua video của a Tuân hướng dẫn mà hoàn toàn không thành công :unknw:
trên Delphi viết xll xong là dùng ok ngay và luôn ko lệ thuộc cái gì của ai cả

còn xem video làm theo đó xem lại xem cái Class đặc biệt quan trọng họ dấu rồi ... chính cái đó đã khởi tạo cho hết đấy

nên làm theo tới tết công gô cũng không xong đâu ... trừ khi abcdzzzzzzzzzzzzzzzzzzz
 
trên Delphi viết xll xong là dùng ok ngay và luôn ko lệ thuộc cái gì của ai cả

còn xem video làm theo đó xem lại xem cái Class đặc biệt quan trọng họ dấu rồi ... chính cái đó đã khởi tạo cho hết đấy

nên làm theo tới tết công gô cũng không xong đâu ... trừ khi abcdzzzzzzzzzzzzzzzzzzz
thời gian tới e tìm xem nguyên nhân ở đâu, còn viết bằng delphi không lại a ạ
abcdzzzzzzzzzzzzzzzzzzz = money thần chưởng rồi a, công sức họ vọc mà
 
Tôi chỉ nói lên sự thật thôi còn không nói bạy nha

Cứ xem Video link sau và làm theo chỉ dẫn cuối cuộc đời cũng ko bao giờ viết cho nó chạy cả .... trừ khi ........................:p:p:p:p


Liên kết: https://youtu.be/xQlEX2mBrd8
 
Tôi chỉ nói lên sự thật thôi còn không nói bạy nha

Cứ xem Video link sau và làm theo chỉ dẫn cuối cuộc đời cũng ko bao giờ viết cho nó chạy cả .... trừ khi ........................:p:p:p:p


Liên kết: https://youtu.be/xQlEX2mBrd8
em thử tận 3 lần lận, cứ nghĩ mình gà mờ chỗ nào, thành ra vậy haha :yahoo:
em làm bằng C++ chạy cái 1, viết code nó dài hơn bình thường thôi anh ạ
 
thời gian tới e tìm xem nguyên nhân ở đâu, còn viết bằng delphi không lại a ạ
abcdzzzzzzzzzzzzzzzzzzz = money thần chưởng rồi a, công sức họ vọc mà
Tính ra tôi cũng ko muốn nói thẳng toẹt ra đâu .... Vì bài số 3 nói cái hình chụp tô màu đen nên thôi mới nói thôi

1674727058343.png

Vui lòng ko ai nhắc lại nữa kẻo lại ồn ào heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
 
@Kiều Mạnh e cũng dùng C++/C# là nhiều để làm việc rồi
tốc độ và hiệu quả k thua kém delphi, ok a ạ
 
@Kiều Mạnh e cũng dùng C++/C# là nhiều để làm việc rồi
tốc độ và hiệu quả k thua kém delphi, ok a ạ
c++ Or Delphi tốc độ gần như nhau ............. có điều c++ tự học quá khó các kiểu

Rảnh tôi vẫn đọc c++ đấy ... có điều chỉ xem hướng code của họ thôi còn lại cơ bản tịt toàn tap6

có 1 điều Viết C/c++ còn phải xem ai viết nó .... nếu gà mờ họ vẫn dịch ngược ok .... còn Delphi gần như tịt ko cần pack mà chỉ cần viết các hàm kế thừa

Nó call nhau lằng là ok ( Còn Crack là khác đừng đánh lộn nó ở đây )

Thôi dừng bà tám ở đây ... làm loãng vậy thôi ko nó lại vào bà Tám ... Quay lại với mục đích và định hướng bài số 2
 
Lần chỉnh sửa cuối:
Tôi chỉ nói lên sự thật thôi còn không nói bạy nha

Cứ xem Video link sau và làm theo chỉ dẫn cuối cuộc đời cũng ko bao giờ viết cho nó chạy cả .... trừ khi ........................:p:p:p:p


Liên kết: https://youtu.be/xQlEX2mBrd8
Video hướng dẫn rõ thế mà?
Thiếu cái gì thì bạn hỏi người đăng share cho?
Muốn control excel từ bên ngoài thì trước hết bạn phải xác định chính xác cửa sổ mà bạn muốn làm việc, gọi là phân lớp cửa sổ (subclassing windows), với excel thì EXCELapp->XLMAIN->XLDESK->EXCEL7,...
và viết các hàm để làm việc với từng cái.
Đó là theo suy luận logic của mình, (PS: mình không là Programmer), nên có gì thông cảm.
 

File đính kèm

  • image002.png
    image002.png
    245.7 KB · Đọc: 41
How to add ribbon and task pane to xll?

Pyxll seems to be able to do it, but what about DELPHI
Bạn xem mọi cái đã có hết trong bài #1 rồi

Còn lại là Bạn viết thêm vào đó như thế nào thôi

1/ Trong COM DLL thì Tôi viết xml cho Ribbon Menu quá đơn giản .. sau 3 to 10 giây là xong

2/ còn trong cấu trúc xll nó khác chính vì thế tôi mới khôi phục lại chủ đề này và tìm kiếm ai đó có đam mê khai thác nó

như mô tả bài Số #2
 
Lần chỉnh sửa cuối:
Excel4v in C Api can customize the Excel2003 menu, which can run in MS Excel207-2021, but cannot customize the ribbon
Cái khó nhất thì họ làm cho rồi ... phần còn lại tùy thuộc vào khả năng của chính bạn thôi ... Cái Ribbon Menu đó Tôi viết thêm vào được nhưng nó mất quá nhiều thời gian của tôi nên tôi không có làm nữa mà đang tìm giải pháp khác nhanh và hiệu quả hơn thay thế nó
 
1. It is easy to write ribbon xml to implement callback functions in Com dll. You can also add descriptions for Excel custom functions in com dll. Unfortunately, I haven't implemented them.

2. For example, Excel dna and Pyxll can implement Excel function prompts. You can also customize the ribbon and task pane
1/ Mục số 1 của bạn tôi làm trong 10 giậy

2/ Mục số 2 của bạn với Tôi không cần thiết ... Vì Tôi viết được nhiều thứ tương tự trên Delphi rồi

3/ Tại sao tôi nói thiết kế Ribbon Menu trong 10 giây ... Vì Tools Sau Tôi với 1 người bạn trên GPE này tạo ra nó .... thiết kế cho ( VBA - VB6 - Delphi = 3 trong 1)

Chỉ nhanh tay bấm chuột vài cái là xong ... Xem hình và tự hình dung ra nó

1675056154130.png
 
Lần chỉnh sửa cuối:
Excel4v in C Api can customize the Excel2003 menu, which can run in MS Excel207-2021, but cannot customize the ribbon
bác chia sẻ ít code addin viết bằng c api cho e xem được k?
Bài đã được tự động gộp:

Cái khó nhất thì họ làm cho rồi ... phần còn lại tùy thuộc vào khả năng của chính bạn thôi ... Cái Ribbon Menu đó Tôi viết thêm vào được nhưng nó mất quá nhiều thời gian của tôi nên tôi không có làm nữa mà đang tìm giải pháp khác nhanh và hiệu quả hơn thay thế nó
Cái này viết được qua VSTO a ạ, e thấy nó hoạt động khá tốt với dữ liệu nhỏ
 
bác chia sẻ ít code addin viết bằng c api cho e xem được k?
Bài đã được tự động gộp:


Cái này viết được qua VSTO a ạ, e thấy nó hoạt động khá tốt với dữ liệu nhỏ
Thấy cái hình to phía trên không ... dùng mọi cái theo mặc định của Ms kể cả ICON ... bấm vài cái là xong nó xuất ra XML xong Copy cho vào Hàm trong Delphi Builder phát xong
 
@Kiều Mạnh
How to get the Excel application in XLL, just like the Excel application in Com Dll。thank you!
Mọi cái đã có ở bài số #1 Rồi bạn chỉ điều chỉnh viết thêm hàm và Ribbon Menu cho nó nữa là xong

điều đó có thực hiện được hay không thì phụ thuộc vào chính khả năng của bạn

Với Tôi thừa sức làm tuy nhiên chi phí mất quá nhiều thời gian cho nó và rất lâu ... Ví dụ bài #17 Tôi có nói viết COM DLL trên Delphi tạo XML cho Ribbon Menu tôi chỉ thao tác 10 giây ... còn Áp dụng cho XML của bài số #1 là điều không thể

Hy Vọng Bạn thể hiện khả Năng của bạn cho tôi xem 1 chút dù nhỏ nhoi thôi thì Tôi cũng muốn xem 1 lần cho biết ???!!!!
 
quay lại chủ đề này hãy chia nhỏ vấn đề ra xong hỏi ChatGPT nó chỉ dẫn cho là viết các hàm nhỏ lẻ sử dụng tốt

Nó chỉ dẫn cho tùy trường hợp có thể sử dụng được luôn có trường hợp đạt 90 % cơ bản nó cho ta hướng code và dựa vào đó mà viết là ok

Cái khó nhất là chuyển dXLCall Từ C/c++ qua Delphi họ viết cho rồi chi tiết và mô tả bài số #1

Còn ta có Mút được hay không thì đó điều đó phụ thuộc chính khả năng của chúng ta :p

Có lẽ Tôi chỉ đóng vai trò là hướng dẫn và vẽ đường cho hươu chạy ...
kể cả không vẽ thì hươu vẫn chạy đó là tự nhiên vốn có của nó thượng đế sinh ra muôn loài tự thân nó đã thế

nên Tôi vẽ cho thì nó chạy nhanh hơn tí thôi và cho hướng đi tốt hơn 1 tí tẹo vậy

Còn chạy được hay không qua câu nói của Tôi và chatGPT nói lên điều đó

1676952814081.png
 
Lần chỉnh sửa cuối:
MSDN Excel XLL API quá ít tài liệu phát triển, lệnh Excel không có tài liệu tham khảo, rất khó để sử dụng các thuộc tính và phương pháp Excel
 
MSDN Excel XLL API quá ít tài liệu phát triển, lệnh Excel không có tài liệu tham khảo, rất khó để sử dụng các thuộc tính và phương pháp Excel
Không phải là ít mà nhiều đấy.. có điều nó chỉ dẫn bao quát theo tổng thể mà khả năng của ta chưa nhận ra thôi

trên Delphi cũng vậy nguồn Server + Client có ngay trên chính máy tính của ta khi cài chọn Samples nhưng vận dụng nó thì phải mất nhiều thời gian ngâm cứu thôi

tải file bài số 1 viết vài hàm nhỏ lẻ 1 tham số là ok... xong dò lên 2,3 hay n+1 tham số xem sao
Bài đã được tự động gộp:

xem cái Ribbon cho Excel hay nguyên bộ Office của bài số 14 là thấy... không có ai chỉ dẫn + tài liệu cả.. nhưng tôi dò ra xong kết hợp với Tân viết ra 1

Tools tự dộng tạo menu Ribbon cho nguyên bộ Office trên Delphi sử dụng ngay mã trên VBA thôi ... tìm nát Google không có ra cái thứ 2 đâu

mọi cái dò đi là ra thôi --=0
 
Lần chỉnh sửa cuối:
xlcall.h có nhiều lệnh nhưng không biết sử dụng trong Excel4V như xlcPageSetup, xlcNewWindow .....................
 
không đi đâu về đâu cả ... cuốn theo chiều gió thôi --=0--=0--=0

Rảnh tôi đang nghiên cứu cái DataSnap chạy đa tầng, đa dịch vụ trên Web Server xong thì nó xử lý mọi thứ. nếu thích xuất hàm qua Excel khai báo một

hàm trung gian xong chỉ call nó chạy vèo vèo ... thay vì cố với cái xll làm chi cho nhọc xác ra _+)(9
 
  • Thích
Reactions: A-T
File dXLCall.pas tác giả port có lỗi, build trên 64bit té hổng cẳng đó. Tìm khùng luôn.
 
Port từ 2012, chưa có Delphi x64

1697518975118.png
 
chính xác là vậy ..

Khó nhất là dựa vào đó viết 1 class tùy chỉnh liên kết sử dụng cho hàm với nhiều tham số

còn khai báo thủ công theo chỉ dẫn của Ms sẻ rất khó cho ai đó mới tập tành sử dụng nó

nếu ai đó thích hay có nhu cầu tôi sẻ úp tiếp file tạo Menu Ribbon cho Delphi lên cho tham khảo thêm như mô tả bài số 14

File đo tân thành viên GPE viết còn phần XML cho Delphi + VB6 do Tôi kết hợp với Tân Viết sẻ hổ trợ tạo menu Ribbon trên VBA + VB6 + Delphi = 3 trong 1
 
  • Thích
Reactions: A-T
chính xác là vậy ..

Khó nhất là dựa vào đó viết 1 class tùy chỉnh liên kết sử dụng cho hàm với nhiều tham số

còn khai báo thủ công theo chỉ dẫn của Ms sẻ rất khó cho ai đó mới tập tành sử dụng nó

nếu ai đó thích hay có nhu cầu tôi sẻ úp tiếp file tạo Menu Ribbon cho Delphi lên cho tham khảo thêm như mô tả bài số 14

File đo tân thành viên GPE viết còn phần XML cho Delphi + VB6 do Tôi kết hợp với Tân Viết sẻ hổ trợ tạo menu Ribbon trên VBA + VB6 + Delphi = 3 trong 1
Cứ upload lên ai cần thì họ dùng, họ cảm ơn. Còn đây thì chỉ thấy Úp - Mở thôi.
Trong ngôn ngữ lập trình Pascal thì phải, thấy họ viết như thế lày:

unit ExcelApp.MenuButton.pas;

interface

uses Office2000_TLB, ExcelApp.EventSink;

type
TMenuButton = class(TObject)
private
FID: string;
FButton: _CommandBarButton;
FSink: TEventSink;
FCookie: Integer;
FClickProc: TClickProc;
public
constructor Create(const Parent: CommandBarPopup; const strID: string; const strCaption:
string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions); overload;

constructor Create(const Parent: CommandBar; const strCaption: string; const EventHandler:
TClickProc; const MenuOptions: TMenuOptions); overload;
destructor Destroy; override;
property Button: _CommandBarButton read FButton;
property ID: string read FID default 0;
property ClickProc: TClickProc read FClickProc;
end;

implementation

{ TMenuButton }

constructor TMenuButton.Create(const Parent: CommandBarPopup; const strID: string; const
strCaption: string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin

end;

constructor TMenuButton.Create(const Parent: CommandBar; const strCaption: string; const
EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin

end;

destructor TMenuButton.Destroy;
begin

end;

end.
------------------------------------------------------------
1697524356361.png

unit Unit2;

interface

uses
Windows, ActiveX, ComObj, Variants;

const
CLASS_DTExtensibility2: TGUID = '{AD1C5BA3-0140-4E45-8C92-2550B1271BC0}';

type
IDTExtensibility2 = interface(IDispatch)
['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']
procedure OnConnection(const HostApp: IDispatch; ext_ConnectMode: Integer;
const AddInInst: IDispatch; var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer; var custom: PSafeArray); safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;
procedure BeginShutdown(var custom: PSafeArray); safecall;
procedure DoAction(const Control: IUnknown); safecall;

function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;

IRibbonExtensibility = interface(IDispatch)
['{000C0396-0000-0000-C000-000000000046}']
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
end;

TOfficeAddInsTest = class(TAutoObject, IDTExtensibility2, IRibbonExtensibility)
private

protected
procedure BeginShutdown(var custom: PSafeArray); safecall;
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;

procedure DoAction(const Button: IUnknown); safecall;
function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;

implementation

uses
AxCtrls, Graphics, ComServ;

procedure TOfficeAddInsTest.OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.BeginShutdown(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnAddInsUpdate(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnStartupComplete(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.DoAction(const Button: IUnknown);
begin
MessageBox(0, 'Hello, World', 'Information', MB_ICONINFORMATION)
end;

function TOfficeAddInsTest.DoLoadImage(const aImageName: WideString): IPictureDisp;
var
PictureDesc: TPictDesc;
begin
if aImageName = 'mainicon.ico' then begin
with PictureDesc do begin
cbSizeOfStruct := SizeOf(PictureDesc);
picType := PICTYPE_ICON;
hIcon := LoadIcon(HInstance, 'MAINICON')
end;
OleCheck(OleCreatePictureIndirect(PictureDesc, IPicture, True, Result))
end else
Result := nil
end;

function TOfficeAddInsTest.GetCustomUI(const RibbonID: WideString): WideString; safecall;
begin
Result :=
'<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="DoLoadImage">'#13#10+
' <ribbon>'#13#10+
' <officeMenu>'#13#10+
' <menu idMso="FileSendMenu">'#13#10+
// ' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" imageMso ="HappyFace" onAction="DoAction"/>'#13#10+
' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" image="mainicon.ico" onAction="DoAction"/>'#13#10+
' </menu>'#13#10+
' </officeMenu>'#13#10+
' </ribbon>'#13#10+
'</customUI>'
end;

initialization
TAutoObjectFactory.Create(ComServer, TOfficeAddInsTest, CLASS_DTExtensibility2, ciSingleInstance);
end.
 
Lần chỉnh sửa cuối:
Cứ upload lên ai cần thì họ dùng, họ cảm ơn. Còn đây thì chỉ thấy Úp - Mở thôi.
Vào trang http://techvanguards.com/ của Bác BinhLy
https://github.com/jhc-systems/DelphiUIAutomation
https://www.davidghoyle.co.uk/WordPress/?p=311
Hình như bằng ngôn ngữ lập trình Pascal thì phải, thấy họ viết như thế lày:

unit ExcelApp.MenuButton.pas;

interface

uses Office2000_TLB, ExcelApp.EventSink;

type
TMenuButton = class(TObject)
private
FID: string;
FButton: _CommandBarButton;
FSink: TEventSink;
FCookie: Integer;
FClickProc: TClickProc;
public
constructor Create(const Parent: CommandBarPopup; const strID: string; const strCaption:
string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions); overload;

constructor Create(const Parent: CommandBar; const strCaption: string; const EventHandler:
TClickProc; const MenuOptions: TMenuOptions); overload;
destructor Destroy; override;
property Button: _CommandBarButton read FButton;
property ID: string read FID default 0;
property ClickProc: TClickProc read FClickProc;
end;

implementation

{ TMenuButton }

constructor TMenuButton.Create(const Parent: CommandBarPopup; const strID: string; const
strCaption: string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin

end;

constructor TMenuButton.Create(const Parent: CommandBar; const strCaption: string; const
EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin

end;

destructor TMenuButton.Destroy;
begin

end;

end.
------------------------------------------------------------
View attachment 295814

unit Unit2;

interface

uses
Windows, ActiveX, ComObj, Variants;

const
CLASS_DTExtensibility2: TGUID = '{AD1C5BA3-0140-4E45-8C92-2550B1271BC0}';

type
IDTExtensibility2 = interface(IDispatch)
['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']
procedure OnConnection(const HostApp: IDispatch; ext_ConnectMode: Integer;
const AddInInst: IDispatch; var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer; var custom: PSafeArray); safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;
procedure BeginShutdown(var custom: PSafeArray); safecall;
procedure DoAction(const Control: IUnknown); safecall;

function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;

IRibbonExtensibility = interface(IDispatch)
['{000C0396-0000-0000-C000-000000000046}']
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
end;

TOfficeAddInsTest = class(TAutoObject, IDTExtensibility2, IRibbonExtensibility)
private

protected
procedure BeginShutdown(var custom: PSafeArray); safecall;
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;

procedure DoAction(const Button: IUnknown); safecall;
function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;

implementation

uses
AxCtrls, Graphics, ComServ;

procedure TOfficeAddInsTest.OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.BeginShutdown(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnAddInsUpdate(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.OnStartupComplete(var custom: PSafeArray);
begin

end;

procedure TOfficeAddInsTest.DoAction(const Button: IUnknown);
begin
MessageBox(0, 'Hello, World', 'Information', MB_ICONINFORMATION)
end;

function TOfficeAddInsTest.DoLoadImage(const aImageName: WideString): IPictureDisp;
var
PictureDesc: TPictDesc;
begin
if aImageName = 'mainicon.ico' then begin
with PictureDesc do begin
cbSizeOfStruct := SizeOf(PictureDesc);
picType := PICTYPE_ICON;
hIcon := LoadIcon(HInstance, 'MAINICON')
end;
OleCheck(OleCreatePictureIndirect(PictureDesc, IPicture, True, Result))
end else
Result := nil
end;

function TOfficeAddInsTest.GetCustomUI(const RibbonID: WideString): WideString; safecall;
begin
Result :=
'<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="DoLoadImage">'#13#10+
' <ribbon>'#13#10+
' <officeMenu>'#13#10+
' <menu idMso="FileSendMenu">'#13#10+
// ' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" imageMso ="HappyFace" onAction="DoAction"/>'#13#10+
' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" image="mainicon.ico" onAction="DoAction"/>'#13#10+
' </menu>'#13#10+
' </officeMenu>'#13#10+
' </ribbon>'#13#10+
'</customUI>'
end;

initialization
TAutoObjectFactory.Create(ComServer, TOfficeAddInsTest, CLASS_DTExtensibility2, ciSingleInstance);
end.
Mới tải về xem thấy như sau + 2 link khác ngó qua thì làm biếng xem tiếp

Lưu lại đó thong thả ngó lại

1697528984373.png

File Tạo Menu Ribbon cho VBA + VB6 + Delphi Tôi úp lên đây ai cần thì tham khảo sử dụng ( Như mô tả bài số 26 )

nếu ai đó có khả năng khá hơn thì kế thừa mà viết tốt hơn xong úp lại cho ai đó cần lại kế thừa của kế thừa tiếp

Nếu chưa biết sử dụng thì cứ nói Tôi sẻ chỉ dẫn ... trước khi hỏi hãy dò làm trước xem sao rồi hãy hỏi !?

1697529852860.png

Cái này có vẻ tốt không lỗi khi builder nó ... thong thả dò mới ngộ ra được

Hàm sau thiết kế sử dụng cho Delphi 7 trở lên vì Delphi 7 không hổ trợ Unicode nên tôi với Tân cố tình viết vậy và dùng cho VB6 nữa

Mã:
Rem =========== Ap dung cho Delphi
Public Function GetXML_Delphi(ByRef GTri As Boolean, ByVal mTHop As Byte) As String
    Rem Luu trong Sub ExportXML Module Code_In_Ribbon_help Ap dung cho Xuat XML Cho Delphi
    Dim a As Long, b As Long, c As Long, s As String, Arrs, Arrd(1 To 10000)
    Arrs = mArr(1, mTHop) 'Sheet1.Range("A3:AZ" & Sheet1.Cells(&H100000, 1).End(xlUp).Row).Value
    a = 0
    a = a + 1: Arrd(a) = "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""" & _
            IIf(mTHop > 1, " onLoad= ""onLoad""", "") & ">"
    a = a + 1: Arrd(a) = "<ribbon startFromScratch=""false"">"
    a = a + 1: Arrd(a) = "    <tabs>" & IIf((mTHop = 1 Or mTHop = 3), "", vbNewLine & _
            "      <!-- Doan nay dung de an Tab he thong-->" & vbNewLine & _
            "      <tab idMso=""TabHome"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabInsert"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabPageLayoutExcel"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabFormulas"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabData"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabReview"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabView"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabDeveloper"" getVisible=""getVisible""/>" & vbNewLine & _
            "      <tab idMso=""TabAddIns"" getVisible=""getVisible""/>") '' & vbNewLine
    For b = RwStar + 2 To UBound(Arrs, 1)
        If Len(LTrim(Arrs(b, 1))) > 0 Then
            s = Space(Get_Str(Arrs(b, 1)) + 6)
            If LTrim(Arrs(b, 1)) Like "End *" Then
                s = s & Replace(LTrim(Arrs(b, 1)), "End ", "</") & ">"
            Else
                s = s & "<" & LTrim(Arrs(b, 1))
                For c = 2 To UBound(Arrs, 2)
                    If Len(Arrs(b, c)) > 0 Then
                        s = s & get_XXX(Arrs, b, c, mTHop)
                    End If
                Next
                If " item " Like "* " & LTrim(Arrs(b, 1)) & " *" And (mTHop = 3 Or mTHop = 4) Then
                    If Not IsEmpty(Sheet1.Cells(b, xlabel)) Then s = s & " label=""" & Sheet1.Cells(b, xlabel) & """"
                    If Not IsEmpty(Sheet1.Cells(b, xscreentip)) Then s = s & " screentip=""" & Sheet1.Cells(b, xscreentip) & """"
                    If Not IsEmpty(Sheet1.Cells(b, xsupertip)) Then s = s & " supertip=""" & Sheet1.Cells(b, xsupertip) & """"
                End If
                s = s & IIf(" box buttonGroup comboBox dialogBoxLauncher dropDown group menu splitButton tab " Like "* " & LTrim(Arrs(b, 1)) & " *", ">", "/" & ">")
            End If
            If Len(Arrs(b, ximage)) > 0 Then s = s & "<!--" & Arrs(b, ximage) & "-->"
            a = a + 1: Arrd(a) = s
        End If
    Next
    a = a + 1: Arrd(a) = "    </tabs>"
    a = a + 1: Arrd(a) = "  </ribbon>"
    a = a + 1: Arrd(a) = "</customUI>"
   
    For b = 1 To a
        GetXML_Delphi = GetXML_Delphi & vbNewLine & "'" & Arrd(b)
    Next
    GetXML_Delphi = RibbonTV(Mid(GetXML_Delphi, 3))
    GetXML_Delphi = Replace(GetXML_Delphi, vbNewLine, "'#13#10 +" & vbNewLine)
    GetXML_Delphi = "result := " & GetXML_Delphi '17h32 them cai nay
    GetXML_Delphi = GetXML_Delphi & "';"
End Function

Mấu chốt ở hàm sau nếu ai đó sử dụng Delphi các bản sau này có hổ trợ Unicode thì loại bỏ nó ra

Mã:
Rem =========== Chuyen doi tieng Viet co dau tren Ribbon
Private Function RibbonTV(ByVal myText As String) As String
    Dim i As Long, myWord As Long
    For i = 1 To Len(myText)
        myWord = AscW(Mid$(myText, i, 1))
        If myWord < &H80 Then
            RibbonTV = RibbonTV & Chr$(myWord)
        Else
            RibbonTV = RibbonTV & "&#" & myWord & ";"
        End If
    Next i
End Function
Rem ===========
 

File đính kèm

Lần chỉnh sửa cuối:
Có tài liệu XLL giúp đỡ không?
 
xlmacr8.hlp là tập tin trước đó có tệp trợ giúp XLL bên trong
 
Học C API một thời gian nhưng không thay đổi các biểu tượng thanh công cụ, bất kỳ ý tưởng tốt 1705558364021.jpeg
 
Học C API một thời gian nhưng không thay đổi các biểu tượng thanh công cụ, bất kỳ ý tưởng tốt View attachment 298580
xem lại các bài trước và mã nguồn trong link bài số 1 là làm được

1/ sử dụng biểu tượng mặc định của Excel
2/ chèn hình ngoài vào trong Res xong dùng hàm keo nó nổi lên

2 cách trên thong thả dò đi là ra và code mẫu có hết đã lên mâm rồi còn ta mua 2 xị là xong thôi ... tự xào nấu đi mới thú vị --=0
 
Nếu thật sự đam mê chịu khó dò đi là ra vì mọi cái bài trên nói rất rõ rồi vì nó đã có sẳn còn ta dò xong tuỳ chỉnh lại theo sở thích...
qua đó xong mới biết và làm tiếp cái khác còn không thì sẻ bỏ cuộc chạy mất dép thôi _)()(-

Ngay trên Delphi khi ta cài đặt nó có hết các code mẫu... kể cả đọc và ghi dữ liệu từ xa qua Internet thông DataSnap chạy đa tầng đa dịch vụ ... không

ai chỉ dẫn cả đâu mà xem code mẫu xong hiểu nguyên lý , phương thức hoạt động của nó xong copy ra ngoài tuỳ chỉnh lại theo sở thích của mình

Tôi mất vài năm lôi ra xong cất vào không biết bao nhiều lượt .. khi rảnh nổi gió lại lôi ra... xong bây giờ viết API tạm ổn..

Tôi đang tập chung phát triển mở rộng Web Server đa tầng, đa dịch vụ ...
ai cần gì nếu Tôi biết thì Tôi sẻ chỉ cho các nơi mà Tôi lôi ra xong cất vào... xong tự mà dò lấy ... còn cái gì phổ biến thì Tôi sẻ úp cho Free xem như tham khảo thêm vậy ?!

Xem hình ... Addins TaskPane WebServer ... code có hết rồi chỉ thiết kế giao diện cho dễ nhìn, thân thiện, dễ sử dụng và phù hợp là xong ...

Khi biết viết AddIns trên Delphi thì rất tốt cho nhiều thứ mà thuần VBA không thể làm được và bảo mật tốt vv...

1705805358753.png
 
Lần chỉnh sửa cuối:
ai có ví dụ về bắt sự kiện trong excel không ta ?
 
Không phải là ít mà nhiều đấy.. có điều nó chỉ dẫn bao quát theo tổng thể mà khả năng của ta chưa nhận ra thôi

trên Delphi cũng vậy nguồn Server + Client có ngay trên chính máy tính của ta khi cài chọn Samples nhưng vận dụng nó thì phải mất nhiều thời gian ngâm cứu thôi

tải file bài số 1 viết vài hàm nhỏ lẻ 1 tham số là ok... xong dò lên 2,3 hay n+1 tham số xem sao
Bài đã được tự động gộp:

xem cái Ribbon cho Excel hay nguyên bộ Office của bài số 14 là thấy... không có ai chỉ dẫn + tài liệu cả.. nhưng tôi dò ra xong kết hợp với Tân viết ra 1

Tools tự dộng tạo menu Ribbon cho nguyên bộ Office trên Delphi sử dụng ngay mã trên VBA thôi ... tìm nát Google không có ra cái thứ 2 đâu

mọi cái dò đi là ra thôi --=0
Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.
 
Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.
Tôi chưa làm trên excel chứ trên Access thì tạo Ribbon menu thoải mái. Khi gọi Form hoặc Report thì có thể load Ribbon menu cho riêng từng Form/ Report, kể cả menu nút chuột phải.
 
Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.
Delphi thì tui không rành nhưng nhìn mã xml là biết có thể tùy biến ribbon, việc vô hiệu, ẩn hay hiện đề được hết.
ai có ví dụ về bắt sự kiện trong excel không ta ?
Delphi không biết có được không chứ C# hơi bị ngon về các sự kiện.
Tôi chưa làm trên excel chứ trên Access thì tạo Ribbon menu thoải mái. Khi gọi Form hoặc Report thì có thể load Ribbon menu cho riêng từng Form/ Report, kể cả menu nút chuột phải.
Excel vẫn làm được mấy chuyện đó, tùy biến là do người dùng mà. Vô hiệu, ẩn, hiện, thay đổi Caption, thay đổi trạng thái (CheckBox, item, menu chuột phải...) đều làm được tất.
 
Mình đang tìm hiểu để viết xll trong delphi mà đang bí chỗ bắt sự kiện trong excel, vbnet mình cũng đã viết và làm được giờ học thêm chút kiến thức mới. Coi 2 bài của anh Nguyễn Duy Tuân và bác Kiều Mạnh mà thấy nó phức tạp hơn trong vbnet nhiều.
 

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

Back
Top Bottom