PDA

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



anktdn
24-05-09, 08:40 AM
Đâ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).

ndu96081631
24-05-09, 09:14 AM
Đâ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:


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

sealand
24-05-09, 04:59 PM
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



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
(http://www.giaiphapexcel.com/forum/showpost.php?p=159438&postcount=3) Chúc các bạn ngày Chủ nhật vui vẻ.

ndu96081631
24-05-09, 06:47 PM
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



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
(http://www.giaiphapexcel.com/forum/showpost.php?p=159438&postcount=3) 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

anktdn
25-05-09, 07:34 AM
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.

ndu96081631
25-05-09, 08:24 AM
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:


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 SubNgắn hơn 1 chút

sealand
25-05-09, 08:29 AM
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

ndu96081631
25-05-09, 09:06 AM
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)

sealand
25-05-09, 09:22 AM
Mình không hiểu Ndu à, xác định dòng cuối của DICH sao lại căn cứ DLNGUON

ndu96081631
25-05-09, 12:02 PM
Mình không hiểu Ndu à, xác định dòng cuối của DICH sao lại căn cứ DLNGUON
Ah... thì ra anh đang nói đến dử liệu ĐÍCH... còn em lại đang nói đến việc dùng CurrentRegion cho dử liệu NGUỒN
Hic... Hiểu lầm anh à!

tam8678
25-05-09, 12:29 PM
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.

ndu96081631
25-05-09, 12:33 PM
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é

tam8678
25-05-09, 12:46 PM
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)

anktdn
29-05-09, 06:58 PM
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 .


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

tam8678
29-05-09, 07:43 PM
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 .


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 .

ChanhTQ@
29-05-09, 09:18 PM
Macro kiểu củ khoai

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

win-sun
31-08-10, 09:21 AM
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

win-sun
31-08-10, 09:46 AM
Bác nào nghĩa hiệp xem giúp mình cái nhé ! thanks