Xin Code VBA gán giá trị vào mã hàng trong vùng dữ liệu theo điều kiện thời gian

Liên hệ QC

nhodoan

Thành viên mới
Tham gia
6/7/07
Bài viết
4
Được thích
1
Mình xin trợ giúp code vba gán giá trị vào vùng dữ liệu như sau
- Mình có Sheet DATA chứa dữ liệu xuất kho từ tháng 1 đến tháng 12
- Mình muốn cập nhật đơn giá xuất kho trong một khoảng thời gian vào các tháng 3,4,5 vào Sheet DATA mà không làm thay đổi đơn giá các tháng khác.
Nhờ các cao thủ cho mình xin đoạn code VBA này nhé
Cám ơn ah.
 

File đính kèm

  • Gan gia tri vao ma hang theo dieu kien thoi gian.xlsx
    18.4 KB · Đọc: 32
Cảm ơn bạn đã quan tâm và chỉ giáo:
Tôi nghĩ là: Khi thay đổi giá thì chạy code ở sự kiện thay đổi Range(C4:C10000) Sh Don gia rồi mà.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("C4:C10000"), Target) Is Nothing Then Chk = True
End Sub


Private Sub Worksheet_Deactivate()
If Chk Then
CapNhatDic
Chk = False
End If
End Sub
Đúng là như vậy, nhưng sự kiện của bạn là cột C, cột đó là cột mã hàng, nếu họ chỉ thay đổi giá mà không thay đổi mã hàng thì code không hiệu lực.
Nhưng không cần phải code trong sheet như vậy, cứ để mỗi lần chạy code thì tự add đơn giá vào dic sẽ gọn hơn
Bạn chỉ nên dùng if dic is nothing then set dic=... thôi, chứ không nên xét dic nothing hay không để chạy code khác
 
Upvote 0
Thử 1 cách khác. Và tiện nhờ mọi người chỉ giáo giúp
Mã:
Sub ABC()
    Dim arr(), dic As Object, BD, KT, iRow&, i&, sarr(), j&
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Don gia")
        iRow = .Range("C" & Rows.Count).End(3).Row
        BD = .Range("G1").Value
        KT = .Range("G2").Value
        arr = .Range("C4:D" & iRow).Value
    End With
    For i = 1 To UBound(arr, 1)
        If dic.exists(arr(i, 1)) = False Then
            dic.Item(arr(i, 1)) = arr(i, 2)
        End If
    Next
    If dic.Count < 0 Then Exit Sub
    With Sheets("DATA")
        iRow = .Range("C" & Rows.Count).End(3).Row
        sarr = .Range("B4:F" & iRow).Value
    End With
    For i = 1 To UBound(sarr, 1)
        If sarr(i, 1) > BD And sarr(i, 1) < KT Then
            If dic.exists(sarr(i, 2)) = True Then
                j = dic.Item(sarr(i, 2))
                sarr(i, 4) = j
                sarr(i, 5) = sarr(i, 3) * sarr(i, 4)
            End If
       
        End If
    Next
    Sheets("DATA").Range("B4").Resize(UBound(sarr, 1), UBound(sarr, 2)) = sarr
End Sub
Cho câu lệnh này.
If dic.Count < 0 Then Exit Sub
vào đây làm gì bạn.Có bao giờ số đếm nó nhỏ hơn 0 đâu.Tối thiểu nó bằng không.Mà nó đã chạy được đên đây rồi thì sao bằng 0 được nữa.
 
Upvote 0
Cho câu lệnh này.
If dic.Count < 0 Then Exit Sub
vào đây làm gì bạn.Có bao giờ số đếm nó nhỏ hơn 0 đâu.Tối thiểu nó bằng không.Mà nó đã chạy được đên đây rồi thì sao bằng 0 được nữa.
hihi. cám ơn anh góp ý. Tại suy nghĩ của em là nếu trong dic không có giá trị nào thì bỏ qua không làm gì nữa. nhưng anh nói cũng có lí.
 
Upvote 0
Em chào anh chị, hiện tại em có 1 file xử lí số liệu, do tính chất nên phải xử lí rất nhiều dòng (>2000 dòng), ở sheet Data CT cột M, N là 2 cột để em trích ra kỳ KPI, đối chiếu từ cột "Thời gian", dữ liệu để so sánh nằm trong sheet Kỳ SX, hiện tại em đang dùng hàm thủ công nhưng cứ mỗi lần cập nhật dữ liệu là lại bị rất chậm nên em muốn nhờ anh chị giúp cho.
Hàm hiện tại của em là: =IFERROR(IF(OR([@[Thời gian]]<INDEX('Kỳ SX'!$C$3:$C$38;MATCH([@Tháng];'Kỳ SX'!$E$3:$E$38;0));[@[Thời gian]]>INDEX('Kỳ SX'!$D$3:$D$38;MATCH([@Tháng];'Kỳ SX'!$E$3:$E$38;0)));"";[@Tháng]);"").

Trong file em có giải thích cụ thể vấn đề, em cám ơn anh chị
 

File đính kèm

  • Dữ liệu mẫu.xlsm
    412.2 KB · Đọc: 4
Upvote 0
Đúng là như vậy, nhưng sự kiện của bạn là cột C, cột đó là cột mã hàng, nếu họ chỉ thay đổi giá mà không thay đổi mã hàng thì code không hiệu lực.
Nhưng không cần phải code trong sheet như vậy, cứ để mỗi lần chạy code thì tự add đơn giá vào dic sẽ gọn hơn
Bạn chỉ nên dùng if dic is nothing then set dic=... thôi, chứ không nên xét dic nothing hay không để chạy code khác
Rất trân trọng sự góp ý của bạn.
Xin hỏi ngu một tý là : Vậy tạo sự kiện thay đổi cả 2 cột C và D kiểu If Not Intersect(Range("C4:C10000"), Target) Is Nothing Then có được không nhỉ?
Tôi vẫn cứ nghĩ rằng : Nếu trong sh Data có một Sub cũng sử dụng đến bảng đơn giá (không phải 2 cột mà là nhiều cột - được sử dụng cho một vài cột ở các Sh khác nhau) thì ta lại phải chạy lại Sub CapNhatDic thì cũng hơi phiền (nhất là đối với bảng đơn gia có nhiều dòng và thường xuyên thay đổi). tất nhiên với bài này thì không cần phải chia ra Sub nạp dic riêng-code sẽ gọn hơn. -Không biết suy nghĩ như thế của mình có đúng không?
Càng nhận được nhiều phản hồi góp ý càng giúp tôi hiểu thêm vấn đề, vỡ lẽ ra nhiều điều, tích lũy thêm được kinh nghiệm.
 
Upvote 0
Vậy tạo sự kiện thay đổi cả 2 cột C và D kiểu If Not Intersect(Range("C4:C10000"), Target) Is Nothing Then có được không nhỉ?
Được bạn nhé, đúng ra câu này bạn phải test ngay và luôn chứ không hỏi lại nha!
Tôi vẫn cứ nghĩ rằng : Nếu trong sh Data có một Sub cũng sử dụng đến bảng đơn giá (không phải 2 cột mà là nhiều cột - được sử dụng cho một vài cột ở các Sh khác nhau) thì ta lại phải chạy lại Sub CapNhatDic thì cũng hơi phiền
Mình mua máy tính là để làm phiền nó mà :D
Nói chứ làm hướng của bạn cũng được, mình không có ý kiến về phần đó. Mình chỉ góp ý những chỗ mình thấy là chưa đúng thôi!
Chú thêm: Theo kiến thức học lỏm của mình thì chia sub(function) xử lý các công việc riêng của nó là một cách làm khoa học, dễ sửa code hơn nha
 
Upvote 0
Web KT

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

Back
Top Bottom