Cần Macro để xử lý dữ liệu Text sau

Liên hệ QC

hoangexcell

Thành viên tiêu biểu
Tham gia
8/1/08
Bài viết
459
Được thích
132
Donate (Momo)
Donate
Giới tính
Nam
Hi các Pro,

Có ai vui lòng giúp đoạn macro để xử lý dữ liệu theo yêu cầu trong File đính kèm không?
Xin Cảm ơn trước! Giúp mình nhé.-\\/.
 

File đính kèm

  • Noi description.xls
    16 KB · Đọc: 51
Lần chỉnh sửa cuối:
Hi các Pro,

Có ai vui lòng giúp đoạn macro để xử lý dữ liệu theo yêu cầu trong File đính kèm không?
Xin Cảm ơn trước, cái này mình thấy dễ ẹc à, nhưng mà chưa biết làm -+*/. Giúp mình nhé.-\\/.
Đã nhờ mà còn nói thế.
Bạn dùng code sau:
PHP:
Sub NoiDG()
'With Application
'    .DisplayAlerts = False: .ScreenUpdating = False: .Calculation = xlCalculationManual
'End With
Dim SoRow, MyRng, iR, jR, eRow, iRow, MyStr As String
Set WF = WorksheetFunction
Sheet1.Select
With Sheet1
    eRow = .Cells(10000, 2).End(xlUp).Row
    Set MyRng = .Range(.Cells(1, 2), .Cells(eRow, 2))
    SoRow = MyRng.Count
End With
MyStr = ""
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) <> "+" Then
        eRow = iR
        Exit For
    End If
Next
Set MyRng = Range(Cells(1, 2), Cells(eRow, 2))
SoRow = MyRng.Count
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) = "+" Then
        MyStr = MyStr & MyRng(iR)
        MyRng(iR).Delete Shift:=xlUp
    Else
    MyRng(iR) = MyRng(iR) & MyStr
    MyStr = ""
    End If
Next
End Sub
 
Upvote 0
!$@!!hic mình không biết sài làm sao với các Code này.
Vui lòng chỉ cách làm tiếp theo nhe bạn.

Còn câu nói của mình không có ý gì đâu. Đã gọi là Pro rồi mà, mình chỉ biết = A+B thôi àh.
Chứ không biết gì về code hết. bây giờ có cũng không biết sài nữa nè.
Thanks
 
Upvote 0
Hi các Pro,

Có ai vui lòng giúp đoạn macro để xử lý dữ liệu theo yêu cầu trong File đính kèm không?
Xin Cảm ơn trước! Giúp mình nhé.-\\/.
Trước đây tôi có đăng lên diển đàn 2 hàm: Unique và JoinIf ... Giờ chỉ việc áp dụng vào là được:
1> Hàm Unique: Trích lọc ra 1 danh sách duy nhất
PHP:
Function Unique(Vung As Range, STT As Long) As Variant
   Dim i, K As Long
   Dim Temp As Variant
   For i = 1 To Vung.Cells.Count
    If Vung(i) <> "" Then
      If i = Application.WorksheetFunction.Match(Vung(i), Vung, 0) Then
        K = K + 1
      End If
      If K = STT Then Temp = Vung(i): Exit For
    End If
   Next i
   Unique = Temp
End Function
2> Hàm JoinIf : Nối chuối theo điều kiện:
PHP:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, Optional PC As Variant) As String
  Dim i, Dem As Long
  Dim Temp As String
  Dem = VungDK.Count
  If IsMissing(PC) Then PC = ""
  For i = 1 To Dem
    If VungDK(i) = DK Then Temp = Temp & PC & VungKQ(i)
  Next
  JoinIf = Mid(Temp, Len(PC) + 1, Len(Temp))
End Function
Sau khi add 2 đoạn code này vào bảng tính thì ta áp dụng như sau:
C3 =JoinIf($A$3:$A$30,Unique($A$3:$A$30,ROWS($1:1)),$B$3:$B$30)
Kéo fill xuống đến khi nào gặp kết quả = rổng thì dừng lại
Xem file
 

File đính kèm

  • Noi description_01.xls
    28 KB · Đọc: 38
Upvote 0
Đã nhờ mà còn nói thế.
Bạn dùng code sau:
Code của bác để nguyên báo lỗi. Em sửa chút như sau

bỏ dấu nháy đơn ở đầu 2 dòng
PHP:
'With Application
'    .DisplayAlerts = False: .ScreenUpdating = False: .Calculation = xlCalculationManual
 End With
Cắt bỏ đoạn (có ảnh hưởng gì trong trường hợp tổng quát không?)
PHP:
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) <> "+" Then
        eRow = iR
        Exit For
    End If
Next
Thêm .EntireRow ở dòng này
PHP:
............
        MyRng(iR).EntireRow.Delete Shift:=xlUp
