VBA - Cho hỏi khai báo biến dạng mảng ntn

  • Thread starter adam_tran
  • Ngày gửi
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#1
Chưa biết gì về VBA khổ thế này đây! :wall:

Cho tớ hỏi code khai báo biến dạng mảng như thế nào, thí dụ hàm SUM của Excel sử dụng nhiều biến là số, range... Khai báo kiểu thông thường thì được.
Thí dụ:
Function Sumiff (Dkien1 as Boolean, Dkien2 as Boolean, xArray as Range)
""""""""""""""""""""""
Endfunction
Ở đấy XArray khai báo kiểu Range hay Array thì đúng? Khi kiểm tra các phần tử trong mảng thì làm như thế nào?
Cám ơn nhiều

À Bác Duyệt nói là sẽ photocopy tài liệu về VBA cho mọi người, (TP.HCM) ai muốn thì đăng ký vào đây. Có lẽ tổ chức 1 cái offline nho nhỏ (cafe) để nhận tài liệu nhĩ?
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#2
adam_tran nói:
Chưa biết gì về VBA khổ thế này đây! :wall:

Cho tớ hỏi code khai báo biến dạng mảng như thế nào, thí dụ hàm SUM của Excel sử dụng nhiều biến là số, range... Khai báo kiểu thông thường thì được.
Thí dụ:
Function Sumiff (Dkien1 as Boolean, Dkien2 as Boolean, xArray as Range)
""""""""""""""""""""""
Endfunction
Ở đấy XArray khai báo kiểu Range hay Array thì đúng? Khi kiểm tra các phần tử trong mảng thì làm như thế nào?
Cám ơn nhiều

À Bác Duyệt nói là sẽ photocopy tài liệu về VBA cho mọi người, (TP.HCM) ai muốn thì đăng ký vào đây. Có lẽ tổ chức 1 cái offline nho nhỏ (cafe) để nhận tài liệu nhĩ?
Tôi đăng ký đầu tiên. Học phí (à quên phô tô phí) bao nhiêu thế?
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#3
Vấn đề của tớ đây

Tớ muốn lập 1 cái function tính giá xuất theo bình quân gia quyền tại thời điểm hiện tại, với chỉ 1 biến số là mã hàng hóa. Lập bằng hàm Excel thuần túy tớ làm được, nhưng dài và phức tạp.
Tớ có 1 sheet dữ liệu với các Name tương ứng là Soluong, Sotien, Ngay, Type (kiểu N hay X) và MaSP. Hàm sau dùng để tính xem giá hiện tại của sản phẩm MaSP là bao nhiêu. Kiểm tra coding không bị lỗi, nhưng công thức vẫn cho kết quả là [HASHTAG]#VALUE[/HASHTAG]. Mong các cao thủ chỉ giùm sai sót của tớ. Cám ơn rất nhiều.

Option Explicit
Function Giaxuat(MaSP As String)
Dim xSoluong As Range, xSotien As Range, xKieu As Range, xNgay As Range, xMaSP As Range
Dim Ngay As Date
Dim Soluong As Single, Sotien As Single
Dim n As Long, i As Long
Ngay = Application.WorksheetFunction.Now()
Set xSoluong = Range("Soluong")
Set xSotien = Range("Tien")
Set xKieu = Range("Type")
Set xNgay = Range("Ngay")
Soluong = 0
Sotien = 0
n = xMaSP.Rows.Count
For i = 1 To n Step 1
If (xMaSP(i).Value = MaSP) And (xNgay(i).Value <= Ngay) Then
If xKieu(i).Value = "N" Then
Soluong = Soluong + xSoluong(i).Value
Sotien = Sotien + xSotien(i).Value
ElseIf xKieu(i).Value = "X" Then
Soluong = Soluong - xSoluong(i).Value
Sotien = Sotien - xSotien(i).Value
End If
End If
Next i
If Soluong > 0 Then
Giaxuat = Sotien / Soluong
Else
Giaxuat = "Not available"
End If
End Function
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#4
Adam post file lên được không? Nếu có file dễ theo dõi hơn.
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#5
workman nói:
Adam post file lên được không? Nếu có file dễ theo dõi hơn.
Tớ Upload file lên đây.
Vì file chưa hoàn thành nên tớ chỉ up lên làm ví dụ, chú ý các Name tớ đặt, sheet Input có protect sheet nhưng không có password.
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#6
adam_tran nói:
Set xNgay = Range("Ngay")
không có file đọc code mù mắt luôn. Function của bạn rất hoàn chỉnh không có chỗ nào sai cả. Chỉ có một điểm sai là bạn chưa gán giá trị cho biến MaPS.

Bạn chèn thêm đoạn này vào là chạy ổn ngay.

Set xMaSP = Range("MaSP")
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#7
Hì hì post xong mới thấy bạn đã load file rồi. Xin lỗi nhé. Nhưng bây giờ chắc không cần file nữa. :)
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#8
workman nói:
không có file đọc code mù mắt luôn. Function của bạn rất hoàn chỉnh không có chỗ nào sai cả. Chỉ có một điểm sai là bạn chưa gán giá trị cho biến MaPS.

Bạn chèn thêm đoạn này vào là chạy ổn ngay.

