Code VBA tra lãi suất theo sản phẩm và thời gian cho trước.

Liên hệ QC

myly

Thành viên mới
Tham gia
25/7/08
Bài viết
33
Được thích
0
Chào mọi người, em đang suy nghĩ về cách viết code VBA để tra lãi suất theo sản phẩm và thời gian cho trước mà nghĩ vẫn chưa ra được. Nay em post file này lên đây hi vọng nếu anh chị nào đã từng biết qua cách viết code cho bài này có thể hướng dẫn giúp em xử lý bài toán này.
Trong file em gửi, em muốn viết Code để chạy ra kết quả như cột K. Em muốn code chạy theo hướng Khung tra điều kiện cho vùng tham chiếu từ C4:F28 để sau này em có thể sử dụng 1 code này cho thêm nhiều dữ liệu.
Xin chân thành cám ơn mọi người
 

File đính kèm

  • Send2forum.xlsx
    9.6 KB · Đọc: 29
Chào mọi người, em đang suy nghĩ về cách viết code VBA để tra lãi suất theo sản phẩm và thời gian cho trước mà nghĩ vẫn chưa ra được. Nay em post file này lên đây hi vọng nếu anh chị nào đã từng biết qua cách viết code cho bài này có thể hướng dẫn giúp em xử lý bài toán này.
Trong file em gửi, em muốn viết Code để chạy ra kết quả như cột K. Em muốn code chạy theo hướng Khung tra điều kiện cho vùng tham chiếu từ C4:F28 để sau này em có thể sử dụng 1 code này cho thêm nhiều dữ liệu.
Xin chân thành cám ơn mọi người
Có khả năng trùng ngày không bạn.Ví dụ có 1 mã mà thỏa mãn 2 ngày ấy.Dữ liệu thực tế có dài không bạn để còn lựa viết code.
 
Upvote 0
Không có khả năng trùng ngày đâu bạn. Và dữ liệu thực tế có thể rất dài nên mình mới nghĩ chỉ có cách viết code mới giải quyết được vấn đề này thôi. cám ơn bạn đã quan tâm
 
Upvote 0
Không có khả năng trùng ngày đâu bạn. Và dữ liệu thực tế có thể rất dài nên mình mới nghĩ chỉ có cách viết code mới giải quyết được vấn đề này thôi. cám ơn bạn đã quan tâm
Bạn thử code này nhé.
Mã:
Sub laygiatri()
    Dim arr, i As Long, dic As Object, kq, data, s As String, dk As String, lr As Long, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("sheet1")
         lr = .Range("C" & Rows.Count).End(xlUp).Row
         arr = .Range("C5:F" & lr).Value
         For i = 1 To UBound(arr)
             dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, i
             Else
                dic.Item(dk) = dic.Item(dk) & "#" & i
             End If
         Next i
         lr = .Range("I" & Rows.Count).End(xlUp).Row
         If lr < 5 Then Exit Sub
         data = .Range("I5:J" & lr).Value
         ReDim kq(1 To UBound(data), 1 To 1)
         For i = 1 To UBound(data)
             dk = data(i, 1)
             If dic.exists(dk) Then
                s = dic.Item(dk)
                For Each T In Split(s, "#")
                    If CLng(arr(T, 2)) <= CLng(data(i, 2)) And CLng(arr(T, 3)) >= CLng(data(i, 2)) Then
                       kq(i, 1) = arr(T, 4)
                       Exit For
                    End If
                Next
            End If
        Next i
           .Range("K5:K" & lr).Value = kq
  End With
 
Upvote 0
Bạn thử code này nhé.
Mã:
Sub laygiatri()
    Dim arr, i As Long, dic As Object, kq, data, s As String, dk As String, lr As Long, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("sheet1")
         lr = .Range("C" & Rows.Count).End(xlUp).Row
         arr = .Range("C5:F" & lr).Value
         For i = 1 To UBound(arr)
             dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, i
             Else
                dic.Item(dk) = dic.Item(dk) & "#" & i
             End If
         Next i
         lr = .Range("I" & Rows.Count).End(xlUp).Row
         If lr < 5 Then Exit Sub
         data = .Range("I5:J" & lr).Value
         ReDim kq(1 To UBound(data), 1 To 1)
         For i = 1 To UBound(data)
             dk = data(i, 1)
             If dic.exists(dk) Then
                s = dic.Item(dk)
                For Each T In Split(s, "#")
                    If CLng(arr(T, 2)) <= CLng(data(i, 2)) And CLng(arr(T, 3)) >= CLng(data(i, 2)) Then
                       kq(i, 1) = arr(T, 4)
                       Exit For
                    End If
                Next
            End If
        Next i
           .Range("K5:K" & lr).Value = kq
  End With