.........
Được kết quả như sau, áp vào file của bạn hoangexcell thì thấy chạy đúng theo yêu cầu
PHP:
Sub NoiDG()
With Application
    .DisplayAlerts = False: .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
Dim SoRow, MyRng, iR, jR, eRow, iRow, MyStr As String
Set WF = WorksheetFunction
Sheet1.Select
With Sheet1
    eRow = .Cells(10000, 2).End(xlUp).Row
    Set MyRng = .Range(.Cells(1, 2), .Cells(eRow, 2))
    SoRow = MyRng.Count
End With
MyStr = ""
Set MyRng = Range(Cells(1, 2), Cells(eRow, 2))
SoRow = MyRng.Count
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) = "+" Then
        MyStr = MyStr & MyRng(iR)
        MyRng(iR).EntireRow.Delete Shift:=xlUp
    Else
    MyRng(iR) = MyRng(iR) & MyStr
    MyStr = ""
    End If
Next
End Sub
 

File đính kèm

  • Copy of Noi description.xls
    25 KB · Đọc: 30
Upvote 0
[/php]Cắt bỏ đoạn (có ảnh hưởng gì trong trường hợp tổng quát không?)
PHP:
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) <> "+" Then
        eRow = iR
        Exit For
    End If
Next

Phải có đọan này, nhưng mà thiếu, phải thêm if nữa vì bạn ấy yêu cầu nếu dòng cuối begin là + thì giữ lại
PHP:
If Left(MyRng(SoRow), 1)= "+" then
For iR = SoRow To 2 Step -1
    If Left(MyRng(iR), 1) <> "+" Then
        eRow = iR
        Exit For
    End If
Next
end if
 

File đính kèm

  • Noi_description.xls
    39 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Thu nghi: Code của bạn bỏ xót phần text cuối
Boyxin: Bạn cung cấp chính xác cái mình muốn
Ndu96: hàm của bạn rất hữu ích!
Thanks all
 
Lần chỉnh sửa cuối:
Upvote 0
Sorry, chuyện này vẫn chưa kết thúc được!

Tôi muốn bỏ code này vào file personal để khi chạy bất cứ file dữ liệu nào cũng được nhưng nó báo lỗi.
Nhờ các Pro chỉnh lại code giúp nhé! Thanks nhiều
 
Upvote 0
Sorry, chuyện này vẫn chưa kết thúc được!

Tôi muốn bỏ code này vào file personal để khi chạy bất cứ file dữ liệu nào cũng được nhưng nó báo lỗi.
Nhờ các Pro chỉnh lại code giúp nhé! Thanks nhiều
Các đơn giãn nhất là bạn chuyển Function JoinIf thành 1 Add-in, từ đây thì toàn bộ file trên máy bạn đều có thể dùng được như 1 hàm Excel thông thường
 
Upvote 0
Cái đó cũng được nhưng không tiện dùng công thức trong trường hợp của mình!

Chỉ muốn Macro chạy một lèo cho xong. Những giải pháp code trên cần chỉnh lại cho linh hoạt hơn và ứng dụng cao. Mong các Pro nâng cấp !
 
Upvote 0
Thủ tục ghép chuỗi và xóa dòng:
Mã:
Sub GhepChuoi()
Dim sFind As String, r As Long, rd As Long, rc As Long
rd = 3
rc = Cells(1, 2).End(xlDown).Row
sFind = Cells(3, 1)
Do
  r = Range(Cells(rd, 1), Cells(rc, 1)).Find(What:=sFind, After:=Cells(rd, 1), LookIn:=xlValues, LookAt _
    :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _
    :=True, SearchFormat:=False).Row
  If r = rd Then
    rd = rd + 1
    sFind = Cells(rd, 1)
  Else
    Stop
    Cells(rd, 2) = Cells(rd, 2) & Cells(r, 2)
    Cells(r, 1).EntireRow.Delete
    rc = rc - 1
  End If
Loop While rd < rc
End Sub
 

File đính kèm

  • Noi description.xls
    34 KB · Đọc: 19
Upvote 0
Tham gia thêm 1 giải pháp nữa xem sao ;-)