Set xMaSP = Range("MaSP")
Ha ha hà, sao mà tớ sơ ý thế. Cái function của tớ xài nhiếu biến quá (vì tớ chỉ mới học mò VBA) tớ vẫn cảm giác function rất dỡ. Các cao thủ có giải thuật nào hay hơn xin chỉ giáo. Đây là file quản lý NXT, sản phẩm đầu tay xài VBA. Làm xong sẽ post lên!!!!!!!!
Cám ơn Workman nhiều.
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#9
workman nói:
Hì hì post xong mới thấy bạn đã load file rồi. Xin lỗi nhé. Nhưng bây giờ chắc không cần file nữa. :)
À quên, còn mấy cái sửa nữa.

Đừng lấy hàm now() trong excel (hình như hàm now() không work đâu). Bạn gán biến ngày như thế này

Ngay=Date()

Mấy cái .value thực ra không cần. Bạn bỏ đi cho đỡ rườm rà.
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#10
Cám ơn anh Workman!
Cho hỏi thêm chút nữa nhé. Thí dụ Function của mình cần nhiều biến, nhưng giả sử thiếu 1 biến nào đó thì fuction sẽ lấy giá trị mặc định, vậy phải khai báo như thế nào.
Thí dụ:
Function Tinhtoan (a as long, b as date, c as boolean)
'if c is opmited then c = true

end function

Chẳng hạn vậy!
 
L

levanduyet

Welcome
16/10/04
535
11
18
HCM
my.opera.com
#11
adam_tran nói:
Cám ơn anh Workman!
Cho hỏi thêm chút nữa nhé. Thí dụ Function của mình cần nhiều biến, nhưng giả sử thiếu 1 biến nào đó thì fuction sẽ lấy giá trị mặc định, vậy phải khai báo như thế nào.
Thí dụ:
Function Tinhtoan (a as long, b as date, c as boolean)
'if c is opmited then c = true

end function

Chẳng hạn vậy!
To: adam_tran,
ví dụ:
Function DrawOne(InRange, Optional Recalc=0)
'Các câu lệnh của bạn ở đây
'Bạn có thể kiểm tra biến Recalc...
'Giá trị 0 là giá trị mặc định

End Function
Chúc bạn khỏe.
Lê Văn Duyệt
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#12
levanduyet nói:
Function DrawOne(InRange, Optional Recalc=0)
'Các câu lệnh của bạn ở đây
'Bạn có thể kiểm tra biến Recalc...
'Giá trị 0 là giá trị mặc định
End Function
Không hiểu lắm bác Duyệt ơi.
Khai báo như thế này có đúng không:
Function DrawOne(InRange, Optional Recalc=0 as Long)
Bây giờ em không khai báo giá trị mặc định của biến Recalc nữa, nhưng cần kiểm tra nếu biến Recalc không được nhập vào thì "làm gì đó" không phụ thuộc vào giá trị biến Recalc. Nếu vẫn để Optional Recalc=0 và đặt điều kiện if Recalc = 0 then thì khi người nhập giá trị biến này đúng = 0, Function sẽ làm theo điều kiện if true..., tức là "làm gì đó" không phụ thuộc giá trị biến Recalc, mà lẻ ra phải tính toán với giá trị biến Recalc=0. Coding như thế nào, thí dụ:
Function DrawOne(InRange, Optional Recalc as Long)
if Recalc is omited then "làm gì đó"

Đây là diễn đạt theo ngôn ngữ của con người, điều em cần là diễn đạt theo VBA là thế nào cơ...
Một vấn đề khác là, khai báo hàm sử dụng nhiều biến cùng kiểu "vô hạn" thì làm thế nào. Trong Excel có hàm SUM sử dụng nhiều biến dạng số, Hàm CONCATENATE sử dụng nhiều biến dạng text. Các bác thử biểu diễn các hàm trên như thế nào bằng VBA!
Cám ơn nhiều nhiều!
 
Sửa lần cuối:
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#13
adam_tran nói:
Không hiểu lắm bác Duyệt ơi.
Khai báo như thế này có đúng không:
Function DrawOne(InRange, Optional Recalc=0 as Long)
Bây giờ em không khai báo giá trị mặc định của biến Recalc nữa, nhưng cần kiểm tra nếu biến Recalc không được nhập vào thì "làm gì đó" không phụ thuộc vào giá trị biến Recalc. Nếu vẫn để Optional Recalc=0 và đặt điều kiện if Recalc = 0 then thì khi người nhập giá trị biến này đúng = 0, Function sẽ làm theo điều kiện if true..., tức là "làm gì đó" không phụ thuộc giá trị biến Recalc, mà lẻ ra phải tính toán với giá trị biến Recalc=0. Coding như thế nào, thí dụ:
Function DrawOne(InRange, Optional Recalc as Long)
if Recalc is omited then "làm gì đó"

Đây là diễn đạt theo ngôn ngữ của con người, điều em cần là diễn đạt theo VBA là thế nào cơ...
Một vấn đề khác là, khai báo hàm sử dụng nhiều biến cùng kiểu "vô hạn" thì làm thế nào. Trong Excel có hàm SUM sử dụng nhiều biến dạng số, Hàm CONCATENATE sử dụng nhiều biến dạng text. Các bác thử biểu diễn các hàm trên như thế nào bằng VBA!
Cám ơn nhiều nhiều!
Sorry for late reply. Tôi đang đi công tác nên khó check internet. Yêu cầu của bác phức tạp nhỉ. Bạn dùng lệnh ismissing(Recalc) nhé.
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#14
workman nói:
Yêu cầu của bác phức tạp nhỉ. Bạn dùng lệnh ismissing(Recalc) nhé.
Đúng là không thầy đố mày làm nên
(không mày, đố thầy dạy ai ..., hi hi)
 

Thành viên trực tuyến

  • xuantham
  • daongocnam0603
  • Bullet



Xem nhiều