Giúp em viết VBA chuyển dữ liệu từ sheet này sang sheet khác theo điều kiện thời gian (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

khongphai02

Thành viên mới
Tham gia
7/4/12
Bài viết
15
Được thích
2
Chào các bác!
Em đang viết một chương trình kết toán công nợ để theo dõi công nợ khách hàng, mỗi tháng phát sinh khoảng hơn 3000 phiếu xuất kho và phiếu thu tiền, vì dùng công thức chạy rất chậm. Rất mong các bác cao thủ giải quyết giúp em.

Vấn đề đặt ra là:
1. Viết VBA thay thế công thức ở Sheet ""NKC_in"
Sheet "NKC_in" lọc dữ liệu từ sheet "NKC" theo điều kiện thời gian của kỳ báo cáo.
2. Viết VBA thay thế vlookup ở "Cột J sheet NKC"

Cảm ơn các bác nhiều.

File gốc: http://www.mediafire.com/?7ak5k3sdc2ib4th
mediafire.com/?7ak5k3sdc2ib4th
 
Chào các bác!
Em đang viết một chương trình kết toán công nợ để theo dõi công nợ khách hàng, mỗi tháng phát sinh khoảng hơn 3000 phiếu xuất kho và phiếu thu tiền, vì dùng công thức chạy rất chậm. Rất mong các bác cao thủ giải quyết giúp em.

Vấn đề đặt ra là:
1. Viết VBA thay thế công thức ở Sheet ""NKC_in"
Sheet "NKC_in" lọc dữ liệu từ sheet "NKC" theo điều kiện thời gian của kỳ báo cáo.
2. Viết VBA thay thế vlookup ở "Cột J sheet NKC"

Cảm ơn các bác nhiều.
Code bài này không khó nhưng mình nghĩ bạn nên thử nghiên cứu VBA - xong rồi viết code, trong quá trình viết bạn mắc chỗ nào, hoặc cần chỗ nào thì mọi người sẽ giúp đỡ bạn nhanh hơn
ngày xưa mình cũng như bạn VBA = 0------> bạn tìm trong diễn đàn tài liệu của thầy Phan Tự Hướng về nhé
 
Upvote 0
Chào các bác!
Em đang viết một chương trình kết toán công nợ để theo dõi công nợ khách hàng, mỗi tháng phát sinh khoảng hơn 3000 phiếu xuất kho và phiếu thu tiền, vì dùng công thức chạy rất chậm. Rất mong các bác cao thủ giải quyết giúp em.

Vấn đề đặt ra là:
1. Viết VBA thay thế công thức ở Sheet ""NKC_in"
Sheet "NKC_in" lọc dữ liệu từ sheet "NKC" theo điều kiện thời gian của kỳ báo cáo.
2. Viết VBA thay thế vlookup ở "Cột J sheet NKC"

Cảm ơn các bác nhiều.

File gốc: http://www.mediafire.com/?7ak5k3sdc2ib4th
mediafire.com/?7ak5k3sdc2ib4th

mình cũng đang học vba nên thử làm cho bạn
câu thứ 1: bạn thử đoạn code sau:

phương án sử dụng hàm match ko thực hiện được do vướng địng dạng ngày. bạn xem file update mới

câu thứ 2: do bạn chưa set công thức trong sheet, mà mình lại ko phải dân kế toán nên ko biết làm.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
mình cũng đang học vba nên thử làm cho bạn
câu thứ 1: bạn thử đoạn code sau:(Chép nó vào module, nhấn Alt-F8, rồi nhấp run. hoặc tạo button rồi gán macro này vào)

Sub Macro2()
Set wf = WorksheetFunction
row1 = Application.WorksheetFunction.Match([d6], Sheet7.Range("Date"), 0)
row2 = Application.WorksheetFunction.Match([d7], Sheet7.Range("Date"), 0)
Sheet8.Range("a12", "H" & row2 - row1 + 12).Value = Sheet7.Range("A" & row1, "A" & row2).Resize(, 8).Value
Set wf = Nothing
End Sub

câu thứ 2: do bạn chưa set công thức trong sheet, mà mình lại ko phải dân kế toán nên ko biết làm.

Theo mình đã viết code VBA mà vẫn dùng worksheet.Function thì gõ công thức luôn cho xong, vì tốc độ của code và hàm gần như nhau <--------- mình nói thế không biết có đúng không nhj
 
Upvote 0
nhờ mọi người giúp đỡ, vì sao không tìm được ngày, mặc dù định dạng ngày là giống nhau.

ở file đính kèm bên trên.
sheet NKC_in cell [d6] có định dạng ngày là "dd/mm/yyyy"
sheet NKC cell [A12:A240] (đặt tên là Date) cũng có định dạng ngày là "dd/mm/yyyy"
nhưng khi dùng hàm worksheetfunction.match đi tìm thì
nếu sử dụng
row1 = Application.WorksheetFunction.Match([d6].Value, Sheet7.Range("Date"), 0) thì báo lỗi
còn
row1 = Application.WorksheetFunction.Match([d6], Sheet7.Range("Date"), 0) thì tìm không đúng ngày. thí dụ ngày 10 thì nó tìm ra hàng của ngày 8, ngày 14 thì tìm ra hàng của ngày 12.

nhờ mọi người chỉ ra chổ sai giúp
tks many tks

ok, đã tự hiểu rùi...hì hì..hic hic
 
Lần chỉnh sửa cuối:
Upvote 0
Code bài này không khó nhưng mình nghĩ bạn nên thử nghiên cứu VBA - xong rồi viết code, trong quá trình viết bạn mắc chỗ nào, hoặc cần chỗ nào thì mọi người sẽ giúp đỡ bạn nhanh hơn
ngày xưa mình cũng như bạn VBA = 0------> bạn tìm trong diễn đàn tài liệu của thầy Phan Tự Hướng về nhé
Em cảm ơn bác, em thì cũng muốn học thật, nhưng quản thực không có thời gian, với lại học xong lại để đấy cũng lãng phí thời gian. Em không phải dân tin, cũng chẳng phải dân kế toán nên mạn phép lên đây hỏi các bác. Nếu bác có thời gian viết giúp em cũng như để mọi người xem học tập a. cảm ơn bác nhiều.

nhapmon đã viết:
mình cũng đang học vba nên thử làm cho bạn
câu thứ 1: bạn thử đoạn code sau:
phương án sử dụng hàm match ko thực hiện được do vướng địng dạng ngày. bạn xem file update mới
câu thứ 2: do bạn chưa set công thức trong sheet, mà mình lại ko phải dân kế toán nên ko biết làm.
Cảm ơn bác NHAPMON, bác làm gần đúng ý em ạ, nhưng không để nó chạy tự động được ạ? Tiếc quá, vẫn không dụng được cho thực tế của em.
Sorry bác là Câu thứ 2 là hàm vlookup ở cột I chứ ko phải cột J thành thật xin lỗi bác.
Cảm ơn bác nhiều
 
Upvote 0
code chạy ko đúng yêu cầu, hay bạn muốn nó tự động mà ko cần nhấp vào button?
nếu bạn muốn nó tự chạy khi bạn nhấp vào sheet NHk-in
thì làm như sau:
mở cửa sổ vba, nhấp vào sheet8(NHK_in), chép đoạn code này vào

Private Sub Worksheet_Activate()
Call Macro2
End Sub
 
Upvote 0
rồi khỏi phải nhấp tới sheet(NHk_in) luôn, khi nhập xong ngày ở trang đâu là nó tự cập nhật luôn

bạn sửa lại đoạn code trong sheet3 một chút (thêm đoạn code màu đỏ vào), chứa nếu ko lỡ chọn ngày sau nhỏ hơn ngày trước thì nó chạy loạn tùng phèo

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrHandler
Application.EnableEvents = False

If [D18] < [D17] Then
MsgBox "Ngay Ko Dung"
Exit Sub

End If
If Not Intersect(Target, [D17:D18]) Is Nothing Then
Call Macro2
End If

ErrHandler:
Application.EnableEvents = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào các bác!
Em đang viết một chương trình kết toán công nợ để theo dõi công nợ khách hàng, mỗi tháng phát sinh khoảng hơn 3000 phiếu xuất kho và phiếu thu tiền, vì dùng công thức chạy rất chậm. Rất mong các bác cao thủ giải quyết giúp em.

Vấn đề đặt ra là:
1. Viết VBA thay thế công thức ở Sheet ""NKC_in"
Sheet "NKC_in" lọc dữ liệu từ sheet "NKC" theo điều kiện thời gian của kỳ báo cáo.
2. Viết VBA thay thế vlookup ở "Cột J sheet NKC"

Cảm ơn các bác nhiều.

File gốc: http://www.mediafire.com/?7ak5k3sdc2ib4th
mediafire.com/?7ak5k3sdc2ib4th

Thử thế này xem sao
Copy code này vào sheet NKC_in
PHP:
Private Sub Worksheet_Activate()
Dim dl(), i, kq(1 To 10000, 1 To 8), k, n
dl = Sheet7.Range(Sheet7.[A11], Sheet7.[H10000].End(3)).Value
For i = 1 To UBound(dl)
   If dl(i, 1) >= [D6] Then
      If dl(i, 1) <= [D7] Then
         k = k + 1
         For n = 1 To 8
            kq(k, n) = dl(i, n)
         Next
      End If
   End If
Next
[A12:H10000].ClearContents
[A12].Resize(k, 8) = kq
End Sub
Và copy code này vào sheet NKC
PHP:
Private Sub Worksheet_Activate()
Dim dl(), i, tim As Range
dl = Range([H12], [H65536].End(3)).Resize(, 2).Value
For i = 1 To UBound(dl)
   Set tim = Sheet5.[A:A].Find(dl(i, 1), , , 1)
   If Not tim Is Nothing Then
      dl(i, 2) = tim.Offset(, 1)
   End If
Next
[H12].Resize(i - 1, 2) = dl
End Sub
 
Upvote 0
rồi khỏi phải nhấp tới sheet(NHk_in) luôn, khi nhập xong ngày ở trang đâu là nó tự cập nhật luôn

bạn sửa lại đoạn code trong sheet3 một chút (thêm đoạn code màu đỏ vào), chứa nếu ko lỡ chọn ngày sau nhỏ hơn ngày trước thì nó chạy loạn tùng phèo

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrHandler
Application.EnableEvents = False

If [D18] < [D17] Then
MsgBox "Ngay Ko Dung"
Exit Sub

End If
If Not Intersect(Target, [D17:D18]) Is Nothing Then
Call Macro2
End If

ErrHandler:
Application.EnableEvents = True
End Sub
Em cảm ơn bác, code của bác chạy tốt, em chưa làm nhiêù dữ liệu, nhưng hình như cũng hơi nặng thì phải, với lại, nếu nhập ngày không có trong file NKC thì không ra kết quả. Ví dụ chứng từ, từ ngày 2/1 đến 31/1 thì nhập từ 1/1 đến 31/1 hoặc có ngày chủ nhật là ngày 20/1 - 31/1 thì không ra kết quả. bác sửa giúp em nhé, thank bác nhiều.
 
Upvote 0
Thử thế này xem sao
Copy code này vào sheet NKC_in
PHP:
Private Sub Worksheet_Activate()
Dim dl(), i, kq(1 To 10000, 1 To 8), k, n
dl = Sheet7.Range(Sheet7.[A11], Sheet7.[H10000].End(3)).Value
For i = 1 To UBound(dl)
   If dl(i, 1) >= [D6] Then
      If dl(i, 1) <= [D7] Then
         k = k + 1
         For n = 1 To 8
            kq(k, n) = dl(i, n)
         Next
      End If
   End If
Next
[A12:H10000].ClearContents
[A12].Resize(k, 8) = kq
End Sub
Và copy code này vào sheet NKC
PHP:
Private Sub Worksheet_Activate()
Dim dl(), i, tim As Range
dl = Range([H12], [H65536].End(3)).Resize(, 2).Value
For i = 1 To UBound(dl)
   Set tim = Sheet5.[A:A].Find(dl(i, 1), , , 1)
   If Not tim Is Nothing Then
      dl(i, 2) = tim.Offset(, 1)
   End If
Next
[H12].Resize(i - 1, 2) = dl
End Sub

Cảm ơn bác Hải. code của bác chạy êm lắm, nhưng nếu nhập trong chứng từ có từ ngày 2/1-31/1 trong đó ko có ngày 20/1 mà lọc dữ liệu từ 20/1-31/1 thì báo lỗi, hoặc nếu nhập khác số ngày 2/1-31/1 cũng báo lỗi. bác sửa giúp em với, em cảm ơn bác nhiều.
 
Upvote 0
Cảm ơn bác Hải. code của bác chạy êm lắm, nhưng nếu nhập trong chứng từ có từ ngày 2/1-31/1 trong đó ko có ngày 20/1 mà lọc dữ liệu từ 20/1-31/1 thì báo lỗi, hoặc nếu nhập khác số ngày 2/1-31/1 cũng báo lỗi. bác sửa giúp em với, em cảm ơn bác nhiều.
Bạn gởi file bị lỗi lên xem. Bản thân code không liên quan đến điều bạn đề cập. Vì điều kiện lọc là => và <= thì không thể gây ra lỗi được.
 
Upvote 0

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

Back
Top Bottom