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

Liên hệ QC

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

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,842
Được thích
10,337
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
@thuyyeu99
Cho Mạnh hỏi chút khi lấy Path của File *.exe của Delphi thì như sau
Mã:
(ExtractFilePath(Application.ExeName)+'VD.xls');
Vậy Mạnh muốn hỏi lấy Path của File *.DLL ngay trong chính nó thì sao hay phải khai báo thủ công có đường dẫn Full:
VD: D:\nnn\kkk\Manh.DLL
 
Upvote 0
@thuyyeu99
Cho Mạnh hỏi chút khi lấy Path của File *.exe của Delphi thì như sau
Mã:
(ExtractFilePath(Application.ExeName)+'VD.xls');
Vậy Mạnh muốn hỏi lấy Path của File *.DLL ngay trong chính nó thì sao hay phải khai báo thủ công có đường dẫn Full:
VD: D:\nnn\kkk\Manh.DLL
Anh su dụng delphi máy 2010 hay xe
XE
Uses IWSystem
showmessage(gsAppPath);
 
Upvote 0
Upvote 0
Upvote 0
cái đó anh phải khai báo mà chứ Load vào đâu em chưa hiểu. nó khai báo giống như hàm Api mà ?
Mạnh Mô tả chi tiết vầy
1/ Có 2 cái DLL trong 1 Folder: A.dll và B.dll
2/ Từ Excel chạy A.dll và từ A.dll có load cái hàm trong B.dll khi khai báo như sao thì chạy tốt
Mã:
LibHandle := LoadLibrary('D:\MyDelphi_Dynamic_Link_Library\Win32\Debug\FormInDLL.dll')
3/ còn nếu khai báo lấy đường dẫn từ file A.dll xong ghép với File B.dll
khi ShowMessage thì thấy đường dẫn y trang như trên mà sao nó không load vào được

đã thử theo 2 cách sau mà không load được B.dll
Mã:
LibHandle := LoadLibrary(gsAppPath +'FormInDLL.dll'); //Cách 1
LibHandle := LoadLibrary(gsAppPath) + 'FormInDLL.dll';//Cách 2
Chắc nó chưa hiểu cái gì đó mà mình chua biết ???

Rảnh mò cái thư viện IWSystem ... mà Delphi nó cũng dấu luôn he :p ===\.

Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh Mô tả chi tiết vầy
1/ Có 2 cái DLL trong 1 Folder: A.dll và B.dll
2/ Từ Excel chạy A.dll và từ A.dll có load cái hàm trong B.dll khi khai báo như sao thì chạy tốt
Mã:
LibHandle := LoadLibrary('D:\MyDelphi_Dynamic_Link_Library\Win32\Debug\FormInDLL.dll')
3/ còn nếu khai báo lấy đường dẫn từ file A.dll xong ghép với File B.dll
khi ShowMessage thì thấy đường dẫn y trang như trên mà sao nó không load vào được

đã thử theo 2 cách sau mà không load được B.dll
Mã:
LibHandle := LoadLibrary(gsAppPath +'FormInDLL.dll'); //Cách 1
LibHandle := LoadLibrary(gsAppPath) + 'FormInDLL.dll';//Cách 2
Chắc nó chưa hiểu cái gì đó mà mình chua biết ???

Rảnh mò cái thư viện IWSystem ... mà Delphi nó cũng dấu luôn he :p ===\.

View attachment 226178
Mà hình như anh còn thiếu dấu '\'
LibHandle := LoadLibrary(gsAppPath +'\FormInDLL.dll');
Cái này em nghĩ chac không khó đâu, còn không anh chép vô thư mục win hay cố định 1 thư mục nào đó chứ làm gì mà phải lấy lung tung đường dẫn
 
Lần chỉnh sửa cuối:
Upvote 0
Mà hình như anh còn thiếu dấu '/'
Cái này em nghĩ chac không khó đâu, còn không anh chép vô thư mục win hay cố định 1 thư mục nào đó chứ làm gì mà phải lấy lung tung đường dẫn
Biết là thế nếu cho vào folder System thì lại không hỏi ... đang tập tành liên kết các thư viện với nhau đó mà khi cần có thể xài ké cái thư viện của ai đó chẳng hạn )
đã coi hết rồi không thiếu cái dấu '/' đó mà sao nó không load ... có cái chi đó mà mình chưa hiểu hết đó thôi


Cho Mạnh hỏi thêm chút sao cái Delphi 10.2 của Mạnh cứ khoảng mấy giây là nó chớp chớp cái màn hình giao diện của nó là sao ... bất tiện quá đang viết code hay chỉnh sửa nó chớp chớp là khỏi làm luôn ... cách tắt nó đi sao ???
 
Lần chỉnh sửa cuối:
Upvote 0
Biết là thế nếu cho vào folder System thì lại không hỏi ... đang tập tành liên kết các thư viện với nhau đó mà khi cần có thể xài ké cái thư viện của ai đó chẳng hạn )
đã coi hết rồi không thiếu cái dấu '/' đó mà sao nó không load ... có cái chi đó mà mình chưa hiểu hết đó thôi


Cho Mạnh hỏi thêm chút sao cái Delphi 10.2 của Mạnh cứ khoảng mấy giây là nó chớp chớp cái màn hình giao diện của nó là sao ... bất tiện quá đang viết code hay chỉnh sửa nó chớp chớp là khỏi làm làm ... cách tắt nó đi sao ???
Bài đã được tự động gộp:

Mò hông ra thì nhờ các anh hỗ trợ chứ em có làm mấy cái này đâu hichic heheh
 
Lần chỉnh sửa cuối:
Upvote 0
Bài đã được tự động gộp:

Mò hông ra thì nhờ các anh hỗ trợ chứ em có làm mấy cái này đâu hichic heheh
oh đọc cái đó thì chép vào folder system cho rồi... đọc nhức đầu lắm
chỉ Mạnh cách tắt chớp chớp (nháy nháy liên tục ) trên IDE Delphi đi thấy bất tiện quá
 
Upvote 0
Bạn phải lưu ý khi chạy luồng 32 bit thì các dll cũng phải 32 và 64 cũng thế. Việc gọi dll trong thư mục hệ thống hay thư mục ngoài của dll không khác nhau gì cả.
 
Upvote 0
oh đọc cái đó thì chép vào folder system cho rồi... đọc nhức đầu lắm
chỉ Mạnh cách tắt chớp chớp (nháy nháy liên tục ) trên IDE Delphi đi thấy bất tiện quá
Cái này win 7 em không thấy bị chỉ bị win 10. Em không biết bị gì nữa.

Em còn đang dính cái lỗi 217 build dll mà chưa mò ra nè
 
Upvote 0
Bạn phải lưu ý khi chạy luồng 32 bit thì các dll cũng phải 32 và 64 cũng thế. Việc gọi dll trong thư mục hệ thống hay thư mục ngoài của dll không khác nhau gì cả.
Mạnh mới thử chép vào System khai báo như sau chạy rất tốt

Mã:
const
  NomDLL = 'FormInDLL.dll'; // Khai báo Load DLL trong Folder System Windows
procedure ShowForm stdcall; external NomDLL;
Gọi hàm thì nó đơn giản hơn
Mã:
LibHandle := LoadLibrary(NomDLL);
...
LShowForm := GetProcAddress(LibHandle, 'ShowForm');

Tại làm biếng muốn cho vào cùng Folder để test code các kiểu xem sao đó mà
Vì code viết thêm bớt liên tục ko lẻ cứ tí một lại copy vào Folder System thấy cũng bất tiện
Bài đã được tự động gộp:

Cái này win 7 em không thấy bị chỉ bị win 10. Em không biết bị gì nữa.

Em còn đang dính cái lỗi 217 build dll mà chưa mò ra nè
Cứ vài phút cái giao diên Delphi nó cứ nháy nháy mấy phát liên tục thấy khó chịu quá .... ai biết chỉ dùm Mạnh cách tắt nó
 
Upvote 0
Mạnh mới thử chép vào System khai báo như sau chạy rất tốt

Mã:
const
  NomDLL = 'FormInDLL.dll'; // Khai báo Load DLL trong Folder System Windows
procedure ShowForm stdcall; external NomDLL;
Gọi hàm thì nó đơn giản hơn
Mã:
LibHandle := LoadLibrary(NomDLL);
...
LShowForm := GetProcAddress(LibHandle, 'ShowForm');

Tại làm biếng muốn cho vào cùng Folder để test code các kiểu xem sao đó mà
Vì code viết thêm bớt liên tục ko lẻ cứ tí một lại copy vào Folder System thấy cũng bất tiện
Bài đã được tự động gộp:


Cứ vài phút cái giao diên Delphi nó cứ nháy nháy mấy phát liên tục thấy khó chịu quá .... ai biết chỉ dùm Mạnh cách tắt nó

Nó báo lỗi ở dòng nào? Khi chạy thì biến LibHandle có giá trị <>0 hay là 0 ?
Khi lỗi thì có thông báo thế nào?
 
Upvote 0
Nó báo lỗi ở dòng nào? Khi chạy thì biến LibHandle có giá trị <>0 hay là 0 ?
Khi lỗi thì có thông báo thế nào?
Nếu khai báo vậy thì chạy tốt không có lỗi còn LibHandle có giá trị <>0 hay là 0 cái này mạnh biết

mấy bài trước đang hỏi @thuyyeu99 là cho hai cái DLL vào cùng folder xong load nó mà lấy path từ a.dll + B.dll xong load nó mà báo lỗi không được ... có mô tả mấy bài trên

VD: 2 DLL trong cùng Folder khai báo như sau nó báo lỗi
Mã:
PathDLL := (gsAppPath + 'FormInDLL.dll');
ShowMessage(PathDLL);
Lỗi dòng sau khi Build
LibHandle := LoadLibrary(PathDLL);
 
Lần chỉnh sửa cuối:
Upvote 0
Lang thang lọ mọ đọc tài liệu cái này móc cái kia ... thấy Bill nói về Array API ... lưu vào đây cho ai iu thì đọc ... sau này quên vào đây coi lại
 
Upvote 0
Rảnh đang tìm vọc cái này mà thấy ít tài liệu quá
Mã:
procedure TMyAddin.OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray);
var FApp:ExcelApplication;
CTP:TCustomTaskPane;
begin
...
  CTP:=TCustomTaskPane.Create(Self);
//?
  CTP.Visible:=True;
end;
Mã:
Quản lý để làm điều đó bản thân mình. Đối với bất cứ ai có cùng một vấn đề, đăng giải pháp tại đây

Tạo bổ trợ
Thêm biểu mẫu ActiveX vào dự án bổ trợ
Thêm mã dưới đây vào tập tin addin .pas
procedure TmyAddin.CTPFactoryAvailable(const CTPFactoryInst: ICTPFactory); safecall;
Var
    CTP: _CustomTaskPane;
//  NP: TActiveXformClass;
begin  
    CTP:= CTPFactoryInst.CreateCTP('<replace with add-in name>.<replace with activeXform name>', 'pane caption', EmptyParam);
//  NP := TNavigationPane(ctp.ContentControl);
    CTP.Visible := true;
end;
Thấy trên VB có code mẫu mà Excel VBA chưa thấy ai làm nhỉ
 
Lần chỉnh sửa cuối:
Upvote 0
Trong Office2010.pas có TCustomTaskPane ... vậy là nó loanh quanh đâu đó vấn đề khởi tạo khai báo và sử dụng thôi ... mò mò ===\. -0-0-0-
Mã:
procedure TCustomTaskPane.InitServerData;
const
  CServerData: TServerData = (
    ClassID:   '{C5771BE5-A188-466B-AB31-00A6A32B1B1C}';
    IntfIID:   '{000C033B-0000-0000-C000-000000000046}';
    EventIID:  '{000C033C-0000-0000-C000-000000000046}';
    LicenseKey: nil;
    Version: 500);
begin
  ServerData := @CServerData;
end;

procedure TCustomTaskPane.Connect;
var
  punk: IUnknown;
begin
  if FIntf = nil then
  begin
    punk := GetServer;
    ConnectEvents(punk);
    Fintf:= punk as _CustomTaskPane;
  end;
end;

procedure TCustomTaskPane.ConnectTo(svrIntf: _CustomTaskPane);
begin
  Disconnect;
  FIntf := svrIntf;
  ConnectEvents(FIntf);
end;

procedure TCustomTaskPane.DisConnect;
begin
  if Fintf <> nil then
  begin
    DisconnectEvents(FIntf);
    FIntf := nil;
  end;
end;

function TCustomTaskPane.GetDefaultInterface: _CustomTaskPane;
begin
  if FIntf = nil then
    Connect;
  Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
  Result := FIntf;
end;

constructor TCustomTaskPane.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TCustomTaskPane.Destroy;
begin
  inherited Destroy;
end;

procedure TCustomTaskPane.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
    1: if Assigned(FOnVisibleStateChange) then
         FOnVisibleStateChange(Self, IUnknown(TVarData(Params[0]).VPointer) as _CustomTaskPane {const _CustomTaskPane});
    2: if Assigned(FOnDockPositionStateChange) then
         FOnDockPositionStateChange(Self, IUnknown(TVarData(Params[0]).VPointer) as _CustomTaskPane {const _CustomTaskPane});
  end; {case DispID}
end;

function TCustomTaskPane.Get_Title: WideString;
begin
  Result := DefaultInterface.Title;
end;

function TCustomTaskPane.Get_Application: IDispatch;
begin
  Result := DefaultInterface.Application;
end;

function TCustomTaskPane.Get_Window: IDispatch;
begin
  Result := DefaultInterface.Window;
end;

function TCustomTaskPane.Get_Visible: WordBool;
begin
  Result := DefaultInterface.Visible;
end;

procedure TCustomTaskPane.Set_Visible(prop: WordBool);
begin
  DefaultInterface.Visible := prop;
end;

function TCustomTaskPane.Get_ContentControl: IDispatch;
begin
  Result := DefaultInterface.ContentControl;
end;

function TCustomTaskPane.Get_Height: SYSINT;
begin
  Result := DefaultInterface.Height;
end;

procedure TCustomTaskPane.Set_Height(prop: SYSINT);
begin
  DefaultInterface.Height := prop;
end;

function TCustomTaskPane.Get_Width: SYSINT;
begin
  Result := DefaultInterface.Width;
end;

procedure TCustomTaskPane.Set_Width(prop: SYSINT);
begin
  DefaultInterface.Width := prop;
end;

function TCustomTaskPane.Get_DockPosition: MsoCTPDockPosition;
begin
  Result := DefaultInterface.DockPosition;
end;

procedure TCustomTaskPane.Set_DockPosition(prop: MsoCTPDockPosition);
begin
  DefaultInterface.DockPosition := prop;
end;

function TCustomTaskPane.Get_DockPositionRestrict: MsoCTPDockPositionRestrict;
begin
  Result := DefaultInterface.DockPositionRestrict;
end;

procedure TCustomTaskPane.Set_DockPositionRestrict(prop: MsoCTPDockPositionRestrict);
begin
  DefaultInterface.DockPositionRestrict := prop;
end;

procedure TCustomTaskPane.Delete;
begin
  DefaultInterface.Delete;
end;

procedure Register;
begin
  RegisterComponents(dtlServerPage, [TCustomXMLSchemaCollection, TCustomXMLPart, TCustomXMLParts, TCustomTaskPane]);
end;
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mạnh loay hay làm theo hướng dẫn của bài này cả tuần nay mà không xong ... vậy úp bài + Code mẫu của bài đó nhờ các Bạn chỉ dùm
( Thực ra link đã úp từ mấy bài trước )

Mình tải code đó về đã build trên Delphi7 & Delphi 10.2.3 và đã Reg Run As hết mà sao nó không có sử dụng được hàm sau trong COM Add-Ins
Mã:
Function TDelphiAddin.SimpleAdd (X, Y: Double): Double;
begin
  result: = X + Y;
end;

ý mình muốn hỏi là phải chỉnh sửa lại toàn bộ mã nguồn đó sao cho sử dụng được hàm SimpleAdd ở trên Cells khi Gõ A1 = SimpleAdd (B1,B2) Enter là nó trả về kết quả của Hàm

Mạnh mò các kiểu cả tuần nay ko ra ... rất mong sự trợ giúp của các Bạn
Cảm ơn rất nhiều
 

File đính kèm

Upvote 0
Mạnh loay hay làm theo hướng dẫn của bài này cả tuần nay mà không xong ... vậy úp bài + Code mẫu của bài đó nhờ các Bạn chỉ dùm
( Thực ra link đã úp từ mấy bài trước )

Mình tải code đó về đã build trên Delphi7 & Delphi 10.2.3 và đã Reg Run As hết mà sao nó không có sử dụng được hàm sau trong COM Add-Ins
Mã:
Function TDelphiAddin.SimpleAdd (X, Y: Double): Double;
begin
  result: = X + Y;
end;

ý mình muốn hỏi là phải chỉnh sửa lại toàn bộ mã nguồn đó sao cho sử dụng được hàm SimpleAdd ở trên Cells khi Gõ A1 = SimpleAdd (B1,B2) Enter là nó trả về kết quả của Hàm

Mạnh mò các kiểu cả tuần nay ko ra ... rất mong sự trợ giúp của các Bạn
Cảm ơn rất nhiều

Bạn cần làm các việc như sau:
1. Biên dịch DLL và Regsvr32 đúng theo Excel 32 hoặc 64 bit
2. Vào Excel, Add-in Manager chọn nút "Automation" chọn tới DLL này xong.
 
Upvote 0
Mạnh mới thử báo lỗi chắc sai cái gì đó
Capture.JPG
 
Upvote 0
Bạn phải sửa code như sau:

library AutomAddinSample;

uses
ComServ,
AutomAddinSample_TLB in 'AutomAddinSample_TLB.pas',
Unit1 in 'Unit1.pas' {DelphiAddin: CoClass};

{$R *.TLB}
{$R *.RES}

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer,
DllInstall;
begin
end.
 
Upvote 0
cảm ơn Bạn mới thử xong các kiểu vẫn cứ thế ... hay code đó củ rồi người ta viết cho bản x8 nên ko xài được
Mạnh xài Windows10_x64 + Office 2016_x32 hay đó là lý do không sử dụng được với Office 2016
 
