Xác định dòng cuối để copy từ sheet khac sang sheet DICH có khoảng trống về cột .

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

anktdn

Thành viên chính thức
Tham gia
18/6/06
Bài viết
72
Được thích
77
Nghề nghiệp
acc
Đây là File mẫu ví dụ nhờ anh chị giúp đỡ về cách xác định dòng cuối từ dữ liệu có sẵn của Sheet DICH để copy dữ liệu từ sheet NGUON sang ,nhưng Sheet DICH có khoảng trống về cột ( có thể áp dụng nhiều trường hợp khoảng trống từ 1, 2, hoặc hơn 2 cột).
 

File đính kèm

Đây là File mẫu ví dụ nhờ anh chị giúp đỡ về cách xác định dòng cuối từ dữ liệu có sẵn của Sheet DICH để copy dữ liệu từ sheet NGUON sang ,nhưng Sheet DICH có khoảng trống về cột ( có thể áp dụng nhiều trường hợp khoảng trống từ 1, 2, hoặc hơn 2 cột).
Thử code này xem:
PHP:
Sub Copy()
  Dim Src As Range
  Set Src = Range(Sheets("DLNGUON").[C5], Sheets("DLNGUON").[H65536].End(xlUp))
  With Sheets("DICH").Range("B65536").End(xlUp).Offset(1)
    .Offset(0, 0).Resize(Src.Rows.Count, 4).Value = Src.Offset(0, 0).Resize(, 4).Value
    .Offset(0, 5).Resize(Src.Rows.Count, 1).Value = Src.Offset(0, 4).Resize(, 1).Value
    .Offset(0, 8).Resize(Src.Rows.Count, 1).Value = Src.Offset(0, 5).Resize(, 1).Value
  End With
End Sub
 

File đính kèm

Upvote 0
Mình tham gia thêm 1 chút ý kiến tản mạn nhưng cũng nên lưu ý (Vì tránh tối đa lỗi có thể xảy ra thì code mới hoàn thiện). Đã bao giờ các bạn nhập chứng từ nhưng số nhập sau không. Mình thì có rồi! Và trường hợp này lưu theo code của ndu là bị mất dữ liệu. Code của ndu là xác định dòng cuối cùng có số HĐ, như vậy các chứng từ chưa có số bị nhập đè. Các bạn cứ xóa bớt số chứng từ vài dòng cuối rồi chép lưu xem sao.
Vậy là, ta phải tìm dòng cuối cùng có ít nhất 1 cột dữ liệu ( Thực sự cuối cùng) và việc xác định dòng kỹ hơn. Ví dụ vùng dữ liệu có 10 cột và biến dg là dòng cuối cùng

Mã:
Dim dg As Long
    With Sheets("DICH")
        For i = 1 To 10
            If dg < .Cells(65536, i).End(xlUp).Row Then dg = .Cells(65536, i).End(xlUp).Row
        Next
    End With
Giờ mới yên tâm dg mới thực sự là dòng cuối và không bị đè vào dữ liệu đã có. Mình đã thử ở bài này
Chúc các bạn ngày Chủ nhật vui vẻ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia thêm 1 chút ý kiến tản mạn nhưng cũng nên lưu ý (Vì tránh tối đa lỗi có thể xảy ra thì code mới hoàn thiện). Đã bao giờ các bạn nhập chứng từ nhưng số nhập sau không. Mình thì có rồi! Và trường hợp này lưu theo code của ndu là bị mất dữ liệu. Code của ndu là xác định dòng cuối cùng có số HĐ, như vậy các chứng từ chưa có số bị nhập đè. Các bạn cứ xóa bớt số chứng từ vài dòng cuối rồi chép lưu xem sao.
Vậy là, ta phải tìm dòng cuối cùng có ít nhất 1 cột dữ liệu ( Thực sự cuối cùng) và việc xác định dòng kỹ hơn. Ví dụ vùng dữ liệu có 10 cột và biến dg là dòng cuối cùng

Mã:
Dim dg As Long
    With Sheets("DICH")
        For i = 1 To 10
            If dg < .Cells(65536, i).End(xlUp).Row Then dg = .Cells(65536, i).End(xlUp).Row
        Next
    End With
