Code VBA cập nhật dữ liệu

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

xuan.97

Thành viên mới
Tham gia
3/4/23
Bài viết
25
Được thích
11
Em chào mọi người!!!!!

Em có flie Excel như đính kèm, em mong muốn được giúp đỡ code VBA để có thể cập nhật dữ liệu từ sheet Xuat_T5 qua sheet XK_ngay . Thứ tự ngày được sắp xếp tăng dần ạ

Em cảm ơn cả nhà ạ !!!!!
 

File đính kèm

  • XuatKho.xlsx
    29.7 KB · Đọc: 26
Đây bạn chạy thử, mình mù mảng
Mã:
Sub GPE()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim r As Integer
Dim c As Integer
Dim orr As Integer
Dim orc As Integer
Dim dt As Worksheet
Dim rp As Worksheet
Set dt = Sheets("Xuat_T5")
Set rp = Sheets("XK_ngay")
orr = 7
orc = 6
For c = orc To 31 + orc
    For r = orr To WorksheetFunction.CountA(dt.Range("A1:A9999")) + orr
        lr = rp.Cells(Rows.Count, "D").End(xlUp).Row + 1
        If dt.Cells(r, c) > 0 Then
            rp.Cells(lr, 1) = dt.Cells(orr - 1, c)
            rp.Cells(lr, 4) = dt.Cells(r, 2)
            rp.Cells(lr, 5) = dt.Cells(r, 3)
            rp.Cells(lr, 6) = dt.Cells(r, 4)
            rp.Cells(lr, 8) = dt.Cells(r, c)
        End If
    Next r
Next c
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Bài toán của bạn không giản dị như bạn tưởng.
Đã dùng bảng tính để ghi chi tiết thì oohair nghĩ đến việc chỉnh sửa. Ví dụ hôm nay (11/05) tôi cập nhật ngày 10/05 từ XUAT_T5 sang sheet XK_ngay. Ngày mai (12/05), tôi tuần tự xuất ngày 11/05, chỉ có thế thì không nói làm gì. Nhưng nếu tôi sửa dữ liệu ngày 10/05 hoặc 09/05 thì sao?

Quy trình của bạn phải xác định:
1. Hoặc phải chỉnh lại số xuất tháng nếu sửa dữ liệu, HOẶC
2. Xuất rồi thì khóa lại, không cho chỉnh sửa.
 
Upvote 0
Thêm 1 tham khảo & nếu chưa thỏa về tốc độ ta tính tiếp

PHP:
Sub ChepDuLieuThang()
 Dim Rws As Long, J As Long, Col As Integer, W As Integer, Cot As Integer, Thg As Integer, Nam As Integer
 Dim Arr()
 
 With Sheets("Xuat_T5")
    Thg = .[b3].Value:                  Nam = .[b4].Value
    Rws = .[F6].CurrentRegion.Rows.Count
    Arr() = .[F7].Resize(Rws, 31).Value
    ReDim aKQ(1 To 31 * Rws, 1 To 8)
    Sheets("XK_ngay").[A9].Resize(Rws * 31, 8).Value = aKQ()
    For Col = 1 To 31
        For J = 1 To Rws
            If Arr(J, Col) > 0 Then
                W = W + 1:
                aKQ(W, 1) = DateSerial(Nam, Thg, Col)
                aKQ(W, 4) = .Cells(6 + J, "B").Value
                aKQ(W, 5) = .Cells(6 + J, "C").Value
                aKQ(W, 6) = .Cells(6 + J, "D").Value
                aKQ(W, 8) = Arr(J, Col)
            End If
        Next J
    Next Col
 End With
 If W Then
    Sheets("XK_ngay").[A9].Resize(W, 8).Value = aKQ()
 End If
End Sub
 
Upvote 0
Đây bạn chạy thử, mình mù mảng
Mã:
Sub GPE()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim r As Integer
Dim c As Integer
Dim orr As Integer
Dim orc As Integer
Dim dt As Worksheet
Dim rp As Worksheet
Set dt = Sheets("Xuat_T5")
Set rp = Sheets("XK_ngay")
orr = 7
orc = 6
For c = orc To 31 + orc
    For r = orr To WorksheetFunction.CountA(dt.Range("A1:A9999")) + orr
        lr = rp.Cells(Rows.Count, "D").End(xlUp).Row + 1
        If dt.Cells(r, c) > 0 Then
            rp.Cells(lr, 1) = dt.Cells(orr - 1, c)
            rp.Cells(lr, 4) = dt.Cells(r, 2)
            rp.Cells(lr, 5) = dt.Cells(r, 3)
            rp.Cells(lr, 6) = dt.Cells(r, 4)
            rp.Cells(lr, 8) = dt.Cells(r, c)
        End If
    Next r
Next c
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Cảm ơn bạn

Mình thử chạy code của bạn nhưng thấy báo lỗi biến ạ
Bài đã được tự động gộp:

Quy trình của bạn phải xác định:
1. Hoặc phải chỉnh lại số xuất tháng nếu sửa dữ liệu, HOẶC
2. Xuất rồi thì khóa lại, không cho chỉnh sửa.
Cảm ơn bác đã góp ý kiến cho em biết về những vẫn đề có thể xảy ra ạ

Em sẽ chú ý đến nó ạ hihi
 
Upvote 0
Mình thử chạy code của bạn nhưng thấy báo lỗi biến ạ
Mình xin lỗi, mình chép code sau khi đăng bài vào chạy thử nhưng vẫn chạy được và cũng không biết lỗi bên máy bạn là gì để mà gỡ rối. Bạn thử code của thầy @SA_DQ nhé.
 
Upvote 0
Thêm 1 tham khảo & nếu chưa thỏa về tốc độ ta tính tiếp

PHP:
Sub ChepDuLieuThang()
 Dim Rws As Long, J As Long, Col As Integer, W As Integer, Cot As Integer, Thg As Integer, Nam As Integer
 Dim Arr()
 
 With Sheets("Xuat_T5")
    Thg = .[b3].Value:                  Nam = .[b4].Value
    Rws = .[F6].CurrentRegion.Rows.Count
    Arr() = .[F7].Resize(Rws, 31).Value
    ReDim aKQ(1 To 31 * Rws, 1 To 8)
    Sheets("XK_ngay").[A9].Resize(Rws * 31, 8).Value = aKQ()
    For Col = 1 To 31
        For J = 1 To Rws
            If Arr(J, Col) > 0 Then
                W = W + 1:
                aKQ(W, 1) = DateSerial(Nam, Thg, Col)
                aKQ(W, 4) = .Cells(6 + J, "B").Value
                aKQ(W, 5) = .Cells(6 + J, "C").Value
                aKQ(W, 6) = .Cells(6 + J, "D").Value
                aKQ(W, 8) = Arr(J, Col)
            End If
        Next J
    Next Col
 End With
 If W Then
    Sheets("XK_ngay").[A9].Resize(W, 8).Value = aKQ()
 End If
End Sub
Cảm ơn bác nhiều ạ

Em chạy thử thấy code dùng rất ổn ạ hihi

Bác có thể giúp em thêm 1 ý nữa được không ạ? Em muốn chỉ cập nhật từ ngày hiện tại trở về trước thôi còn những ngày sau thì không cập nhật(tránh trường hợp nhập dữ liệu nhầm qua cột ngày hôm sau ạ)
Bài đã được tự động gộp:

Mình xin lỗi, mình chép code sau khi đăng bài vào chạy thử nhưng vẫn chạy được và cũng không biết lỗi bên máy bạn là gì để mà gỡ rối. Bạn thử code của thầy @SA_DQ nhé.
Cảm ơn bạn đã quan tâm đến bài viết của mình nhé. Chắc do máy mình thôi ạ

Mình chạy code thấy báo lỗi như hình đó bạn1683786326456.png
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác nhiều ạ

Em chạy thử thấy code dùng rất ổn ạ hihi

Bác có thể giúp em thêm 1 ý nữa được không ạ? Em muốn chỉ cập nhật từ ngày hiện tại trở về trước thôi còn những ngày sau thì không cập nhật(tránh trường hợp nhập dữ liệu nhầm qua cột ngày hôm sau ạ)
Bạn viết làm bằng VBA mà đi hỏi hết như vậy thì bao giờ mới khá lên được.Ít ra bạn cũng đã thử sửa code rồi xem nó không đúng ở đâu.Chứ bí chỗ nào là hỏi thì khó hiểu hết được các lỗi khi dùng lắm bạn à.
 
Upvote 0
Bạn viết làm bằng VBA mà đi hỏi hết như vậy thì bao giờ mới khá lên được.Ít ra bạn cũng đã thử sửa code rồi xem nó không đúng ở đâu.Chứ bí chỗ nào là hỏi thì khó hiểu hết được các lỗi khi dùng lắm bạn à.
Cảm ơn bác đã góp ý ạ

Em xin rút kinh nghiệm !!!!!!
 
Upvote 0
. . . .Em chạy thử thấy code dùng rất ổn ạ hihi
Bác có thể giúp em thêm 1 ý nữa được không ạ? Em muốn chỉ cập nhật từ ngày hiện tại trở về trước thôi còn những ngày sau thì không cập nhật(tránh trường hợp nhập dữ liệu nhầm qua cột ngày hôm sau ạ
Để ngừa nhập nhầm qua ngày trong tương lai thì nên xài macro sự kiện trong trang nhập
(Ngừa trong trứng nước):
Khi mở trang tính thì việc đầu tiên là tô màu cột ngày hiện hành lên; Chuyện này có thể làm bỡi bạn khi xài CF trên menu 'Home'
Nếu muốn làm bỡi VBA thì bạn hãy tự ên hay thuê người khác (ngoài mình)
 
Upvote 0
Bạn thử khai báo thêm biến "lr" xem, do mình chưa khai báo biến "lr" hay sao đấy.
Để ngừa nhập nhầm qua ngày trong tương lai thì nên xài macro sự kiện trong trang nhập
(Ngừa trong trứng nước):
Khi mở trang tính thì việc đầu tiên là tô màu cột ngày hiện hành lên; Chuyện này có thể làm bỡi bạn khi xài CF trên menu 'Home'
Nếu muốn làm bỡi VBA thì bạn hãy tự ên hay thuê người khác (ngoài mình)
Dạ vâng. Cảm ơn 2 bác đã nhiệt tình giúp đỡ em ạ

Em đang tìm hiểu cách hoạt động của code mà các bác giúp em hihi
 
Upvote 0
Cảm ơn bác nhiều ạ

Em chạy thử thấy code dùng rất ổn ạ hihi

Bác có thể giúp em thêm 1 ý nữa được không ạ? Em muốn chỉ cập nhật từ ngày hiện tại trở về trước thôi còn những ngày sau thì không cập nhật(tránh trường hợp nhập dữ liệu nhầm qua cột ngày hôm sau ạ)
Bài đã được tự động gộp:


Cảm ơn bạn đã quan tâm đến bài viết của mình nhé. Chắc do máy mình thôi ạ

Mình chạy code thấy báo lỗi như hình đó bạnView attachment 290013
Có dòng option explicit không. Option e p li chết tiệt.
Xoá đi cho khỏe. :wallbash: :wallbash: :wallbash:
 
Upvote 0
Upvote 0
. . . . .
Cơ mà em trên rừng, có khi xài được bác nhỉ haha
/-)ó là con dao 2 lưỡi, ai xài được thì phải nói là người tài; Còn không thì cứ tường minh mà mần, chắc như bắp!
Trước khi ăn ngon, mặc đẹp thì phải ăn chắc, mặc bền cái đã!

Chúc cả nhà vui vẻ!
 
Upvote 0
Option Explicit giúp ta cẩn thận hơn trong việc dùng biến, tránh những sai sót không đáng có. Điều gì xảy ra nếu trước đó bạn dùng biến strVal nhưng sau đó lại gõ thành strVar? VBA chấp nhận tuốt nhưng kết quả lại sai bét và ta thì mù tịt vì mắt nhìn không thấy gì sai.
 
Upvote 0
/-)ó là con dao 2 lưỡi, ai xài được thì phải nói là người tài; Còn không thì cứ tường minh mà mần, chắc như bắp!
Trước khi ăn ngon, mặc đẹp thì phải ăn chắc, mặc bền cái đã!

Chúc cả nhà vui vẻ!
Option Explicit giúp ta cẩn thận hơn trong việc dùng biến, tránh những sai sót không đáng có. Điều gì xảy ra nếu trước đó bạn dùng biến strVal nhưng sau đó lại gõ thành strVar? VBA chấp nhận tuốt nhưng kết quả lại sai bét và ta thì mù tịt vì mắt nhìn không thấy gì sai.
Cảm ơn 2 bác đã giải thích cho em hiểu rõ hơn về Option Explicit nhé !!!

Em sẽ tìm hiểu thêm ạ
 
Upvote 0
Option Explicit giúp ta cẩn thận hơn trong việc dùng biến, tránh những sai sót không đáng có. Điều gì xảy ra nếu trước đó bạn dùng biến strVal nhưng sau đó lại gõ thành strVar? VBA chấp nhận tuốt nhưng kết quả lại sai bét và ta thì mù tịt vì mắt nhìn không thấy gì sai.
Nếu bạn có sử dụng và khai báo cả hai strVal và strVar thì sao?

Việc ép khai báo để tránh gõ nhầm là của tay mơ. Option Explicit chỉ ép khai báo ten biến thôi không hề ép bạn phải khai báo kiểu.

Dân chuyên nghiệp khai báo là để kiểm soát kiểu của biến, tầm vực, và cách sử dụng. Gặp bài phức tạp, lúc khai biến, tôi có chú thích nhiệm vụ và hình trạng của chúng. Gặp code phải import/export vào nơi khác, khaii báo biến để khỏi bị lẫn lộn với biến toàn cục.

Chú thích về kiểu của biến:
Điển hình: Long nhanh hơn Double
Cao cấp hơn: chuỗi tĩnh nhanh hơn chuỗi động; mảng tĩnh nhanh hơn mảng động; Object kêt nói sớm hiệu quả hơn kết nối trễ.
 
Upvote 0
Web KT

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

Back
Top Bottom