Dùng hàm tự tạo nhé bạn.Nhờ các bạn làm giúp
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
=layso(B4:B5)
Thử thêm cách nữaNhờ các bạn làm giúp
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
Bạn chạy code này xem đúng không nhé.
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
=layso(B4:B5,B11:B12)
@nvh611
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
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.(file đính kèm).
Cảm ơn bạn @VetMiniBạ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 các bạn @snow25 và @CHAOQUAY hàm rất đúngBạ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)
DIỄN ĐÀN GIẢI PHÁP EXCEL