Xin hàm: lấy các số nhỏ nhất trong dãy số

Liên hệ QC

nvh611

Thành viên thường trực
Tham gia
20/5/17
Bài viết
228
Được thích
42
Nhờ các bạn làm giúp
 

File đính kèm

  • Hàm Lấy số nhỏ nhất trong dãy.xlsx
    8.2 KB · Đọc: 21
Dùng hàm tự tạo nhé bạn.
Mã:
Function layso(ByVal mang As Range, Optional ByVal phancach As String = ";") As String
         Dim dk As Range, T, i As Long, j As Integer, s As String, min As Byte
         For Each dk In mang
             T = Split(phancach & dk.Value, phancach)
             For i = 1 To UBound(T)
                 min = 11
                 For j = 1 To Len(T(i))
                     If min > Mid(T(i), j, 1) Then min = Mid(T(i), j, 1)
                 Next j
                 If Len(s) = 0 Then s = min Else s = s & "-" & min
             Next i
         Next
         layso = s
End Function
Mã:
=layso(B4:B5)
 

File đính kèm

  • Hàm Lấy số nhỏ nhất trong dãy.xlsm
    14.7 KB · Đọc: 14
Upvote 0
Thử thêm cách nữa
Mã:
Public Function MinChuoi(Dl As Range) As String
Dim Chuoi
Dim i, j
For Each Chuoi In Dl
    For i = 1 To Len(Chuoi) Step 3
        If CLng(Mid(Chuoi, i, 1)) < CLng(Mid(Chuoi, i + 1, 1)) Then
            j = j & " " & Mid(Chuoi, i, 1)
        Else
            j = j & " " & Mid(Chuoi, i + 1, 1)
        End If
    Next i
Next Chuoi
MinChuoi = Replace(Trim(j), " ", "-")
End Function
Cú pháp : MinChuoi(Vùng dữ liệu).
Vùng dữ liệu phải là liên tục
 
Upvote 0
Cảm ơn các bạn @snow25; @befaint ; @CHAOQUAY hàm rất đúng,
Nếu như các bạn sửa cho mình là lấy dữ liệu ở các vùng khác nhau được thì tốt quá
Xin cảm ơn các bạn một lần nữa nhé!
 
Upvote 0
Cảm ơn các bạn @snow25; @befaint ; @CHAOQUAY hàm rất đúng,
Nếu như các bạn sửa cho mình là lấy dữ liệu ở các vùng khác nhau được thì tốt quá
Xin cảm ơn các bạn một lần nữa nhé!
Bạn chạy code này xem đúng không nhé.
Mã:
Function layso(ParamArray darr()) As String
         Dim dk As Range, T, i As Long, j As Integer, s As String, min As Byte, mang
         For Each mang In darr
         For Each dk In mang
             T = Split(";" & dk.Value, ";")
             For i = 1 To UBound(T)
                 min = 11
                 For j = 1 To Len(T(i))
                     If min > Mid(T(i), j, 1) Then min = Mid(T(i), j, 1)
                 Next j
                 If Len(s) = 0 Then s = min Else s = s & "-" & min
             Next i
         Next
         Next
         layso = s
End Function
Mã:
=layso(B4:B5,B11:B12)
 
Upvote 0
Cảm ơn các bạn @snow25; @befaint ; @CHAOQUAY hàm rất đúng,
Nếu như các bạn sửa cho mình là lấy dữ liệu ở các vùng khác nhau được thì tốt quá
Xin cảm ơn các bạn một lần nữa nhé!
@nvh611
Mã:
Public Function MinChuoi(ParamArray DL() As Variant) As String
Dim Tam
Dim Chuoi
Dim i, j
For Each Tam In DL
    If IsArray(Tam) = False Then
        Chuoi = Chuoi & " " & Tam
    Else
        For Each j In Tam
            Chuoi = Chuoi & " " & j
        Next j
    End If
Next Tam
Chuoi = Replace(Trim(Chuoi), " ", ";")
j = ""
For i = 1 To Len(Chuoi) Step 3
    If CLng(Mid(Chuoi, i, 1)) < CLng(Mid(Chuoi, i + 1, 1)) Then
        j = j & " " & Mid(Chuoi, i, 1)
    Else
        j = j & " " & Mid(Chuoi, i + 1, 1)
    End If
Next i
MinChuoi = Replace(Trim(j), " ", "-")
End Function
 
Upvote 0
Bạn tách cái hàm min_num ra riêng như vậy là đúng tinh thần cấu trúc lập trình.
Công việc khác nhau thì tách riêng nhau. Ở đây có hai công việc rõ rệt là 1. tách số từ mõi ô dữ liệu, và 2. tìm chữ số nhỏ nhất trong mỗi số.
(thêm yêu cầu ở bài #5 thì còn công việc phụ nữa là lấy ô từ mỗi vùng dữ liệu - làm đúng thì phải là 3 hàm tất cả)

Nhưng cái hàm min_num của bạn hơi lủng củng - có lẽ do bạn muốn bao nhiều trường hợp quá.
Giải thuật giản dị nhất là dùng vòng lặp từ 0 đến 9, nếu InStr > 0 thì Exit
Function MinDigit(ByVal s As String) As String
' hàm tìm chữ số nhỏ nhất trong một chuỗi. Nếu chuỗi không có chữ số thì trả về trống
Dim i As Integer
For i = 0 To 9
If InStr(s, i) Then Exit For
Next i
If i <= 9 Then MinDigit = CStr(i)
End Function

Code gọi hàm này để tính trị một ô
a = Split(chuoi, ";")
for i = 0 to ubound(a)
a(i) = MinDigit(a(i))
next i
gom = Join(a, "-")
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tách cái hàm min_num ra riêng như vậy là đúng tinh thần cấu trúc lập trình.
Công việc khác nhau thì tách riêng nhau. Ở đây có hai công việc rõ rệt là 1. tách số từ mõi ô dữ liệu, và 2. tìm chữ số nhỏ nhất trong mỗi số.
(thêm yêu cầu ở bài #5 thì còn công việc phụ nữa là lấy ô từ mỗi vùng dữ liệu - làm đúng thì phải là 3 hàm tất cả)

Nhưng cái hàm min_num của bạn hơi lủng củng - có lẽ do bạn muốn bao nhiều trường hợp quá.
Giải thuật giản dị nhất là dùng vòng lặp từ 0 đến 9, nếu InStr > 0 thì Exit
Function MinDigit(ByVal s As String) As String
' hàm tìm chữ số nhỏ nhất trong một chuỗi. Nếu chuỗi không có chữ số thì trả về trống
Dim i As Integer
For i = 0 To 9
If InStr(s, i) Then Exit For
Next i
If i <= 9 Then MinDigit = CStr(i)
End Function

Code gọi hàm này để tính trị một ô
a = Split(chuoi, ";")
for i = 0 to ubound(a)
a(i) = MinDigit(a(i))
next i
gom = Join(a, "-")
Cảm ơn bạn @VetMini
Vậy tôi nên dùng hàm nào trong các hàm trên bạn @VetMini
 
Upvote 0
Bạn chạy code này xem đúng không nhé.
Mã:
Function layso(ParamArray darr()) As String
         Dim dk As Range, T, i As Long, j As Integer, s As String, min As Byte, mang
         For Each mang In darr
         For Each dk In mang
             T = Split(";" & dk.Value, ";")
             For i = 1 To UBound(T)
                 min = 11
                 For j = 1 To Len(T(i))
                     If min > Mid(T(i), j, 1) Then min = Mid(T(i), j, 1)
                 Next j
                 If Len(s) = 0 Then s = min Else s = s & "-" & min
             Next i
         Next
         Next
         layso = s
End Function
Mã:
=layso(B4:B5,B11:B12)
Cảm ơn bạn các bạn @snow25@CHAOQUAY hàm rất đúng
Chúc các bạn luôn luôn vui.
 
Upvote 0
Web KT
Back
Top Bottom