Option Explicit
Sub Joint2Col()
''' test voi du lieu co 56450 do`ng
Const sep = " | " 'ky tu phan cach
Const dong = 5, cot = 1 ' vi tri tim mac dinh la o A5
Dim sh As Worksheet
Dim ra As Range, r1 As Range, r2 As Range, r3 As Range
Dim ro As Long, co As Long, t1, t2
Dim a1(), a2(), a3()
Dim i As Long, j As Long, k As Long, pa As String, ok As Boolean
'On Error GoTo 1
t1 = Time ' bat dau luc:
Set sh = ActiveSheet
Set ra = sh.Cells(dong, cot).CurrentRegion.Resize(, 2)
ro = ra.Rows.Count
co = ra.Columns.Count
If (WorksheetFunction.Max(ro, co) < 2) Or (ra Is Nothing) Then GoTo 1
pa = InputBox("Nhap ten o se chua ket qua (dang A1): ", "Destination")
If Len(pa) < 1 Then GoTo 1
ReDim a1(ro), a2(ro), a3(ro)
Set r1 = ra.Columns(1)
Set r2 = ra.Columns(2)
Set r3 = Range(pa).Resize(ro, 1)
If WorksheetFunction.CountA(r3) > 0 Then
ok = MsgBox("Vung chon da co chua du lieu, se bi mat du lieu. Tiep tuc Y/N ", vbExclamation + vbYesNo)
If ok = vbNo Then GoTo 1
End If
a1 = r1: a2 = r2: a3 = r3
k = 1
For i = 1 To ro - 1
If (a1(i, 1) <> "") Then
j = i
a3(k, 1) = a2(j, 1)
Do While j < ro
j = j + 1
If (a1(j, 1) <> "") And (a1(j, 1) = a1(i, 1)) Then
a3(k, 1) = a3(k, 1) & sep & a2(j, 1)
a1(j, 1) = ""
End If
Loop
k = k + 1
End If
Next i
r3 = a3
1:
Set sh = Nothing
Set ra = Nothing
Set r1 = Nothing: Set r2 = Nothing: Set r3 = Nothing:
t2 = Time 'ket thuc luc:
' MsgBox t2 - t1
' Thoi gian test hon 1 phut
End Sub
Private Sub CommandButton1_Click()
Call Joint2Col
End Sub

Sub setRnd()
Dim ra As Range
Dim i As Long
Randomize
Set ra = Range("A3:B56450")
With ra
For i = .Row To .Rows.Count
.Cells(i, 1) = "A" & Int(1 + Rnd * 5000)
.Cells(i, 2) = "B" & Int(1 + Rnd * 100)
Next
End With
End Sub
 
Upvote 0
Thành thật xin lỗi, những ai hỏi thường chẳng biết gì về VBA.
Nên những đoạn code đó chỉ áp dụng được đối với file mẫu thôi áh. Bấm thì thấy nó chạy good đó. Nhưng khi mình dùng qua file thật của mình chẳng được!
Xin kèm theo hướng dẫn cài đặt giống như phải install để sài đó! Thanks
 
Upvote 0
Kết nối 2 cột dữ liệu

Xin lỗi, vì lúc đó chưa up file được, mình nghĩ test cũng đơn giản:
bước 1. mở 1 new workbook
bước 2. nhấn alt-f11 mở VBE
bước 3. chèn thêm 1 module (r-click vào tên VBAProject (book1) và chọn Insert...\Module )
bước 4. copy đoạn mã ở bài #12 và paste vào cửa sổ module này
bước 5. đặt con trỏ ở sub setRnd và nhấn F5 (run macro)
bước 6. đặt con trỏ ở sub Joint2Col và nhấn F5
bước 7. nhập vị trí copy dữ liệu (d3 chẳng hạn)
về lại Excel và xem kết quả


Hoặc lấy file đính kèm. %#^#$
-hvl-
 

File đính kèm

  • Join2Col.xls
    42.5 KB · Đọc: 8
Lần chỉnh sửa cuối:
Upvote 0
Thành thật xin lỗi, những ai hỏi thường chẳng biết gì về VBA.
Nên những đoạn code đó chỉ áp dụng được đối với file mẫu thôi áh. Bấm thì thấy nó chạy good đó. Nhưng khi mình dùng qua file thật của mình chẳng được!
Xin kèm theo hướng dẫn cài đặt giống như phải install để sài đó! Thanks
Không biết ai khác thì sao chứ còn tôi thì:
1> Chỉ xài cái gì mình hiểu
2> Nếu không hiểu thì nhất định không xài
3> Nếu "muốn" quá nhưng lại không hiểu thì cố gắng học hỏi để làm sao hiểu nó trước...

Tôi cũng là người mới tập tành VBA nhưng tôi thấy các đoạn code mọi người đưa lên không đến nổi là "không thể hiểu được" ---> Bằng như bạn cãm thấy ngược lại thì.. xem cái này trước:
http://www.giaiphapexcel.com/forum/showthread.php?t=650
Nếu ít có thời gian trên mạng thì vẩn có cách khac: Mua sách của thầy Phan Tự Hướng
 
Upvote 0
Nếu nói vậy thì tội nghiệp ai cũng phải tìm hiểu VBA trong khi đã có rất nhiều người giỏi chia sẻ.
Chỉ cần họ giúp một đoạn code và ứng dụng được ngay vào trường hợp của mình. Đôi khi cả đời đi làm ở cty đó sài nó.
Mà nếu đã biết VBA lập trình thì chắc cũng tự viết rồi!
 
Upvote 0
Nếu nói vậy thì tội nghiệp ai cũng phải tìm hiểu VBA trong khi đã có rất nhiều người giỏi chia sẻ.
Chỉ cần họ giúp một đoạn code và ứng dụng được ngay vào trường hợp của mình. Đôi khi cả đời đi làm ở cty đó sài nó.
Mà nếu đã biết VBA lập trình thì chắc cũng tự viết rồi!
Oh... hô... Đó là tôi nói theo quan điểm của tôi thôi...
Mọi người thế nào thì tùy, tôi đâu biết và cũng không có quyền can thiệp!
Nói thiệt, nếu tôi nghiên cứu và chia sẽ cho bạn 1 đoạn code nào đó do tôi nghĩ ra thì đàng nào phần lợi lớn nhất vẩn thuộc về tôi (không phải bạn) ---> Lý do là tôi có cơ hội đào sâu kiến thức hơn!
Tản mạn chút...
 
Upvote 0
To: HoangExcel
Đã gửi lại file đính kèm ở bài #14, bạn xem lại nhé!
-hvl-
 
Upvote 0
hoangexcell bạn có suy nghĩ sai rồi.Trên đời không có gì khổ bằng lệ thuộc, xài cái mà mình không làm chủ được, nhất là môi trường VBA thì thật "Trứng treo đầu đẳng".Nó không vững bền đến mức cả đời đi làm không đổi.Nói đây anh Duyệt thông cảm, kể cả các file anh Duyệt lập hoàn chỉnh thì mình cũng phải cải tạo để nó có hơi hướng theo ý mình, phục vụ cái mình cần. Trong cuộc sống, sự học thực chất là sự bắt chước, xin cho, lượm lặt và thậm chí còn là "ăn trộm". Con đường học tin của mình không thuận lợi như các bạn, mình đã tâm sự rồi rằng mình chưa được 1 giờ đến lớp thực sự.Mình cũng đã từng như bạn nói, nhìn người ta thảo văn bản thôi đã thầm thán phục. Kiếm mãi giờ mình cũng có chút lận lưng, tàm tạm cho công việc của mình. Nếu bạn chưa biết thì phải biết chứ, mình không tin đến khi bạn về hưu cũng chỉ vậy thôi.
Còn cách trả lời trên diễn đàn, mặc dầu bạn đã nói trước nhưng ai cũng ít nhiều e dè "múa rìu qua mắt thợ" vì không dám chắc khả năng bạn đến đâu. Do vây, dù bạn nhận không thoải mái, dù nhiệt tình có thừa nhưng cũng thật khó trúng ngay ý bạn. Mặt khác đại đa số các File đưa lên có tính chất mẫu thôi, do vậy cũng chỉ hướng dẫn để bạn ráp vào file của mình. Có chi vướng mắc cứ hỏi, mọi người sẽ giải đáp. Bạn thấy trên diên đàn có chủ đề cũng bình thường thôi nhưng kéo dài cả mấy trang. Vì chưa hiểu, còn hỏi sẽ còn người trả lời. Có chi không phải thông cảm nhé, chỉ vài lời tâm sự thôi.
SEALAND
 
Upvote 0
@ndu96081631 : Thì tất nhiên tôi đã lắng nghe quan điểm của bạn.
@ sealand : Góp ý: Bạn không nên nói với cách này: "hoangexcell bạn có suy nghĩ sai rồi"

Tóm lại, trao đổi cởi mở để hiểu rõ quan điểm và các vấn đề chứ không có gì phải khách sáo. Bạn nói có gì không phải cũng không vấn đề, vì có ai hoàn hảo. Nên góp ý cho nhau và tự học hỏi cải thiện mình qua những trao đổi đó nếu bạn muốn.
Nói lại lần nữa cho rõ quan điểm của hoangexcell:
Hãy tưởng tượng mỗi đoạn code làm ra như một phần mềm. Và người hỏi muốn nhận nó cài đặt, sử dụng free hoặc trả phí. Nói theo ngôn ngữ chuyên ngành có thể gọi là End user! Như vậy người End user này chắc không cần học VBA làm gì! Họ muốn có một phần mềm free để sử dụng theo cách đơn giản nhất hoặc phức tạp mà có thể hiểu được: bấm nút này, chọn dữ liệu này và run macro này ...>> xong! ta đã có kết quả như mong muốn.
Trừ những người hỏi với mục đích nghiên cứu VBA, thì những người có nhu cầu như nói trên đây không cần đầu tư VBA làm gì.(cũng chưa biết rõ để biết VBA có phức tạp lắm không)
Vì ngay cả việc học excel cũng đã khó với một số người.
 
Upvote 0
Web KT
Back
Top Bottom