Cám ơn bạn Snow25 rất nhiều, code của bạn chạy ra đúng kết quả như mong muốn. Vì mình cũng mới bắt đầu tự học VBA gần đây nên trong đoạn code này có nhiều câu lệnh mình chưa biết. Mình sẽ nghiên cứu để học hỏi thêm. Một lần nữa cám ơn sự nhiệt tình giúp đỡ của Snow.
 
Upvote 0
Cám ơn bạn Snow25 rất nhiều, code của bạn chạy ra đúng kết quả như mong muốn. Vì mình cũng mới bắt đầu tự học VBA gần đây nên trong đoạn code này có nhiều câu lệnh mình chưa biết. Mình sẽ nghiên cứu để học hỏi thêm. Một lần nữa cám ơn sự nhiệt tình giúp đỡ của Snow.
hi Snow, mình đã đọc và nghiền ngẫm code của bạn, có một số chỗ mình không hiểu được. Bạn có thể vui lòng ghi ra gợi ý giúp mình những dòng code mà bạn viết có nghĩa là gì không và code như thế để làm gì. Bạn chỉ giúp mình những dòng code tô đỏ nha. cám ơn bạn rất nhiều.

Sub laygiatri()
Dim arr, i As Long, dic As Object, kq, data, s As String, dk As String, lr As Long, T
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")

lr = .Range("C" & Rows.Count).End(xlUp).Row
arr = .Range("C5:F" & lr).Value

For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
dic.Add dk, i
Else
dic.Item(dk) = dic.Item(dk) & "#" & i
End If
Next i
lr = .Range("I" & Rows.Count).End(xlUp).Row
If lr < 5 Then Exit Sub
data = .Range("I5:J" & lr).Value
ReDim kq(1 To UBound(data), 1 To 1)
For i = 1 To UBound(data)
dk = data(i, 1)
If dic.exists(dk) Then
s = dic.Item(dk)
For Each T In Split(s, "#")
If CLng(arr(T, 2)) <= CLng(data(i, 2)) And CLng(arr(T, 3)) >= CLng(data(i, 2)) Then
kq(i, 1) = arr(T, 4)

Exit For
End If
Next
End If
Next i
.Range("K5:K" & lr).Value = kq
End With
End Sub
 
Upvote 0
hi Snow, mình đã đọc và nghiền ngẫm code của bạn, có một số chỗ mình không hiểu được. Bạn có thể vui lòng ghi ra gợi ý giúp mình những dòng code mà bạn viết có nghĩa là gì không và code như thế để làm gì. Bạn chỉ giúp mình những dòng code tô đỏ nha. cám ơn bạn rất nhiều.

Sub laygiatri()
Dim arr, i As Long, dic As Object, kq, data, s As String, dk As String, lr As Long, T
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")

lr = .Range("C" & Rows.Count).End(xlUp).Row
arr = .Range("C5:F" & lr).Value

For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
dic.Add dk, i
Else
dic.Item(dk) = dic.Item(dk) & "#" & i
End If
Next i
lr = .Range("I" & Rows.Count).End(xlUp).Row
If lr < 5 Then Exit Sub
data = .Range("I5:J" & lr).Value
ReDim kq(1 To UBound(data), 1 To 1)
For i = 1 To UBound(data)
dk = data(i, 1)
If dic.exists(dk) Then
s = dic.Item(dk)
For Each T In Split(s, "#")
If CLng(arr(T, 2)) <= CLng(data(i, 2)) And CLng(arr(T, 3)) >= CLng(data(i, 2)) Then
kq(i, 1) = arr(T, 4)

Exit For
End If
Next
End If
Next i
.Range("K5:K" & lr).Value = kq
End With
End Sub
Bạn tìm hiểu mảng và dictionary.
 