Upvote 0
Mạnh rảnh đang tìm kiếm tài liệu mò viết cái CustomTaskPane trên Delphi mà ko phải xài ké cái Add-in Express for Office and VCL Or ...!!

Ai biết có link nào có hướng dẫn hay code mẫu xin chỉ dùm
Tìm thấy toàn code c/c++, C# ... nhiều vô kể ... còn Delphi thì gần như ko thấy hay chưa tìm ra ... Mong chỉ dùm
Xin cảm ơn

Mạnh thấy code VB trên Mạng tiện úp đây cho ai iu em nó

CustomTaskPane_Excel.Ribbon.gif
 

File đính kèm

Upvote 0
Mạnh mới tập làm 1 cái Menu Ribbon DLL cho Excel Úp nhờ các Bạn test dùm trên Máy khác xem sao

1/ Chỉ chạy từ Office2010 To Office2016

2/ Officex32 thì chạy bản Officex32 và Officex64 thì chạy bản Officex64

3/ Sử dụng File Excel RegActiveXDLL.xlsb để đăng ký và hủy ( xong thoát mở lại Excel )

4/ Vậy là theo các Thầy ở đây học Delphi tới nay khá thêm một tẹo chuyển toàn bộ code QLBH của Mạnh Từ VB6 qua Delphi thành công

Nếu Có dịp qua Bình Dương các thầy Alo cho Mạnh .... Mạnh đón tiếp nhiệt tình nhé

Xin cảm ơn
 

File đính kèm

Upvote 0
Mạnh loay hay làm theo hướng dẫn của bài này cả tuần nay mà không xong ... vậy úp bài + Code mẫu của bài đó nhờ các Bạn chỉ dùm
( Thực ra link đã úp từ mấy bài trước )

Mình tải code đó về đã build trên Delphi7 & Delphi 10.2.3 và đã Reg Run As hết mà sao nó không có sử dụng được hàm sau trong COM Add-Ins
Mã:
Function TDelphiAddin.SimpleAdd (X, Y: Double): Double;
begin
  result: = X + Y;
end;

ý mình muốn hỏi là phải chỉnh sửa lại toàn bộ mã nguồn đó sao cho sử dụng được hàm SimpleAdd ở trên Cells khi Gõ A1 = SimpleAdd (B1,B2) Enter là nó trả về kết quả của Hàm

Mạnh mò các kiểu cả tuần nay ko ra ... rất mong sự trợ giúp của các Bạn
Cảm ơn rất nhiều
To Anh @batman1 Em đang tập Viết cái DLL trên Delphi (Excel COM Server ) có cái Hàm gõ trên Cells đại ý như bài này mà Em làm hoài ko được nếu Anh biết chỉ dùm Em học 1 chút
Cảm ơn Anh
 
Upvote 0
Các anh cho em hỏi xíu nhé.
em muốn thay đổi Lower Bounds PSafeArray trong Del phi từ 1 thành 0 mà không dùng vòng lập có được không ?
hoặc copy PSafeArray vào Dynamic Array
(nếu được nhờ các anh hướng dẫn giúp em với).

Cám ơn các anh
 
Upvote 0
Các anh cho em hỏi xíu nhé.
em muốn thay đổi Lower Bounds PSafeArray trong Del phi từ 1 thành 0 mà không dùng vòng lập có được không ?
hoặc copy PSafeArray vào Dynamic Array
(nếu được nhờ các anh hướng dẫn giúp em với).

Cám ơn các anh
Bắt buộc phải tạo mảng khác rồi copy vào nhé.
 
Upvote 0
Em tìm được hướng giải quyết rồi.
Cảm ơn mọi người quan tâm hihi
 
Upvote 0
Em giải quyết theo hướng nào?
Em chuyển từ variant qua PSafeArray rồi từ PSafeArray em copy vào Dynamic Array
em test thử từ lúc get data đến khi ghi vào Excell. (em thấy hơi lâu quá)
1 cái viết trong procedure truc tiếp chạy thử 65536 tới 422ms
1 cái viết trong function chạy thử 65536 tới 932ms
cái nào em cũng thấy chậm hic. Chắc do chuyển qua chuyển lại nhiều quá.
 
Lần chỉnh sửa cuối:
Upvote 0
Em chuyển từ variant qua PSafeArray rồi từ PSafeArray em copy vào Dynamic Array
em test thử từ lúc get data đến khi ghi vào Excell. (em thấy hơi lâu quá)
1 cái viết trong procedure truc tiếp chạy thử 65536 tới 422ms
1 cái viết trong function chạy thử 65536 tới 932ms
cái nào em cũng thấy chậm hic. Chắc do chuyển qua chuyển lại nhiều quá.
Copy SafeArray nhanh lắm. Trong Variant là chứa PSafeArray rồi.
 
Upvote 0
Em nghĩ chắc là nhanh lắm nhưng em chưa biết copy từ PSafeArray vào thẳng dynamic

Như anh nói đó. Tạo mảng mới theo cấu trúc mới và số phần tử bằng mảng gốc. Dùng vòng lặp copy từng phần tử từ mảng gốc vào mảng mới.
Mà mình cũng không biết vì sao lại phải thay đổi ??
 
Upvote 0
Như anh nói đó. Tạo mảng mới theo cấu trúc mới và số phần tử bằng mảng gốc. Dùng vòng lặp copy từng phần tử từ mảng gốc vào mảng mới.
Mà mình cũng không biết vì sao lại phải thay đổi ??
Dùng vòng lập dữ liệu nhiều em nghĩ nó chậm hơn dùng api ah anh.
Hihi có nhiều cai em viết không nổi hoặc em chưa biết, nên tính áp dụng những cái có sẵn của delphi để sài đó mà. Để em mò tiếp để rút ngắn thời gian hơn nữa hihii hi vong là sẽ được
 
Lần chỉnh sửa cuối:
Upvote 0
Lâu lắm ko học bài ...nhờ các bạn chỉ dùm
VD: Trong VB6 mình khai báo như sau:
Mã:
Private ExcelApp As New Excel.Application
Public Property Get Application() As Excel.Application
    Set Application = ExcelApp
End Property
vậy mình muốn hỏi trong Delphi Mình khai báo tương đương code trên như thế nào để sử dụng tốt như code trên vb6 .... Mong chỉ dùm
Xin cảm ơn
 
Upvote 0
Thầy cho e xin công thức tính trên excel ra kq như này với.
 

File đính kèm

  • 89EFE5CB-F287-47C7-BF85-F1C9FE1FE942.jpeg
    89EFE5CB-F287-47C7-BF85-F1C9FE1FE942.jpeg
    210.5 KB · Đọc: 18
Upvote 0
Thầy cho e xin công thức tính trên excel ra kq như này với.
Lần sau thì mở chủ đề mới ở mục thích hợp nhé. Vấn đề của bạn đâu phải là Lập trình DLL?

Do tôi không dùng cách nối chuỗi mà dùng các phép toán số học nên chỉ phục vụ số xuất phát có nhiều nhất là 15 chữ số.

congdon.JPG

Nếu số chữ số là lớn tùy ý (nhập ở dạng text có độ lớn > 15) thì dùng hàm TEXTJOIN (hình như với Excel >= 2019). Lúc đó sử dụng mảng 1 từ công thức ở trên (công thức ở trên có 2 mảng). Nếu số chữ số > 15 và Excel < 2019 thì nên dùng hàm nối chuỗi tự tạo.
 
Lần chỉnh sửa cuối:
Upvote 0
Lâu lắm ko học bài ...nhờ các bạn chỉ dùm
VD: Trong VB6 mình khai báo như sau:
Mã:
Private ExcelApp As New Excel.Application
Public Property Get Application() As Excel.Application
    Set Application = ExcelApp
End Property
vậy mình muốn hỏi trong Delphi Mình khai báo tương đương code trên như thế nào để sử dụng tốt như code trên vb6 .... Mong chỉ dùm
Xin cảm ơn

Bạn viết một procedure và export từ dll ra.

var MyApp: OleVariant;
....
procedure GetApp(YourApp: IDispatch); stdcall;
begin
MyApp := YourApp;
end;

exports
GetApp;

Khi bạn declare bên VBA thìđổi function thành Sub.
 
Upvote 0
Lần sau thì mở chủ đề mới ở mục thích hợp nhé. Vấn đề của bạn đâu phải là Lập trình DLL?

Do tôi không dùng cách nối chuỗi mà dùng các phép toán số học nên chỉ phục vụ số xuất phát có nhiều nhất là 15 chữ số.

View attachment 229489

Nếu số chữ số là lớn tùy ý (nhập ở dạng text có độ lớn > 15) thì dùng hàm TEXTJOIN (hình như với Excel >= 2019). Lúc đó sử dụng mảng 1 từ công thức ở trên (công thức ở trên có 2 mảng). Nếu số chữ số > 15 và Excel < 2019 thì nên dùng hàm nối chuỗi tự tạo.
Anh @batman1 chỉ em cách copy Array bằng Api mà Sizeof(variant) trong Delphi đi anh
 
Upvote 0
Lần sau thì mở chủ đề mới ở mục thích hợp nhé. Vấn đề của bạn đâu phải là Lập trình DLL?

