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

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi adam_tran, 9 Tháng tám 2005.

9,287 lượt xem

  1. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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ĩ?
     
    #1
  2. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    Tôi đăng ký đầu tiên. Học phí (à quên phô tô phí) bao nhiêu thế?
     
    #2
  3. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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
     
    #3
  4. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    Adam post file lên được không? Nếu có file dễ theo dõi hơn.
     
    #4
  5. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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.
     
    #5
  6. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    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")
     
    #6
  7. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    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. :)
     
    #7
  8. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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.
     
    #8
  9. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    À 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à.
     
    #9
  10. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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!
     
    #10
  11. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    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
     
    #11
  12. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    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!
     
    Last edited: 11 Tháng tám 2005
    #12
  13. workman

    workman Thành viên hoạt động

    Bài viết:
    372
    Đã được thích:
    0
    Nơi ở:
    Ho Chi Minh
    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é.
     
    #13
  14. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Đúng là không thầy đố mày làm nên
    (không mày, đố thầy dạy ai ..., hi hi)
     
    #14

Chia sẻ trang này