Upvote 0
Chào mọi người, em đang suy nghĩ về cách viết code VBA để tra lãi suất theo sản phẩm và thời gian cho trước mà nghĩ vẫn chưa ra được. Nay em post file này lên đây hi vọng nếu anh chị nào đã từng biết qua cách viết code cho bài này có thể hướng dẫn giúp em xử lý bài toán này.
Trong file em gửi, em muốn viết Code để chạy ra kết quả như cột K. Em muốn code chạy theo hướng Khung tra điều kiện cho vùng tham chiếu từ C4:F28 để sau này em có thể sử dụng 1 code này cho thêm nhiều dữ liệu.
Xin chân thành cám ơn mọi người
Xin chào mọi người, chủ đề này mình đã đăng lên và có bạn đã giải giúp mình nhưng thật sự là sau mấy ngày nghiền ngẫm mình vẫn không thể hiểu được code của bài này. Hi vọng bạn nào biết cách giải khác đơn giản hơn để giúp mình xin cám ơn ah. Cái mình thật sự cần không phải là kết quả mà là cách giải để mình có thể hiểu được tường tận. Mong mọi người giúp đỡ.
 
Upvote 0
Xin chào mọi người, chủ đề này mình đã đăng lên và có bạn đã giải giúp mình nhưng thật sự là sau mấy ngày nghiền ngẫm mình vẫn không thể hiểu được code của bài này. Hi vọng bạn nào biết cách giải khác đơn giản hơn để giúp mình xin cám ơn ah. Cái mình thật sự cần không phải là kết quả mà là cách giải để mình có thể hiểu được tường tận. Mong mọi người giúp đỡ.
Code bài #4 với giải thuật dùng Dic cao cấp khá phức tạp, nhằm tăng tốc độ xử lý
Mới làm quen với VBA dùng code đơn giản hơn, dữ liệu nhiều tốc độ chậm
Mã:
Sub ABC()
  Dim sArr(), dArr(), Res()
  Dim rRow As Long, i As Long, r As Long
  Dim iAcc As String, iDate As Date

  With Sheets("sheet1")
    sArr = .Range("C5", .Range("F" & Rows.Count).End(xlUp)).Value
    dArr = .Range("I5", .Range("J" & Rows.Count).End(xlUp)).Value
    ReDim Res(1 To UBound(dArr), 1 To 1)
    For i = 1 To UBound(dArr)
      iAcc = dArr(i, 1)
      iDate = dArr(i, 2)
      For r = 1 To UBound(sArr)
        If iDate >= sArr(r, 2) And iDate <= sArr(r, 3) Then
          If iAcc = sArr(r, 1) Then
            Res(i, 1) = sArr(r, 4)
            Exit For
          End If
        End If
      Next r
    Next i
    .Range("K5").Resize(UBound(dArr)).Value = Res
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người, em đang suy nghĩ về cách viết code VBA để tra lãi suất theo sản phẩm và thời gian cho trước mà nghĩ vẫn chưa ra được. Nay em post file này lên đây hi vọng nếu anh chị nào đã từng biết qua cách viết code cho bài này có thể hướng dẫn giúp em xử lý bài toán này.
Trong file em gửi, em muốn viết Code để chạy ra kết quả như cột K. Em muốn code chạy theo hướng Khung tra điều kiện cho vùng tham chiếu từ C4:F28 để sau này em có thể sử dụng 1 code này cho thêm nhiều dữ liệu.
Xin chân thành cám ơn mọi người
Bác @HieuCD@snow25 đã viết code đúng ý cho bạn rồi, tôi cũng không có ý kiến thêm về code.
Tôi góp vui thêm 1 chút là trường hợp này có thể đơn giản dùng công thức thông thường.
1 số lưu ý:
- Để bảng dữ liệu tra cứu ở dạng Table, khi bạn thêm dữ liệu thì vùng tra cứu tự động mở rộng;
- Xem công thức LOOKUP tôi đã viết ở cột L.
Chúc bạn thành công.
 

File đính kèm

  • Tra cuu lai suat.xlsx
    14.9 KB · Đọc: 8
Upvote 0
Code bài #4 với giải thuật dùng Dic cao cấp khá phức tạp, tăng tốc độ xử lý
Mới làm quen với VBA dùng code đơn giản hơn, dữ liệu nhiều tốc độ chậm
Mã:
Sub ABC()
  Dim sArr(), dArr(), Res()
  Dim rRow As Long, i As Long, r As Long
  Dim iAcc As String, iDate As Date

  With Sheets("sheet1")
    sArr = .Range("C5", .Range("F" & Rows.Count).End(xlUp)).Value
    dArr = .Range("I5", .Range("J" & Rows.Count).End(xlUp)).Value
    ReDim Res(1 To UBound(dArr), 1 To 1)
    For i = 1 To UBound(dArr)
      iAcc = dArr(i, 1)
      iDate = dArr(i, 2)
      For r = 1 To UBound(sArr)
        If iDate >= sArr(r, 2) And iDate <= sArr(r, 3) Then
          If iAcc = sArr(r, 1) Then
            Res(i, 1) = sArr(r, 4)
            Exit For
          End If
        End If
      Next r
    Next i
    .Range("K5").Resize(UBound(dArr)).Value = Res
  End With