Giờ mới yên tâm dg mới thực sự là dòng cuối và không bị đè vào dữ liệu đã có. Mình đã thử ở bài này
Chúc các bạn ngày Chủ nhật vui vẻ.
Em có nghĩ đến chuyện này... và ở đây phải tùy theo tác giả xây dựng file quyết định xem nên làm thế nào là hợp lý! (vì đàng nào họ cũng là người xây dựng, đương nhiên phải hiểu rõ cấu trúc file)
Cứ cho rằng có chuyện ấy xảy ra thì em thà rằng xài CurrentRegion chứ không xài For
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh sealand đã chia sẽ , nhưng nếu sử dụng theo vòng lặp thì sẽ hạn chế tốc độ xử lý vì duyệt qua nhiều cột,nên muốn có thêm ý kiến chia sẽ từ các anh chị trong vấn đề xác định dòng cuối cùng của những cột có dữ liệu cuối cùng chiếm đa số , để tránh trường hợp có thể do sơ suất quên nhập số HĐ. Rất mong ý kiến từ anh ndu96081631 về sử dụg CurrentRegion.
 
Upvote 0
Cảm ơn anh sealand đã chia sẽ , nhưng nếu sử dụng theo vòng lặp thì sẽ hạn chế tốc độ xử lý vì duyệt qua nhiều cột,nên muốn có thêm ý kiến chia sẽ từ các anh chị trong vấn đề xác định dòng cuối cùng của những cột có dữ liệu cuối cùng chiếm đa số , để tránh trường hợp có thể do sơ suất quên nhập số HĐ. Rất mong ý kiến từ anh ndu96081631 về sử dụg CurrentRegion.
Bạn thay đoạn
Set Src = Range(Sheets("DLNGUON").[C5], Sheets("DLNGUON").[H65536].End(xlUp))
thành:
Set Src = Sheets("DLNGUON").[C4].CurrentRegion.Offset(1)
rồi chạy code sẽ biết ngày
Câu Sheets("DLNGUON").[C4].CurrentRegion tương đương với việc bạn ở Sheet DLNGUON, chọn vào cell C4 rồi bấm tổ hợp phím Ctrl + Shift + *
(sở dỉ phải thêm .Offset(1) là vì không muốn lấy dòng tiêu đề)
------------
Nói tóm lại, toàn bộ code trên có thể sửa thành:
PHP:
Sub Copy()
  Dim Src As Range
  Set Src = Sheets("DLNGUON").[C4].CurrentRegion.Offset(1)
  With Sheets("DICH").Range("B65536").End(xlUp)
    .Offset(1, 0).Resize(Src.Rows.Count, 4).Value = Src.Offset(0, 0).Resize(, 4).Value
    .Offset(1, 5).Resize(Src.Rows.Count, 1).Value = Src.Offset(0, 4).Resize(, 1).Value
    .Offset(1, 8).Resize(Src.Rows.Count, 1).Value = Src.Offset(0, 5).Resize(, 1).Value
  End With
End Sub
Ngắn hơn 1 chút
 
Upvote 0
Các bạn có lưu ý chủ đề tài nêu trong bài đầu không? Với điều kiện có khoảng 1 vài cột trống (Thậm chí nếu là xen kẽ càng tệ) thì mình e Set Src = Sheets("DLNGUON").[C4].CurrentRegion.Offset(1) vẫn chưa chính xác

Cụ thể ban thêm số dòng cột G hay Cột J nhiều hơn xem sao? Vẫn bị đè như thường.
Bạn vẫn chưa thay CurrentRegion vào chỗ xác định dòng cuối. Đáng lẽ dòng cuối là

=Sheets("DICH").[c1].CurrentRegion.Rows.Count+1

 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn có lưu ý chủ đề tài nêu trong bài đầu không? Với điều kiện có khoảng 1 vài cột trống
Ah.. không anh à!
Em xem dử liệu giả lập thì thấy rằng mấy cột trống mà tác giả nói là dử liệu ĐÍCH chứ không phải NGUỒN
Đương nhiên dùng CurrentRegion cũng phải lưu ý điều này, nếu dử liệu nguồn có cột hoặc dòng trống thì... tèo ngay! (thí nghiệm để biết chi tiết)
Bời vậy em mới nói: Dùng cái gì, dùng thế nào phải do tác giả quyết định, vì tác giả là người hiểu rõ cấu trúc dử liệu của mình
Các ý của em và anh là để tác giả tham khảo thêm (các tình huống có thể xảy ra)
 
Upvote 0
Mình không hiểu Ndu à, xác định dòng cuối của DICH sao lại căn cứ DLNGUON
 
Upvote 0
Gởi NDU
Về nguyên tắc, chứng từ hóa đơn khi nhập vào phải có Số, để tránh trường hợp người nhập số liệu nhập thiếu, sót Số HD thì cần phải kiểm tra, nếu thiếu thông tin Số HD thì báo lổi (bắt buộc ), các thông tin khác trong cùng 1 dòng thì không bắt buộc. Nếu đủ thì cho thi hành nhập liệu.
NDU có thể code cho đoạn này không ?
Chúc vui.
 
