Tách dữ liệu theo điều kiện phức tạp ? (2 người xem)

Liên hệ QC

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

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào các bạn,chúc một ngày mới an lành.
Tôi đang vướng mắc một vấn đề đã nêu chi tiết minh họa trong file đính kèm, phiền các bạn bớt chút thời gian tìm xem có giải pháp nào để giúp cho tôi hoàn thành được vấn đề này không ạ?
Tôi xin cảm ơn các bạn nhiều.
 

File đính kèm

Đã thử sức và mất khá nhiều thời gian với bài toán này.
Kết quả sau nhiều giờ nghiên cứu là : "Em bó tay " --=0--=0--=0
Gửi tới bạn chủ thớt xinh xinh :Những bài tách dữ liệu mà không tuân theo một quy luật chung chung nào đó thì khó làm lắm bạn ah
 
Upvote 0
Xin chào các bạn,chúc một ngày mới an lành.
Tôi đang vướng mắc một vấn đề đã nêu chi tiết minh họa trong file đính kèm, phiền các bạn bớt chút thời gian tìm xem có giải pháp nào để giúp cho tôi hoàn thành được vấn đề này không ạ?
Tôi xin cảm ơn các bạn nhiều.
Bạn xem file có đúng ý bạn không? Hết giờ sáng hết bận mình tin là chỉnh một chút nữa sẽ còn hoàn hảo hơn ^^
 

File đính kèm

Upvote 0
Bạn xem file có đúng ý bạn không? Hết giờ sáng hết bận mình tin là chỉnh một chút nữa sẽ còn hoàn hảo hơn ^^
Mình thì mình chưa hiểu được Code của bạn tuy nhiên nếu theo cách của bạn
ô A7 viết lại là : 450(±120/-90)aB.B thì kết quả chưa được như ý lắm
 
Upvote 0
Mã:
h4=iferror( lookup(10^10,1*mid(c4,match(true, index(isnumber(1* mid(c4,row($1:$99),1)),0),0),row($1:$99))),"")

Mã:
n4=lookup(10^10,1* mid(if( c4>0,c4,c3), lookup(10^10,if(c4>0, find({"±";"+"},c4), find({"±";"-"},c3)))+1,row($1:$99)))*power(-1,row(c4))
 
Upvote 0
Mã:
h4=iferror( lookup(10^10,1*mid(c4,match(true, index(isnumber(1* mid(c4,row($1:$99),1)),0),0),row($1:$99))),"")

Mã:
n4=lookup(10^10,1* mid(if( c4>0,c4,c3), lookup(10^10,if(c4>0, find({"±";"+"},c4), find({"±";"-"},c3)))+1,row($1:$99)))*power(-1,row(c4))

Há há.Dạo này chuyển qua dùng Công thức hả anh --=0--=0--=0
 
