Option Explicit
Function GiaFifo(SL_Xuat As Double, sMaHH As String, RngData As Range, MaCol As Long, SLNhapCol As Long, SLXuatCol As Long, DGNhapCol As Long, Optional TT As Boolean = False)
On Error GoTo Exit_UDF
Dim TongXuat As Double, TongNhap As Double
Dim i As Long, s As Long, j As Long
Dim GiaXuat(), ArrData(), ArrSlNh(), ArrDgNh()
If SL_Xuat = 0 Or Len(sMaHH) = 0 Then
GiaFifo = ""
GoTo Exit_UDF
End If
ArrData() = RngData.Value
TongXuat = 0: s = 0
For i = 1 To UBound(ArrData) - 1
If ArrData(i, MaCol) = sMaHH Then
s = s + 1
ReDim Preserve ArrSlNh(1 To s): ReDim Preserve ArrDgNh(1 To s)
ArrSlNh(s) = ArrData(i, SLNhapCol)
ArrDgNh(s) = ArrData(i, DGNhapCol)
TongXuat = TongXuat + ArrData(i, SLXuatCol)
End If
Next i
If s = 0 Then
GiaFifo = ""
GoTo Exit_UDF
End If
TongNhap = 0: j = 0
For i = 1 To s
TongNhap = TongNhap + ArrSlNh(i)
If TongNhap > TongXuat Then
j = j + 1
ReDim Preserve GiaXuat(1 To j)
If TongNhap - TongXuat >= SL_Xuat Then
GiaXuat(j) = "(" & SL_Xuat & "*" & ArrDgNh(i) & ")"
Exit For
Else
GiaXuat(j) = "(" & (TongNhap - TongXuat) & "*" & ArrDgNh(i) & ")"
SL_Xuat = SL_Xuat - (TongNhap - TongXuat)
TongXuat = TongNhap
End If
End If
Next i
GiaFifo = Join(GiaXuat, "+")
If TT = True Then
GiaFifo = Evaluate(GiaFifo)
End If
Erase GiaXuat
Exit_UDF:
Erase ArrData(), ArrSlNh(), ArrDgNh()
If Err <> 0 Then
MsgBox Err.Description, vbCritical
Exit Function
End If
End Function
Như tựa chủ đề em xin nhờ các cao nhân giải thích giúp em dòng code này với ạ em mới học nên không thông được cám ơn các cao nhân đã ghé qua. Thanks!
Function GiaFifo(SL_Xuat As Double, sMaHH As String, RngData As Range, MaCol As Long, SLNhapCol As Long, SLXuatCol As Long, DGNhapCol As Long, Optional TT As Boolean = False)
On Error GoTo Exit_UDF
Dim TongXuat As Double, TongNhap As Double
Dim i As Long, s As Long, j As Long
Dim GiaXuat(), ArrData(), ArrSlNh(), ArrDgNh()
If SL_Xuat = 0 Or Len(sMaHH) = 0 Then
GiaFifo = ""
GoTo Exit_UDF
End If
ArrData() = RngData.Value
TongXuat = 0: s = 0
For i = 1 To UBound(ArrData) - 1
If ArrData(i, MaCol) = sMaHH Then
s = s + 1
ReDim Preserve ArrSlNh(1 To s): ReDim Preserve ArrDgNh(1 To s)
ArrSlNh(s) = ArrData(i, SLNhapCol)
ArrDgNh(s) = ArrData(i, DGNhapCol)
TongXuat = TongXuat + ArrData(i, SLXuatCol)
End If
Next i
If s = 0 Then
GiaFifo = ""
GoTo Exit_UDF
End If
TongNhap = 0: j = 0
For i = 1 To s
TongNhap = TongNhap + ArrSlNh(i)
If TongNhap > TongXuat Then
j = j + 1
ReDim Preserve GiaXuat(1 To j)
If TongNhap - TongXuat >= SL_Xuat Then
GiaXuat(j) = "(" & SL_Xuat & "*" & ArrDgNh(i) & ")"
Exit For
Else
GiaXuat(j) = "(" & (TongNhap - TongXuat) & "*" & ArrDgNh(i) & ")"
SL_Xuat = SL_Xuat - (TongNhap - TongXuat)
TongXuat = TongNhap
End If
End If
Next i
GiaFifo = Join(GiaXuat, "+")
If TT = True Then
GiaFifo = Evaluate(GiaFifo)
End If
Erase GiaXuat
Exit_UDF:
Erase ArrData(), ArrSlNh(), ArrDgNh()
If Err <> 0 Then
MsgBox Err.Description, vbCritical
Exit Function
End If
End Function
Như tựa chủ đề em xin nhờ các cao nhân giải thích giúp em dòng code này với ạ em mới học nên không thông được cám ơn các cao nhân đã ghé qua. Thanks!


