Hướng giải đáp VBA hay Hàm thông dụng (1 người xem)

  • Thread starter Thread starter bloger
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

bloger

Thành viên mới
Tham gia
15/2/11
Bài viết
12
Được thích
0
Chào các bạn hiện tại mình đang gặp vấn đề như sau:

Ở ô A1 mình có đoạn text:"Cách lấy 1 phần trong chuỗi, xử lý trong excel làm thế nào?"

Và ô
A2: mình muốn lấy đoạn văn bản A1 là:"Cách lấy 1 phần trong "
Ô:
A3 mình sẽ lấy phần còn lại của A1: "chuỗi, xử lý trong excel làm thế nào?"

Ý đồ của mình là muốn lấy chuổi theo ý muốn bất kỳ đoạn nào trong đoạn text A1.

Nếu như vậy thì mình nên đi theo hướng nào và các điều cần chú ý trong vấn đề này là gì. Mong các bạn chỉ dẫn và cho thêm ý kiến.
Thanks nhiều.
P/s. Ý kiến riêng của mình là cắt chưổi thành mảng rồi dựa vào số ký tự khoảng trắng mà lấy nhưng không thành công ^^
 
Lần chỉnh sửa cuối:
Chào các bạn hiện tại mình đang gặp vấn đề như sau:

Ở ô A1 mình có đoạn text:"Cách lấy 1 phần trong chuỗi, xử lý trong excel làm thế nào?"

Và ô
A2: mình muốn lấy đoạn văn bản A1 là:"Cách lấy 1 phần trong "
Ô:
A3 mình sẽ lấy phần còn lại của A1: "chuỗi, xử lý trong excel làm thế nào?"

Ý đồ của mình là muốn lấy chuổi theo ý muốn bất kỳ đoạn nào trong đoạn text A1.

Nếu như vậy thì mình nên đi theo hướng nào và các điều cần chú ý trong vấn đề này là gì. Mong các bạn chỉ dẫn và cho thêm ý kiến.
Thanks nhiều.
P/s. Ý kiến riêng của mình là cắt chưổi thành mảng rồi dựa vào số ký tự khoảng trắng mà lấy nhưng không thành công ^^
Dạng bài này có thể làm bằng công thức hoặc VBA đều được.......với điều kiện phải có quy luật tách dữ liệu rõ ràng, còn không thì "tèo"
Thân
 
Upvote 0
Thật sự hiểu ý bạn lắm thử code này làm đại đại thử xem đúng không
Mã:
Function Test(txt As Range, vitri As String)
Dim sarr, i As Long
Dim text, kq
text = Split(txt, " ")
sarr = Split(vitri, ",")
For i = 0 To UBound(sarr)
   kq = kq & " " & text(sarr(i) - 1)
Next
Test = Trim(kq)
End Function
Cú pháp vị trí muốn lấy
=Test(A1,"1,2,5,7,8,10,13")
 
Upvote 0
Thật sự hiểu ý bạn lắm thử code này làm đại đại thử xem đúng không
Mã:
Function Test(txt As Range, vitri As String)
Dim sarr, i As Long
Dim text, kq
text = Split(txt, " ")
sarr = Split(vitri, ",")
For i = 0 To UBound(sarr)
   kq = kq & " " & text(sarr(i) - 1)
Next
Test = Trim(kq)
End Function
Cú pháp vị trí muốn lấy
=Test(A1,"1,2,5,7,8,10,13")
Mình test thử code của bạn nhưng sao không ra kết quả nhỉ?
 
Upvote 0
Nếu là tôi thì tôi viết hàm thế này:

PHP:
Function Test(txt As String, words As String)
Dim i As Long
Dim text, kq As String

text = Split(txt, " ")
For i = 0 To words - 1
   kq = kq & " " & text(i)
Next
Test = Trim(kq)
End Function

Muốn lấy 5 từ đầu thì viết công thức:
=test(A1,5)
 
Upvote 0
Nếu là tôi thì tôi viết hàm thế này:

PHP:
Function Test(txt As String, words As String)
Dim i As Long
Dim text, kq As String

text = Split(txt, " ")
For i = 0 To words - 1
   kq = kq & " " & text(i)
Next
Test = Trim(kq)
End Function

Muốn lấy 5 từ đầu thì viết công thức:
=test(A1,5)
Hàm này sử dụng dễ hơn hàm của bạn nmhung49.
 
Upvote 0
Nhưngminhf chỉ lấy được khúc đầu ak. còn lấy ngẫu nhiên khúc cuối hoặc khúc giữa thì hok được
Thanks bạn đã cho ý kiến
Thanks ptm0412
Thanks
concogia

 
Lần chỉnh sửa cuối:
Upvote 0
Nếu là tôi thì tôi viết hàm thế này:

PHP:
Function Test(txt As String, words As String)
Dim i As Long
Dim text, kq As String

text = Split(txt, " ")
For i = 0 To words - 1
   kq = kq & " " & text(i)
Next
Test = Trim(kq)
End Function

Muốn lấy 5 từ đầu thì viết công thức:
=test(A1,5)

Bạn ơi cho mình hỏi hàm của bạn có 2 tham số kiểu string mà sao lúc lấy hàm lại ghi kiểu số được vậy.
 
Upvote 0
Muốn lấy bất kỳ khúc nào trong chuỗi thì dùng hàm MID.
Nếu có thêm điều kiện gì thì phải nêu cho rõ. Nói lừng khừng lại còn viết tắt tùm lum ai mà hiểu cho nổi. Cứ mỗi lần hiểu lầm thì phải code lại.

Điều kiện:
- Cắt ở đâu cũng được (sẽ có từ bị cắt đôi), hay là không được cắt giữa từ?
- Nếu không được cắt giữa từ thì giũ lại từ đó hay bỏ luôn từ đó?
- Nếu trúng dấu phẩy hoặc dấu chấm thì giữ lại hay bỏ luôn?
- Nếu có nhiều dâu trống cạnh nhau thì vẫn giữ hay xếp gọn lại?
Sơ sơ mấy quy luật ấy thôi. Không xác định từ đầu thì code viết đi viết lại cả chục lần.
 
Upvote 0
Chào các bạn hiện tại mình đang gặp vấn đề như sau:

Ở ô A1 mình có đoạn text:"Cách lấy 1 phần trong chuỗi, xử lý trong excel làm thế nào?"

Và ô
A2: mình muốn lấy đoạn văn bản A1 là:"Cách lấy 1 phần trong "
Ô:
A3 mình sẽ lấy phần còn lại của A1: "chuỗi, xử lý trong excel làm thế nào?"

Ý đồ của mình là muốn lấy chuổi theo ý muốn bất kỳ đoạn nào trong đoạn text A1.

Nếu như vậy thì mình nên đi theo hướng nào và các điều cần chú ý trong vấn đề này là gì. Mong các bạn chỉ dẫn và cho thêm ý kiến.
Thanks nhiều.
P/s. Ý kiến riêng của mình là cắt chưổi thành mảng rồi dựa vào số ký tự khoảng trắng mà lấy nhưng không thành công ^^

Thử hàm sau
Mã:
Function tach(cell, Optional x As Integer, Optional y As Integer)
Dim str, i, j
i = 1
j = Len(cell)
If x > 0 Then
For i = 1 To Len(cell)
    str = Left(cell, i)
    If Len(str) - Len(Replace(str, " ", "")) = x - 1 Then Exit For
Next
End If
If y > 0 Then
For j = 1 To Len(cell)
    str = Left(cell, j)
    If Len(str) - Len(Replace(str, " ", "")) = y Then Exit For
Next
End If
    tach = Trim(Mid(cell, i, j - i + 1))
End Function

Cú pháp :
=tach(cell,x,y) : lấy đoạn text từ chữ thứ x đến chữ thứ y, nếu x=y thì lấy chữ thứ x
=tach(cell,x) lấy đoạn text từ chữ thứ x đến hết câu
=tach(cell,,y) lấy đoạn text từ chữ thứ y đến đầu câu
 
Upvote 0
Thử hàm sau
Mã:
Function tach(cell, Optional x As Integer, Optional y As Integer)
Dim str, i, j
i = 1
j = Len(cell)
If x > 0 Then
For i = 1 To Len(cell)
    str = Left(cell, i)
    If Len(str) - Len(Replace(str, " ", "")) = x - 1 Then Exit For
Next
End If
If y > 0 Then
For j = 1 To Len(cell)
    str = Left(cell, j)
    If Len(str) - Len(Replace(str, " ", "")) = y Then Exit For
Next
End If
    tach = Trim(Mid(cell, i, j - i + 1))
End Function

Cú pháp :
=tach(cell,x,y) : lấy đoạn text từ chữ thứ x đến chữ thứ y, nếu x=y thì lấy chữ thứ x
=tach(cell,x) lấy đoạn text từ chữ thứ x đến hết câu
=tach(cell,,y) lấy đoạn text từ chữ thứ y đến đầu câu

Hàm trên tính sai nếu có nhiều dấu trắng liên tiếp nhau.

Bởi vậy câu hỏi của tôi có đề cập đến "nếu nhiều dấu trắng liên tiếp nhau thì giữ lại hay rút gọn?". Mục đích là để xem có thể sử dụng hàm worksheetfunction.TRIM hay không.
 
Upvote 0
Bạn ơi cho mình hỏi hàm của bạn có 2 tham số kiểu string mà sao lúc lấy hàm lại ghi kiểu số được vậy.
Tôi sửa theo code của nmhung49 nhưng bỏ sót, may là vào vòng lặp For nó chuyển lại từ string thành number.

Bài 1 của bạn đâu có nói gì về việc lấy 1 số từ bất kỳ trong chuỗi? Bạn chỉ thí dụ là lấy 1 chuỗi đầu câu, và phần còn lại.
 
Upvote 0
Bạn ơi cho mình hỏi hàm của bạn có 2 tham số kiểu string mà sao lúc lấy hàm lại ghi kiểu số được vậy.

Bởi vì theo luật ép kiểu của VBA, lúc cần thiết, integer có thể bị trình dịch ép kiểu thành string.
Lúc nạp hàm, tham số bị ép thành string. Sau đó bên trong hàm, trị này lại bị ép kiểu lần nữa lúc sử dụng.

Tuy nhiên lợi dụng tính chất này rất nguy hiểm. Cho nên tốt hơn hết là nên tránh.

VD:
a = "1"
b = "2"
msgbox a+b ' kết quả là 12, trình dịch tự động đổi toán tử thành ghép chuỗi
msgbox a + cint(b) ' kết quả là 3, trình dịch tự động đổi a thành số
 
Upvote 0
Hàm trên tính sai nếu có nhiều dấu trắng liên tiếp nhau.

Bởi vậy câu hỏi của tôi có đề cập đến "nếu nhiều dấu trắng liên tiếp nhau thì giữ lại hay rút gọn?". Mục đích là để xem có thể sử dụng hàm worksheetfunction.TRIM hay không.

Để loại trừ nhiều dấu trắng liên tiếp nhau thì có thể thêm
Mã:
Do
str = Replace(str, "  ", " ")
Loop Until InStr(str, "  ") = 0
 
Upvote 0
Để loại trừ nhiều dấu trắng liên tiếp nhau thì có thể thêm
Mã:
Do
str = Replace(str, "  ", " ")
Loop Until InStr(str, "  ") = 0

Cha mẹ ơi! chi mà khổ thế.
Hàm TRIM của Worksheet là đủ rồi.

Nhưng thực ra nếu chấp nhận thâu gọn khoảng trắng thì cách gọ nhất là dùng hàm Split. Lúc rắp từ lại thì chỉ việc bỏ qua các chuỗi trống.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom