Cắt dữ liệu từ sheet này sang sheet khác với điều kiện cố định

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

test1986

Thành viên mới
Tham gia
19/10/22
Bài viết
9
Được thích
2
Em có file excel quản lý thiết bị máy tính gồm 2 sheet và 17 cột trên mỗi sheet.
Em muốn tạo buttoncomand để thực hiện quá trình "CẮT" dữ liệu từ cột Ci-Qi sheet1 và chuyển sang sheet HONG có các cột tương tự với điều kiện là Fi="BREAK" (giữ nguyên Ai,Bi của sheet1, chỉ cắt từ Ci-Qi)
Hiện tại, em chưa biết bắt đầu phải làm như thế nào. Rất mong sự hỗ trợ, đóng góp và đưa ra gợi ý của các anh các chị.
Em chân thành cảm ơn
 

File đính kèm

  • TEST-QLPC.xlsm
    56.6 KB · Đọc: 7
Paste link qua sheet Hong,
CF cột F=break thì tô chữ trắng
 

File đính kèm

  • screenshot_1711790264.png
    screenshot_1711790264.png
    13.9 KB · Đọc: 12
  • TEST-QLPC222.xlsm
    59.5 KB · Đọc: 3
Upvote 0
Em có file excel quản lý thiết bị máy tính gồm 2 sheet và 17 cột trên mỗi sheet.
Em muốn tạo buttoncomand để thực hiện quá trình "CẮT" dữ liệu từ cột Ci-Qi sheet1 và chuyển sang sheet HONG có các cột tương tự với điều kiện là Fi="BREAK" (giữ nguyên Ai,Bi của sheet1, chỉ cắt từ Ci-Qi)
Hiện tại, em chưa biết bắt đầu phải làm như thế nào. Rất mong sự hỗ trợ, đóng góp và đưa ra gợi ý của các anh các chị.
Em chân thành cảm ơn
Tham khảo code trong file đính kèm
 

File đính kèm

  • TEST-QLPC.xlsm
    64.3 KB · Đọc: 10
Upvote 0
Tham khảo code trong file đính kèm
Đầu tiên em cảm ơn anh đã hỗ trợ giúp em về khó khăn em đang gặp phải.
Em đã xem code và thử thực hiện việc chạy đoạn code mà anh đã cung cấp. Kết quả nhận được thì dữ liệu đã được trả về sheet "HONG" nhưng mà dữ liệu trên sheet1 vẫn còn nguyên. Nên kết quả hơi khác so với dự định ban đầu của em ạ.
Ngoài ra, em có thử xóa 1 dòng trên sheet1 thì khi chạy code thì danh sách break chuyển qua sheet "HONG" cũng giảm đi 1 dòng.
Mong anh hướng dẫn em có thể cắt hẳn dữ liệu theo dòng từ sheet1 đến sheet "HONG" và những lần cập nhật sau đấy thì sheet "HONG" chỉ có bổ sung thêm vào mà không bị xóa đi những dữ liệu đã được cập nhật trước đó.
Em cảm ơn anh ạ.
 
Upvote 0
Đầu tiên em cảm ơn anh đã hỗ trợ giúp em về khó khăn em đang gặp phải.
Em đã xem code và thử thực hiện việc chạy đoạn code mà anh đã cung cấp. Kết quả nhận được thì dữ liệu đã được trả về sheet "HONG" nhưng mà dữ liệu trên sheet1 vẫn còn nguyên. Nên kết quả hơi khác so với dự định ban đầu của em ạ.
Ngoài ra, em có thử xóa 1 dòng trên sheet1 thì khi chạy code thì danh sách break chuyển qua sheet "HONG" cũng giảm đi 1 dòng.
Mong anh hướng dẫn em có thể cắt hẳn dữ liệu theo dòng từ sheet1 đến sheet "HONG" và những lần cập nhật sau đấy thì sheet "HONG" chỉ có bổ sung thêm vào mà không bị xóa đi những dữ liệu đã được cập nhật trước đó.
Em cảm ơn anh ạ.
Phải chăng bạn muốn giữ lại ở sheet1 những dòng không phải là BREAK và chúng được xếp lần lượt (không có dòng trống).
Nếu đúng vậy, thì sửa lại code cũ thành code này.
Mã:
Option Explicit