Do tôi không dùng cách nối chuỗi mà dùng các phép toán số học nên chỉ phục vụ số xuất phát có nhiều nhất là 15 chữ số.

View attachment 229489

Nếu số chữ số là lớn tùy ý (nhập ở dạng text có độ lớn > 15) thì dùng hàm TEXTJOIN (hình như với Excel >= 2019). Lúc đó sử dụng mảng 1 từ công thức ở trên (công thức ở trên có 2 mảng). Nếu số chữ số > 15 và Excel < 2019 thì nên dùng hàm nối chuỗi tự tạo.
Dạ! E cảm ơn thầy ạ! Vì e là thành viên mới nên ko rõ. Thầy thông cảm, chúc thầy mạnh khoẻ, công tác tốt ạ.
 
Upvote 0
Anh @batman1 chỉ em cách copy Array bằng Api mà Sizeof(variant) trong Delphi đi anh
Tôi ngán Delphi rồi. Thực ra cái tôi đam mê là Windows API. Delphi chỉ là mượn môi trường lập trình. Bây giờ tôi có cài Delphi nữa đâu.

Chủ đề này Tuân mở ra thì bạn hỏi Tuân là đúng người.
 
Upvote 0
Tôi ngán Delphi rồi. Thực ra cái tôi đam mê là Windows API. Delphi chỉ là mượn môi trường lập trình. Bây giờ tôi có cài Delphi nữa đâu.

Chủ đề này Tuân mở ra thì bạn hỏi Tuân là đúng người.
(@$%@
Mã:
    mSize:=Count * SizeOf(Variant);
    Move(inArrayByte^, Pointer(OutArray[0])^,  mSize);
Em Chạy xong là nó Lỗi thoát Fom luôn
 
Lần chỉnh sửa cuối:
Upvote 0
(@$%@
Mã:
    mSize:=Count * SizeOf(Variant);
    Move(inArrayByte^, Pointer(OutArray[0])^,  mSize);
Em Chạy xong là nó Lỗi thoát Fom luôn
Bạn và kieu manh có thói quen chỉ tung lên 1 dòng code nên rất khó để đoán. Trong trường hợp này tôi chỉ đoán là vd. inArrayByte là mảng BAI. Nó có là Pointer đâu mà inArrayByte^

Chưa tính tới mảng Variant. Tôi không biết inArrayByte mặt mũi thế nào nhưng Variant là cả một record. Có trường trong đó có thể là string, numeric, object, interface. Vậy thì chưa biết mảng inArrayByte thế nào thì khi copy sang OutArray thì giá trị của trường kia sẽ thế nào? Nó có là interface không, nếu phải thì interface ấy có tồn tại không. Nếu không tồn tại thì tiếp theo truy cập tới interface ấy sẽ có kết quả là "một nhát dao vào lưng".

Mà thôi, không quan trọng chuyện cụ thể như thế nào vì có nhìn được đoạn trước đâu để mà biết 2 mảng kia thế nào. Nhưng chắc chắn là ngoài lỗi inArrayByte^ còn có lỗi khác.

Theo tôi:
- không phải là inArrayByte^ mà là inArrayByte

- hoặc đơn giản là OutArray, hoặc cùng lắm là Pointer(OutArray[0]). Không phải là Pointer(OutArray[0])^

Đấy là nếu tôi còn nhớ đúng. Tôi đã nói rồi, bạn hãy hỏi Tuân vì tôi không cài Delphi.
 
Upvote 0
Bạn và kieu manh có thói quen chỉ tung lên 1 dòng code nên rất khó để đoán. Trong trường hợp này tôi chỉ đoán là vd. inArrayByte là mảng BAI. Nó có là Pointer đâu mà inArrayByte^

Chưa tính tới mảng Variant. Tôi không biết inArrayByte mặt mũi thế nào nhưng Variant là cả một record. Có trường trong đó có thể là string, numeric, object, interface. Vậy thì chưa biết mảng inArrayByte thế nào thì khi copy sang OutArray thì giá trị của trường kia sẽ thế nào? Nó có là interface không, nếu phải thì interface ấy có tồn tại không. Nếu không tồn tại thì tiếp theo truy cập tới interface ấy sẽ có kết quả là "một nhát dao vào lưng".

Mà thôi, không quan trọng chuyện cụ thể như thế nào vì có nhìn được đoạn trước đâu để mà biết 2 mảng kia thế nào. Nhưng chắc chắn là ngoài lỗi inArrayByte^ còn có lỗi khác.

Theo tôi:
- không phải là inArrayByte^ mà là inArrayByte

- hoặc đơn giản là OutArray, hoặc cùng lắm là Pointer(OutArray[0]). Không phải là Pointer(OutArray[0])^

Đấy là nếu tôi còn nhớ đúng. Tôi đã nói rồi, bạn hãy hỏi Tuân vì tôi không cài Delphi.
nhưng Variant là cả một record. Có trường trong đó có thể là string, numeric, object, interface

Em dang bí chỗ này đây, nếu là sizeof là string, number, date thì chạy tốt mà varvariant sau khi move xong là lỗi. Tự vì trong array nó là một mớ hỗn độn.
Chắc để em tìm cách khác.
Cám ơn anh
 
Upvote 0
Em dang bí chỗ này đây, nếu là sizeof là string, number, date thì chạy tốt
Chưa nói tới Variant. Giả sử cả 2 đều là mảng BYTE. Câu lệnh của bạn sẽ thế nào? Theo tôi không thể là inArrayByte^.

Mà chạy tốt nghĩa là gì? Là không có lỗi thực hiện? Nhiều khi không có lỗi nhưng kết quả không như mong đợi do nhập sai tham số. Không phải loại sai vd. cú pháp mà truyền sai tham số. Vd. ông văn thư cần tham số địa chỉ mà bạn truyền cho ông ấy cốc kem thì là sai cú pháp. Nhưng nếu bạn truyền Nguyễn Du 2 thì là chuẩn. Nhưng nếu bạn muốn gửi tới Tràng Tiền 3 mà bạn truyền nhầm là Nguyễn Du 2 thì bạn không thấy lỗi (cú pháp?) nhưng có kết quả sai. Ông văn thư chuyển tài liệu tới Tràng Tiền 3 chứ không phải tới Nguyễn Du 2.

Hãy có 2 mảng BYTE, chưa cần Variant. Sau đó viết code. Không thấy lỗi chưa là gì cả. Hãy kiểm tra các giá trị của OutArray. Nhiều khi không có lỗi nhưng do truyền sai giá trị mà kết quả không như mong đợi.
 
Upvote 0
Chưa nói tới Variant. Giả sử cả 2 đều là mảng BYTE. Câu lệnh của bạn sẽ thế nào? Theo tôi không thể là inArrayByte^.

Mà chạy tốt nghĩa là gì? Là không có lỗi thực hiện? Nhiều khi không có lỗi nhưng kết quả không như mong đợi do nhập sai tham số. Không phải loại sai vd. cú pháp mà truyền sai tham số. Vd. ông văn thư cần tham số địa chỉ mà bạn truyền cho ông ấy cốc kem thì là sai cú pháp. Nhưng nếu bạn truyền Nguyễn Du 2 thì là chuẩn. Nhưng nếu bạn muốn gửi tới Tràng Tiền 3 mà bạn truyền nhầm là Nguyễn Du 2 thì bạn không thấy lỗi (cú pháp?) nhưng có kết quả sai. Ông văn thư chuyển tài liệu tới Tràng Tiền 3 chứ không phải tới Nguyễn Du 2.

Hãy có 2 mảng BYTE, chưa cần Variant. Sau đó viết code. Không thấy lỗi chưa là gì cả. Hãy kiểm tra các giá trị của OutArray. Nhiều khi không có lỗi nhưng do truyền sai giá trị mà kết quả không như mong đợi.
Cái này thì có kiểm tra du liệu rồi anh nếu là si sizeof string la ok còn có lỗi khác không thì chưa thay .
Mục đích của em mò cái này là em muốn tạo 1 mãng mới bắt đầu từ 0 và copy dữ liệu trong mãng cũ (mảng cũ bắt đầu la 1) vào tránh dùng vòng lập mà thôi hihihi
 
Upvote 0
Việc Copy mảng có xác định kích thước của cấu trúc dữ liệu rõ ràng và cố định các phần tử thì dùng Move hay hàm API CopyMemoy là được ngay. Tôi cũng có bài viết về FastArray trên GPE này (không nhớ vở chỗ nào nữa) dùng CopyMemory của array mà các phần tử đều là kiểu Double nên thành công và rất nhanh. Tuy nhiên với mảng mà các phần tử có kiểu String (chưa cần nói đến các kiểu object - IUnknown, IDispatch) thì điều này là khó. Vì string trong SafeArray hay String trong VBA là WideString nó có kích thước tùy vào số ký tự mà nó mang. Nên nếu copy với khối byte bằng SizeOf(Variant)*nCount sẽ lỗi (độ rộng của Variant là 16 hoặc 24 chỉ để lưu các kiểu xác định kích thước như Integer, Long, Double, Byte). Nên bài toán copy SafeArray này tôi đã nói ở trên với bạn Thuyyeu là tạo mảng mới theo cấu trúc bạn muốn và dùng vòng lặp Copy từng phần tử thôi. Chắc bạn ấy còn hy vọng một điều ký diệu khác nữa nên cứ hỏi vậy thôi.
 
Upvote 0
Việc Copy mảng có xác định kích thước của cấu trúc dữ liệu rõ ràng và cố định các phần tử thì dùng Move hay hàm API CopyMemoy là được ngày. Tôi cũng có bài viết về FasstArray trên GPE này (không nhớ vở chỗ nào nữa) dùng CopyMemory của array mà các phần tử đều là kiểu Double nên thành công và rất nhanh. Tuy nhiên với mảng mà các phần tử có String (chưa cần nói đến các kiểu object - IUnknown, IDispatch) thì điều này là khó. Vì string trong SafeArray hay String trong VBA là WideString nó có kích thước tùy vào số ký tự mà nó mang. Nên nếu copy với khối byte bằng SizeOf(Variant) sẽ lỗi (độ rọng của nó là 16 hoặc 24 chỉ để lưu các kiểu xác định kích thước như Integer, Long, Double, Byte). Nên bài toán copy SafeArray này tôi đã nói ở trên với bạn Thuyyeu là tạo mảng mới và dùng vòng lặp Copy từng phần tử thôi. Chắc bạn ấy còn hy vọng một điều gí hơn nên cứ hỏi vậy thôi.
Em làm theo cách anh dùng vòng lặp Copy từng phần tử thì và cũng có 1 cách khác trong Del phi mà em nghĩ cũng dùng vòng lập.
Em chỉ muốn tiềm hiểu thử coi còn cách nào nhanh nữa không đó mà (hình như trong VBA vẫn có cách hay sao ý khác cái FasstArray của anh)
Vấn đề của em hỏi tới đây Begin End; (đã giải quyết chủ yếu em tìm cách tối ưu thôi) :)
Khi nào bí cái khác thì nhờ các anh định hướng giúp em hihihih
Cám ơn các anh quan tâm.
 
Upvote 0
Em làm theo cách anh dùng vòng lặp Copy từng phần tử thì và cũng có 1 cách khác trong Del phi mà em nghĩ cũng dùng vòng lập.
Em chỉ muốn tiềm hiểu thử coi còn cách nào nhanh nữa không đó mà (hình như trong VBA vẫn có cách hay sao ý khác cái FasstArray của anh)
Vấn đề của em hỏi tới đây Begin End; (đã giải quyết chủ yếu em tìm cách tối ưu thôi) :)
Khi nào bí cái khác thì nhờ các anh định hướng giúp em hihihih
Cám ơn các anh quan tâm.

Với mình thì CopyMemory là hết cỡ rồi không biết còn cái gì nữa không. Nếu có bạn share vào đây để mình xem thế nào.
 
Upvote 0
để em lục lại đã em nhớ mang máng là MemCopy thì phải máy cái API này em mù tịt nào là con trỏ ... byte... nhứt đầu (@$%@

MemCopy cung lý cũng là Move hoặc CopyMemory đó. Quan trọng là copy khối dữ liệu có kích cỡ xác định hay không thôi.
 
Upvote 0
Vì tác giả không cho xem chỗ khai báo vd. inArrayByte nên tôi vẫn cho đó là mảng BAI. Và tôi vẫn cho là sai cú pháp. Khi dùng MOVE của Delphi thì không thể là inArrayByte^ được. Và nếu dùng Pointer(OutArray[0])^ thì có lẽ không sai "cú pháp" nhưng chắc chắn sai với mong muốn. Nếu tôi nhớ không nhầm thì tham số thứ nhất của MOVE là const, còn tham số thứ 2 là var. Phải rất cẩn thận để khỏi nhầm khi truyền tham số.

Ở FastArray thì hơi khác chút. Ngoài dùng CopyMemory thì trong đó là copy từ MẢNG VARIANT. Còn ở đây là copy từ MẢNG BYTE. Trong VARIANT có trường mà nó có thể là STRING hoặc OBJECT. Chắc gì những byte của inArrayByte khi copy nào những trường kia có là những pointer tới STRING hoặc OBJECT được "đặt" ở chỗ khác trong memory hay không. Tôi đoán mò inArrayByte là mảng bai do nhìn thấy tên như thế. Nhưng thực chất nó là mảng gì, được tạo như thế nào thì bó tay. Người ta tung 1 dòng code thì bó tay rồi.
 
Upvote 0
Anh @batman1 Em thấy anh viết mấy bài thì có cài Delphi hay ko thì nó cũng ko quan trọng lắm với Anh phải không...
Cơ bản code két và phương pháp anh nhớ hết rồi
nếu em có kẹt cái gì Em hỏi có đầy đủ: mở bài , thân bài và kết thúc ( nói chung càng chi tiết càng tốt ) thì Anh nếu có rảnh chỉ cho Em học với he

Rút kinh nghiệm nhiều lần Em hỏi có vài dòng khiến người trả lời suy đoán Em thấy cũng nhọc :D

Em cảm ơn trước
 
Upvote 0
Anh @batman1 Em thấy anh viết mấy bài thì có cài Delphi hay ko thì nó cũng ko quan trọng lắm với Anh phải không...
Cơ bản code két và phương pháp anh nhớ hết rồi
nếu em có kẹt cái gì Em hỏi có đầy đủ: mở bài , thân bài và kết thúc ( nói chung càng chi tiết càng tốt ) thì Anh nếu có rảnh chỉ cho Em học với he

Rút kinh nghiệm nhiều lần Em hỏi có vài dòng khiến người trả lời suy đoán Em thấy cũng nhọc :D

Em cảm ơn trước
Thôi thôi. Tôi đã viết rồi. Thực ra không phải là tôi đam mê Delphi. Tôi đam mê lập trình Windows API, và để có thể viết code thì tôi dùng Delphi. Bây giờ thôi không muốn mất thời gian nữa. Kỷ nguyên mới thì đam mê mới, nhiều công việc mới. Ở đây có Tuân thì bạn hỏi Tuân thôi.
 
Upvote 0
Pointer(OutArray[0])^: sai ngay đây, dập nát vùng memory có địa chỉ = giá trị chứa trong OutArray[0]
=> Pointer(@OutArray[0])^
 
Upvote 0
Sửa Move lại thành CopyMemory đi, cho nó rõ, tường minh hơn. Để ý Dest, Source và Size.
Nếu inArrayByte là PByte thì thử như sau:
CopyMemory(Pointer(@OutArray[0]), inArrayByte, mSize);
Còn nếu inArrayByte là 1 array thì:
CopyMemory(Pointer(@OutArray[0]), Pointer(@inArrayByte[0], mSize);
 
Upvote 0
Đọc lại đi.
Mấy cô cậu này yếu về cái căn bản memory, pointer,địa chỉ quá. Căn bản không học, cứ nhảy đòi làm cái cao xa, giờ thấy hổng cẵng chưa ?
 
Upvote 0
Access violation at address 00408A2E
Tôi đã nói ngay từ đầu, ngay từ bài 1047 là
Mã:
 Không phải là Pointer(OutArray[0])^
Nhưng bạn lờ đi, bạn không bàn về nó.

Dùng CopyMemory của Windows thì quá dễ. Dùng Move của Delphi mà truyền đúng tham số mới là thử thách cho bạn. Nếu bạn thấy Move khó quá đối với bạn thì dùng CopyMemory của Windows API thôi.
 
Upvote 0
Các bạn học Delphi mà đụng vào memory hay sử dụng các hàm API thì phải hiểu kiến thức về con trỏ đã. Xem bài bạn Thuyyeu thì hình như bạn chưa đọc kỹ tài liệu về Pointer trong Pascal. Nếu chưa có chuẩn bị kiến thức về Pointer thì các hướng dẫn trên của mọi người về Move hay CopyMemory sẽ không hiểu đâu. Kiến thức dạng này phải cày tài liệu kỹ, không học mò được đâu.
 
Upvote 0
Vài lời tâm sự gửi cho gió ...
Xem ra cái thớt Delphi này Có nhiều thành Viên mê lắm, thích lắm và mong muốn học nhiều lắm
…!!!???

Mà tại làm sao không dám lên đây đặt 1 câu hỏi đơn giản nhất như 1 + 1 = ???!!! là sao vậy
Mà cứ lén lút nhắn tin + kết Bạn Zalo, Facebook hỏi giật chọt như thế thì làm sao mà học được ??!!!
Hay cái Tôi của mình quá lớn đến nổi dấu dốt mà không dám hỏi 1 câu hay sao ????!!!

Không có gì là xấu hổ cả Chỉ có dấu dốt hay xâm phạm tới các quy định của pháp luật mới thật sự xấu hổ
Học tập là cả 1 quá trình tích lũy đâu có dễ như ăn kẹo mút …hỏi cà giật tin nhắn 1 ,2 câu xong
Hãy dũng cảm lên , Mạnh mẻ lên … lên cái thớt này mà hỏi … học tập giao lưu tương tác thì mới phát sinh nhiều cái hay mà học ...

Trẻ tuổi học cái hay cái kinh nghiệm của người nhiều tuổi và người nhiều tuổi trong chừng mực nào đó có khi lại học cái hay của giới trẻ ấy chứ
Có giao lưu, tương tác thì xã hội này nó mới phát triển lên được và chính mình cũng thế !!!!???

Và cuối cùng nếu thật sự mong muốn học thì nên hỏi nhưng nơi người ta giảng dạy có trường lớp, bài bản VD như: @Nguyễn Duy Tuân
thì sẻ có một kiến thức cơ bản tốt

Xin đừng nhắn tin + kết bạn với Mạnh vì cái sự dấu dốt, lén lút và mấy đồng bạc còi … tui bới cho lại hủy kết bạn thì nhọc lắm hehehehe
 
Lần chỉnh sửa cuối:
Upvote 0
Vài lời tâm sự gửi cho gió ...
Xem ra cái thớt Delphi này Có nhiều thành Viên mê lắm, thích lắm và mong muốn học nhiều lắm
…!!!???

Mà tại làm sao không dám lên đây đặt 1 câu hỏi đơn giản nhất như 1 + 1 = ???!!! là sao vậy
Mà cứ lén lút nhắn tin + kết Bạn Zalo, Facebook hỏi giật chọt như thế thì làm sao mà học được ??!!!
Hay cái Tôi của mình quá lớn đến nổi dấu dốt mà không dám hỏi 1 câu hay sao ????!!!

Không có gì là xấu hổ cả Chỉ có dấu dốt hay xâm phạm tới các quy định của pháp luật mới thật sự xấu hổ
Học tập là cả 1 quá trình tích lũy đâu có dễ như ăn kẹo mút …hỏi cà giật tin nhắn 1 ,2 câu xong
Hãy dũng cảm lên , Mạnh mẻ lên … lên cái thớt này mà hỏi … học tập giao lưu tương tác thì mới phát sinh nhiều cái hay mà học ...

Trẻ tuổi học cái hay cái kinh nghiệm của người nhiều tuổi và người nhiều tuổi trong chừng mực nào đó có khi lại học cái hay của giới trẻ ấy chứ
Có giao lưu, tương tác thì xã hội này nó mới phát triển lên được và chính mình cũng thế !!!!???

Và cuối cùng nếu thật sự mong muốn học thì nên hỏi nhưng nơi người ta giảng dạy có trường lớp, bài bản VD như: @Nguyễn Duy Tuân
thì sẻ có một kiến thức cơ bản tốt

Xin đừng nhắn tin + kết bạn với Mạnh vì cái sự dấu dốt, lén lút và mấy đồng bạc còi … tui bới cho lại hủy kết bạn thì nhọc lắm hehehehe
hehe em giải quyết xong hàm move rồi (mà move xong nó chuyển dòng thành cột mới ghê chứ éc).Làm liên quan tới Memory không nắm vững nguy hiểm quá không mò nữa.
Khi nào vướng hỏi tiếp heheheh
 
Upvote 0
hehe em giải quyết xong hàm move rồi (mà move xong nó chuyển dòng thành cột mới ghê chứ éc).Làm liên quan tới Memory không nắm vững nguy hiểm quá không mò nữa.
Khi nào vướng hỏi tiếp heheheh
THÌ HÔM mạnh cũng có thử trên VBA mà thấy nó rối quá đang bỏ đó
Hình như dòng sang cột cho vào Memory nó cho tốc độ rất nhanh .... có thể bỏ qua được vòng lặp chuyển mảng
Chúc mừng nha

mà có Re cho Mạnh 1 tẹo học hỏi ko nhỉ Quan trọng cái đó ý :D :p cái đó người ta keo là giao lưu và tương tác đấy ???
 
Upvote 0
THÌ HÔM mạnh cũng có thử trên VBA mà thấy nó rối quá đang bỏ đó
Hình như dòng sang cột cho vào Memory nó cho tốc độ rất nhanh .... có thể bỏ qua được vòng lặp chuyển mảng
Chúc mừng nha

mà có Re cho Mạnh 1 tẹo học hỏi ko nhỉ Quan trọng cái đó ý :D :p cái đó người ta keo là giao lưu và tương tác đấy ???
Mò đi cho nó phê hehehehe
Chạy lần đầu không sao, lần 2 nó lỗi làm biếng mò quá anh với lại không đúng yêu cầu của em (em đâu có muốn viết Tranpose đâu em muốn viết ReDim Preserve ).
Thôi cái này khó quá cho qua để đó tính sau.
 
Upvote 0
1/ Mạnh có tìm hiểu đọc khá nhiều tài liệu thấy trên Google nó keo chỉ có C++ Or Delphi mới viết được *.DLL ... API không biết nó phán như vậy có đúng không ???? ai biết xin trả lời dùm

2/ Thực tế Mạnh thấy mấy Fan hâm mộ VB6 cũng tự chế thêm Tools cũng Build DLL kiểu API thấy cũng chạy được đó nhưng chỉ trên nền tảng 32 bit ( mà thấy nó cũng ko giống ai ... chạy code ok code lỗi linh tinh )

3/ Tại vì cũng có mấy Bạn hỏi viết trên VB6 nên đang tìm hiểu tài liệu chút viết cái Add-ins cho VB6 như ý đồ mục số 2 cho các Bạn đó làm quên DLL API mà thấy nó không giống ai cả .... :D ;) ( Vì code VB6 nó gần như VBA nên rất dễ làm quen )

4/ Thui khuyên ai đó nếu rảnh nên học C++ Or Delphi đi viết *.DLL API cho khoẻ khỏi mất công làm giả như mục số 2 thấy cũng nhọc lắm he
 
Lần chỉnh sửa cuối:
Upvote 0
PHƯƠNG PHÁP LẬP TRÌNH NHÚNG DLL TRONG DELPHI
Lập trình Delphi tạo hàm trả về mảng động (co giãn trên worksheet) với thư viện Add-in A-Tools.
Lợi ích của phương pháp này là:
- Code các hàm của bạn được biên dịch hoàn toàn ra DLL
- Vì DLL biên dịch bằng Delphi ra mã máy nên tốc độ code chạy rất nhanh.
- Tận dụng được thư viện đã có từ một DLL khác để dùng trong phần mềm hay DLL của bạn.

 
Lần chỉnh sửa cuối:
Upvote 0
1/ Năm ngoái Mạnh có quậy cái TaskPane có nhúng cái BSAC.OCX đó vào Delphi ... Mục đích là xem trong đó nó có cái gì !! :p :p nhưng khi Build nó báo lỗi liên quan Tới Bản Quyền ( Vì ko cài bản Free )

2/ Mới xem hết Video xong học được cách tạo cái Arr trên Delphi thấy hay ... lâu lâu học được 1 chút + lại nhiều chút cũng ok

Cảm ơn @Nguyễn Duy Tuân rất nhiều
 
Upvote 0
1/ Năm ngoái Mạnh có quậy cái TaskPane có nhúng cái BSAC.OCX đó vào Delphi ... Mục đích là xem trong đó nó có cái gì !! :p :p nhưng khi Build nó báo lỗi liên quan Tới Bản Quyền ( Vì ko cài bản Free )

2/ Mới xem hết Video xong học được cách tạo cái Arr trên Delphi thấy hay ... lâu lâu học được 1 chút + lại nhiều chút cũng ok

Cảm ơn @Nguyễn Duy Tuân rất nhiều

1). Tạo TaskPane dùng thư viện BSAC thì viết lệnh nhé, đúng kéo TaskPaneX vào form (không như VBA). Cũng làm công việc Import Type Library. Dùng class IBSTaskPanes, IBSTakPane. Sau có time có thể mình làm clip về cái này.

