Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False On Error GoTo ErrorHandler If Not Intersect(Target, Me.Range("A:L")) Is Nothing Then Call CalculateFIFO End If Application.EnableEvents = True Exit Sub ErrorHandler: Application.EnableEvents = True MsgBox "حدث خطأ: " & Err.Description End Sub Sub CalculateFIFO() On Error GoTo ErrorHandler Dim ws As Worksheet Dim lastRow As Long Dim i As Long, j As Long, currentRow As Long Dim itemCode As String Dim qtyToIssue As Double Dim totalCost As Double Dim remainingQty As Double Dim totalQtyAvailable As Double Dim supplyList As Object Set supplyList = CreateObject("Scripting.Dictionary")
Set ws = ThisWorkbook.Sheets("Sheet1") If ws Is Nothing Then MsgBox "لم يتم العثور على الورقة المحددة." Exit Sub End If
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row If lastRow < 2 Then MsgBox "لا توجد بيانات كافية في الورقة." Exit Sub End If
' تحضير الكميات Debug.Print "تحضير الكميات المتاحة" For j = 2 To lastRow If ws.Cells(j, "E").Value = "إضافة" Then itemCode = ws.Cells(j, "A").Value remainingQty = ws.Cells(j, "D").Value supplyList(itemCode & "_" & j) = Array(remainingQty, ws.Cells(j, "F").Value) Debug.Print "تمت إضافة: " & itemCode & " كمية: " & remainingQty & " بسعر: " & ws.Cells(j, "F").Value ' حساب إجمالي قيمة الشراء لكل عملية شراء ووضعها في العمود L ws.Cells(j, "L").Value = remainingQty * ws.Cells(j, "F").Value End If Next j
' تنفيذ عملية الصرف Debug.Print "تنفيذ عملية الصرف" For i = 2 To lastRow If ws.Cells(i, "E").Value = "صرف" Then itemCode = ws.Cells(i, "A").Value If IsNumeric(ws.Cells(i, "D").Value) And ws.Cells(i, "D").Value > 0 Then qtyToIssue = ws.Cells(i, "D").Value Else qtyToIssue = 0 End If totalCost = 0 totalQtyAvailable = 0
' حساب الكميات المتاحة For Each Key In supplyList.Keys If InStr(1, Key, itemCode) > 0 Then totalQtyAvailable = totalQtyAvailable + supplyList(Key)(0) End If Next Key
' التحقق من توفر الكمية الكافية Debug.Print "الصنف: " & itemCode & " | الكمية المطلوبة: " & qtyToIssue & " | الكمية المتاحة: " & totalQtyAvailable If qtyToIssue > totalQtyAvailable Then MsgBox "الرصيد غير كافي للصرف للصنف: " & itemCode ws.Cells(i, "G").Value = "N/A" ws.Cells(i, "M").Value = "N/A" Debug.Print "الصنف: " & itemCode & " الرصيد غير كافي للصرف." GoTo NextRow Else For Each Key In supplyList.Keys If InStr(1, Key, itemCode) > 0 Then currentRow = Val(Mid(Key, InStrRev(Key, "_") + 1)) remainingQty = supplyList(Key)(0) If remainingQty > qtyToIssue Then totalCost = totalCost + qtyToIssue * supplyList(Key)(1) supplyList(Key)(0) = remainingQty - qtyToIssue qtyToIssue = 0 Else totalCost = totalCost + remainingQty * supplyList(Key)(1) qtyToIssue = qtyToIssue - remainingQty supplyList.Remove Key End If Debug.Print "معالجة الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | الكمية المصروفة: " & qtyToIssue & " | الكمية المتبقية: " & remainingQty End If If qtyToIssue = 0 Then Exit For Next Key
If ws.Cells(i, "D").Value > 0 Then ws.Cells(i, "G").Value = totalCost / ws.Cells(i, "D").Value Else ws.Cells(i, "G").Value = 0 End If ' عرض التكلفة الإجمالية في العمود M ws.Cells(i, "M").Value = totalCost
Debug.Print "الصف: " & i & " | الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | السعر المحسوب: " & ws.Cells(i, "G").Value End If End If NextRow: Next i Exit Sub ErrorHandler: Application.EnableEvents = True MsgBox "حدث خطأ أثناء الحساب: " & Err.Description End Sub
شغل عالى اوى اوى ده يا كبير
❤❤
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo ErrorHandler
If Not Intersect(Target, Me.Range("A:L")) Is Nothing Then
Call CalculateFIFO
End If
Application.EnableEvents = True
Exit Sub
ErrorHandler:
Application.EnableEvents = True
MsgBox "حدث خطأ: " & Err.Description
End Sub
Sub CalculateFIFO()
On Error GoTo ErrorHandler
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long, currentRow As Long
Dim itemCode As String
Dim qtyToIssue As Double
Dim totalCost As Double
Dim remainingQty As Double
Dim totalQtyAvailable As Double
Dim supplyList As Object
Set supplyList = CreateObject("Scripting.Dictionary")
Set ws = ThisWorkbook.Sheets("Sheet1")
If ws Is Nothing Then
MsgBox "لم يتم العثور على الورقة المحددة."
Exit Sub
End If
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If lastRow < 2 Then
MsgBox "لا توجد بيانات كافية في الورقة."
Exit Sub
End If
' تحضير الكميات
Debug.Print "تحضير الكميات المتاحة"
For j = 2 To lastRow
If ws.Cells(j, "E").Value = "إضافة" Then
itemCode = ws.Cells(j, "A").Value
remainingQty = ws.Cells(j, "D").Value
supplyList(itemCode & "_" & j) = Array(remainingQty, ws.Cells(j, "F").Value)
Debug.Print "تمت إضافة: " & itemCode & " كمية: " & remainingQty & " بسعر: " & ws.Cells(j, "F").Value
' حساب إجمالي قيمة الشراء لكل عملية شراء ووضعها في العمود L
ws.Cells(j, "L").Value = remainingQty * ws.Cells(j, "F").Value
End If
Next j
' تنفيذ عملية الصرف
Debug.Print "تنفيذ عملية الصرف"
For i = 2 To lastRow
If ws.Cells(i, "E").Value = "صرف" Then
itemCode = ws.Cells(i, "A").Value
If IsNumeric(ws.Cells(i, "D").Value) And ws.Cells(i, "D").Value > 0 Then
qtyToIssue = ws.Cells(i, "D").Value
Else
qtyToIssue = 0
End If
totalCost = 0
totalQtyAvailable = 0
' حساب الكميات المتاحة
For Each Key In supplyList.Keys
If InStr(1, Key, itemCode) > 0 Then
totalQtyAvailable = totalQtyAvailable + supplyList(Key)(0)
End If
Next Key
' التحقق من توفر الكمية الكافية
Debug.Print "الصنف: " & itemCode & " | الكمية المطلوبة: " & qtyToIssue & " | الكمية المتاحة: " & totalQtyAvailable
If qtyToIssue > totalQtyAvailable Then
MsgBox "الرصيد غير كافي للصرف للصنف: " & itemCode
ws.Cells(i, "G").Value = "N/A"
ws.Cells(i, "M").Value = "N/A"
Debug.Print "الصنف: " & itemCode & " الرصيد غير كافي للصرف."
GoTo NextRow
Else
For Each Key In supplyList.Keys
If InStr(1, Key, itemCode) > 0 Then
currentRow = Val(Mid(Key, InStrRev(Key, "_") + 1))
remainingQty = supplyList(Key)(0)
If remainingQty > qtyToIssue Then
totalCost = totalCost + qtyToIssue * supplyList(Key)(1)
supplyList(Key)(0) = remainingQty - qtyToIssue
qtyToIssue = 0
Else
totalCost = totalCost + remainingQty * supplyList(Key)(1)
qtyToIssue = qtyToIssue - remainingQty
supplyList.Remove Key
End If
Debug.Print "معالجة الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | الكمية المصروفة: " & qtyToIssue & " | الكمية المتبقية: " & remainingQty
End If
If qtyToIssue = 0 Then Exit For
Next Key
If ws.Cells(i, "D").Value > 0 Then
ws.Cells(i, "G").Value = totalCost / ws.Cells(i, "D").Value
Else
ws.Cells(i, "G").Value = 0
End If
' عرض التكلفة الإجمالية في العمود M
ws.Cells(i, "M").Value = totalCost
Debug.Print "الصف: " & i & " | الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | السعر المحسوب: " & ws.Cells(i, "G").Value
End If
End If
NextRow:
Next i
Exit Sub
ErrorHandler:
Application.EnableEvents = True
MsgBox "حدث خطأ أثناء الحساب: " & Err.Description
End Sub