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

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
1/ nếu xài dòng sau không hiểu sao nó làm đơ file Excel xong thoát luôn
Mã:
E := GetActiveOleObject('Excel.Application');


hay đó Mai mạnh Nghiên Cứu Kỹ hơn .... Cảm ơn rất NhiềuView attachment 204577

Có lẻ truyền chính tham số từ Excel vào nó tương tác với *.dll cho nên nó chạy rất nhanh thấy bài trước @Nguyễn Duy Tuân có nói ?!

Nếu viết phần mềm độc lập - Application thì ta chủ động tạo một instance của Excel là cần. Dùng GetActiveOleObject hay CreateOleObject để gọi "Excel.Application" tùy vào mục đích. Nhưng khi viết DLL, OCX thì ta đã xác định nó được gọi bên trong một Application cụ thể rồi vì thế vai trò của hàm chỉ đảm nhận khai thác từ tham số truyền vào và trả về cái người gọi cần. Nên việc viết hàm phải rất chú ý tới cách tạo , truyền tham số, trả về.

Có một điều nữa là Delphi có tất cả những thứ cần thiết để làm những yêu cầu mà các bạn lập trình VBA hay dùng như Dictionary, ADO, FileSystemObject. Nên hãy dùng những thứ trong Delphi gần như sẽ là tốt và chủ động nhất, trừ phi không có.

Dùng những Object thứ có sẵn trong Delphi phần lớn sẽ rất nhanh vì họ làm công nghệ mới, cải tiến rất nhiều, nhiều hàm hệ thống Delphi cung cấp họ viết bằng Assemply tốc độ chạy rất nhanh.
 
Upvote 0
Nếu viết phần mềm độc lập - Application thì ta chủ động tạo một instance của Excel là cần. Dùng GetActiveOleObject hay CreateOleObject để gọi "Excel.Application" tùy vào mục đích. Nhưng khi viết DLL, OCX thì ta đã xác định nó được gọi bên trong một Application cụ thể rồi vì thế vai trò của hàm chỉ đảm nhận khai thác từ tham số truyền vào và trả về cái người gọi cần. Nên việc viết hàm phải rất chú ý tới cách tạo , truyền tham số, trả về.

Có một điều nữa là Delphi có tất cả những thứ cần thiết để làm những yêu cầu mà các bạn lập trình VBA hay dùng như Dictionary, ADO, FileSystemObject. Nên hãy dùng những thứ trong Delphi gần như sẽ là tốt và chủ động nhất, trừ phi không có.

Dùng những Object thứ có sẵn trong Delphi phần lớn sẽ rất nhanh vì họ làm công nghệ mới, cải tiến rất nhiều, nhiều hàm hệ thống Delphi cung cấp họ viết bằng Assemply tốc độ chạy rất nhanh.
Nếu được bạn cho Mình xin 1 code không phải khai báo như sau với để Mình học ..
Mã:
Dic := CreateOleObject('Scripting.Dictionary') ;
Mình suy đoán nếu ko khởi tạo CreateOleObject thì sẻ cho tốc độ nhanh hơn đó vì ADO Delphi thấy cũng tích hợp sẳn dòng sau
Mã:
cnn := TADOConnection.Create(nil);
Có nghĩa họ viết cho Windows nên đã tích hợp sẳn luôn trong đó ko cần khởi tạo nữa ( mạnh suy đoán bạy vậy)
 
