Ghép 2 chuỗi theo thứ tự?

Liên hệ QC

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Mình có 2 chuỗi như sau :
chuỗi A : 10-11-12-13-14
chuỗi B : 00-01-02-03-04-10-11-12-13-14-20-21-22-23-24-30-31-32-33-34-40-41-42-43-44.
Nếu mình muốn ghép các số ở chuỗi A vào chuỗi B theo quy tắc :
- mỗi số ở chuỗi A ghép lần lượt với tất cả các số ở chuỗi B và loại bớt các số bị trùng (ví dụ 00-01, 01-00 là cặp số bị trùng, loại bớt 1 cặp).
xin hỏi làm như thế nào. Chân thành cảm ơn!
 
Mình có 2 chuỗi như sau :
chuỗi A : 10-11-12-13-14
chuỗi B : 00-01-02-03-04-10-11-12-13-14-20-21-22-23-24-30-31-32-33-34-40-41-42-43-44.
Nếu mình muốn ghép các số ở chuỗi A vào chuỗi B theo quy tắc :
- mỗi số ở chuỗi A ghép lần lượt với tất cả các số ở chuỗi B và loại bớt các số bị trùng (ví dụ 00-01, 01-00 là cặp số bị trùng, loại bớt 1 cặp).
xin hỏi làm như thế nào. Chân thành cảm ơn!
Bài này tôi đang tập viết với Dictionary, có một chút rắc rối với dấu "-" khi ghép chuỗi, gán lên sheet thì bị chuyển sang dạng ngày tháng, vì vậy tôi thay dấu "-" bằng dấu "|", bạn tham khảo code và file đính kèm:
[gpecode=vb]
Sub Button1_Click()
Dim ArrA, ArrB, ArrC, ArrD, iR As Long, jR As Long
Dim Dic As Object, nR As Long, Tmp1 As String, Tmp2 As String
Set Dic = CreateObject("Scripting.Dictionary")
ArrA = Split(Sheet1.[B1], "-")
ArrB = Split(Sheet1.[B2], "-")
ReDim ArrC(1 To (UBound(ArrA) + 1) * (UBound(ArrB) + 1), 1 To 1)
For iR = 0 To UBound(ArrA)
For jR = 0 To UBound(ArrB)
Tmp1 = ArrA(iR) & "|" & ArrB(jR)
Tmp2 = ArrB(jR) & "|" & ArrA(iR)
If Not Dic.Exists(Tmp1) And Not Dic.Exists(Tmp2) Then
nR = nR + 1
Dic.Add Tmp1, nR
ArrC(nR, 1) = Tmp1
End If
Next jR
Next iR
Sheet1.Range([B6], [B6].End(4)).ClearContents
Sheet1.[B6].Resize(nR) = ArrC
Set Dic = Nothing
End Sub
[/gpecode]
 

File đính kèm

  • Tách và ghép chuỗi.xls
    40 KB · Đọc: 11
Bài này tôi đang tập viết với Dictionary, có một chút rắc rối với dấu "-" khi ghép chuỗi, gán lên sheet thì bị chuyển sang dạng ngày tháng, vì vậy tôi thay dấu "-" bằng dấu "|", bạn tham khảo code và file đính kèm:
[gpecode=vb]
Sub Button1_Click()
Dim ArrA, ArrB, ArrC, ArrD, iR As Long, jR As Long
'---
[/gpecode]
Lúc đầu dùng cách giải khác (mà không được), nên quên xóa biến ArrD.
Nhờ mọi người chỉ thêm cách gán mảng xuống sheet với code trên, sử dụng dấu "-", mà không bị chuyển qua định dạng ngày tháng.
Cảm ơn!
 
Lúc đầu dùng cách giải khác (mà không được), nên quên xóa biến ArrD.
Nhờ mọi người chỉ thêm cách gán mảng xuống sheet với code trên, sử dụng dấu "-", mà không bị chuyển qua định dạng ngày tháng.
Cảm ơn!

Bạn thử format trước khi gán xuống sheet xem sao:

Thêm dòng đỏ này :

Mã:
Sheet1.Range([B6], [B6].End(4)).ClearContents
[COLOR=#ff0000]Sheet1.[B6].Resize(nR).NumberFormat = "@"[/COLOR]
Sheet1.[B6].Resize(nR) = ArrC
 
Lúc đầu dùng cách giải khác (mà không được), nên quên xóa biến ArrD.
Nhờ mọi người chỉ thêm cách gán mảng xuống sheet với code trên, sử dụng dấu "-", mà không bị chuyển qua định dạng ngày tháng.
Cảm ơn!
Cảm ơn bạn, cái CreateObject("Scripting.Dictionary") của bạn rất hay và đúng yêu cầu của mình. Bạn mở rộng thêm 1 chút giúp mình luôn nha : đó loại luôn cặp số có 2 số giống nhau (ví dụ : 10-10, 11-11, 12-12, 13-13, 14-14...). Còn vấn đề sử dung dấu "-" mà không bị chuyển thành ngày tháng bạn chỉ cần format khối cells đó thành dạng TEXT là OK. Code là : Selection.NumberFormat = "@". Chẳng hiểu tại sao không xuống dòng được nữa.
 
Bạn thử format trước khi gán xuống sheet xem sao:

Thêm dòng đỏ này :

Mã:
Sheet1.Range([B6], [B6].End(4)).ClearContents
[COLOR=#ff0000]Sheet1.[B6].Resize(nR).NumberFormat = "@"[/COLOR]
Sheet1.[B6].Resize(nR) = ArrC
OK, đây cũng là một cách, cảm ơn mhung12005 !
Còn cách nào khác xử lý trong vòng lặp, trong mảng không nhỉ?
Bạn emgaingayngo có thể sử dụng cách này, thêm vào code để trích các cặp theo yêu cầu của bạn.
 
Cảm ơn bạn, cái CreateObject("Scripting.Dictionary") của bạn rất hay và đúng yêu cầu của mình. Bạn mở rộng thêm 1 chút giúp mình luôn nha : đó loại luôn cặp số có 2 số giống nhau (ví dụ : 10-10, 11-11, 12-12, 13-13, 14-14...). Còn vấn đề sử dung dấu "-" mà không bị chuyển thành ngày tháng bạn chỉ cần format khối cells đó thành dạng TEXT là OK. Code là : Selection.NumberFormat = "@". Chẳng hiểu tại sao không xuống dòng được nữa.
Chỉ cần thêm điều kiệu ArrA(iR) <> ArrB(jR) là được nha bạn.
[gpecode=vb]
If ArrA(iR) <> ArrB(jR) And Not Dic.Exists(Tmp1) And Not Dic.Exists(Tmp2) Then
[/gpecode]
 

File đính kèm

  • Tách và ghép chuỗi.xls
    40.5 KB · Đọc: 2
Còn cách nào khác xử lý trong vòng lặp, trong mảng không nhỉ?

Đương nhiên có! Khai báo các phần tử mảng là chuổi là được rồi
Thay:
Mã:
ReDim ArrC(1 To (UBound(ArrA) + 1) * (UBound(ArrB) + 1), 1 To 1)
Thành:
Mã:
ReDim ArrC(1 To (UBound(ArrA) + 1) * (UBound(ArrB) + 1), 1 To 1) [COLOR=#ff0000]As String[/COLOR]
Hoặc thêm dấu nháy đơn vào kết quả: ArrC(nR, 1) = "'" & Tmp1
Tuy ý
 
Web KT
Back
Top Bottom