Dò tìm giảm giá bằng VBA (1 người xem)

Liên hệ QC

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

thao nguyen01

Thành viên thường trực
Tham gia
8/12/19
Bài viết
241
Được thích
30
Kính gửi anh/chị trên diễn đàn,

Em đang bị vướng vấn đề sau ạ:

Em muốn dò tìm cột giảm giá trong sheet Danh muc: Nếu ngày bên sheet Thống kê nằm trong khoảng ngày của Danh mục thì sẽ lấy cột Giảm giá ạ. Em có viết code nhưng chưa ra ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.

Sub thongke03(Dic As Object, arr_D())
Dim i As Long, dcuoi As Long
Dim arr_N()
dcuoi = Sheet2.Range("G10000").End(xlUp).Row
arr_N = Sheet2.Range("G2:I" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 3)
For i = 1 To UBound(arr_N, 1)
If Not Dic.exists(">=" & arr_N(i, 1) And "<=" & arr_N(i, 2)) Then
k = k + 1
Dic.Add ">=" & arr_N(i, 1) And "<=" & arr_N(i, 2), k
arr_D(k, 1) = arr_N(i, 1)
arr_D(k, 2) = arr_N(i, 2)
arr_D(k, 3) = arr_N(i, 3)
End If
Next
End Sub


Sub dotim()
Dim i As Long, dcuoi As Long, j As Long, ii As Long
Dim arr_N()
Dim arr_D(), arr_Dotim()
Dim Dic As Object
Set Dic = CreateObject("scripting.dictionary")
Call thongke03(Dic, arr_Dotim)

dcuoi = Sheet1.Range("C10000").End(xlUp).Row
arr_N = Sheet1.Range("C2:C" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 2)

For i = 1 To UBound(arr_N, 1)
If Dic.exists(arr_N(i, 1)) Then
j = Dic.Item(arr_N(i, 1))
arr_D(i, 1) = arr_Dotim(j, 3)
End If
Next
Sheet1.Range("G2:H1000").Clear
Sheet1.Range("G2").Resize(UBound(arr_N, 1), 1) = arr_D
End Sub
 

File đính kèm

Bạn xài tạm cái ni; Nếu là rùa thì báo để xài con dao bén hơn như bạn!
PHP:
Sub GiamGia()
Dim J As Long, W As Integer, fDat As Date, lDat As Date, Dat As Date
Dim Cls As Range, Sh As Worksheet

Set Sh = ThisWorkbook.Worksheets("Danh Muc")   
With Sheets("Thong Ke")
    For Each Cls In .Range(.[C2], .[C2].End(xlDown))
        Dat = Cls.Value
        For J = 2 To Sh.[G2].End(xlDown).Row
            fDat = Sh.Cells(J, "G").Value:          lDat = Sh.Cells(J, "H").Value
            If Dat >= fDat And Dat <= lDat Then
                .Cells(Cls.Row, "G").Value = Sh.Cells(J, "I").Value
                .Cells(Cls.Row, "G").Interior.ColorIndex = 34 + J
            End If
        Next J
    Next Cls
  End With
End Sub
 
Upvote 0
Kính gửi anh/chị trên diễn đàn,

Em đang bị vướng vấn đề sau ạ:

Em muốn dò tìm cột giảm giá trong sheet Danh muc: Nếu ngày bên sheet Thống kê nằm trong khoảng ngày của Danh mục thì sẽ lấy cột Giảm giá ạ. Em có viết code nhưng chưa ra ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.

Bạn xem thử
 

File đính kèm

Upvote 0
Góp vui thêm 1 cách:
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:I" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = tbGiamGia(i, 3)
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 1)
    
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))
        End If
    Next i
    .Range("G2").Resize(lr, 1) = tbKetQua
End With

End Sub
 
Upvote 0
Bạn xài tạm cái ni; Nếu là rùa thì báo để xài con dao bén hơn như bạn!
PHP:
Sub GiamGia()
Dim J As Long, W As Integer, fDat As Date, lDat As Date, Dat As Date
Dim Cls As Range, Sh As Worksheet

Set Sh = ThisWorkbook.Worksheets("Danh Muc")  
With Sheets("Thong Ke")
    For Each Cls In .Range(.[C2], .[C2].End(xlDown))
        Dat = Cls.Value
        For J = 2 To Sh.[G2].End(xlDown).Row
            fDat = Sh.Cells(J, "G").Value:          lDat = Sh.Cells(J, "H").Value
            If Dat >= fDat And Dat <= lDat Then
                .Cells(Cls.Row, "G").Value = Sh.Cells(J, "I").Value
                .Cells(Cls.Row, "G").Interior.ColorIndex = 34 + J
            End If
        Next J
    Next Cls
  End With
End Sub

Dạ, con cảm ơn Thầy @SA_DQ nhiều lắm ạ.
Bài đã được tự động gộp:


Dạ, em cảm ơn anh @Nhất Chi Lan nhiều ạ
Bài đã được tự động gộp:

Góp vui thêm 1 cách:
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:I" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = tbGiamGia(i, 3)
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 1)
   
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))
        End If
    Next i
    .Range("G2").Resize(lr, 1) = tbKetQua
End With

End Sub

Dạ, em cảm ơn anh nhiều ạ. Anh có thể xem giúp em nếu có thêm cột chương trình không ạ. Vì nếu nằm trong khoảng thời gian bên sheet Danhmuc sẽ lấy vào sheet Thong ke cột Giảm giá và tên chương trình ạ. Vì em đang thắc mắc nếu dò tìm lấy 2 cột thì đoạn code sau sẽ thay đổi như thế nào ạ
For i = 1 To UBound(tbGiamGia)
For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
Dic.Item(j) = tbGiamGia(i, 3)
Next
Next i
Nếu có thể, anh xem giúp em ạ. Em cảm ơn anh nhiều ạ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thay đổi một chút.
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:J" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = Array(tbGiamGia(i, 3), tbGiamGia(i, 4))
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 2)
  
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))(0)
            tbKetQua(i, 2) = Dic.Item(tbThongKe(i, 1))(1)
        End If
    Next i
    .Range("G2").Resize(lr, 2) = tbKetQua
End With

End Sub
 
Upvote 0
Thay đổi một chút.
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:J" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = Array(tbGiamGia(i, 3), tbGiamGia(i, 4))
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 2)
 
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))(0)
            tbKetQua(i, 2) = Dic.Item(tbThongKe(i, 1))(1)
        End If
    Next i
    .Range("G2").Resize(lr, 2) = tbKetQua
End With

End Sub

Dạ, em cảm ơn anh @phuocam nhiều lắm ạ.
 
Upvote 0
Kính gửi anh/chị trên diễn đàn,
Em đang bị vướng vấn đề sau ạ: Em muốn dò tìm cột giảm giá trong sheet Danh muc: Nếu ngày bên sheet Thống kê nằm trong khoảng ngày của Danh mục thì sẽ lấy cột Giảm giá ạ. Em có viết code nhưng chưa ra ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.
Thử sử dụng hàm GiamGia, với điều kiện chọn một chương trình Khuyến mãi ở cột I.
Tôi làm với mục đích còn sử dụng PivotTable để tổng hợp số trường hợp được giảm giá theo từng chương trình Khuyến mãi.
 

File đính kèm

Upvote 0
Dạ, em cảm ơn anh @be09 nhiều ạ.
Để áp dụng cho nhiều chương trình khuyến mãi khác thì bạn sửa nội dung F3: F5 của sheet danh muc, tại đây tôi dùng Name có tên là Ten_ChuongTrinh để gán cho Validation ở cột I của sheet thong ke bạn chỉ việc chọn 1 chương trình phù hợp với 1 đợt khuyến mãi.
 
Upvote 0
Để áp dụng cho nhiều chương trình khuyến mãi khác thì bạn sửa nội dung F3: F5 của sheet danh muc, tại đây tôi dùng Name có tên là Ten_ChuongTrinh để gán cho Validation ở cột I của sheet thong ke bạn chỉ việc chọn 1 chương trình phù hợp với 1 đợt khuyến mãi.

Dạ, em hiểu ý anh rùi ạ. Em cảm ơn anh nhiều lắm ạ.
 
Upvote 0
Thay đổi một chút.
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:J" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = Array(tbGiamGia(i, 3), tbGiamGia(i, 4))
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 2)
 
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))(0)
            tbKetQua(i, 2) = Dic.Item(tbThongKe(i, 1))(1)
        End If
    Next i
    .Range("G2").Resize(lr, 2) = tbKetQua
End With

End Sub

Dạ, anh có thể xem giúp em thêm trường hợp là: array(Array(tbGiamGia(i, 3), tbGiamGia(i, 4))) chỉ lưu được 2 cột. Trường hợp em cần dò tìm 3 cột và đưa vào sheet thong ke thì em không thể dùng array được ạ. Khi nào anh có thời gian, anh xem giúp em ạ. Em cảm ơn anh nhiều ạ.
 
Upvote 0
Thay đổi một chút.
PHP:
Sub GiamGia()
Dim i As Long, j As Long, lr As Long
Dim Dic As Object
Dim tbGiamGia, tbThongKe, tbKetQua
Set Dic = CreateObject("scripting.dictionary")

With Sheets("danh muc")
    lr = .Range("G" & .Rows.Count).End(xlUp).Row
    tbGiamGia = .Range("G2:J" & lr).Value2
    For i = 1 To UBound(tbGiamGia)
        For j = tbGiamGia(i, 1) To tbGiamGia(i, 2)
          Dic.Item(j) = Array(tbGiamGia(i, 3), tbGiamGia(i, 4))
        Next
    Next i
End With

With Sheets("thong ke")
    lr = .Range("C" & .Rows.Count).End(xlUp).Row
    tbThongKe = .Range("C2:C" & lr).Value2
    lr = UBound(tbThongKe)
    ReDim tbKetQua(1 To lr, 1 To 2)
 
    For i = 1 To lr
        If Dic.exists(tbThongKe(i, 1)) Then
            tbKetQua(i, 1) = Dic.Item(tbThongKe(i, 1))(0)
            tbKetQua(i, 2) = Dic.Item(tbThongKe(i, 1))(1)
        End If
    Next i
    .Range("G2").Resize(lr, 2) = tbKetQua
End With

End Sub
Dạ, em định viết giống như sau ạ:
If Not Dic.exists(....)Then
k = k + 1
Dic.Add ......,k
arr_D(k, 1) = arr_N(i, 1)
arr_D(k, 2) = arr_N(i, 2)
arr_D(k, 3) = arr_N(i, 3)
End If
Bai #1, Chỗ ..... em không biết điền arr_N(i,1) hay arr_N(i,2)... vô ạ, của anh là tbgiamgia. Vì công việc của em có nhiều khi dò lấy trên 2 kết quả. Bài này em vướng ở chỗ sheet thong ke và sheet danh muc, e dò ngày nhưng dò trong khoảng ạ. Em làm theo cách của anh dò đến kết quả thứ 3 không được ạ. E đưa vô array chỉ được 2 thôi ạ.
 
Upvote 0
Bạn thử Code này, có thể bạn sẽ dễ tùy chỉnh thêm nhiều cột kết quả hơn.
PHP:
Option Explicit

Sub s_Gpe()
Dim Dic As Object, sArr(), dArr(), tArr()
Dim I As Long, J As Long, K As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
    ' ===========Sheet danh muc 4 cot'
    tArr = Sheets("danh muc").Range("G1", Sheets("danh muc").Range("G10000").End(xlUp)).Resize(, 4).Value
    If UBound(tArr) = 1 Then Exit Sub
    For I = 2 To UBound(tArr)
        For J = tArr(I, 1) To tArr(I, 2)
          Dic.Item(J) = I   '==========Cac ngay co chuong trinh khuyen mai'
        Next J
    Next I
With Sheets("thong ke")
    sArr = .Range("C2", .Range("C10000").End(xlUp)).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 2)      'Ket qua muon lay co 2 cot'
    For I = 1 To R
        If Dic.Exists(sArr(I, 1)) Then
            dArr(I, 1) = tArr(Dic.Item(sArr(I, 1)), 3)  'Ket qua cot 1:Giam gia'
            dArr(I, 2) = tArr(Dic.Item(sArr(I, 1)), 4)  'Ket qua cot 2:Ten Chuong trinh'
        End If
    Next I
    .Range("G2").Resize(R, 2) = dArr
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn thử Code này, có thể bạn sẽ dễ tùy chỉnh thêm nhiều cột kết quả hơn.
PHP:
Option Explicit

Sub s_Gpe()
Dim Dic As Object, sArr(), dArr(), tArr()
Dim I As Long, J As Long, K As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
    ' ===========Sheet danh muc 4 cot'
    tArr = Sheets("danh muc").Range("G1", Sheets("danh muc").Range("G10000").End(xlUp)).Resize(, 4).Value
    If UBound(tArr) = 1 Then Exit Sub
    For I = 2 To UBound(tArr)
        For J = tArr(I, 1) To tArr(I, 2)
          Dic.Item(J) = I   '==========Cac ngay co chuong trinh khuyen mai'
        Next J
    Next I
With Sheets("thong ke")
    sArr = .Range("C2", .Range("C10000").End(xlUp)).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 2)      'Ket qua muon lay co 2 cot'
    For I = 1 To R
        If Dic.Exists(sArr(I, 1)) Then
            dArr(I, 1) = tArr(Dic.Item(sArr(I, 1)), 3)  'Ket qua cot 1:Giam gia'
            dArr(I, 2) = tArr(Dic.Item(sArr(I, 1)), 4)  'Ket qua cot 2:Ten Chuong trinh'
        End If
    Next I
    .Range("G2").Resize(R, 2) = dArr
End With
Set Dic = Nothing
End Sub

Dạ, con làm theo cách của bác ra rồi ạ. Con cảm ơn bác @Ba Tê nhiều lắm ạ.
 
Upvote 0
Dạ, em định viết giống như sau ạ:
If Not Dic.exists(....)Then
k = k + 1
Dic.Add ......,k
arr_D(k, 1) = arr_N(i, 1)
arr_D(k, 2) = arr_N(i, 2)
arr_D(k, 3) = arr_N(i, 3)
End If
Bai #1, Chỗ ..... em không biết điền arr_N(i,1) hay arr_N(i,2)... vô ạ, của anh là tbgiamgia. Vì công việc của em có nhiều khi dò lấy trên 2 kết quả. Bài này em vướng ở chỗ sheet thong ke và sheet danh muc, e dò ngày nhưng dò trong khoảng ạ. Em làm theo cách của anh dò đến kết quả thứ 3 không được ạ. E đưa vô array chỉ được 2 thôi ạ.
Thử code
Cột G sheet "danh muc" phải xếp thứ tự theo thời gian
Mã:
Sub ABC()
  Dim i&, j&, sRow&, ik
  Dim Rng As Range, ngayMua(), Res()
  Const sCol& = 3 'So cot lay du lieu

  With Sheets("danh muc")
    Set Rng = .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
  End With
  With Sheets("thong ke")
    ngayMua = .Range("C2", .Range("C" & .Rows.Count).End(xlUp)).Value2
    sRow = UBound(ngayMua)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      ik = Application.Match(ngayMua(i, 1), Rng.Value2)
      If IsNumeric(ik) Then
        If ngayMua(i, 1) <= Rng(ik, 1).Offset(, 1).Value2 Then
          For j = 1 To sCol
            Res(i, j) = Rng(ik, 1).Offset(, j + 1).Value2
          Next j
        End If
      End If
    Next i
    .Range("G2").Resize(sRow, sCol) = Res
  End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thử code
Mã:
Sub ABC()
  Dim i&, j&, sRow&, ik
  Dim Rng As Range, ngayMua(), Res()
  Const sCol& = 3 'So cot lay du lieu

  With Sheets("danh muc")
    Set Rng = .Range("G2", .Range("G" & .Rows.Count).End(xlUp))
  End With
  With Sheets("thong ke")
    ngayMua = .Range("C2", .Range("C" & .Rows.Count).End(xlUp)).Value2
    sRow = UBound(ngayMua)
    ReDim Res(1 To sRow, 1 To sCol)
    For i = 1 To sRow
      ik = Application.Match(ngayMua(i, 1), Rng.Value2)
      If IsNumeric(ik) Then
        If ngayMua(i, 1) <= Rng(ik, 1).Offset(, 1).Value2 Then
          For j = 1 To sCol
            Res(i, j) = Rng(ik, 1).Offset(, j + 1).Value2
          Next j
        End If
      End If
    Next i
    .Range("G2").Resize(sRow, sCol) = Res
  End With
End Sub

dạ, em cảm ơn Thầy @HieuCD nhiều ạ.
Bài đã được tự động gộp:

Lỡ khai báo biến K mà không xài.
Xem file này "vui" hơn nè.

Dạ, con cảm ơn Bác@ba tê nhiều ạ. Nhưng bác ơi, con có viết code vào file dò tìm thuế TNCN mà trước đây con dùng nhiều IF lồng nhau để viết ạ. Con thấy cách dò giống file này nhưng khi con chạy code, code quay vòng vòng, không ra kết quả ạ. Bác có thể xem giúp con với ạ. Con định mở chủ đề khác nhưng vì con thấy cách vận dụng code và ví dụ giống bài trên ạ.

Sub thongke03(Dic As Object, arr_D())
Dim i As Long, dcuoi As Long
Dim arr_N()

dcuoi = Sheet1.Range("G10000").End(xlUp).Row
arr_N = Sheet1.Range("G2:J" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 3)
For i = 1 To UBound(arr_N, 1)
For j = arr_N(i, 1) To arr_N(i, 2)
Dic.Item(j) = i
Next

Next
End Sub
Sub dotim()
Dim i As Long, dcuoi As Long, j As Long, ii As Long
Dim arr_N()
Dim arr_D(), arr_Dotim()
Dim Dic As Object
Set Dic = CreateObject("scripting.dictionary")
Call thongke03(Dic, arr_Dotim)

dcuoi = Sheet1.Range("B10000").End(xlUp).Row
arr_N = Sheet1.Range("B2:B" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 2)

For i = 1 To UBound(arr_N, 1)
If Dic.exists(arr_N(i, 1)) Then
j = Dic.Item(arr_N(i, 1))
arr_D(i, 1) = arr_Dotim(j, 3)
arr_D(i, 2) = arr_Dotim(j, 4)

End If
Next
Sheet1.Range("C2:D1000").Clear
Sheet1.Range("C2").Resize(UBound(arr_N, 1), 2) = arr_D
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
dạ, em cảm ơn Thầy @HieuCD nhiều ạ.
Bài đã được tự động gộp:



Dạ, con cảm ơn Bác@ba tê nhiều ạ. Nhưng bác ơi, con có viết code vào file dò tìm thuế TNCN mà trước đây con dùng nhiều IF lồng nhau để viết ạ. Con thấy cách dò giống file này nhưng khi con chạy code, code quay vòng vòng, không ra kết quả ạ. Bác có thể xem giúp con với ạ. Con định mở chủ đề khác nhưng vì con thấy cách vận dụng code và ví dụ giống bài trên ạ.

Sub thongke03(Dic As Object, arr_D())
Dim i As Long, dcuoi As Long
Dim arr_N()

dcuoi = Sheet1.Range("G10000").End(xlUp).Row
arr_N = Sheet1.Range("G2:J" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 3)
For i = 1 To UBound(arr_N, 1)
For j = arr_N(i, 1) To arr_N(i, 2)
Dic.Item(j) = i
Next

Next
End Sub
Sub dotim()
Dim i As Long, dcuoi As Long, j As Long, ii As Long
Dim arr_N()
Dim arr_D(), arr_Dotim()
Dim Dic As Object
Set Dic = CreateObject("scripting.dictionary")
Call thongke03(Dic, arr_Dotim)

dcuoi = Sheet1.Range("B10000").End(xlUp).Row
arr_N = Sheet1.Range("B2:B" & dcuoi)
ReDim arr_D(1 To UBound(arr_N, 1), 1 To 2)

For i = 1 To UBound(arr_N, 1)
If Dic.exists(arr_N(i, 1)) Then
j = Dic.Item(arr_N(i, 1))
arr_D(i, 1) = arr_Dotim(j, 3)
arr_D(i, 2) = arr_Dotim(j, 4)

End If
Next
Sheet1.Range("C2:D1000").Clear
Sheet1.Range("C2").Resize(UBound(arr_N, 1), 2) = arr_D
End Sub
Tôi đâu phải cùng ngành với bạn, bạn đưa file không có 1 ghi chú, không có kết quả mẫu muốn có v.v... làm sao biết đường mà mò.
Code viết quay mòng mòng mà biểu xem thì cũng như không, vì đâu có ra kết quả mà hình dung cách viết.
 
Upvote 0
Tôi đâu phải cùng ngành với bạn, bạn đưa file không có 1 ghi chú, không có kết quả mẫu muốn có v.v... làm sao biết đường mà mò.
Code viết quay mòng mòng mà biểu xem thì cũng như không, vì đâu có ra kết quả mà hình dung cách viết.

Dạ, con xin lỗi ạ. Con gửi Bác file đính kèm ạ, trong file con có mô tả ạ. Vùng màu xanh là kết quả ạ. Bác xem giúp con ạ. Con cảm ơn Bác.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom