Tách dữ liệu trong 1 sheet ra nhiều Sheet

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
460
Được thích
19
Em chào mọi người.

Em có 1 file mẫu như đính kèm ạ.

Trong Sheet "Main" em có thông tin 4 loại giao dịch…. em muốn chia từng giao dịch tương ứng ra các Sheet con như trong file ạ.

Rất mong anh chị và các thầy hỗ trợ em code bài toán này ạ.

Em xin chân thành cảm ơn!
 

File đính kèm

  • File.xlsm
    16.2 KB · Đọc: 19
.. .

PHP:
Option Explicit

Sub vidu()
    Const card_type = "visa"
    Dim data As Variant, res As Variant
    Dim i As Long, ii As Long, j As Long, ub As Long, start_row As Long
    data = Sheet1.Range("A3:C19").Value2
    ub = UBound(data, 1) - 1
    start_row = 2
    ReDim res(1 To ub, 1 To 2)
    For i = ub To start_row Step -1
        If InStr(1, data(i, 2), card_type, vbTextCompare) > 0 Then 'tim thay loai the'
            For j = i - 1 To start_row Step -1
                If Len(data(j, 1)) > 0 Then
                    ii = ii + 1
                    res(ii, 1) = data(j, 2)
                    res(ii, 2) = data(j, 3)
                Else
                    i = j + 1
                    Exit For
                End If
            Next j
        End If
    Next i
    Sheet1.Range("E3").Resize(1000, 2).ClearContents
    If ii > 0 Then Sheet1.Range("E3").Resize(ii, 2).Value = res
End Sub
 
Upvote 0
.. .

PHP:
Option Explicit

Sub vidu()
    Const card_type = "visa"
    Dim data As Variant, res As Variant
    Dim i As Long, ii As Long, j As Long, ub As Long, start_row As Long
    data = Sheet1.Range("A3:C19").Value2
    ub = UBound(data, 1) - 1
    start_row = 2
    ReDim res(1 To ub, 1 To 2)
    For i = ub To start_row Step -1
        If InStr(1, data(i, 2), card_type, vbTextCompare) > 0 Then 'tim thay loai the'
            For j = i - 1 To start_row Step -1
                If Len(data(j, 1)) > 0 Then
                    ii = ii + 1
                    res(ii, 1) = data(j, 2)
                    res(ii, 2) = data(j, 3)
                Else
                    i = j + 1
                    Exit For
                End If
            Next j
        End If
    Next i
    Sheet1.Range("E3").Resize(1000, 2).ClearContents
    If ii > 0 Then Sheet1.Range("E3").Resize(ii, 2).Value = res
End Sub
Dạ, Cảm ơn anh faint rất nhiều ạ.

Chúc anh sk và hp ^^
 
Upvote 0
Gửi anh @befaint

Dạ em mới tìm được 1 chút khó khan trong đoạn code của anh ạ.

Const card_type = "noi dia" ==> Làm sao để gán địa chỉ của 1 cell vào thay thế cho chữ kia ạ

Vì đang không gõ dc tiếng việt trong code nên em muốn lấy địa chỉ cell để gán vào ạ.

Cảm ơn anh!
Bài đã được tự động gộp:

Dạ em tự xử lý được rồi ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em mới tìm được 1 chút khó khan trong đoạn code của anh ạ.
Dùng hàm VBA.ChrW$()

Bạn chuyển sub vidu trên thành dạng LocDuLieu(byval ws_target as Worksheet, byval card_type as String) để lọc và ghi dữ liệu vào ws_target

Sub chính như này
Dim noi_dia as string
noi_dia = "n" & ChrW$(7897) & "i " & ChrW$(273) & ChrW$(7883) & "a"
Dim list_cards as variant: list_cards = array(noi_dia, "visa", "mastercard","xyz")
Dim list_ws as variant: list_ws = array(Sheet2, Sheet3, Sheet4, Sheet5)
Dim i as long, num_res as long
num_res = 4
For i=0 to num_res -1
call LocDuLieu(list_ws (i), list_cards (i))
Next i
 
Upvote 0
Em chào mọi người.

Em có 1 file mẫu như đính kèm ạ.

Trong Sheet "Main" em có thông tin 4 loại giao dịch…. em muốn chia từng giao dịch tương ứng ra các Sheet con như trong file ạ.

Rất mong anh chị và các thầy hỗ trợ em code bài toán này ạ.

Em xin chân thành cảm ơn!
Chả biết phải vậy không, lỡ làm xong gửi đại
Mã:
Option Explicit
Sub TachSheet()
Dim Ws As Worksheet, Str1 As String, Str2 As String, Rng As Range, I As Long, idRng As Range, The As Range
Dim TypeCard As String
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Str1 = "T" & ChrW(7893) & "ng giao d" & ChrW(7883) & "ch th" & ChrW(7867)
Str2 = "S" & ChrW(7889) & " ti" & ChrW(7873) & "n GD"
For Each Ws In ActiveWorkbook.Sheets
    If Ws.Name <> "Main" Then Ws.Delete