Upvote 0
Gởi NDU
Về nguyên tắc, chứng từ hóa đơn khi nhập vào phải có Số, để tránh trường hợp người nhập số liệu nhập thiếu, sót Số HD thì cần phải kiểm tra, nếu thiếu thông tin Số HD thì báo lổi (bắt buộc ), các thông tin khác trong cùng 1 dòng thì không bắt buộc. Nếu đủ thì cho thi hành nhập liệu.
NDU có thể code cho đoạn này không ?
Chúc vui.
Tôi không rành về Kế Toán nên những gì bạn nói tôi không tài nào hình dung được!
Bạn giả lập dử liệu rồi gửi lên đây nhé
 
Upvote 0
Trong bài: Xác dịnh dòng cuối để copy từ sheet DICH có khoảng trống về cột

SOHD NGAYHD DIENGIAI NO CO SOTIEN
232233 1/03/2009 Phan bo chi phi 642 142 465.765
7353563 1/03/2009 Phan bo chi phi 642 142 657653
436663 1/03/2009 ( Có thể trống) 642 142 34323
( Báo lổi) 1/03/2009 Phan bo chi phi 642 142 3255325
5423543 1/03/2009 Phan bo chi phi 642 142 2352352
Nếu không có SOHD thì báo lổi cho người nhập liệu, ngược lại đủ thông tin thì sheet DICH nhận số liệu ( các số liệu khác trên cùng 1 dòng có thể trống)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể đặt code sau vào sheet DICH, nếu trường hợp ta quên nhập số HD mà ta nhập ngày trước
thì sẽ có dòng báo hiệu tại ô hóa đơn và ghi chú màu đỏ cho ta dễ nhận thấy .
PHP:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 With Target
 If .Count > 1 Then Exit Sub
 If Not Intersect(Range("c2:c50000"), .Cells) Is Nothing Then
 Application.EnableEvents = False
 If IsEmpty(.Value) Then
.Offset(0, -1).ClearContents
 Else
 With .Offset(0, -1)
 
 .Value = "Ban phai nhap so HD"
 .Font.ColorIndex = 3
 End With
 End If
 Application.EnableEvents = True
End If
 End With
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể đặt code sau vào sheet DICH, nếu trường hợp ta quên nhập số HD mà ta nhập ngày trước
thì sẽ có dòng báo hiệu tại ô hóa đơn và ghi chú màu đỏ cho ta dễ nhận thấy .
PHP:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
 With Target
 If .Count > 1 Then Exit Sub
 If Not Intersect(Range("c2:c50000"), .Cells) Is Nothing Then
 Application.EnableEvents = False
 If IsEmpty(.Value) Then
.Offset(0, -1).ClearContents
 Else
 With .Offset(0, -1)
 
 .Value = "Ban phai nhap so HD"
 .Font.ColorIndex = 3
 End With
 End If
 Application.EnableEvents = True
End If
 End With
-------------------------
Tôi không rành VBA cho lắm, bạn có thể chú thích cho từng dòng lệnh được không ?
Rất mong .
 
Upvote 0
Tác giả topic xem macro sau có còn khiếm khuyết gì chăng.

Macro kiểu củ khoai
PHP:
Option Explicit
Sub CopyToDes()
 Dim Clls As Range, Rng As Range, sRng As Range
 Dim Sh As Worksheet:                           Dim FieldName As String
 
 Set Sh = Worksheets("DICH"):                   Set Rng = Sh.Rows("2:2")
 Sheets("DLNguon").Select
 For Each Clls In Range([c4], [IV4].End(xlToLeft))
   If Clls.Value <> "" Then
      Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         Range(Clls.Offset(1), Cells(65500, Clls.Column).End(xlUp)).Copy _
            Destination:=sRng.End(xlDown).Offset(1)
   End If:           End If
 Next Clls
End Sub
 
Upvote 0
code dán vào ô cuối cùng này bị si chỗ nào, nhờ các huynh hướng dẫn giúp, cảm ơn.
Sub loc_dk()
Sheets("D_KY").Select
Range("DVT").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets( _
"D_KY").Range("A1:C1"), CopyToRange:=Sheets("D_KY").Range("A65536").End(xlUp).Offset(1, 0), Unique:=False
End Sub
 
Upvote 0
Bác nào nghĩa hiệp xem giúp mình cái nhé ! thanks
 
Upvote 0
Web KT

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

Back
Top Bottom