Chỉ là bài toán tổ hợp thôi mà Quang Hải (đâu phải nội suy gì chứ)
Ví dụ:
- Đầu vào là ABC
- Kết quả ghép là: AA, AB, AC, BA, BB, BC, CA, CB, CC
- Trong dảy kết quả trên, nếu có trùng thì loại bỏ (unique)
Vậy thôi
Sub test()
Dim chuoi As String, kq(1 To 10000), i As Long, j As Long, tam As Variant, kqtam As Variant
chuoi = [D2] & [E2] & [F2]
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\B"
tam = .Replace(chuoi, ",")
End With
kqtam = Split(tam, ",")
With CreateObject("scripting.dictionary")
For i = 0 To UBound(kqtam)
For j = 0 To UBound(kqtam)
If Not .exists(kqtam(i) & kqtam(j)) Then .Add kqtam(i) & kqtam(j), ""
Next
Next
[H3].Resize(, .Count).NumberFormat = "@"
[H3].Resize(, .Count) = .keys
End With
End Sub
Em biết thuật toán của mình chưa đủ để xơi bài này mà anh gọi em lên trả bài. Cũng ác thiêt đó. Nếu trúng thì tốt, nếu tác giả la lên chưa trúng thì anh hỗ trợ sửa giúp em nha.
PHP:Sub test() Dim chuoi As String, kq(1 To 10000), i As Long, j As Long, tam As Variant, kqtam As Variant chuoi = [D2] & [E2] & [F2] With CreateObject("vbscript.regexp") .Global = True .Pattern = "\B" tam = .Replace(chuoi, ",") End With kqtam = Split(tam, ",") With CreateObject("scripting.dictionary") For i = 0 To UBound(kqtam) For j = 0 To UBound(kqtam) If Not .exists(kqtam(i) & kqtam(j)) Then .Add kqtam(i) & kqtam(j), "" Next Next [H3].Resize(, .Count).NumberFormat = "@" [H3].Resize(, .Count) = .keys End With End Sub
Thì bài 17 là xài hàm đó, bài mình viêt bằng code mà hàm gì chứ. Nghiên cưu cách chay code trong file nhé. Nếu kết quả chưa trúng thì thế nào cũng có người hỗ trợ vì mình đã khởi động phương án cho bài toán của bạn rồi.Dạ cảm ơn bác đã quan tâm. Em đã load file bác về nhưng em không thấy có Hàm nào cả
Mục đích của bạn là làm sao tách được ra các tổ hợp, vậy tôi để dang cột bạn chỉ cần thay các giá trị vào dữ liệu là có kết quả, công thức thì kéo sang bên, nếu muốn sang mảng ngang thì bạn copy > Paste special > chọn Value + Transpose là được.Cảm ơn bác nhiều, nhưng em đọc file của bác hình như không hiểu ạ. Em cũng không biết cách chuyển sao cho (Đáp án từ cột dọc sang cột ngang) Híc.
Tại em mù tịt về nó nên mới vào hỏi ạ.
Thanks bác nhiều.
Theo như sư phụ mô tả thì đây là bài toán chỉnh hợp chứ nhỉ? Cụ thể là chỉnh hợp lặp chập 2 của 3 phần tử, số phần tử tạo ra chính là 3^2 = 9 phần tử. Nếu là ABCD thì kết quả sẽ là 4^2 = 16 phần tử.Chỉ là bài toán tổ hợp thôi mà Quang Hải (đâu phải nội suy gì chứ)
Ví dụ:
- Đầu vào là ABC
- Kết quả ghép là: AA, AB, AC, BA, BB, BC, CA, CB, CC
- Trong dảy kết quả trên, nếu có trùng thì loại bỏ (unique)
Vậy thôi
Chọn ô C2 hoặc C3 (hoặc ô nào muốn tách) rồi bấm nút. Cái vụ tô màu chưa tính.Các bác xem lại giúp em file em mới gửi lên.
Public Sub GPE()
Dim Rng As Range, Arr(), I As Long, J As Long, L As Long, K As Long, Dic As Object, Tem As Variant
Set Dic = CreateObject("Scripting.Dictionary")
Set Rng = Selection
ReDim Arr(1 To 1, 1 To Len(Rng) ^ 2)
L = Len(Rng)
For I = 1 To L
If Mid(Rng, I, 1) <> "-" Then
For J = 1 To L
If Mid(Rng, J, 1) <> "-" Then
Tem = Mid(Rng, I, 1) & Mid(Rng, J, 1)
If Not Dic.exists(Tem) Then
K = K + 1
Dic.Add Tem, ""
Arr(1, K) = Tem
End If
End If
Next J
End If
Next I
Selection.Offset(, 1).Resize(, L ^ 2).ClearContents
Selection.Offset(, 1).Resize(, K).Value = Arr
Set Dic = Nothing
End Sub
Vâng, vậy ta có thể ghép số dạng như trong file này em gửi được không vậy?
Ta tách thành 3 CELL để ghép.
Ta lấy giá trị của từng chuỗi số ghép với nhau của CELL D2:F2
Ví dụ: Giá trị ta cho vào
D2 E2 F2
227 816 805
Lọc chuỗi số cho H2 đến BD2
22 27 28 21 26 20 25 Tiếp đến(Vì số 2 có rồi nên bỏ qua) ta lại ghép 77 78 71 76 (Vì 78 có rồi nên ta bỏ qua) 70 75 lại tới 88 82 87 81 86 80 85 cứ như thế tới BD2
Như vạy có được không đại ca.
tmp =IF(COUNTIF($D$2,"*"&ROW($1:$10)-1&"*"),ROW($1:$10)-1,"")
UniqueNum =SMALL(tmp,ROW(INDIRECT("1:"&COUNT(tmp))))
=IF(INT((COLUMNS($A:A)-1)/COUNT(tmp))+1>COUNT(tmp),"",INDEX(UniqueNum,INT((COLUMNS($A:A)-1)/COUNT(tmp))+1)&INDEX(UniqueNum,MOD((COLUMNS($A:A)-1),COUNT(tmp))+1))
Sub Tohop()
Dim i, j As Integer, Arr, Kq As String, Chuoi As String, TmpChuoi as String
TmpChuoi = [D3] & [E3] & [F3]
For i = 1 To Len(TmpChuoi)
If IsNumeric(Mid(TmpChuoi, i, 1)) Then Chuoi = Chuoi & Mid(TmpChuoi, i, 1)
Next
For i = 1 To Len(Chuoi)
For j = 1 To Len(Chuoi)
If i <> j And InStr(1, Kq, Mid(Chuoi, i, 1) & Mid(Chuoi, j, 1)) = 0 Then
Kq = Kq & Mid(Chuoi, i, 1) & Mid(Chuoi, j, 1) & ","
End If
Next
Next
Arr = Split(Kq, ",")
Range("h3", Range("h3").End(xlToRight)).ClearContents
[H3].Resize(, UBound(Arr)) = Arr
End Sub
Cảm ơn các bác nhiều ạ..
Chắc tại em không biết hỏi nên thế.. Dù sao cũng thật cảm ơn mọi người đã nhiệt tình..
Vậy kết luận cuối cùng là sao đây? Vẫn chưa đúng ý của bạn à?
Vậy đó, tốn bao nhiêu công sức cuối cùng không ai hiểu đúng hay không. Sao em dị ứng với cụm từ "Dù sao cũng cám ơn".
còn nhiêu đứa sau khi làm xong lặng lệ quay đi biệt tâm không một lời từ giãCảm ơn các bác nhiều ạ..
Chọn ô C2 hoặc C3 (hoặc ô nào muốn tách) rồi bấm nút. Cái vụ tô màu chưa tính.
PHP:Public Sub GPE() Dim Rng As Range, Arr(), I As Long, J As Long, L As Long, K As Long, Dic As Object, Tem As Variant Set Dic = CreateObject("Scripting.Dictionary") Set Rng = Selection ReDim Arr(1 To 1, 1 To Len(Rng) ^ 2) L = Len(Rng) For I = 1 To L If Mid(Rng, I, 1) <> "-" Then For J = 1 To L If Mid(Rng, J, 1) <> "-" Then Tem = Mid(Rng, I, 1) & Mid(Rng, J, 1) If Not Dic.exists(Tem) Then K = K + 1 Dic.Add Tem, "" Arr(1, K) = Tem End If End If Next J End If Next I Selection.Offset(, 1).Resize(, L ^ 2).ClearContents Selection.Offset(, 1).Resize(, K).Value = Arr Set Dic = Nothing End Sub