Upvote 0
Nếu được bạn cho Mình xin 1 code không phải khai báo như sau với để Mình học ..
Mã:
Dic := CreateOleObject('Scripting.Dictionary') ;
Mình suy đoán nếu ko khởi tạo CreateOleObject thì sẻ cho tốc độ nhanh hơn đó vì ADO Delphi thấy cũng tích hợp sẳn dòng sau
Mã:
cnn := TADOConnection.Create(nil);
Có nghĩa họ viết cho Windows nên đã tích hợp sẳn luôn trong đó ko cần khởi tạo nữa ( mạnh suy đoán bạy vậy)
nếu bạn dùng ADO trong Delphi thử nghiên cứu xem có câu lệnh sụm theo điều kiện đấy, tất cả yêu cầu của bạn điều có trong sql (Có đợt tôi làm chương trình quản lý hóa đơn bằng C Shap cũng na ná delphi cũng dùng Sql, giờ máy không còn cai nên không mở Code lên được, ban thu nghiên cứu xem)
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu được bạn cho Mình xin 1 code không phải khai báo như sau với để Mình học ..
Mã:
Dic := CreateOleObject('Scripting.Dictionary') ;
Mình suy đoán nếu ko khởi tạo CreateOleObject thì sẻ cho tốc độ nhanh hơn đó vì ADO Delphi thấy cũng tích hợp sẳn dòng sau
Mã:
cnn := TADOConnection.Create(nil);
Có nghĩa họ viết cho Windows nên đã tích hợp sẳn luôn trong đó ko cần khởi tạo nữa ( mạnh suy đoán bạy vậy)

Cách làm việc với Dictionary trong Delphi là dùng đối tượng TDictionary, đối tượng này nằm trong unit System.Generics.Collections.
Bạn hãy tạo một VCL Application rồi copy đoạn code dưới đây để chạy.


Mã:
uses System.Generics.Collections;
type
  TMyData = class
    MaNV: string;
    TenNV: string;
    Tuoi: Integer;
  end;
procedure TForm1.FormCreate(Sender: TObject);

var
  Key: string;
  data: TMyData;
  dic: TDictionary<string, TMyData>;
  I: Integer;
begin
  dic := TDictionary<string, TMyData>.create;
  try
    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Duy Tuan';
    data.Tuoi := 25;
    dic.Add('001', data); //add data to dictionary

    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Bao Ninh';
    data.Tuoi := 24;
    dic.Add('002', data); //add data to dictionary

    //kiem tra ton tai key chua
    Key := '001';
    if dic.ContainsKey(Key) then
    begin
      data := dic.Items[Key];
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
    end
    else
    begin
      ShowMessage('Chua co can them moi!');
    end;

    //doc tung ban ghi (record) vaf free
    for data in Dic.Values do
    begin
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
      //Free memory
      data.Free;
    end;
  finally
    dic.Free;
  end;
end;
 
Lần chỉnh sửa cuối:
Upvote 0
Cách làm việc với Dictionary trong Delphi là dùng đối tượng TDictionary, đối tượng này nằm trong unit System.Generics.Collections.
Bạn hãy tạo một VCL Application rồi copy đoạn code dưới đây để chạy.


Mã:
uses System.Generics.Collections;
type
  TMyData = class
    MaNV: string;
    TenNV: string;
    Tuoi: Integer;
  end;
procedure TForm1.FormCreate(Sender: TObject);

var
  Key: string;
  data: TMyData;
  dic: TDictionary<string, TMyData>;
  I: Integer;
begin
  dic := TDictionary<string, TMyData>.create;
  try
    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Duy Tuan';
    data.Tuoi := 25;
    dic.Add('001', data); //add data to dictionary

    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Bao Ninh';
    data.Tuoi := 24;
    dic.Add('002', data); //add data to dictionary

    //kiem tra ton tai key chua
    Key := '001';
    if dic.ContainsKey(Key) then
    begin
      data := dic.Items[Key];
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
    end
    else
    begin
      ShowMessage('Chua co can them moi!');
    end;

    //doc tung ban ghi (record) vaf free
    for data in Dic.Values do
    begin
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
      //Free memory
      data.Free;
    end;
  finally
    dic.Free;
  end;
end;
Cảm ơn bạn vậy là mình đoán trúng :D ... vốn dĩ khởi tạo Obiect nó đã nhanh rồi mà xài kiểu này nó lại nhanh nữa
Mình có coi mấy trang nước ngoài thấy nó keo xài API của windows trong Delphi càng tiện hơn nữa
Khai Báo Uses
Mã:
uses
ShellApi,
vậy là xài nó đơn giản như sau ... quá tiện đi chứ
Mã:
begin
   ShellExecute(0, 'open', PCHAR(SaveDialog.FileName), nil, nil, SW_SHOWNORMAL);
