اذهب الي المحتوي
أوفيسنا

حماية خلايا بدون حماية الشيت


الردود الموصى بها

الكثيرون لحماية الخلايا يستعملون حماية الشيت  (Protect Sheet) 

لكن  في نطاق معين (تختاره بواسطة الكود) كيف يمكن ان نستعمل الخلية مرة واحدة فقط
     بحيث لا يمكن مسحها ولا التعديل عليها   فيما بعد الا اذا تم توقيف الكود عن العمل  كل ذلك بدون ( Protect Sheet) 
 

  الكود

Option Explicit
 Dim Old_value
 Dim New_value

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Old_value = Target.Cells(1, 1).Value
 End Sub
'==============================================
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo Final_Step
If Intersect(Target, Range("A1:F12")) Is Nothing Then GoTo Final_Step
   New_value = Target.Value
    If Old_value = "" And Target.Cells.Count > 1 Then
     Application.Undo
     GoTo Final_Step
    End If
     If Old_value = "" Then
      Target.Value = New_value
      Else
     Application.Undo
    End If
Final_Step:
 Application.EnableEvents = True
End Sub

الملف تحت التصّرف

 

Protect_without Protect.xlsm

  • Like 4
رابط هذا التعليق
شارك

أحسنت استاذ سليم بارك الله فيك وجعل الله هذا العمل فى ميزان حسناتك

وجعلك دائما زخرا لنا وافاض الله عليك من كرمه وزادك من علمه وادامك الله لنا دائما عونا فى هذا المنتدى الكريم ولا تحرمنا دائما من كرمك وطلاتك علينا جزاك الله كل خير

  • Like 1
رابط هذا التعليق
شارك

ممتاز استاذنا لكن لو وضعت زر لتصفير الخلايا يكون أفضل ... فقد نحتاج إلى تصفير الشيت بعد انتهاء مرحلة معينة وإعادته لطبيعته للعمل به من جديد فهل ذلك ممكن وأشكرك على مجهودك الطيب جعله الله في ميزان حسناتك

  • Like 1
رابط هذا التعليق
شارك

2 ساعات مضت, Khalf said:

أغبطك على معرفتك ... بارك الله بك

ملف مميز و  لكن لدى التجربة

تبين أن إعادة الكتابة أو مسح محتويات الخلية لمرتين  يسمح بالتعديل .

 

 

تم التعديل على الكود لمنع هذا الشي

Option Explicit
 Dim Old_value
 Dim New_value

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Old_value = Target.Cells(1, 1).Value
 End Sub
'==============================================
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo Final_Step
If Intersect(Target, Range("A1:F12")) Is Nothing Then GoTo Final_Step
   New_value = Target.Value
    If Target.Cells.Count > 1 Then
      Application.Undo
     GoTo Final_Step
    End If
    If Old_value = "" And Target.Cells.Count > 1 Then
     Application.Undo
     GoTo Final_Step
    End If
     If Old_value = "" Then
      Target.Value = New_value
      Else
     Application.Undo
    End If
Final_Step:
 Application.EnableEvents = True
End Sub

 

  • Thanks 1
رابط هذا التعليق
شارك

يعطيك العافية على مجهودك الرائع

ولكن وجدت ثغرة اثناء تجربة الملف وهي من الممكن حذف محتويات الخلية بالطرية التالية:

1 تحديد الخلية

2 الضغط على مفتاح Backspace

3 ثم الضغط على Delete

4 الضغط على Enter

5 ثم الضغط على Delete مرة اخرى 

Protect_without Protect.xlsm

رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information