Đẩy dữ liệu đúng theo ngày VBA (1 người xem)

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

loinguyen212

Thành viên thường trực
Tham gia
21/2/14
Bài viết
254
Được thích
35
Em chào các thầy cô anh chị.
Em muốn đẩy dữ liệu cột D của sheet LXCho sang sheet2 (file đính kèm), nhưng đẩy đúng theo ngày chọn ở ô D4 sheet LXCho. khi chọn ngày mới, nhập mới (or có dữ liệu mới) thì ấn nút để đẩy sang. Kính mong thầy cô anh chị giúp đỡ. Em cảm ơn.
 

File đính kèm

Đẩy đi đâu thì đẩy, nhưng mỗi nhân viên nên có mã duy nhất.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn Bác ChanhTQ@ rất nhiều.
Em đang cố dịch đoạn code của Bác ChanhTQ@ (khả năng về VBA của em có hạn, em mới học nên chưa hiểu)
Việc gắn mã mục đích để tránh tên nhân viên trùng nhau còn có mục đích gì khác không ạ?
Cho em hỏi khi thứ tự nhân viên thay đổi thì lại phải gõ lại từ ngày mùng 1 đề nhập và đẩy lại dữ liệu đúng không ạ, vậy có giải pháp nào giúp ích cho việc này không ạ? (Em cạn nghĩ sẽ đặt ra quy tắc là không được thay đổi thứ tự, chỉ thêm mới tên nhân viên vào dưới thôi).
Chúc bác Sức Khỏe và "Ngày mới iên lành"!
 
Upvote 0
Em cảm ơn Bác ChanhTQ@ rất nhiều.
Em đang cố dịch đoạn code của Bác ChanhTQ@ (khả năng về VBA của em có hạn, em mới học nên chưa hiểu)
Việc gắn mã mục đích để tránh tên nhân viên trùng nhau còn có mục đích gì khác không ạ?
Cho em hỏi khi thứ tự nhân viên thay đổi thì lại phải gõ lại từ ngày mùng 1 đề nhập và đẩy lại dữ liệu đúng không ạ, vậy có giải pháp nào giúp ích cho việc này không ạ? (Em cạn nghĩ sẽ đặt ra quy tắc là không được thay đổi thứ tự, chỉ thêm mới tên nhân viên vào dưới thôi).
Chúc bác Sức Khỏe và "Ngày mới iên lành"!

Nếu chắc chắn Tên người từ trên xuống giống nhau ở 2 sheet thì chạy thử cái này:
PHP:
Public Sub DayDay()
Dim C As Long, Arr()
With Sheets("LXCho")
    C = Day(.[D4])
    Arr = .Range(.[C7], .[C7].End(xlDown)).Offset(, 1).Value
End With
Sheets("Sheet2").[B5].Offset(, C).Resize(UBound(Arr, 1)) = Arr
End Sub
Còn nếu tên từ trên xuống "luxubu" lộn xộn thì khác.
 
Upvote 0
Em cảm ơn bác Ba Tê. Bài viết của hai bác rất hay. Hiện em đang ngâm cứu. Chúc bác công việc thuận lợi và gặp nhiều may mắn.
 
Upvote 0
(1)
Việc gắn mã mục đích để tránh tên nhân viên trùng nhau còn có mục đích gì khác không ạ?

("2") Cho em hỏi khi thứ tự nhân viên thay đổi thì lại phải gõ lại từ ngày mùng 1 đề nhập và đẩy lại dữ liệu đúng không ạ, vậy có giải pháp nào giúp ích cho việc này không ạ? (Em cạn nghĩ sẽ đặt ra quy tắc là không được thay đổi thứ tự, chỉ thêm mới tên nhân viên vào dưới thôi).

Việc gắn mã duy nhất cho 1 CSDL là thói quen tốt để CSDL hoạt động lâu bền.

Tránh sai chính tả khi nhập liệu như bạn đã nêu;

Tiết kiệm thời gian cho máy khi sưu tra; Khi tìm theo mã sẽ nhanh hơn nhiều khi tra theo họ tên;

Thêm nữa khi mã không chứa các từ như 'Đ', 'đ', "Ă", 'Ơ',. . . . ta sẽ tránh được chuyện máy dùng các font chữ khác nhau sẽ ra kết quả khác nhau, có khi chả giống ai!

Khỏi gò bó khi đổi trật tự nhân viên như fần "2" trên bạn nêu.
 
Upvote 0
Cảm ơn Bác HaiYen đã chia sẻ kinh nghiệm.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người,
Hôm nay em lại có một bài toán nữa mà cũng liên quan đến việc đẩy dữ liệu đúng theo ngày cần tìm, cũng xuất phát từ nhu cầu ở trên nhưng việc tìm dữ liệu trước khi đẩy sẽ có thêm tính chặt chẽ. Tìm đúng "mã nhân viên" và đẩy "lịch phân công" đúng theo ngày.
Em đã ngâm cứu code trên của bác ChanhTQ nhưng chưa được. Mong các bác chỉ dạy.
Thân!
 

File đính kèm

Upvote 0
Chào mọi người,
Hôm nay em lại có một bài toán nữa mà cũng liên quan đến việc đẩy dữ liệu đúng theo ngày cần tìm, cũng xuất phát từ nhu cầu ở trên nhưng việc tìm dữ liệu trước khi đẩy sẽ có thêm tính chặt chẽ. Tìm đúng "mã nhân viên" và đẩy "lịch phân công" đúng theo ngày.
Em đã ngâm cứu code trên của bác ChanhTQ nhưng chưa được. Mong các bác chỉ dạy.
Thân!

