طيب .. رغم أن الطلب تم تحقيقه من خلال Data Validation ، ولكن هذا لا يمنع من تجربة الفكرة التالية من خلال الأكواد . حيث تم دمج الحدث عند التغيير للورقة من :-
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("B3:B3000")) Is Nothing Then
With Target(1, 5)
.Value = Date & " " & Time
.EntireColumn.AutoFit
End With
End If
ليصبح :-
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Or Target.Row < 3 Then Exit Sub
If Target.Column = 2 And Target.Value <> "" Then Target.Offset(0, 4).Value = Now
If (Target.Column = 4 Or Target.Column = 5) And Trim(Me.Cells(Target.Row, "D").Value) = "بيع" Then
Dim r As Long: r = Target.Row
Dim itemCode As Variant: itemCode = Me.Cells(r, "B").Value
Dim qty As Double: qty = Val(Me.Cells(r, "E").Value)
If Not IsEmpty(itemCode) And qty > 0 Then
Dim stockSheet As Worksheet: Set stockSheet = Worksheets("المخزن")
Dim findCell As Range
Set findCell = stockSheet.Range("B3:B800").Find(What:=itemCode, LookIn:=xlValues, LookAt:=xlWhole)
If Not findCell Is Nothing Then
Dim realAvailableStock As Double
realAvailableStock = Val(stockSheet.Range("I" & findCell.Row).Value) + qty
If qty > realAvailableStock Then
MsgBox "• لا يمكنك إتمام عملية البيع هذه" & vbCrLf & vbCrLf & _
"• الصنــف: " & Me.Cells(r, "C").Value & vbCrLf & _
"• الرصيد المتاح حالياً: " & realAvailableStock & " قطعة" & vbCrLf & _
"• الكمية المطلوبة: " & qty & " قطعة", _
vbCritical + vbMsgBoxRight + vbMsgBoxRtlReading, "تجاوز الرصيد"
Application.EnableEvents = False
Me.Cells(r, "E").ClearContents
Me.Cells(r, "E").Select
Application.EnableEvents = True
End If
End If
End If
End If
End Sub
ملفك بعد التطبيق :-
مخزن 1.xlsb