End Sub
Cám ơn
Code bài #4 với giải thuật dùng Dic cao cấp khá phức tạp, nhằm tăng tốc độ xử lý
Mới làm quen với VBA dùng code đơn giản hơn, dữ liệu nhiều tốc độ chậm
Mã:
Sub ABC()
  Dim sArr(), dArr(), Res()
  Dim rRow As Long, i As Long, r As Long
  Dim iAcc As String, iDate As Date

  With Sheets("sheet1")
    sArr = .Range("C5", .Range("F" & Rows.Count).End(xlUp)).Value
    dArr = .Range("I5", .Range("J" & Rows.Count).End(xlUp)).Value
    ReDim Res(1 To UBound(dArr), 1 To 1)
    For i = 1 To UBound(dArr)
      iAcc = dArr(i, 1)
      iDate = dArr(i, 2)
      For r = 1 To UBound(sArr)
        If iDate >= sArr(r, 2) And iDate <= sArr(r, 3) Then
          If iAcc = sArr(r, 1) Then
            Res(i, 1) = sArr(r, 4)
            Exit For
          End If
        End If
      Next r
    Next i
    .Range("K5").Resize(UBound(dArr)).Value = Res
  End With
End Sub
Xin cám ơn rất nhiều ah. Thật sự là đang vò đầu bức tóc không biết làm thế nào, cách viết này có vẻ giúp em dễ tiếp thu hơn ah. Vì thật sự là mới chuyên tâm học VBA mới được khoảng 1 tháng thôi nên rất cần những cái đơn giản dễ hiểu ah. Em sẽ tiếp tục nghiên cứu và nếu có gì không hiểu sẽ nhờ chỉ giáo thêm ah.
Bài đã được tự động gộp:

Bác @HieuCD@snow25 đã viết code đúng ý cho bạn rồi, tôi cũng không có ý kiến thêm về code.
Tôi góp vui thêm 1 chút là trường hợp này có thể đơn giản dùng công thức thông thường.
1 số lưu ý:
- Để bảng dữ liệu tra cứu ở dạng Table, khi bạn thêm dữ liệu thì vùng tra cứu tự động mở rộng;
- Xem công thức LOOKUP tôi đã viết ở cột L.
Chúc bạn thành công.
Dạ xin cám ơn đã chỉ em thêm cách thứ 2 ah. Em cũng sẽ dùng VBA để nhập công thức excel này vào sau đó copy từ trên xuống dưới luôn :)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử code này nhé.
Mã:
Sub laygiatri()
    Dim arr, i As Long, dic As Object, kq, data, s As String, dk As String, lr As Long, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("sheet1")
         lr = .Range("C" & Rows.Count).End(xlUp).Row
         arr = .Range("C5:F" & lr).Value
         For i = 1 To UBound(arr)
             dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, i
             Else
                dic.Item(dk) = dic.Item(dk) & "#" & i
             End If
         Next i
         lr = .Range("I" & Rows.Count).End(xlUp).Row
         If lr < 5 Then Exit Sub
         data = .Range("I5:J" & lr).Value
         ReDim kq(1 To UBound(data), 1 To 1)
         For i = 1 To UBound(data)
             dk = data(i, 1)
             If dic.exists(dk) Then
                s = dic.Item(dk)
                For Each T In Split(s, "#")
                    If CLng(arr(T, 2)) <= CLng(data(i, 2)) And CLng(arr(T, 3)) >= CLng(data(i, 2)) Then
                       kq(i, 1) = arr(T, 4)
                       Exit For
                    End If
                Next
            End If
        Next i
           .Range("K5:K" & lr).Value = kq
  End With
Code viết bằng scripting.dictionary nhìn rất hay nhưng thật sự khó ạ. Ngồi ngẫm ngẫm với tra cứu mà vẫn thấy khó ạ !
 
Upvote 0
Web KT

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

Back
Top Bottom