end;
Còn cách trên của Bạn Mạnh nghỉ Dic với Fso chung một thư viên Windows Xài Fso cũng khai báo như vậy hay khác mong Bạn chỉ cho
Xin cảm ơn
 
Upvote 0
Cách làm việc với Dictionary trong Delphi là dùng đối tượng TDictionary, đối tượng này nằm trong unit System.Generics.Collections.
Bạn hãy tạo một VCL Application rồi copy đoạn code dưới đây để chạy.


Mã:
uses System.Generics.Collections;
type
  TMyData = class
    MaNV: string;
    TenNV: string;
    Tuoi: Integer;
  end;
procedure TForm1.FormCreate(Sender: TObject);

var
  Key: string;
  data: TMyData;
  dic: TDictionary<string, TMyData>;
  I: Integer;
begin
  dic := TDictionary<string, TMyData>.create;
  try
    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Duy Tuan';
    data.Tuoi := 25;
    dic.Add('001', data); //add data to dictionary

    data := TMyData.Create;
    data.MaNV := '001';
    data.TenNV := 'Nguyen Bao Ninh';
    data.Tuoi := 24;
    dic.Add('002', data); //add data to dictionary

    //kiem tra ton tai key chua
    Key := '001';
    if dic.ContainsKey(Key) then
    begin
      data := dic.Items[Key];
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
    end
    else
    begin
      ShowMessage('Chua co can them moi!');
    end;

    //doc tung ban ghi (record) vaf free
    for data in Dic.Values do
    begin
      ShowMessage('Da co MaNV da ton tai voi ten NV: ' + data.TenNV);
      //Free memory
      data.Free;
    end;
  finally
    dic.Free;
  end;
end;
Sẵn tiện anh làm sum luôn đi
 
Upvote 0
Sẵn tiện anh làm sum luôn đi

Nếu làm về CSDL thì dùng SQL, như vậy cách để SUM thì dùng trong ngôn ngữ SQL. ADOConnection là object để thực thi nó (thực ra có nhiều cái khác nhưng tạm cứ dùng cái này cho người làm VBA gần gũi mà thôi).

Câu lệnh để tính SUM là

ADOQuery1.SQL.Text := ' SELECT MAHH, SUM(SLG) AS [SLG] FROM KHO GROUP BY MAHH";

Duyệt từng dòng trong ADOQuery1 như sau:

while not ADOQuery1.Eof do
begin
data.MAHH := ADOQuery1.Fields[0].AsString;
data.SLG := ADOQuery1.Fields[0].AsFloat;
ADOQuery1.Next;
end;

...

Không biết có phải ý bạn là thế không?
 
Upvote 0
Sẵn tiện anh làm sum luôn đi
bạn thử code trong Delphi xem sao Nhé
1/ Theo Cách Bạn viết
2/ Theo hướng Dẫn bài 124
Mã:
Sub Test_Dic_Sum()
    Dim i As Long, Arr(), Res(), k As Long, x As Long
    Arr = Range("B4:E1000").Value
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(Arr)
            If Len(Arr(i, 1)) Then
                If Not .exists(Arr(i, 1)) Then
                    k = k + 1
                    .Add Arr(i, 1), k
                    Res(k, 1) = Arr(i, 1)
                    Res(k, 2) = Arr(i, 2)
                    Res(k, 3) = Arr(i, 3)
                    Res(k, 4) = Arr(i, 4)
                Else
                    x = .Item(Arr(i, 1))
                    Res(x, 4) = Res(x, 4) + Arr(i, 4)
                End If
            End If
        Next
        Range("H4").Resize(k, 4) = Res
    End With
End Sub
 
Upvote 0
Nếu làm về CSDL thì dùng SQL, như vậy cách để SUM thì dùng trong ngôn ngữ SQL. ADOConnection là object để thực thi nó (thực ra có nhiều cái khác nhưng tạm cứ dùng cái này cho người làm VBA gần gũi mà thôi).