Upvote 0
chuyển gì ? tôi biết mỗi công thức thì tôi xài công thức , có biết gì khác đâu .
Về hướng giải quyết thì không phải là không có (như ở trên đã có 2 hướng) tuy nhiên mấy dạng bài tập không có quy luật chung này em thấy lúc mình làm thường hay phải suy nghĩ theo kiểu : dựa vào kết quả rồi ép công thức hoặc code cho nó ra giống bằng được như vầy thì mới thôi.Tuy nhiên nếu có thay đổi 1 số chỗ trong dữ liệu thì dường như kết quả lại không như ý muốn (ví dụ CT của anh mà dữ liệu cũng thay đổi như ở bài #7 em nói thì kết quả sẽ lệch) và lúc đó ta lại phải nhúng tay vào chỉnh lại . File này em đoán là chắc tác giả cũng chỉ đưa ra 1 số trường hợp ví dụ thôi chứ cũng chưa bao quát hết tất thảy các trường hợp được.
Nhưng mà thôi dẫu sao thì mọi thứ cũng "muôn hình muôn vẻ" - có thế thì mới học hỏi trau dồi được những kiến thức bổ ích từ diễn đàn này.
----------------------------------------------------------
----------------------------------------
Ngoài lề chút :
Chúc mọi người năm mới may mắn, hạnh phúc và thành công !
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các bạn,chúc một ngày mới an lành.
Tôi đang vướng mắc một vấn đề đã nêu chi tiết minh họa trong file đính kèm, phiền các bạn bớt chút thời gian tìm xem có giải pháp nào để giúp cho tôi hoàn thành được vấn đề này không ạ?
Tôi xin cảm ơn các bạn nhiều.
Mã:
Public Sub NHOT()
Dim Nguon, kq(), r As Long

Nguon = Sheet1.Range("C4:C11")
ReDim kq(1 To UBound(Nguon), 1 To 2)

With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\d+.?\d+"

For r = 1 To UBound(Nguon)
If .test(Nguon(r, 1)) Then
kq(r, 1) = .Execute(Nguon(r, 1))(0)
kq(r, 2) = .Execute(Nguon(r, 1))(1)
If .Execute(Nguon(r, 1)).Count = 2 Then kq(r + 1, 2) = "-" & .Execute(Nguon(r, 1))(1)
If .Execute(Nguon(r, 1)).Count = 3 Then kq(r + 1, 2) = "-" & .Execute(Nguon(r, 1))(2)
End If
Next r
End With

Sheet1.Range("H4:I11").ClearContents
Sheet1.Range("H4:I11") = kq
End Sub
 
Upvote 0
Về hướng giải quyết thì không phải là không có (như ở trên đã có 2 hướng) tuy nhiên mấy dạng bài tập không có quy luật chung này em thấy lúc mình làm thường hay phải suy nghĩ theo kiểu : dựa vào kết quả rồi ép công thức hoặc code cho nó ra giống bằng được như vầy thì mới thôi.Tuy nhiên nếu có thay đổi 1 số chỗ trong dữ liệu thì dường như kết quả lại không như ý muốn và lúc đó lại phải nhúng tay vào chỉnh lại. File này em đoán là chắc tác giả cũng chỉ đưa ra 1 số trường hợp ví dụ thôi chứ cũng chưa bao quát hết tất thảy các trường hợp được.
Nhưng mà thôi dẫu sao thì mọi thứ cũng "muôn hình muôn vẻ" - có thế thì mới học hỏi trau dồi được những kiến thức bổ ích từ diễn đàn này.
----------------------------------------------------------
----------------------------------------
Ngoài lề chút :
Chúc mọi người năm mới may mắn, hạnh phúc và thành công !
Sao lại không có quy luật. Dữ liệu trong file có quy luật rõ ràng. Hướng giải quyết là lấy ra 3 số từ chuỗi. Nếu số thứ 3 không có thì lấy số thứ 2. Thứ tự dấu là + + -

Bài này nếu dùng VBA thì nên viết dạng UDF, khi sử dụng sẽ linh hoạt hơn nhiều. Đầu vào là 1 chuỗi, kết quả là mảng 2x2
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Public Sub NHOT()
Dim Nguon, kq(), r As Long

Nguon = Sheet1.Range("C4:C11")
ReDim kq(1 To UBound(Nguon), 1 To 2)

With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\d+.?\[COLOR=#ff0000][SIZE=5][B]d+[/B][/SIZE][/COLOR]"

For r = 1 To UBound(Nguon)
If .test(Nguon(r, 1)) Then
kq(r, 1) = .Execute(Nguon(r, 1))(0)
kq(r, 2) = .Execute(Nguon(r, 1))(1)
If .Execute(Nguon(r, 1)).Count = 2 Then kq(r + 1, 2) = "-" & .Execute(Nguon(r, 1))(1)
If .Execute(Nguon(r, 1)).Count = 3 Then kq(r + 1, 2) = "-" & .Execute(Nguon(r, 1))(2)
End If
Next r
End With

Sheet1.Range("H4:I11").ClearContents
Sheet1.Range("H4:I11") = kq
End Sub

gì chứ nhà mình có kính lúp
thay 450 bằng số 1 xem
 
Upvote 0
Sao lại không có quy luật. Dữ liệu trong file có quy luật rõ ràng. Hướng giải quyết là lấy ra 3 số từ chuỗi. Nếu số thứ 3 không có thì lấy số thứ 2. Thứ tự dấu là + + -

Bài này nếu dùng VBA thì nên viết dạng UDF, khi sử dụng sẽ linh hoạt hơn nhiều. Đầu vào là 1 chuỗi, kết quả là mảng 2x2

Sao lại 3 số hay 2 số gì hả anh. Ở đây, em hiểu là bạn ấy muốn lấy số kèm theo dấu phía trước con số đó thôi mà. Với lại em cũng có nói là KHÔNG có quy luật đâu, em chỉ bảo là "Không có quy luật chung" thôi mà..Tức là ô thì chỉ chứa dấu +,- nhưng cũng có ô còn có cả (, / , ) , phi .... xen lẫn nữa
 
Lần chỉnh sửa cuối:
Upvote 0
Sao lại không có quy luật. Dữ liệu trong file có quy luật rõ ràng. Hướng giải quyết là lấy ra 3 số từ chuỗi. Nếu số thứ 3 không có thì lấy số thứ 2. Thứ tự dấu là + + -

Bài này nếu dùng VBA thì nên viết dạng UDF, khi sử dụng sẽ linh hoạt hơn nhiều. Đầu vào là 1 chuỗi, kết quả là mảng 2x2

file có nhiêu ta chơi nhiêu , tôi chỉ cầu cho người này vào đưa cái chuỗi ....

"G7 ngày 1/1/2016 1(+120/-90)aB.B"
 
Upvote 0
Sao lại không có quy luật. Dữ liệu trong file có quy luật rõ ràng. Hướng giải quyết là lấy ra 3 số từ chuỗi. Nếu số thứ 3 không có thì lấy số thứ 2. Thứ tự dấu là + + -

Bài này nếu dùng VBA thì nên viết dạng UDF, khi sử dụng sẽ linh hoạt hơn nhiều. Đầu vào là 1 chuỗi, kết quả là mảng 2x2
Dựa theo ý tưởng của anh em làm thử cách củ chuối này! Thực sự Regexp em chưa tìm hiểu kĩ!
 

File đính kèm

Upvote 0
Trong cái pattern trên, \d+ thì đúng rồi, nhưng muốn tìm thêm + hoặc - thì phải thêm ký tự
[-+]?\d+

Sau khi test rồi, nếu muốn xét nhiều match thì phải dùng một biến để lấy trị trả về của Execute. Sau đó xét count của collection này.
Dùng thẳng chỉ số như code trên sẽ bị lỗi.
 
Upvote 0
Aaaaaaaaaha!!!Xin cảm ơn các bạn rất nhiều ạ.
Rất xin lỗi mọi người vì cả ngày hôm nay tôi bận rộn với công việc cuối năm nên không online cùng các bạn được.
Tôi không những cảm thấy vui vì mong muốn của mình được đáp ứng mà còn rất bất ngờ vì có rất nhiều bài viết để có thể lựa chọn và còn có cả lời chúc năm mới nữa.
Hi, tôi còn một thỉnh cầu nữa --> Các bạn tham gia trong chủ đề đồng ý kết bạn với tôi nhé! (-_^)!
Diễn đàn này thật là tuyệt vời và dễ mến - Xin cảm ơn các bạn rất nhiều!
**********
Cũng chỉ còn vài giờ nữa là bước sang năm 2016 rồi. Tôi cũng chúc tất cả các bạn có một năm mới nhiều niềm vui , thành công trong công việc và hạnh phúc trong cuộc sống riêng tư.
Chúc diễn đàn ta ngày càng phát triển !
 
Lần chỉnh sửa cuối:
Upvote 0
Trong cái pattern trên, \d+ thì đúng rồi, nhưng muốn tìm thêm + hoặc - thì phải thêm ký tự
[-+]?\d+

Sau khi test rồi, nếu muốn xét nhiều match thì phải dùng một biến để lấy trị trả về của Execute. Sau đó xét count của collection này.
Dùng thẳng chỉ số như code trên sẽ bị lỗi.
Đúng là câu lệnh .test() thay = .execute().count thì sát hơn
 
Upvote 0
Web KT

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

Back
Top Bottom