Sub THU1986()
Dim i&, j&, Lr&, R&, C&, t&
Dim Arr(), Hong(), KhongHong()
Dim DK As String
DK = "BREAK"
With Sheets("Sheet1")
Lr = .Cells(Rows.Count, 2).End(xlUp).Row
If Lr < 4 Then Exit Sub
Arr = .Range("C4:Q" & Lr).Value
R = UBound(Arr): C = UBound(Arr, 2)
End With
ReDim Hong(1 To R, 1 To C)
ReDim KhongHong(1 To R, 1 To C)

For i = 1 To R
    If VBA.Trim(Arr(i, 4)) = DK Then
        t = t + 1
        For j = 1 To C
            Hong(t, j) = Arr(i, j)
        Next j
    Else
        k = k + 1
        For j = 1 To C
            KhongHong(k, j) = Arr(i, j)
        Next j
    End If
Next i
If t Then
    With Sheets("HONG")
        .Range("C4").Resize(100000, C).ClearContents
       .Range("C4").Resize(t, C) = Hong
    End With
    MsgBox "Đa chuyên " & t & " dong san phâm hong sang Sheet Hong thành công"
End If
If k Then
    With Sheets("Sheet1")
        .Range("C4").Resize(100000, C).ClearContents
        .Range("C4").Resize(k, C) = KhongHong
    End With
    MsgBox "Con lai " & k & " dong san phâm không hong trên sheet1"
End If
End Sub
 
Upvote 0
Upvote 0
@HUONGHCKT có khi nào thớt muốn cắt những dòng thỏa mãn điều kiện mà không đẩy data lên trên không chú. Code trên cháu thấy nó đẩy data lên. E rằng thớt chưa nói cụ thể điều này
Cảm ơn bạn đã xem bài.
Ừ nhỉ. Giờ mới xem lại.
Code trên cũng đã hỏi lại là lấy tuần tự các mã không bị BREAK , và nếu đúng thì dùng code ấy thì cũng ổn mà.
Còn để đúng như yêu cầu của bài #1 thì chay code của bài#3 và dùng cách của bài #2 cũng được.
Còn nhất khoát phải như yêu cầu bài #1 thì Có lẽ sửa code ở bài #5 cũng không khó. Thay vì lấy vào KhongHong(k,j)=Arr(i,j) thì ta cho mảng gốc =Rỗng (Arr(i,j)=Empty ) Code lại thì bỏ biến KhongHong không dùng đến nữa.
Tất cả những thay đổi trên đều là tôi nói chủ quan, nói mò thế thôi, chứ thực ra chưa thử code trên sheet (do đã tắt máy đi ăn tiệc rồi).
 
Upvote 0
Còn nhất khoát phải như yêu cầu bài #1 thì Có lẽ sửa code ở bài #5 cũng không khó. Thay vì lấy vào KhongHong(k,j)=Arr(i,j) thì ta cho mảng gốc =Rỗng (Arr(i,j)=Empty ) Code lại thì bỏ biến KhongHong không dùng đến nữa.
Tại thấy chủ thớt nói giữ lại cột A và B sheet1. không được cắt đi. Nếu đẩy data lên trên. thì việc giữ lại cột A và B có vẻ không còn ý nghĩa vì nó lộn xộn
 
Upvote 0
Tại thấy chủ thớt nói giữ lại cột A và B sheet1. không được cắt đi. Nếu đẩy data lên trên. thì việc giữ lại cột A và B có vẻ không còn ý nghĩa vì nó lộn xộn

Cảm ơn bạn đã xem bài.
Ừ nhỉ. Giờ mới xem lại.
Code trên cũng đã hỏi lại là lấy tuần tự các mã không bị BREAK , và nếu đúng thì dùng code ấy thì cũng ổn mà.
Còn để đúng như yêu cầu của bài #1 thì chay code của bài#3 và dùng cách của bài #2 cũng được.
Còn nhất khoát phải như yêu cầu bài #1 thì Có lẽ sửa code ở bài #5 cũng không khó. Thay vì lấy vào KhongHong(k,j)=Arr(i,j) thì ta cho mảng gốc =Rỗng (Arr(i,j)=Empty ) Code lại thì bỏ biến KhongHong không dùng đến nữa.
Tất cả những thay đổi trên đều là tôi nói chủ quan, nói mò thế thôi, chứ thực ra chưa thử code trên sheet (do đã tắt máy đi ăn tiệc rồi).
Đầu tiên em cảm ơn bạn BuiQuangThuan và anh HUONGHCKT đã hỗ trợ em vấn đề này rất nhiệt tình.
Dạ em thấy bạn BuiQuangThuan nói đúng rồi anh HUONGHCKT. Dòng bị lấy dữ liệu từ cột C đến cột Q và giữ nguyên giá trị ở cột A và cột B nên việc đẩy dòng lên sẽ không cần thiết. Sau này dữ liệu dòng này sẽ được cấp phát cho máy tính mới (cột B là IP) nên sẽ không thể bị xóa đị ạ.
 