Câu lệnh để tính SUM là

ADOQuery1.SQL.Text := ' SELECT MAHH, SUM(SLG) AS [SLG] FROM KHO GROUP BY MAHH";

Duyệt từng dòng trong ADOQuery1 như sau:

while not ADOQuery1.Eof do
begin
data.MAHH := ADOQuery1.Fields[0].AsString;
data.SLG := ADOQuery1.Fields[0].AsFloat;
ADOQuery1.Next;
end;

...

Không biết có phải ý bạn là thế không?
Sai Sql thống kê với tính toán là nhanh gọn lẹ, còn cách nào không dùng Sql hay hay anh Tuân cho gợi ý với hihihih
 
Upvote 0
Các bạn lưu ý là. Khai thác tối đa thư viện có trong Delphi vì người ta làm để chạy trên các nền tảng Linux, MAC OS, Windows, Android, iOS nên chỉ cần một code ta sẽ build ra các loại ứng dụng đó. Còn khi phải dùng cả những DLL của Microsoft cần lắm mới dùng vì nó đồng nghĩa xác định ứng dụng của bạn chỉ chạy trong Windows mà thôi.

Microsoft (MS) là hãng cộng nghệ nổi tiếng nhưng trong mắt tôi thì họ chỉ là một trong số nhiều hãng khác, MS không phải là nhất tất cả, đặc biệt công nghệ của họ (hiện nay) không phải định hướng cho multi platforms - đây là xu thế toàn cầu hóa.
Bài đã được tự động gộp:

Sai Sql thống kê với tính toán là nhanh gọn lẹ, còn cách nào không dùng Sql hay hay anh Tuân cho gợi ý với hihihih

Dùng theo cách của Dictionary thôi chứ không có gì ảo thuật nữa :).
Bài đã được tự động gộp:

Cảm ơn bạn vậy là mình đoán trúng :D ... vốn dĩ khởi tạo Obiect nó đã nhanh rồi mà xài kiểu này nó lại nhanh nữa
Còn cách trên của Bạn Mạnh nghỉ Dic với Fso chung một thư viên Windows Xài Fso cũng khai báo như vậy hay khác mong Bạn chỉ cho
Xin cảm ơn

Làm việc với ổ đĩa, file, folder thì đừng dùng FSO như VBA nhé. Hãy dùng các hàm trong Delphi rất tốt đó - Nó còn là Multi Platforms.
Bạn dùng tới cái gì thì cứ gõ từ khóa Google, ví dụ "How to check file exists" + Delphi. Nếu thấy tiếng Anh khó thì nhờ Google dịch cho, Tất cả đều có ví dụ hết rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
bạn thử code trong Delphi xem sao Nhé
1/ Theo Cách Bạn viết
2/ Theo hướng Dẫn bài 124
Mã:
Sub Test_Dic_Sum()
    Dim i As Long, Arr(), Res(), k As Long, x As Long
    Arr = Range("B4:E1000").Value
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(Arr)
            If Len(Arr(i, 1)) Then
                If Not .exists(Arr(i, 1)) Then
                    k = k + 1
                    .Add Arr(i, 1), k
                    Res(k, 1) = Arr(i, 1)
                    Res(k, 2) = Arr(i, 2)
                    Res(k, 3) = Arr(i, 3)
                    Res(k, 4) = Arr(i, 4)
                Else
                    x = .Item(Arr(i, 1))
                    Res(x, 4) = Res(x, 4) + Arr(i, 4)
                End If
            End If
        Next
        Range("H4").Resize(k, 4) = Res
    End With
End Sub
Muốn thì làm luôn

Mã:
procedure TForm1.Button24Click(Sender: TObject);
var
    Src,Des, Tmp,Dic,Arr,Rng: OleVariant;
    i, j,n,n1,lcol,lRows,dongcuoi,x: Longint;
    TG: Double;
  temp,key: string;
  Start: Cardinal;
begin
Start := GetTickCount;
   try
    E := GetActiveOleObject('Excel.Application');

  except
   ShowMessage('khong lay duoc excel ?');
  end;
  Dic := CreateOleObject('Scripting.Dictionary') ;
    j := 0;
  Src  := E.Range['A4:E20'].Value;
  Des  := E.Range['H4'];
  lcol := VarArrayHighBound(Src, 2); //Cot
  lRows := VarArrayHighBound(Src, 1); //dong
  Arr := VarArrayCreate([1, lRows + 1, 1, lcol + 1],varVariant);
   for i:=VarArrayLowBound(Src, 1) to VarArrayHighBound(Src,1) do begin
    if Src[i, 2]<>'' then begin
          Tmp := Src[i, 2];
            if  not dic.Exists(Tmp) then begin
                j := j+1;
                Dic.Add(Tmp, j);
                 Arr[j, 1] := Src[i, 1];
                 Arr[j, 2] := Src[i, 2];
        Arr[j, 3] := Src[i, 3];
        Arr[j, 4] := Src[i, 4];
        Arr[j, 5] := Src[i, 5];
        end else begin
        x := Dic.Item[Src[i, 2]];
        Arr[x, 5] := IntToStr(StrToIntDef(Trim(VarToStr(Arr[x, 5])), 0) + StrToIntDef(Trim(VarToStr(Src[i, 5])), 0));
            end;
        end;
    end;
     if j<>0 then begin
    Des.Resize[j, VarArrayHighBound(Arr, 2)].Value:=Arr;
    end;
   ShowMessage(Format('Thời gian lọc là : %d ms', [GetTickCount - Start]));
end;
 
Upvote 0
Muốn thì làm luôn

Mã:
procedure TForm1.Button24Click(Sender: TObject);
var
    Src,Des, Tmp,Dic,Arr,Rng: OleVariant;
    i, j,n,n1,lcol,lRows,dongcuoi,x: Longint;
    TG: Double;
  temp,key: string;
  Start: Cardinal;
begin
Start := GetTickCount;
   try
    E := GetActiveOleObject('Excel.Application');

  except
   ShowMessage('khong lay duoc excel ?');
  end;
  Dic := CreateOleObject('Scripting.Dictionary') ;
    j := 0;
  Src  := E.Range['A4:E20'].Value;
  Des  := E.Range['H4'];
  lcol := VarArrayHighBound(Src, 2); //Cot
  lRows := VarArrayHighBound(Src, 1); //dong
  Arr := VarArrayCreate([1, lRows + 1, 1, lcol + 1],varVariant);
   for i:=VarArrayLowBound(Src, 1) to VarArrayHighBound(Src,1) do begin
    if Src[i, 2]<>'' then begin
          Tmp := Src[i, 2];
            if  not dic.Exists(Tmp) then begin
                j := j+1;
                Dic.Add(Tmp, j);
                 Arr[j, 1] := Src[i, 1];
                 Arr[j, 2] := Src[i, 2];
        Arr[j, 3] := Src[i, 3];
        Arr[j, 4] := Src[i, 4];
        Arr[j, 5] := Src[i, 5];
        end else begin
        x := Dic.Item[Src[i, 2]];
        Arr[x, 5] := IntToStr(StrToIntDef(Trim(VarToStr(Arr[x, 5])), 0) + StrToIntDef(Trim(VarToStr(Src[i, 5])), 0));
            end;
        end;
    end;
     if j<>0 then begin
    Des.Resize[j, VarArrayHighBound(Arr, 2)].Value:=Arr;
    end;
   ShowMessage(Format('Thời gian lọc là : %d ms', [GetTickCount - Start]));
end;
Thử 1 code theo hướng dẫn xài dic của @Nguyễn Duy Tuân xem .... mạnh mới coi qua thấy code đó viết khó quá
mai rảnh coi kỹ lại
 
Upvote 0
Thử 1 code theo hướng dẫn xài dic của @Nguyễn Duy Tuân xem .... mạnh mới coi qua thấy code đó viết khó quá
mai rảnh coi kỹ lại
Nó khong kho dau tu minh chua quen thoi thấy hoi ruon rà
quan trong no phải có
Mã:
type
  TMyData = class
    MaNV: string;
    TenNV: string;
    Tuoi: Integer;
  end;
số ra số, text ra text, rồi mai mốt còn đổ dữ liệu lên máy cái List nữa, đỗ dữ liệu xong chỉnh sửa cho đẹp nữa, hơi bị vui ;);););););););)
 
Upvote 0
Nó khong kho dau tu minh chua quen thoi thấy hoi ruon rà
quan trong no phải có
Mã:
type
  TMyData = class
    MaNV: string;
    TenNV: string;
    Tuoi: Integer;
  end;
số ra số, text ra text, rồi mai mốt còn đổ dữ liệu lên máy cái List nữa, đỗ dữ liệu xong chỉnh sửa cho đẹp nữa, hơi bị vui ;);););););););)
Mạnh đang nghiền ngẫm lại code ....
Mã:
dic: TDictionary<string, TMyData>;
Chưa quen cách khai báo và xài kiểu đó coi thấy Rối :p:D:rolleyes:
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh đang nghiền ngẫm lại code ....
Mã:
dic: TDictionary<string, TMyData>;
Chưa quen cách khai báo và xài kiểu đó coi thấy Rối :p:D:rolleyes:

Làm Delphi hay .NET đều phải học cách tiếp cận mới, cách tổ chức đối tượng/class mới. VBA vẫn tốt nhưng cách giải quyết vấn đề khác. Delphi hay .NET khác nên cần thay đổi theo.
 
Upvote 0
Làm Delphi hay .NET đều phải học cách tiếp cận mới, cách tổ chức đối tượng/class mới. VBA vẫn tốt nhưng cách giải quyết vấn đề khác. Delphi hay .NET khác nên cần thay đổi theo.
NGày trước khi chuyển qua VB6 cũng vậy bước qua cái ngưỡng khai báo 1 cái là Viết code Vèo vèo
này chuyển qua Delphi cũng gặp y trang vậy ... nhưng Delphi khó hơn nhiều lần ... may có các bạn chì cho đang từng bước Tiếp cận Delphi dần dần

Rồi từng bước từng bước dưới sự chỉ dẫn của các Bạn Mạnh sẻ học Tốt :D:p quan trọng nhất trong code là có người khai đường mở lối cho đi

Tăng cho Những Bạn nào có ý đinh học Delphi Code ADO nè .... Viết theo phong cách sau nó rất gần gủi với VBA ta tiếp cận Delphi Nhanh hơn
Khi nào ta thành thạo Delphi rồi ta chuyển qua Viết Theo Phong cách @Nguyễn Duy Tuân chỉ dẫn là tốt nhất ...
Mã:
Function CopyDataRange(ExcelPath, sSQL: OleVariant;  Range: OleVariant): Longint; stdcall;
var
    cnn,Rst    : OleVariant;
    SQL    : string;
begin
    cnn := CreateOleObject('ADODB.Connection') ;
        cnn.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + ExcelPath +
                                ';Extended Properties="Excel 12.0 Xml;HDR=YES";';
        SQL := 'select * from ['+ sSQL + '$]';
        cnn.open;
        rst := cnn.Execute(SQL);
        Result := Range.CopyFromRecordset(rst); //copy data from recordset to Excel range
        cnn.close
end;
 
Upvote 0
Các Bạn cho Mình hỏi chút
Trên VBA mình viết Hàm có Tùy chọn : Optional
Vậy trên Delphi viết Hàm xài Tùy chon Optional như thế nào .... Mong chỉ dẫn
VD: trên VBA mình Viết Hàm sau: Vậy Trong Delphi Viết Sao

Mã:
Public Function UniMsgbox(Optional Message$, Optional TimeOut = "", Optional Format = "", Optional Msg)
    Rem Cu Phap object.Popup (Message [, TimeOut][, Title] [, Format])
    Dim Title As String
    If Format = "" Then Format = 64     '' Icon Mac dinh la 64 ...Tuy Chon Tham So 1,2,3,4,5,48,64,65,67,68...
    If TimeOut = "" Then TimeOut = 3    '' Thoi gian Thoat Mac dinh la 3 Giay
    Title = "Ph" & ChrW(432) & ChrW(417) & "ng" & " Nam" & " Telecom" & ChrW(174)
    Msg = CreateObject("Wscript.shell").PopUp(Message, TimeOut, Title, Format)
End Function
Xin Cảm Ơn
 
Upvote 0
NGày trước khi chuyển qua VB6 cũng vậy bước qua cái ngưỡng khai báo 1 cái là Viết code Vèo vèo
này chuyển qua Delphi cũng gặp y trang vậy ... nhưng Delphi khó hơn nhiều lần ... may có các bạn chì cho đang từng bước Tiếp cận Delphi dần dần

Rồi từng bước từng bước dưới sự chỉ dẫn của các Bạn Mạnh sẻ học Tốt :D:p quan trọng nhất trong code là có người khai đường mở lối cho đi

Tăng cho Những Bạn nào có ý đinh học Delphi Code ADO nè .... Viết theo phong cách sau nó rất gần gủi với VBA ta tiếp cận Delphi Nhanh hơn
Khi nào ta thành thạo Delphi rồi ta chuyển qua Viết Theo Phong cách @Nguyễn Duy Tuân chỉ dẫn là tốt nhất ...
Mã:
Function CopyDataRange(ExcelPath, sSQL: OleVariant;  Range: OleVariant): Longint; stdcall;
var
    cnn,Rst    : OleVariant;
    SQL    : string;
begin
    cnn := CreateOleObject('ADODB.Connection') ;
        cnn.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + ExcelPath +
                                ';Extended Properties="Excel 12.0 Xml;HDR=YES";';
        SQL := 'select * from ['+ sSQL + '$]';
        cnn.open;
        rst := cnn.Execute(SQL);
        Result := Range.CopyFromRecordset(rst); //copy data from recordset to Excel range
        cnn.close
end;
[/QUCai nay minh chay bi loi
invalid variant operation
Bài đã được tự động gộp:

Các Bạn cho Mình hỏi chút
Trên VBA mình viết Hàm có Tùy chọn : Optional
Vậy trên Delphi viết Hàm xài Tùy chon Optional như thế nào .... Mong chỉ dẫn
VD: trên VBA mình Viết Hàm sau: Vậy Trong Delphi Viết Sao

Mã:
Public Function UniMsgbox(Optional Message$, Optional TimeOut = "", Optional Format = "", Optional Msg)
    Rem Cu Phap object.Popup (Message [, TimeOut][, Title] [, Format])
    Dim Title As String
    If Format = "" Then Format = 64     '' Icon Mac dinh la 64 ...Tuy Chon Tham So 1,2,3,4,5,48,64,65,67,68...
    If TimeOut = "" Then TimeOut = 3    '' Thoi gian Thoat Mac dinh la 3 Giay
    Title = "Ph" & ChrW(432) & ChrW(417) & "ng" & " Nam" & " Telecom" & ChrW(174)
    Msg = CreateObject("Wscript.shell").PopUp(Message, TimeOut, Title, Format)
End Function
Xin Cảm Ơn
;CONST ForeColor : TColor=clBlack
 
Upvote 0
Thử vầy Xem sao Nhé ... bỏ dòng này cnn.close

Mã:
Declare Function CopyDataRange Lib "VBLibrary.dll" _
                    (ByVal ExcelPath As Variant, _
                     ByVal sSQL As Variant, _
                     ByVal Target As Variant) As Long

Rem ==========
Sub MainCopyDataRange()
    Dim FilePath As Variant, DataRange  As Variant
    DataRange = "Data_Nhap" ''Ten SheetName (ko Phai SheetCodeName)
    Cells.ClearContents
    FilePath = ThisWorkbook.Path & "\Data.xlsb"
    Call CopyDataRange(FilePath, DataRange, Range("A2"))
End Sub
 
Upvote 0
Web KT
Back
Top Bottom