Thử Sub này xem sao.
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Sheets("TongHop").Range(Sheets("TongHop").[A5], Sheets("TongHop").[A5].End(xlDown)).Value
For I = 1 To UBound(sArr, 1)
    Dic.Item(sArr(I, 1)) = I
Next I
K = I
ReDim dArr(1 To K, 1 To 31)
With Sheets("DuLieu")
    sArr = .Range(.[C4], .[C4].End(xlDown)).Resize(, 4).Value
End With
    For I = 1 To UBound(sArr, 1)
        Tem = sArr(I, 4)
        If Dic.Exists(Tem) Then dArr(Dic.Item(Tem), Day(sArr(I, 1))) = sArr(I, 2)
    Next I
Sheets("TongHop").Range("C5").Resize(K, 31) = dArr
Set Dic = Nothing
MsgBox "XONG!", , "GPE"
End Sub
 
Upvote 0
Thử Sub này xem sao.
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Sheets("TongHop").Range(Sheets("TongHop").[A5], Sheets("TongHop").[A5].End(xlDown)).Value
For I = 1 To UBound(sArr, 1)
    Dic.Item(sArr(I, 1)) = I
Next I
K = I
ReDim dArr(1 To K, 1 To 31)
With Sheets("DuLieu")
    sArr = .Range(.[C4], .[C4].End(xlDown)).Resize(, 4).Value
End With
    For I = 1 To UBound(sArr, 1)
        Tem = sArr(I, 4)
        If Dic.Exists(Tem) Then dArr(Dic.Item(Tem), Day(sArr(I, 1))) = sArr(I, 2)
    Next I
Sheets("TongHop").Range("C5").Resize(K, 31) = dArr
Set Dic = Nothing
MsgBox "XONG!", , "GPE"
End Sub
1)- Hông chơi em "Đít- to" & sử dụng 1 vòng lặp ......được hông ???
2)- Sao bắt nó chạy tới 31, rủi tháng có 28 ngày thì phí......3 bước chay à
Híc
 
Upvote 0
1)- Hông chơi em "Đít- to" & sử dụng 1 vòng lặp ......được hông ???
2)- Sao bắt nó chạy tới 31, rủi tháng có 28 ngày thì phí......3 bước chay à
Híc

1/ Xài Dic cho chắc ăn, khi mã NV là một "nùi lu xu bu" chẳng có thứ tự gì cả.
2/ Thà giết lầm chứ không bỏ sót mà. Giết "hụt" vài ba thằng chắc hổng chậm lắm đâu. Hihi..
Híc!
 
Upvote 0
Cách khai báo các biến như sArr, dArr, Tem ... em thấy được sử dụng rất nhiều và thường xuyên gặp. Vậy đó là nguyên tắc hay thói quen nào và được học ở đâu, mong bác chia sẻ. Em cảm ơn.
Thân!

Tên các biến là do người viết tự tạo, không ai bắt buộc cả, chỉ là ... đặt sao cho mình dễ nhớ.
Học ở đâu? Tôi toàn học lóm trên GPE. Trước khi biết GPE tôi có biết VBA là cái "khỉ" gì đâu.
http://www.giaiphapexcel.com/forum/...-tổng-theo-từng-mặt-hàng!&p=635060#post635060
 
Upvote 0
Tên các biến là do người viết tự tạo, không ai bắt buộc cả, chỉ là ... đặt sao cho mình dễ nhớ.
Học ở đâu? Tôi toàn học lóm trên GPE. Trước khi biết GPE tôi có biết VBA là cái "khỉ" gì đâu.
Vậy là bác đã tiêm cho em ít động lực rồi, hôm giờ em bị nhiều thứ ảnh hưởng quá, học hổng vô. Giờ lại tiếp tục cày cuốc vậy, gút lắc -0-/.
 
Upvote 0
Vậy là bác đã tiêm cho em ít động lực rồi, hôm giờ em bị nhiều thứ ảnh hưởng quá, học hổng vô. Giờ lại tiếp tục cày cuốc vậy, gút lắc -0-/.

Đúng thế, khó khăn chi đâu - nỗ lực chút là viết code được tốt ấy mà,
sao cho bao giờ đổi thay, như hiện giờ GPE này toàn thấy - các bác cao niên viết code là chính vậy - như là

Trẻ ham uống trà
Già tập thể dục


(không chỉ trẻ đâu các sếp cũng uống trà ngồi không, đôi khi còn chém gió chén trà rung bần bật)
 
Upvote 0
Cách giải của bác Ba Tê đã rất tuyệt. Em cũng đang mò mẫm vòng lặp, bác thử cho một đoạn vòng lặp áp dụng được cho em tham khảo vs đi ạ.;;;;;;;;;;;

- Nếu cột C sheet DuLieu nhập theo thứ tự ngày nhỏ --> lớn
- Nếu Mã NV đều bắt đầu là NV sau đó là số từ 1 đến 999
- Nếu cột A sheet Tonghop, Mã NV nhập theo thứ tự nhỏ-->lớn.
Một vòng lặp có thể như vầy:
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, Rws As Long, Col As Long, MaxR As Long
sArr = Sheets("DuLieu").Range(Sheets("DuLieu").[C4], Sheets("DuLieu").[F4].End(xlDown)).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 31)
For I = 1 To UBound(sArr, 1)
    Col = Day(sArr(I, 1))
    Rws = Val(Mid(sArr(I, 4), 3))
    If Rws > MaxR Then MaxR = Rws
    dArr(Rws, Col) = sArr(I, 2)
Next I
Sheets("TongHop").[C5].Resize(1000, 31).ClearContents
Sheets("TongHop").[C5].Resize(MaxR, Col) = dArr
End Sub
 
Upvote 0

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

Back
Top Bottom