2). Mảng trong VBA nhìn thì dễ, bản chất nó là mảng PSafeArray nên ở Delphi phải dùng kiểu đó (VarArrayCreate() ). Còn mảng chỉ giao tiếp trong môi trường Delphi thôi thì chỉ cần khai báo var arr: array[0..n-1, 0..0] of Variant;
 
Upvote 0
Mạnh thấy Bài 1074 viết Hàm hay quá mò diết Copy xào trẻ, cắt dán diết cuối cùng cũng mò ra phương thức của nó một tí ... khoe 1 tẹo :p
Code Copy từ Internet .... thêm hành + tỏi + nước mắm xào lên thế thôi ... thấy nó cũng thơm _+)(9
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
các Bạn cho mình hỏi chút Mình muốn xài CreateObject("Scripting.FileSystemObject") Trong Delphi thì Uses cái Unit nào nhỉ
lâu này toàn sử dụng kiểu sau ... giờ muốn bỏ sử dụng cái sẳn có trong Delphi
Mã:
fso := CreateOleObject('Scripting.FileSystemObject');
 
Upvote 0
Các Bạn cho Mình hỏi chút
Mình sử dụng code sau test thử sao có 2 dòng sau lúc nó chạy lúc Không mà chưa biết vì sao ... hay viết sai cái gì
Rất mong trợ giúp
Mã:
ShowMessage(sheet.name); //dòng này lúc chạy lúc không
sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
Toàn bộ code như sau:
Mã:
procedure Get_ExcelApp;
var
  Excel: OleVariant;
  sheet: OleVariant;
  XlVersion: Integer;
begin
  try
    Excel := GetActiveOleObject('EXCEL.Application');
    XlVersion := Trunc(Excel.Application.Version);
    ShowMessage('GetActiveOleObject');
    ShowMessage(IntToStr(XlVersion));
    sheet := Excel.ActiveSheet;
    ShowMessage(sheet.name); //dòng này lúc chạy lúc không
    sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
  except
    Excel := CreateOleObject('EXCEL.Application');
    XlVersion := Trunc(Excel.Application.Version);
    ShowMessage('CreateOleObject');
    ShowMessage(IntToStr(XlVersion));
    sheet := Excel.ActiveSheet;
    ShowMessage(sheet.name); //dòng này lúc chạy lúc không
    sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
  end;
  Excel := Unassigned;
end;
1/ Nếu mở 1 File Excel mới tinh lên chưa Lưu có đường dẫn trên ổ cứng là tịt !!
2/ Nếu 1 File có có dữ liệu đã lưu trên Ổ cứng thì OK ???
 
Lần chỉnh sửa cuối:
Upvote 0
Debug đi, debug vào source của Delphi luôn, xem tại sao failed.
Quăng lý do failed, file source, dòng lên đây.
Code mà không biết debug là vứt.
Những dòng lệnh trong khối except...end sẽ được thực thi khi nào mà viết là "lúc chạy lúc không ?????"
Đọc help của Delphi về cơ chế exception handling của nó chưa ?
try finally except mục đích làm gì ?
 
Upvote 0
Các Bạn cho Mình hỏi chút
Mình sử dụng code sau test thử sao có 2 dòng sau lúc nó chạy lúc Không mà chưa biết vì sao ... hay viết sai cái gì
Rất mong trợ giúp
Mã:
ShowMessage(sheet.name); //dòng này lúc chạy lúc không
sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
Toàn bộ code như sau:
Mã:
procedure Get_ExcelApp;
var
  Excel: OleVariant;
  sheet: OleVariant;
  XlVersion: Integer;
begin
  try
    Excel := GetActiveOleObject('EXCEL.Application');
    XlVersion := Trunc(Excel.Application.Version);
    ShowMessage('GetActiveOleObject');
    ShowMessage(IntToStr(XlVersion));
    sheet := Excel.ActiveSheet;
    ShowMessage(sheet.name); //dòng này lúc chạy lúc không
    sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
  except
    Excel := CreateOleObject('EXCEL.Application');
    XlVersion := Trunc(Excel.Application.Version);
    ShowMessage('CreateOleObject');
    ShowMessage(IntToStr(XlVersion));
    sheet := Excel.ActiveSheet;
    ShowMessage(sheet.name); //dòng này lúc chạy lúc không
    sheet.Range['a1', 'a1'] := 'Kiều Mạnh';    //dòng này lúc chạy lúc không
  end;
  Excel := Unassigned;
end;
1/ Nếu mở 1 File Excel mới tinh lên chưa Lưu có đường dẫn trên ổ cứng là tịt !!
2/ Nếu 1 File có có dữ liệu đã lưu trên Ổ cứng thì OK ???

Có vài vấn đề cần làm rõ hơn:
1. Hàm GetActiveOleObject giống GetObject của VBA/VB6. Nó chit chạy nếu Excel chạy với “Run as Administrator”.
2. Range cách dùng Range[‘A1’, EmptyParam] (không muốn viết tham số thứ hai)
3. Code của bạn là ghi dữ liệu vào file đang mở, nó sẽ lỗi nếu Excel mới tạo không có file nào. Nên bạn phải viết dòng code
Excel := CreateOleObject('EXCEL.Application');
Excel.Workbooks.Add

(*) Bạn xem video tôi hướng dẫn ghi dữ liệu và vẽ biểu đồ Excel đây để thêm kinh nghiệm
 
Upvote 0
Debug đi, debug vào source của Delphi luôn, xem tại sao failed.
Quăng lý do failed, file source, dòng lên đây.
Code mà không biết debug là vứt.
Những dòng lệnh trong khối except...end sẽ được thực thi khi nào mà viết là "lúc chạy lúc không ?????"
Đọc help của Delphi về cơ chế exception handling của nó chưa ?
try finally except mục đích làm gì ?
chịu ... coi help mà biết hết cũng chết liền .... Chỉ Em út chút đi ... mò lâu quá đi
 
Upvote 0
Có vài vấn đề cần làm rõ hơn:
1. Hàm GetActiveOleObject giống GetObject của VBA/VB6. Nó chit chạy nếu Excel chạy với “Run as Administrator”.
2. Range cách dùng Range[‘A1’, EmptyParam] (không muốn viết tham số thứ hai)
3. Code của bạn là ghi dữ liệu vào file đang mở, nó sẽ lỗi nếu Excel mới tạo không có file nào. Nên bạn phải viết dòng code
Excel := CreateOleObject('EXCEL.Application');
Excel.Workbooks.Add

(*) Bạn xem video tôi hướng dẫn ghi dữ liệu và vẽ biểu đồ Excel đây để thêm kinh nghiệm
Cho Mình hỏi chút có cách nào khác khai báo và sử dụng trên Excel mà bỏ cái dòng mình tô đậm đó không
mà sử dụng tốt cho Office 2010 to 2019
 
Upvote 0
Có vài vấn đề cần làm rõ hơn:
1. Hàm GetActiveOleObject giống GetObject của VBA/VB6. Nó chit chạy nếu Excel chạy với “Run as Administrator”.
2. Range cách dùng Range[‘A1’, EmptyParam] (không muốn viết tham số thứ hai)
3. Code của bạn là ghi dữ liệu vào file đang mở, nó sẽ lỗi nếu Excel mới tạo không có file nào. Nên bạn phải viết dòng code
Excel := CreateOleObject('EXCEL.Application');
Excel.Workbooks.Add

(*) Bạn xem video tôi hướng dẫn ghi dữ liệu và vẽ biểu đồ Excel đây để thêm kinh nghiệm
Quá hay ... chắc coi tới lui sẻ làm ok đó
Nếu được cho Mình xin code Phần kết nối và gán kết quả tới Excel đi .... thì Mạnh học sẻ rất nhanh thôi, cơ bản kiến thức Delphi Mạnh Học ở đây và Internet tạm ổn rồi
Xin cảm ơn
 
Upvote 0
Upvote 0
Cái đó là bắt buộc. Nếu viết add-in thì không cần.
Có vài vấn đề cần làm rõ hơn:
1. Hàm GetActiveOleObject giống GetObject của VBA/VB6. Nó chit chạy nếu Excel chạy với “Run as Administrator”.
2. Range cách dùng Range[‘A1’, EmptyParam] (không muốn viết tham số thứ hai)
3. Code của bạn là ghi dữ liệu vào file đang mở, nó sẽ lỗi nếu Excel mới tạo không có file nào. Nên bạn phải viết dòng code
Excel := CreateOleObject('EXCEL.Application');
Excel.Workbooks.Add

(*) Bạn xem video tôi hướng dẫn ghi dữ liệu và vẽ biểu đồ Excel đây để thêm kinh nghiệm
Xem tới lui qua lại mấy lần đã học xong ... vậy là cái Add-Ins COM + Ribbon menu trên Delphi của Mạnh cơ bản đã hoàn thành
quá hay luôn .... Mạnh cảm ơn nhiều
1592705408017.png
 
Upvote 0
Xem tới lui qua lại mấy lần đã học xong ... vậy là cái Add-Ins COM + Ribbon menu trên Delphi của Mạnh cơ bản đã hoàn thành
quá hay luôn .... Mạnh cảm ơn nhiều
View attachment 239654

Nếu đã chạy COM add-in tbif hãy gán biến Excel vào tham số Application trong sự kiện OnConnection nhé. Sau này không phải Create hay get Object gì cả.
 
Upvote 0
Nếu đã chạy COM add-in tbif hãy gán biến Excel vào tham số Application trong sự kiện OnConnection nhé. Sau này không phải Create hay get Object gì cả.
Chắc là code sau quá .... càng đi sâu lại khám phá ra nhiều thứ hay ... Cảm ơn chỉ cho Mạnh
Mã:
procedure TCoMultipleUIThreadsDemo.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
Mới biết khai báo tham số và đối số sử dụng cho File *.ridl vậy là qua nhưng bài của Bạn + sự đam mê code của Mạnh cơ bản học được rất nhiều đó

1592707374440.png
Vậy cơ bản Viết Add-ins COM trên Delphi cho Excel tạm OK rồi ... khó khăn lại nhờ Tiếp
 
Upvote 0
Rảnh mình mới thử thì thấy như sau

Code Sau chạy tốt
Mã:
procedure TForm1.Button1Click(Sender: TObject);
begin { Tạo 1 File Excel Moi }
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectKind := cknewinstance;
  FExcelApp.Connect;
  FExcelApp.Visible[0] := true;
  FExcelApp.Workbooks.Add(EmptyParam, 0);
end;

Code Sau thì báo lỗi Mình chưa biết do khai báo thiếu gì hay Viết sai
Mã:
procedure TForm1.Button2Click(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
  Sheet: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default['a1', EmptyParam].Value := 'Kiều Mạnh';  //Không chạy và báo Lỗi
  ShowMessage(sh.Name);  //không chạy
end;

Hình báo Lỗi khi chạy Add-Ins Mở 1 File Excel mới lên chưa có Lưu
1592720028113.png
Mong chỉ dùm ... xin cảm ơn
 
Upvote 0
Rảnh mình mới thử thì thấy như sau

Code Sau chạy tốt
Mã:
procedure TForm1.Button1Click(Sender: TObject);
begin { Tạo 1 File Excel Moi }
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectKind := cknewinstance;
  FExcelApp.Connect;
  FExcelApp.Visible[0] := true;
  FExcelApp.Workbooks.Add(EmptyParam, 0);
end;

Code Sau thì báo lỗi Mình chưa biết do khai báo thiếu gì hay Viết sai
Mã:
procedure TForm1.Button2Click(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
  Sheet: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default['a1', EmptyParam].Value := 'Kiều Mạnh';  //Không chạy và báo Lỗi
  ShowMessage(sh.Name);  //không chạy
end;

Hình báo Lỗi khi chạy Add-Ins Mở 1 File Excel mới lên chưa có Lưu
View attachment 239660
Mong chỉ dùm ... xin cảm ơn
Đã truyền vào Cells thì nó phải là số chứ anh:

Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
   
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1,1].Value :='Kiều Mạnh' ;
  ShowMessage(sh.Name);  //ok
end;
 
Lần chỉnh sửa cuối:
Upvote 0
Đã truyền vào Cells thì nó phải là số chứ anh:

Mã:
procedure TForm1.Button1Click(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
  
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1,1].Value :='Kiều Mạnh' ;
  ShowMessage(sh.Name);  //ok
end;
Mới thử xong nó vẫn báo lỗi vậy ... Hay DLL COM Add-ins nó khai báo có gì khác ???

1592808541562.png
1592808592300.png
 
Upvote 0
Chịu thử các kiểu rồi ... mai mốt rảnh làm cái Form.exe chạy xem sao ... còn Add-ins COM DLL là thua rồi đó
 
Upvote 0
Bạn gửi đoạn code nằm trong lệnh chạy lỗi xem nào?
Code chay báo Lỗi
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
  ShowMessage(sh.name);
end;

Khai báo Trên Form
Mã:
uses
  System.Win.ComObj,
  Excel2010, Vcl.oleServer,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls,
  Vcl.ExtCtrls, Vcl.DBCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    TaoWorkBook: TButton;
    GetRange: TButton;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    cmdDongExcel: TButton;
    // manh them khai bao
    procedure SpeedButton1Click(Sender: TObject);
    procedure TaoWorkBookClick(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure cmdDongExcelClick(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
  end;
Xem dùm Mạnh hay Uses nó thiếu cái gì

Ý là khi mở Form trên Add-ins Ribbon Excel lên thì nó lấy ActiveSheet của bất cứ File nào đó đang mở... xong tùy chọn gán dữ liệu Xuống Range
VD: có nhiều ActiveWorkbook đang mở thì kho Form Show lên trên ActiveSheet của ActiveWorkbook đó thì tùy chọn gán xuống Range của ActiveSheet đó

Thiết kế Y trang cái Tools SQL sau Mạnh viết trên VB6 là File EXE ... còn Delphi là DLL COM Add-Ins
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code chay báo Lỗi
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
  ShowMessage(sh.name);
end;

Khai báo Trên Form
Mã:
uses
  System.Win.ComObj,
  Excel2010, Vcl.oleServer,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls,
  Vcl.ExtCtrls, Vcl.DBCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    TaoWorkBook: TButton;
    GetRange: TButton;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    cmdDongExcel: TButton;
    // manh them khai bao
    procedure SpeedButton1Click(Sender: TObject);
    procedure TaoWorkBookClick(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure cmdDongExcelClick(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
  end;
Xem dùm Mạnh hay Uses nó thiếu cái gì

Ý là khi mở Form trên Add-ins Ribbon Excel lên thì nó lấy ActiveSheet của bất cứ File nào đó đang mở... xong tùy chọn gán dữ liệu Xuống Range
VD: có nhiều ActiveWorkbook đang mở thì kho Form Show lên trên ActiveSheet của ActiveWorkbook đó thì tùy chọn gán xuống Range của ActiveSheet đó

Thiết kế Y trang cái Tools SQL sau Mạnh viết trên VB6 là File EXE ... còn Delphi là DLL COM Add-Ins
Anh thử file đính kèm nhé
 

File đính kèm

Upvote 0
Anh thử file đính kèm nhé
Rảnh tải code đó xem ( Code Của tây đó nha )
COM Add-Ins Delphi đó nghiên cứu xem và thử trên cái Form đó xem là thấy cái lỗi Mạnh đang bị
Mạnh Ứng dụng File đó Viết thêm Menu vào thôi ...
Vọc File đó đi xu hướng sẻ có nhiều thứ hay đấy

nếu ko thích cái Form đó load khi Excel load thì xóa nó đi tạo cái Mới xong viết Menu gọi nó lên thì cũng lỗi như vậy
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Rảnh tải code đó xem ( Code Của tây đó nha )
COM Add-Ins Delphi đó nghiên cứu xem và thử trên cái Form đó xem là thấy cái lỗi Mạnh đang bị
Mạnh Ứng dụng File đó Viết thêm Menu vào thôi ...
Vọc File đó đi xu hướng sẻ có nhiều thứ hay đấy

nếu ko thích cái Form đó load khi Excel load thì xóa nó đi tạo cái Mới xong viết Menu gọi nó lên thì cũng lỗi như vậy
Cho đến tận bài #1097 bạn chỉ toàn nói nhát gừng, đính từng mẩu code, nên muốn đoán mò vẫn rất khó. Bạn tung mẩu code:
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
  ShowMessage(sh.name);
end;
nhưng bạn không tiết lộ bí mật là từ đâu bạn đã có FExcelApp.

Ở bài #1098 bạn đính kèm toàn bộ code nên chả cần đoán mò nữa. Sự thật nó trần trụi hay trần truồng thế nào thì nhìn rõ mồn một.

Bạn hãy tìm trong tất cả các tập tin PAS xem có chỗ nào khởi tạo hay đọc từ đâu đó vào FExcelApp. Tôi đeo kính, soi đèn pin nhưng không tìm thấy. Tức ở thời điểm nhấn nút GetRange thì FExcelApp = NIL. Không có lỗi mới là chuyện lạ.

Tôi rất ngại trả lời bạn và một bạn nữa vì các bạn thường chỉ nói nhát gừng, và đính kèm 1 mẩu code ngắn. Không một lời giải thích thêm.

Bạn viết code nhưng bạn không biết debug ở mức tối thiểu?
 
Lần chỉnh sửa cuối:
Upvote 0
Cho đến tận bài #1097 bạn chỉ toàn nói nhát gừng, đính từng mẩu code, nên muốn đoán mò vẫn rất khó. Bạn tung mẩu code:
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  d: Integer; // Last row
  sh: _WorksheetDisp;
begin
  sh := _WorksheetDisp(FExcelApp.ActiveSheet);
  sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
  ShowMessage(sh.name);
end;
nhưng bạn không tiết lộ bí mật là từ đâu bạn đã có FExcelApp.

Ở bài #1098 bạn đính kèm toàn bộ code nên chả cần đoán mò nữa. Sự thật nó trần trụi hay trần truồng thế nào thì nhìn rõ mồn một.

Bạn hãy tìm trong tất cả các tập tin PAS xem có chỗ nào khởi tạo hay đọc từ đâu đó vào FExcelApp. Tôi đeo kính, soi đèn pin nhưng không tìm thấy. Tức ở thời điểm nhấn nút GetRange thì FExcelApp = NIL. Không có lỗi mới là chuyện lạ.

Tôi rất ngại trả lời bạn và một bạn nữa vì các bạn thường chỉ nói nhát gừng, và đính kèm 1 mẩu code ngắn. Không một lời giải thích thêm.

Bạn viết code nhưng bạn không biết debug ở mức tối thiểu?
Em mới thử viết kiểu vầy nó vẫn báo lỗi ... Anh xem Em viết sai cái gì hay thiếu cái gì viết lại dùm Em với
Cảm Ơn Anh :D
Mã:
procedure TForm1.Button3Click(Sender: TObject);
var
  ExcelApp: TExcelApplication;
  ExWorkbook: TExcelWorkbook;
  ExSheet: TExcelWorksheet;
begin
  ExcelApp := TExcelApplication.Create(nil);
  ExcelApp.Connect;
  ExWorkbook := TExcelWorkbook.Create(nil);
  ExSheet := TExcelWorksheet.Create(nil);
  try
    ExWorkbook.ConnectTo(ExcelApp.ActiveWorkbook as _Workbook);
    ExSheet.ConnectTo(ExWorkbook.ActiveSheet as _Worksheet);
    ShowMessage(ExSheet.name);
  finally
    if Assigned(ExcelApp) then
    begin
      ExcelApp.free;
      ExWorkbook.free;
      ExSheet.free;
    end;
  end;
end;
Code trên Mở File Excel Mới lên Chạy lần 1 báo lỗi
Loi.PNG

Thoát Form chạy Lần thứ 2 Ok ... gần đúng rồi đó
ok.PNG

Anh Viết lại dùm Em với sao cũng File Excel đó chạy Form lần 1 báo lỗi ... Close Form xong chạy lại thì Ok ... Em chịu ko biết tại sao Luôn
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom