Hỏi về công thức mảng

Liên hệ QC

thuyyeu99

Trùm Nhiều Chuyện
Tham gia
6/6/08
Bài viết
1,729
Được thích
873
Các anh chị nào biết công thức mảng bằng VBA cho em hỏi xíu nhé.

Em đang mò mẫm về cách viết công thức mảng, nhưng còn lăn tăng 1 chỗ là khi viết công thức mảng có nên gán hết công thức vào trong 1 vùng không hay là chỉ Gán giá trị vào vùng đó (khi nào cần up1date thì chỉ việc Enter vào ô chứa công thức thì dữ liệu sẽ cập nhật lại).

Cám ơn các anh chị quan tâm!

Supper UDF SQL version 2

Hàm Supper UDF SQL version 2.1 hihihi (Hàm Group Concat trong T_SQL)
 
Lần chỉnh sửa cuối:
Đúng là viết hàm mãng thuần trong Delphi khó thật, em viết Fill được công thức mãng trong vùng được rồi, bây giờ lại nãy sinh 1 vấn đề. Em get record vào mãng Array (em khai báo là OleVariant) trong delphi đọc đựợc nhưng Result :=Array trong Excel nó lại không hiểu
 
Upvote 0
Đúng là viết hàm mãng thuần trong Delphi khó thật, em viết Fill được công thức mãng trong vùng được rồi, bây giờ lại nãy sinh 1 vấn đề. Em get record vào mãng Array (em khai báo là OleVariant) trong delphi đọc đựợc nhưng Result :=Array trong Excel nó lại không hiểu

Mảng trong Excel là chuẩn của API: PSafeArray. Mảng trong Delphi có hai loại Array thuần của Delphi thì chỉ dùng trong Delphi, còn Array để giao tiếp với các ứng dụng khác thì phải là PSafeArray. Em tạo bảng hàm VarArrayCreate() là tạo PSafeArray. Với Excel thì thì nó là mảng 2D. Làm theo hướng này là ok nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Mảng trong Excel là chuẩn của API: PSafeArray. Mảng trong Delphi có hai loại Array thuần của Delphi thì chỉ dùng trong Delphi, còn Array để giao tiếp với các ứng dụng khác thì phải là PSafeArray. Em tạo bảng hàm VarArrayCreate() là tạo PSafeArray. Với Excel thì thì nó là mảng 2D. Làm theo hướng này là ok nhé.
anh có thể cho em cai vi dụ nho nhỏ về làm sao để dưa recoset vào VarArrayCreate() là tạo PSafeArray , từ PSafeArray có thể Return (Olevariant) duoc không anh
 
Upvote 0
Thử đưa nó hết vào mãng xong duyệt xem sao lấy số dòng và cột ??!!
 
Lần chỉnh sửa cuối:
Upvote 0
anh có thể cho em cai vi dụ nho nhỏ về làm sao để dưa recoset vào VarArrayCreate() là tạo PSafeArray , từ PSafeArray có thể Return (Olevariant) duoc không anh

Em dùng biến Kiểu Variant thay cho OleVariant (về cơ bản 2 kiểu này gần tương đương).

var
arr: Variant;
begin
arr := VarArrayCreate([1, sodong, 1, so cot], varVariant);

dùng vòng lặp duyệt từng record trong recodeset và nhặt vào mảng Arr[I,J]

end;

Cách tạo mảng này có trong box học Delphi đó.
 
Upvote 0
Em dùng biến Kiểu Variant thay cho OleVariant (về cơ bản 2 kiểu này gần tương đương).

var
arr: Variant;
begin
arr := VarArrayCreate([1, sodong, 1, so cot], varVariant);

dùng vòng lặp duyệt từng record trong recodeset và nhặt vào mảng Arr[I,J]

end;

Cách tạo mảng này có trong box học Delphi đó.
Mã:
     Result := VarArrayCreate([1, oRs.RecordCount+1, 1, oRs.Fields.Count+1], varVariant);
      oRS.MoveFirst;
      row := 1;
        while not oRS.Eof do
        begin
          for col:=1 to oRS.Fields.Count do
          Result[row,col] := oRS.Fields[col-1].Value;
    inc(row);
    oRS.MoveNext;
   end;
loi.jpgNó vẫn báo #Value anh
 
Upvote 0
Bằng mọi giá bạn phải tạo đc mảng như mình nói trên thành công. Hãy test thử bằng cách viết hàm API trong DLL của Delphi theo bài hướng dẫn của anh đã. Nếu mảng đó em gán được ra sheet trong VBA là mảng đó Ok. Tron code trên em tạo số phần tử mảng bị thừa 1 cả số dòng và số cột.
 
Upvote 0
Bằng mọi giá bạn phải tạo đc mảng như mình nói trên thành công. Hãy test thử bằng cách viết hàm API trong DLL của Delphi theo bài hướng dẫn của anh đã. Nếu mảng đó em gán được ra sheet trong VBA là mảng đó Ok. Tron code trên em tạo số phần tử mảng bị thừa 1 cả số dòng và số cột.
Trong vba thì dễ rồi anh, làm cái ra liền mà cũng mã đó đưa vô Delphi nó lại vậy, em test trong Delphi thì ok mà cứ dùng bên Excel là bị vậy khng6 hiểu nổi
Em viet trong VBA cũng y chang như vậy
VBA.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Ý mình là bạn viết hàm tạo mảng, kiểu trả về là Variant (hàm được tạo bởi VarArrayCreate() ). Rồi khai báo API trong VBA , paste nó vào ô. Không cần dụng gì hàm mảng đâu. Nếu chạy được rồi bạn mới áp dụng hàm đó vào hàm mảng của bạn.

function GetArray(): Variant; stdcall;
begin
Result := VarArrayCreate(...);
//làm các lệnh lấy dữ liệu cho mảng
end;
excports
GetArray

Bây giờ khai báo API hàm đó trong VBA xem chạy được không?
Trong ví dụ tạo mảng của bạn, nếu mảng chứa cả dòng tiêu đề cột thì số phần tử dòng trong mảng là RecordCount + 1 là đúng.
 
Upvote 0
Ý mình là bạn viết hàm tạo mảng, kiểu trả về là Variant (hàm được tạo bởi VarArrayCreate() ). Rồi khai báo API trong VBA , paste nó vào ô. Không cần dụng gì hàm mảng đâu. Nếu chạy được rồi bạn mới áp dụng hàm đó vào hàm mảng của bạn.

function GetArray(): Variant; stdcall;
begin
Result := VarArrayCreate(...);
//làm các lệnh lấy dữ liệu cho mảng
end;
excports
GetArray

Bây giờ khai báo API hàm đó trong VBA xem chạy được không?
Trong ví dụ tạo mảng của bạn, nếu mảng chứa cả dòng tiêu đề cột thì số phần tử dòng trong mảng là RecordCount + 1 là đúng.
Ah để em test thử
 
Upvote 0
Ý mình là bạn viết hàm tạo mảng, kiểu trả về là Variant (hàm được tạo bởi VarArrayCreate() ). Rồi khai báo API trong VBA , paste nó vào ô. Không cần dụng gì hàm mảng đâu. Nếu chạy được rồi bạn mới áp dụng hàm đó vào hàm mảng của bạn.

function GetArray(): Variant; stdcall;
begin
Result := VarArrayCreate(...);
//làm các lệnh lấy dữ liệu cho mảng
end;
excports
GetArray

Bây giờ khai báo API hàm đó trong VBA xem chạy được không?
Trong ví dụ tạo mảng của bạn, nếu mảng chứa cả dòng tiêu đề cột thì số phần tử dòng trong mảng là RecordCount + 1 là đúng.
Delphi vba ok.jpg

Dạ Chạy ok anh
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom