phanthanh157
Thành viên mới
![](/diendan/data/PhoToDanhHieu/gold.gif)
- Tham gia
- 24/5/18
- Bài viết
- 7
- Được thích
- 0
Dùng hàm INDEX kết hợp RANDBETWEEN là được rồi:Hiện tại mình có 1 file danh sách lỗi sản phẩm, cũng như mã phân loại, mình muốn tạo một function(item) cho kết quả là một random của item đó trong danh sách.
=INDEX($B$2:$B$16,RANDBETWEEN(1,15))
Function RandomizeItem(iTem As Long, CSDL As Range) As String
Dim sRng As Range, Rng As Range
Dim Rws As Long, W As Long, Dm As Integer: Dim MyAdd As String
Rws = CSDL.Rows.Count
Set Rng = CSDL(1).Resize(Rws)
ReDim Arr(1 To Rws, 1 To 1) As String
Set sRng = Rng.Find(iTem, , xlFormulas, xlWhole)
If sRng Is Nothing Then
RandomizeItem = "Nothing"
Else
' MyAdd = sRng.Address '
Set Rng = sRng.Resize(Rws)
For Each CSDL In Rng
If CSDL.Value = iTem Then
W = W + 1: Arr(W, 1) = CSDL.Offset(, 1).Value
End If
Next CSDL
Randomize: Dm = (1 + W * Rnd()) \ 1
RandomizeItem = Arr(Dm, 1)
End If
End Function
Chào a, em đã thử, nhưng khi radom thì vẫn có radom trả về giá trị rỗngBạn thao tác thử với cái ni:
PHP:Function RandomizeItem(iTem As Long, CSDL As Range) As String Dim sRng As Range, Rng As Range Dim Rws As Long, W As Long, Dm As Integer: Dim MyAdd As String Rws = CSDL.Rows.Count Set Rng = CSDL(1).Resize(Rws) ReDim Arr(1 To Rws, 1 To 1) As String Set sRng = Rng.Find(iTem, , xlFormulas, xlWhole) If sRng Is Nothing Then RandomizeItem = "Nothing" Else ' MyAdd = sRng.Address ' Set Rng = sRng.Resize(Rws) For Each CSDL In Rng If CSDL.Value = iTem Then W = W + 1: Arr(W, 1) = CSDL.Offset(, 1).Value End If Next CSDL Randomize: Dm = (1 + W * Rnd()) \ 1 RandomizeItem = Arr(Dm, 1) End If End Function
Bạn nên mô tả trường hợp 'rỗng' mà bạn đã gặp fải để cùng khắc fục & hoàn chỉnh.Chào a, em đã thử, nhưng khi radom thì vẫn có radom trả về giá trị rỗng
Ý Mình khi random không cho kết quả tương ứng với item trong csdl mà đôi khi chỉ trả về kết quả trốngBạn nên mô tả trường hợp 'rỗng' mà bạn đã gặp fải để cùng khắc fục & hoàn chỉnh.
Chắc là trị W cần bớt thêm 1 đơn vị.
Ý Mình khi random không cho kết quả tương ứng với item trong csdl mà đôi khi chỉ trả về kết quả trống
Public Function Gpe(ByVal Item As Range, ByVal Rng As Range) As Variant
Dim sArr(), tArr(), I As Long, K As Long, R As Long
sArr = Rng.Value
R = UBound(sArr)
ReDim tArr(1 To R, 1 To 2)
For I = 1 To R
If sArr(I, 1) = Item.Value Then
K = K + 1
tArr(K, 1) = sArr(I, 1)
tArr(K, 2) = sArr(I, 2)
End If
Next I
Randomize
R = Int(Rnd * K) + 1
Gpe = tArr(R, 2)
End Function
Ok bạn, tại mình đang dùng hàm này sử dụng cho code vba khác trong file chứ ko dùng trực tiếp trên sheetTrường hợp csdl có dòng rỗng, bạn thử công thức này:
Mã:=INDEX(B:B,LARGE(INDEX((B2:B16<>"")*ROW(B2:B16),0),RANDBETWEEN(1,COUNTA(B2:B16))))
Bạn thao tác thử với cái ni:
PHP:Function RandomizeItem(iTem As Long, CSDL As Range) As String Dim sRng As Range, Rng As Range Dim Rws As Long, W As Long, Dm As Integer: Dim MyAdd As String Rws = CSDL.Rows.Count Set Rng = CSDL(1).Resize(Rws) ReDim Arr(1 To Rws, 1 To 1) As String Set sRng = Rng.Find(iTem, , xlFormulas, xlWhole) If sRng Is Nothing Then RandomizeItem = "Nothing" Else ' MyAdd = sRng.Address ' Set Rng = sRng.Resize(Rws) For Each CSDL In Rng If CSDL.Value = iTem Then W = W + 1: Arr(W, 1) = CSDL.Offset(, 1).Value End If Next CSDL Randomize: Dm = (1 + W * Rnd()) \ 1 RandomizeItem = Arr(Dm, 1) End If End Function
Xin lỗi, tôi nhầm. Hàm Find cache vị trí con trỏ dò với lệnh Find/Replace trong worksheet cho nên khi dùng trong worksheet thì FindNext bị tắt.Hình như chỉ xài được FindNext trong Sub thôi; Trong hàm (Function) thì chỉ hiện kết quả được trên CS Immediate