Dùng biến thay cho Cells trong cột phụ ?

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,468
Nghề nghiệp
Công chức
Vd: Tôi muốn lấy chữ Chinh trong chuỗi Trung Chinh thì tôi dùng lệnh gán chuỗi Trung Chinh vào một ô nào đó trong cột phụ sau đó tách lấy chữ Chinh bằng code sau:

Mã:
Sub Macro2()
    [a1] = "Trung Chinh"
    [a1].Replace "* ", ""
    MsgBox [a1]
End Sub
Vậy có thể dùng biến thay thế các ô trong cột phụ để chứa các chuỗi này sau đó tách chữ từ chuỗi trong biến mà không phải dùng cột phụ. Nếu được thì viết code như thế nào ?

Lưu ý: các ô trong cột phụ có thể là các Clls in Rng hoặc .Cells(i) tuỳ theo kiểu vòng lặp.

Bạn nào biết viết giúp mình đoạn code này. Thanks !
 
Lần chỉnh sửa cuối:
Mã:
Sub chay()
MsgBox Trim(Replace("Trung Chinh", "Trung", " ", 1))
End Sub
Hoặc:
Mã:
Sub chay()
[A1] = Trim(Replace("Trung Chinh", "Trung", " ", 1))
End Sub
Hoặc như vầy:
Mã:
Sub chay()
Dim mng() As String
a = "Trung Chinh"
mng() = Split(a, " ")
MsgBox mng(UBound(mng()))
End Sub
Vầy được không?
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub Macro2()
    mystr = "Trung Chinh"
    mystr = Right(mystr, Len(mystr) - InStr(1, mystr, " "))
    MsgBox mystr
End Sub
 
Upvote 0
Vd: Tôi muốn lấy chữ Chinh trong chuỗi Trung Chinh thì tôi dùng lệnh gán chuỗi Trung Chinh vào một ô nào đó trong cột phụ sau đó tách lấy chữ Chinh bằng code sau:

Mã:
Sub Macro2()
    [a1] = "Trung Chinh"
    [a1].Replace "* ", ""
    MsgBox [a1]
End Sub
Vậy có thể dùng biến thay thế các ô trong cột phụ để chứa các chuỗi này sau đó tách chữ từ chuỗi trong biến mà không phải dùng cột phụ. Nếu được thì viết code như thế nào ?

Lưu ý: các ô trong cột phụ có thể là các Clls in Rng hoặc .Cells(i) tuỳ theo kiểu vòng lặp.

Bạn nào biết viết giúp mình đoạn code này. Thanks !
Thì vầy thôi
PHP:
Dim Clls As Range, Temp As String
For Each Clls in Rang(....)
  Temp = Split(Clls, " ")(UBound(Split(Clls, " ")))
  MsgBox Temp
Next
 
Upvote 0
Cảm ơn các bạn, Tôi đã test thử bài của các bạn nhưng có thể đề bài tôi đưa ra không diễn đạt được rõ yêu cầu nên kết quả chưa được như mong muốn. Tôi gửi File ví dụ đính kèm nhờ các bạn xem lại giúp
 

File đính kèm

  • Bien Cells.xls
    27 KB · Đọc: 18
Upvote 0
Cảm ơn các bạn, Tôi đã test thử bài của các bạn nhưng có thể đề bài tôi đưa ra không diễn đạt được rõ yêu cầu nên kết quả chưa được như mong muốn. Tôi gửi File ví dụ đính kèm nhờ các bạn xem lại giúp
Với dử liệu có ở cột B, C, mục đích cuối cùng của anh là kết quả tại cột H, đúng không?
Vậy anh thử code này xem:
PHP:
Sub Test()
  Dim Clls As Range, i As Long, Temp As String
  With Range([C4], [C65536].End(xlUp))
    For i = 1 To .SpecialCells(2).Areas.Count
      For Each Clls In .SpecialCells(2).Areas(i)
        With .Offset(, -1).SpecialCells(2).Areas(i)(1)
          Temp = Split(.Cells, " ")(UBound(Split(.Cells, " ")))
        End With
        Clls(, 6) = Clls & " " & Temp
      Next Clls
    Next i
  End With
End Sub
 
Upvote 0
Cảm ơn Ndu ! Code này tôi chạy thử thì OK rồi nhưng nhờ bạn giải thích giúp nghĩa của câu lệnh này
Temp = Split(.Cells, " ")(UBound(Split(.Cells, " ")))