Next
With Sheets("Main")
    Set Rng = .Range("A4", .Range("A4").SpecialCells(xlLastCell))
    For I = Rng.Rows.Count To 1 Step -1
        If InStr(1, Rng(I, 2).Value, Str1, 1) > 0 Then
            Set The = Rng(I, 2)
            TypeCard = Trim(Replace(Replace(Rng(I, 2), Str1, ""), ":", ""))
            Do While Rng(I - 1, 1) <> "" And I > 1
                If idRng Is Nothing Then
                    Set idRng = Rng(I - 1, 1)
                Else
                    Set idRng = Union(idRng, Rng(I - 1, 1))
                End If
                    I = I - 1
            Loop
            Worksheets.Add after:=Sheets("Main")
            Set Ws = ActiveSheet
            With Ws
                .Name = TypeCard
                .Cells(1, 1) = The.Value
                .Cells(1, 2) = Str2
                idRng.Offset(, 1).Resize(, 2).Copy .Range("A2")
                .Columns("A:B").AutoFit
            End With
        End If
        Set The = Nothing: Set idRng = Nothing
    Next
    .Activate
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng hàm VBA.ChrW$()

Bạn chuyển sub vidu trên thành dạng LocDuLieu(byval ws_target as Worksheet, byval card_type as String) để lọc và ghi dữ liệu vào ws_target

Sub chính như này
Dim noi_dia as string
noi_dia = "n" & ChrW$(7897) & "i " & ChrW$(273) & ChrW$(7883) & "a"
Dim list_cards as variant: list_cards = array(noi_dia, "visa", "mastercard","xyz")
Dim list_ws as variant: list_ws = array(Sheet2, Sheet3, Sheet4, Sheet5)
Dim i as long, num_res as long
num_res = 4
For i=0 to num_res -1
call LocDuLieu(list_ws (i), list_cards (i))
Next i
Gửi anh.

Anh ơi em hơi tù mù phần xử lý này ạ... phiền anh có thể code lại giúp để em study mẫu được không anh?

Em muốn xử lý cho trường hợp Card_Type có mấy loại liền một lúc như anh bảo anh, mỗi loại sẽ xử lý ghi data vào 1 sheet riêng ( Sheet2,3,4,5 )
Em cảm ơn anh nhiều ạ.
Bài đã được tự động gộp:

Chả biết phải vậy không, lỡ làm xong gửi đại
Mã:
Option Explicit
Sub TachSheet()
Dim Ws As Worksheet, Str1 As String, Str2 As String, Rng As Range, I As Long, idRng As Range, The As Range
Dim TypeCard As String
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Str1 = "T" & ChrW(7893) & "ng giao d" & ChrW(7883) & "ch th" & ChrW(7867)
Str2 = "S" & ChrW(7889) & " ti" & ChrW(7873) & "n GD"
For Each Ws In ActiveWorkbook.Sheets
    If Ws.Name <> "Main" Then Ws.Delete
Next
With Sheets("Main")
    Set Rng = .Range("A4", .Range("A4").SpecialCells(xlLastCell))
    For I = Rng.Rows.Count To 1 Step -1
        If InStr(1, Rng(I, 2).Value, Str1, 1) > 0 Then
            Set The = Rng(I, 2)
            TypeCard = Trim(Replace(Replace(Rng(I, 2), Str1, ""), ":", ""))
            I = I - 1
            Do While Rng(I, 1) <> ""
                If idRng Is Nothing Then
                    Set idRng = Rng(I, 1)
                Else
                    Set idRng = Union(idRng, Rng(I, 1))
                End If
                    I = I - 1
            Loop
            Worksheets.Add after:=Sheets("Main")
            Set Ws = ActiveSheet
            With Ws
                .Name = TypeCard
                .Cells(1, 1) = The.Value
                .Cells(1, 2) = Str2
                idRng.Offset(, 1).Resize(, 2).Copy .Range("A2")
                .Columns("A:B").AutoFit
            End With
        End If
        Set The = Nothing: Set idRng = Nothing
    Next
    .Activate
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Cảm ơn anh nhiều ạ :)
 
Lần chỉnh sửa cuối:
Upvote 0
Bài #8 đã sửa lại, bạn kiểm tra lại xem
Anh cho em hỏi chút….

Sheet "Main" nếu cột C nó di chuyển sang cột E.... thì để lấy đúng số tiền ở cột E ở Sheet "Main" để đưa sang cột B ở các sheet kia thì đổi code ở chỗ nào ạ ?
Chắc copy hết dữ liệu đưa qua, xong xóa cột không cần ở sheet mới, nó sẽ về lại cột B
 
Upvote 0
Chắc làm thế cho nhanh vậy
Ý là không phải làm tay, mà sửa code đoạn này:
.Cells(1, 4) = Str2
idRng.Offset(, 1).Resize(, 4).Copy .Range("A2")
.Columns("B:C").Delete
Bài đã được tự động gộp:

Lưu ý là nếu chỗ tiền ở cột E có tham chiếu đến cột C, D thì như vậy sẽ bị sai nha
 
Upvote 0
Web KT

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

Back
Top Bottom