Cho mình hỏi về ParamArray (1 người xem)

  • Thread starter Thread starter alohn
  • Ngày gửi Ngày gửi
Liên hệ QC

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

alohn

Thành viên chính thức
Tham gia
21/12/07
Bài viết
59
Được thích
13
Mình đang nghiên cứu về ParamArray. Có mấy vấn đề chưa hiểu, mong các bạn giải thích giúp. Mình lấy ví dụ nối chuỗi sau nguồn trên diến đàn:

Function Dconcatenate(ParamArray cel() As Variant) As String
For n = LBound(cel) To UBound(cel)
For i = 1 To cel(n).Rows.Count
For j = 1 To cel(n).Columns.Count
Ketqua = Ketqua & "," & cel(n)(i, j)
Next
Next
Ketquachung = Ketquachung & "," & Ketqua
Next
Ketquachung = Right(Ketquachung, Len(Ketquachung) - 2)
Dconcatenate = Ketquachung
End Function

Khi sử dụng func trong execl giả sử chọn vùng từ A1:I1 mình muốn hỏi:

1. Là vùng A1:I1 này có được gán luôn cho mảng cel() không ( cel = Range("A1:I1").Value ), hay chỉ là gán kich thước của vùng vào mảng thôi. Vì khi mình Debug vẫn thấy Lbound(Cel) và Ubound(Cel) vẫn trả về giá trị 0.
2. Cách viết Cel(n)(i,j) có nghĩa là: lấy giá trị có tọa độ i, j của phần tử thứ n trong mảng cel ?

Mong các cao thủ chỉ giúp. Thank so much.
 
Mình đang nghiên cứu về ParamArray. Có mấy vấn đề chưa hiểu, mong các bạn giải thích giúp. Mình lấy ví dụ nối chuỗi sau nguồn trên diến đàn:

Function Dconcatenate(ParamArray cel() As Variant) As String
For n = LBound(cel) To UBound(cel)
For i = 1 To cel(n).Rows.Count
For j = 1 To cel(n).Columns.Count
Ketqua = Ketqua & "," & cel(n)(i, j)
Next
Next
Ketquachung = Ketquachung & "," & Ketqua
Next
Ketquachung = Right(Ketquachung, Len(Ketquachung) - 2)
Dconcatenate = Ketquachung
End Function

Khi sử dụng func trong execl giả sử chọn vùng từ A1:I1 mình muốn hỏi:

1. Là vùng A1:I1 này có được gán luôn cho mảng cel() không ( cel = Range("A1:I1").Value ), hay chỉ là gán kich thước của vùng vào mảng thôi. Vì khi mình Debug vẫn thấy Lbound(Cel) và Ubound(Cel) vẫn trả về giá trị 0.
2. Cách viết Cel(n)(i,j) có nghĩa là: lấy giá trị có tọa độ i, j của phần tử thứ n trong mảng cel ?

Mong các cao thủ chỉ giúp. Thank so much.

Bạn hỏi về Param Array --> nên mình cũng chỉ trả lời xoay quanh ParamArray !

Visual Basic 6.0 cho phép tạo một chương trình con với danh sách tham số tuỳ ý (nghĩa là số lượng các tham số có thể thay đổi khi gọi chương trình con) thông qua việc đặt từ khoá ParamArray trước danh sách tham số. Khi đó danh sách tham số là tuỳ chọn và có dạng một mảng kiểu Variant.

Một số nguyên tắc khi sử dụng ParamArray:

* Biến ParamArray phải là một mảng của các phần tử kiểu Variant.
* Biến ParamArray phải là tham số cuối cùng trong danh sách tham số.
* Không có tham số nào được khai báo với Optional trong danh sách. Đó là vì ta không thể dùng chung, tức là vừa có khai báo dùng Optional và vừa có khai báo dùng ParamArray. Bạn chỉ có thể dùng một trong chúng mà thôi.
* Chỉ được sử dụng một ParamArray trong một Procedure mà thôi.
* Do tham số ParamArray là một mảng, nên nó luôn được khai báo với ByRef.
* Mảng ParamArray là mảng được bắt đầu bằng 0 bất chấp việc khai báo Option Base của module. Nếu không có biến nào được truyền thì LBound bằng 0 và UBound là -1.
* Biến kiểu người dùng (UDT) không thể là một phần tử của ParamArray.

Với các hàm có biến là ParamArray thì trong code thường có công đoạn kiểm tra như sau :
Mã:
Function Eg(ParamArray sArray())
..........................................
count = UBound(sArray) - LBound(sArray) + 1
    If count = 0 Then
        Exit Function
    ElseIf count = 1 Then
        count = UBound(sArray(0)) - LBound(sArray(0)) + 1
        ReDim Arr(1 To count)
        For index = 1 To count
            Arr(index) = sArray(0)(index + LBound(sArray(0)) - 1)
        Next index
    Else
        Arr = sArray
    End If
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn hungpecc1 mình đang muốn hiểu rõ bản chất, như hai câu hỏi mình nêu, còn mình cũng tham khảo về ParamArry trên diễn đàn những lưu ý của bạn mình cũng đã tìm hiểu rồi.

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn hungpecc1 mình đang muốn hiểu rõ bản chất, như hai câu hỏi mình nêu, còn mình cũng tham khảo về ParamArry trên diễn đàn những lưu ý của bạn mình cũng đã tìm hiểu rồi.
Nói nôm na ParamArray là một mảng một chiều, các tham số truyền trong ParamArray chính là các phần tử trong mảng đó, từ đó tùy theo Hàm mình tạo sẽ tùy biến các phần tử đó để cho ra kết quả mong đợi.
 
Upvote 0
Mình đang nghiên cứu về ParamArray. Có mấy vấn đề chưa hiểu, mong các bạn giải thích giúp. .

Về ParamArray bạn có thể tham khảo bài này:
http://www.giaiphapexcel.com/forum/showthread.php?16499-Khai-báo-Optional-Có-thể-bạn-chưa-biết
Còn hàm của bạn viết vậy là chưa ổn đâu. Biến cel có thể là bất cứ dạng dữ liệu gì, sao bạn chắc nó là Range mà chơi cel(n).Rows.Count ---> Thiếu tổng quát
Sửa lại:
Mã:
Function Dconcatenate(ParamArray Arrays() As Variant) As String
  Dim n As Long, i As Long
  Dim Item, aTmp, arr(), tmp As String
  On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      tmp = CStr(Item)
      If Len(tmp) Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = tmp
      End If
    Next
  Next
  If n Then Dconcatenate = Join(arr, ",")
End Function
Còn tôi thì viết hàm này theo kiểu khác:
Mã:
Function JoinText(ByVal Sep As String, ByVal IgnoreBlanks As Boolean, ParamArray sArray()) As String
  Dim tmpArr, SubArr, arr(), Item, n As Long, tmp As String
  'On Error Resume Next
  For Each SubArr In sArray
    tmpArr = IIf(IsArray(SubArr), SubArr, Array(SubArr))
    For Each Item In tmpArr
      tmp = IIf(TypeName(Item) = "Error", "", Trim(CStr(Item)))
      If IgnoreBlanks = False Or Len(tmp) Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = tmp
      End If
    Next
  Next
  If n Then JoinText = Join(arr, Sep)
End Function
Cho phép người dùng tùy chọn dấu phân cách và cho phép lấy giá trị rổng hoặc không lấy
 
Upvote 0
Mình đang nghiên cứu về ParamArray. Có mấy vấn đề chưa hiểu, mong các bạn giải thích giúp. Mình lấy ví dụ nối chuỗi sau nguồn trên diến đàn:

Function Dconcatenate(ParamArray cel() As Variant) As String
For n = LBound(cel) To UBound(cel)
For i = 1 To cel(n).Rows.Count
For j = 1 To cel(n).Columns.Count
Ketqua = Ketqua & "," & cel(n)(i, j)
Next
Next
Ketquachung = Ketquachung & "," & Ketqua
Next
Ketquachung = Right(Ketquachung, Len(Ketquachung) - 2)
Dconcatenate = Ketquachung
End Function

Khi sử dụng func trong execl giả sử chọn vùng từ A1:I1 mình muốn hỏi:

1. Là vùng A1:I1 này có được gán luôn cho mảng cel() không ( cel = Range("A1:I1").Value ), hay chỉ là gán kich thước của vùng vào mảng thôi. Vì khi mình Debug vẫn thấy Lbound(Cel) và Ubound(Cel) vẫn trả về giá trị 0.
2. Cách viết Cel(n)(i,j) có nghĩa là: lấy giá trị có tọa độ i, j của phần tử thứ n trong mảng cel ?

Mong các cao thủ chỉ giúp. Thank so much.

Cảm ơn bạn hungpecc1 mình đang muốn hiểu rõ bản chất, như hai câu hỏi mình nêu, còn mình cũng tham khảo về ParamArry trên diễn đàn những lưu ý của bạn mình cũng đã tìm hiểu rồi.

Với code như trên --> khi bạn gõ hàm Dconcatenate(Range("A1:I1") --> thì hiển nhiên n = 0 ,--> lúc này câu lệnh For n = Lbuound to ubound không còn ý nghĩa nữa ( Không tin bạn xóa 2 dòng này đi nó vẫn chạy bình thường )
2. Cách viết Cel(n)(i,j) lúc này tương đương với Range("A1:I1")(i,j) --> lấy cell ở hàng i cột j trong vùng A1:I1 ( cell(0) tương đương với biến variant ban đầu là range("A1:I1")

--> tóm lại cách viết code trên chưa tổng quát --> bạn tham khảo code của anh Ndu
 
Upvote 0
Cảm ơn bác hungpecc1 câu trả của bác làm em sáng ra nhiều :D

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

  • Dán lên cao
Trả lời
26
Đọc
10K
Back
Top Bottom