Tôi không hiểu Split, UBound ?

Thanks !
 
Upvote 0
Bác chỉ cần chỉ ra đầu và cuối thôi! Phần ở giữa không cần nhiều công đoạn thế đâu?
Mã:
Sub chay()
For i = 5 To 11
If Cells(i, "C") <> "" Then
    Cells(i, "H") = ghep(Cells(i, "C"), Cells(Int(i / 4) * 4, "B"))
End If
Next
End Sub
 
Function ghep(rng As Range, cel As Range)
ghep = rng & " " & Split(cel, " ")(UBound(Split(cel, " ")))
End Function
Bác xem file nha!

Split có cú pháp như sau: Split(<Đoạn text>,<Cắt theo chỉ tiêu nào>)
-Hàm này dùng để cắt một đoạn text theo 1 yêu cầu nào đó và cho ra một mãng.
VD: [A1]="abc 123 !@#" thì để tách thành ba đoạn text nhỏ hơn người ta viết:
arr() = Split([A1], " ") lấy dấu cách làm đk cắt.

UBound có cú pháp như sau: UBound(<mãng dữ liệu>)
-Lệnh này dùng để lấy chỉ số cuối cùng của mãng. Ví dụ như mãng có 6 phần tử thì UBound sẽ cho kết quả là 6. Ngược lại thì có LBound(<mãng dữ liệu>) cho ra vị trí đầu tiên của mãng dữ liệu.
Ví dụ: ta có
Dim arr() as String
Redim arr(1 to 13)
Nếu chỉ nạp được 10 ô dữ liệu của mãng arr() này thôi thì UBound(arr()) = 10

Split(cel, " ")(UBound(Split(cel, " "))): Còn dòng này là 1 kiểu viết tắt thôi. Để khỏi đặt biến mãng arr() đó mà. Có thể tạm hiểu là cắt nó ra rồi lấy ở vị trí cuối cùng của mãng mới vừa cắt.
Thân.
 

File đính kèm

  • Bien Cells.xls
    37.5 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Bạn giải thích rất dễ hiểu, hôm nay mình lại biết thêm 1 chiêu mới. Một lần nữa Cảm ơn tuyetbay!
 
Upvote 0
Bác chỉ cần chỉ ra đầu và cuối thôi! Phần ở giữa không cần nhiều công đoạn thế đâu?
Mã:
Sub chay()
For i = 5 To 11
If Cells(i, "C") <> "" Then
    Cells(i, "H") = ghep(Cells(i, "C"), Cells(Int(i / 4) * 4, "B"))
End If
Next
End Sub
 
Function ghep(rng As Range, cel As Range)
ghep = rng & " " & Split(cel, " ")(UBound(Split(cel, " ")))
End Function
Cái này không có chơi kiểu Int(i / 4) được đâu nha ---> Hên nó trúng thôi ---> Làm sao bạn biết chắc dử liệu thật cách 4 dòng có 1 dòng chứa dử liệu?
Chính vì vậy ta quét qua các Areas là ăn chắc
 
Upvote 0
Tại em thấy bác viết code có dùng Areas rồi! Chẳng lẽ lại viết giống như vậy nữa! Nên mạo muội biên thêm một cách khác cho hay thôi mà! :-D
Tất nhiên code này ko thể áp dụng cho tất cả các trường hợp được. Tùy vào mỗi tình huống ta tìm cách nào nhanh và ngắn nhất thôi????! (Đúng hơn là chỉ có trường hợp này mới đúng thôi!)
Thân.
 
Upvote 0
Ví dụ Split vầy cho dể hiểu
Cell A1 chưa chuổi: Nguyễn Trung Chính
Vậy:
Temp = Split([A1]," ") sẽ cắt chuổi này thành 1 mãng 3 phần tử dựa vào từ khóa là khoảng trắng (giống Text to Column ấy)
===>
Temp(0) = "Nguyễn"
Temp(1) = "Trung"
Temp(2) = "Chính"

Số 2 có thể thay bằng UBound(Temp) ---> Là phần tử cuối cùng (trong trường hợp ta không biết chắc mãng gồm bao nhiêu phần tử)
Nó chuyên dùng để tách tên ---> VÔ ĐỊCH
 
Upvote 0
Web KT
Back
Top Bottom