Upvote 0
Dòng bị lấy dữ liệu từ cột C đến cột Q và giữ nguyên giá trị ở cột A và cột B nên việc đẩy dòng lên sẽ không cần thiết. Sau này dữ liệu dòng này sẽ được cấp phát cho máy tính mới (cột B là IP) nên sẽ không thể bị xóa đị ạ.
Tôi thì lại cho rằng: nếu để các dòng ấy rỗng mà giữ nguyên cột A và cột B thì mớ dữ liệu ấy là một mớ lộn xộn chẳng có gí trị gì ở các dòng để rỗng từ C:Z. Còn để sau này sẽ cấp phát cho máy tính mới thì sao không thêm vào các dòng cuối cùng của dữ liệu, cứ kế tiếp như vậy đến hết.(tùy theo mục đích có thể thêm cột ngày cập nhật máy tính này vào dữ liệu là ngày nào- để theo dõi từng máy theo thời gian (bán ra, cho thuê, thòi hạn bảo hành-hóa đơn bảo hành điện tử cũng đều căn cứ vào ngày này). Được biết thêm là mỗi máy tính, điện thoại, laptop, máy in,.... đều mỗi máy có 1 ID (hay IP) mà không máy nào giống máy nào. Cho nên nói để dành cho việc sau này cập nhật máy khác vào chỗ rỗng ấy( vẫy giữ lại cột B -là IP máy) tôi thấy hơi lạ.
Trở lại vấn đề bài toán. Nếu vẫn giữ quan điểm giữ lại cột A và B thì bạn đã đọc "Còn nhất khoát phải như yêu cầu bài #1 thì Có lẽ sửa code ở bài #5 cũng không khó. Thay vì lấy vào KhongHong(k,j)=Arr(i,j) thì ta cho mảng gốc =Rỗng (tức là Arr(i,j)=Empty ) Code lại thì bỏ biến KhongHong không dùng đến nữa." và làm theo chưa? Tôi tin là bạn hiểu và làm được.
 
Upvote 0
Đầu tiên em cảm ơn bạn BuiQuangThuan và anh HUONGHCKT đã hỗ trợ em vấn đề này rất nhiệt tình.
Dạ em thấy bạn BuiQuangThuan nói đúng rồi anh HUONGHCKT. Dòng bị lấy dữ liệu từ cột C đến cột Q và giữ nguyên giá trị ở cột A và cột B nên việc đẩy dòng lên sẽ không cần thiết. Sau này dữ liệu dòng này sẽ được cấp phát cho máy tính mới (cột B là IP) nên sẽ không thể bị xóa đị ạ.
Thêm 1 cách khác tham khảo cho bạn.
Mã:
Sub ABC()
    Dim Rng As Range, iR&, sR&
    sR = Sheets("HONG").Range("B" & Rows.Count).End(3).Row + 1
    With Sheets("Sheet1")
        If .AutoFilterMode = True Then .AutoFilterMode = False
        iR = .Range("B" & Rows.Count).End(3).Row
        Set Rng = .Range("C4:Q" & iR)
        If WorksheetFunction.CountIf(.Range("F:F"), "BREAK") > 0 Then
            .Range("A3:Q" & iR).AutoFilter 6, "BREAK"
            Rng.SpecialCells(12).Copy Sheets("HONG").Range("B" & sR)
            Rng.SpecialCells(12).ClearContents
        End If
        If .AutoFilterMode = True Then .AutoFilterMode = False
    End With
End Sub
 
Upvote 0
Thêm 1 cách khác tham khảo cho bạn.
Mã:
Sub ABC()
    Dim Rng As Range, iR&, sR&
    sR = Sheets("HONG").Range("B" & Rows.Count).End(3).Row + 1
    With Sheets("Sheet1")
        If .AutoFilterMode = True Then .AutoFilterMode = False
        iR = .Range("B" & Rows.Count).End(3).Row
        Set Rng = .Range("C4:Q" & iR)
        If WorksheetFunction.CountIf(.Range("F:F"), "BREAK") > 0 Then
            .Range("A3:Q" & iR).AutoFilter 6, "BREAK"
            Rng.SpecialCells(12).Copy Sheets("HONG").Range("B" & sR)
            Rng.SpecialCells(12).ClearContents
        End If
        If .AutoFilterMode = True Then .AutoFilterMode = False
    End With
End Sub
quá đỉnh.
Tôi lúc đầu cũng nghĩ dến cách dùng fiter rồi copy sang sheet khác, nhưng lại nghĩ, nếu mà dữ liệu nhiều dòng thì lọc cũng sẽ rất lâu, và có thể trong dải ô từ C:Z ấy có công thức thì khi copy sang sheet khác nó cũng mang theo cả công thức và định dạng sang nữa, nên thôi không code theo hướng ấy mà chuyển sang dùng mảng.
 
Upvote 0
Hề hề, tóm tắt toán đố bài 1 thì hình như nó phải thế này các bác ạ.
1712022205319.png

1712022224437.png
 
Upvote 0
Hề hề, tóm tắt toán đố bài 1 thì hình như nó phải thế này các bác ạ.
View attachment 299960

View attachment 299961
Bạn hiểu sai ý rồi, chỉ cắt khi thỏa điều kiện thỏa là Fi="BREAK" mà, không phải là chuyển hàng loạt như vậy ạ.
Bài đã được tự động gộp:

Tôi thì lại cho rằng: nếu để các dòng ấy rỗng mà giữ nguyên cột A và cột B thì mớ dữ liệu ấy là một mớ lộn xộn chẳng có gí trị gì ở các dòng để rỗng từ C:Z. Còn để sau này sẽ cấp phát cho máy tính mới thì sao không thêm vào các dòng cuối cùng của dữ liệu, cứ kế tiếp như vậy đến hết.(tùy theo mục đích có thể thêm cột ngày cập nhật máy tính này vào dữ liệu là ngày nào- để theo dõi từng máy theo thời gian (bán ra, cho thuê, thòi hạn bảo hành-hóa đơn bảo hành điện tử cũng đều căn cứ vào ngày này). Được biết thêm là mỗi máy tính, điện thoại, laptop, máy in,.... đều mỗi máy có 1 ID (hay IP) mà không máy nào giống máy nào. Cho nên nói để dành cho việc sau này cập nhật máy khác vào chỗ rỗng ấy( vẫy giữ lại cột B -là IP máy) tôi thấy hơi lạ.
Trở lại vấn đề bài toán. Nếu vẫn giữ quan điểm giữ lại cột A và B thì bạn đã đọc "Còn nhất khoát phải như yêu cầu bài #1 thì Có lẽ sửa code ở bài #5 cũng không khó. Thay vì lấy vào KhongHong(k,j)=Arr(i,j) thì ta cho mảng gốc =Rỗng (tức là Arr(i,j)=Empty ) Code lại thì bỏ biến KhongHong không dùng đến nữa." và làm theo chưa? Tôi tin là bạn hiểu và làm được.
Em cảm ơn anh đã mở ra nhiều hướng phân tích để bài toán được rõ ràng hơn. Em sẽ nguyên cứu và làm thử ạ.
Về việc xóa nguyên dòng và cập nhật dòng vào cuối dữ liệu thì hơi khó vì cột B là cột cố định không thay đổi. Nếu có xóa nguyên dòng thì sau khi nhập lại vẫn phải sắp xếp vào đúng vị trí dòng đã xóa ạ, mà như vậy e thấy sẽ phức tạp hơn ạ.
Còn IP của máy tính khác với ID của máy tính anh ạ, ID thì mỗi máy tính sẽ là duy nhất (đổi máy tính thì ID cũng phải đổi mới) nhưng IP của máy tính là số lượng cấp phát có hạn và không thể thay đổi (không thêm mới, không xóa bỏ) nên em mới phải giữ nguyên cột B cố định ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nhận 1 báo cáo vi phạm (tên gọi của diễn đàn), tác giả cantl, nội dung nhờ xóa bài 13 chủ đề này vì hiểu sai.
Tôi không xóa, lý do:
- Đừng viết linh tinh, mất công người ta xóa
- Đọc đề bài cho kỹ, hiểu cho rõ rồi hãy giải. Giải sai rồi nhờ xóa là sao?
- Bài 13 đã có bài 14 trích dẫn, chả lẽ xóa luôn bài 14, hoặc để bài 14 trở thành vô duyên sao? Mình vô duyên thì mình chịu chứ sao để người khác chịu?
 
Upvote 0
Web KT
Back
Top Bottom