اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

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

قام بنشر

السلام عليكم ...

أحياناً قد نحتاج للقيام بعملية EnterChange بين خليتين (الخليتين B3 و D3 مثلاً) ، فهل فكرت بعمل مثل هذا الشيء بواسطة كود الـ VBA ؟!!

هذه العملية شائعة الاستخدام بين المبرمجين تحت اسم Swap وذلك للقيام بعملية التبديل بين المتغيرات.

للقيام بهذه العملية فأنت بحاجة لتعريف متغير يقوم بمهمة الوسيط في عملية التبديل ، المتغير TempValue في الكود التالي:

Sub SwapCells1()
 Dim TempValue
 With Worksheets(1)
   TempValue = .Range("B3").Value
   .Range("B3").Value = .Range("D3").Value
   .Range("D3").Value = TempValue
 End With
End Sub
لاحظ أن المتغير TempValue ينتمي لنوع البيانات Variant ، وذلك لأن الخلايا المتقايضة يمكن أن تحتوي على : نص ، أرقام ، تاريخ ، ... الخ ولكن إذا كنا نعلم بشكل مسبق أن الخليتين B3 ، D3 لن تحتويان إلا على أرقام ، فهنا يمكننا الاستغناء عن المتغير TempValue ، وذلك بواسطة إحدى الطرق الموجودة في الأكواد التالية :
Sub SwapCells2()
 With Worksheets(1)
   .Range("B3").Value = .Range("B3").Value + .Range("D3").Value
   .Range("D3").Value = .Range("B3").Value - .Range("D3").Value
   .Range("B3").Value = .Range("B3").Value - .Range("D3").Value
 End With
End Sub
Sub SwapCells3()
 With Worksheets(1)
   .Range("B3").Value = .Range("B3").Value * .Range("D3").Value
   .Range("D3").Value = .Range("B3").Value / .Range("D3").Value
   .Range("B3").Value = .Range("B3").Value / .Range("D3").Value
 End With
End Sub
Sub SwapCells4()
 With Worksheets(1)
   .Range("B3").Value = .Range("B3").Value Xor .Range("D3").Value
   .Range("D3").Value = .Range("D3").Value Xor .Range("B3").Value
   .Range("B3").Value = .Range("B3").Value Xor .Range("D3").Value
 End With
End Sub

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

يمكن أن نقول بأن الطريقة الموجودة في الإجراء SwapCells4 هي الأفضل على الإطلاق :pp:

منقول بتصرف من الرابط التالي:

http://www.c4arab.com/showthread.php?threadid=28624

Swap.zip

  • 2 weeks later...
قام بنشر (معدل)

السلام عليكم ...

بالنسبة للإجراء SwapCells4 فهو يعتمد على العلاقة المنطقية Xor

العلاقة المنطقية Xor (أو المانع = eXclusive OR) تشبه إلى حد كبير العلاقة المنطقية Or ( أو ) ، ولكن بشروط خاصة ، حيث يتحقق جواب الشرط إذا تحقق أحد الشرطين فقط ، مثال:

Sub Test()
Dim Qestion1 As Integer
Dim Qestion2 As Integer
Qestion1 = MsgBox("هل تؤدي فريضة الصلاة", vbYesNo, "هل تقوم بالصلاة؟")
Qestion2 = MsgBox("هل تؤدي فريضة الزكاة", vbYesNo, "هل تقوم بالزكاة؟")
If Qestion1 = vbYes Xor Qestion2 = vbYes Then
  MsgBox prompt:="مقصر ، تدارك الوضع", Title:="النتيجة"
ElseIf Qestion1 = vbNo And Qestion2 = vbNo Then
  MsgBox prompt:="أنت في خطر ، عد إلى الله", Title:="النتيجة"
Else
  MsgBox prompt:="ممتاز ، تابع وفقك الله", Title:="النتيجة"
End If
End Sub
نلاحظ من المثال المبسط السابق أن الرسالة (مقصر ، تدارك الوضع) تظهر في حال تحقق أحد الشرطين وعدم تحقق الشرط الآخر. هذا استعمال للتعليمة Xor ، ولكن هل يوجد استعمال آخر لها؟!!! نعم هناك صيغة مختصرة ، انظر للكود :
Sub mah()
Dim Number As Integer
Number = 10 Xor 9
MsgBox Number
End Sub

قيمة المتغير Number الناتجة عن الإجراء mah هي 3 ، لماذا؟

في هذه الصيغة (الصيغة المختصرة) تقوم التعليمة Xor بالتعامل مع العددين 9 و 10 وفق نظام العد الثنائي Binary ، حيث يتم جعل كل بت من الوجهة مساوياً للواحد إذا كانت العلاقة المنطقية Xor محققة ويتم جعله مساوياً للصفر في حالة عدم تحقق العلاقة المنطقية Xor ؛ وللتوضيح انظر التمثيل التالي للمسألة السابقة:

العدد / نظام العد : العدد في النظام العشري ، العدد في النظام الثنائي

العدد الأول______________10__________________1010

العدد الثاني_____________ 9 __________________1001

النتيجة ________________3 __________________0011

الميزة في استخدام التعليمة Xor في عملية الـ Swap تكمن بالقدرة على التحكم في الـ Binary و الاكتفاء بذلك مما يغنينا عن القيام بمعالجات تستهلك موارد النظام.

أرجو أن أكون قد وفقت في إيصال المعلومة :rol:

مرفق ملف يقوم بتمثيل عملية الـ Swap باستخدام التعليمة Xor ، و الملف يحتاج لتفعيل الوظيفة الإضافية Analysis ToolPak .

تحياتي :fff::fff::fff:

Xor.zip

تم تعديل بواسطه محمد حجازي
قام بنشر

السلام عليكم

جزاك الله خيراعلي الموضوع المميز

و صراحة لم استخدك دالة ال xor سابقا

و لكي اتابع عملها قمت بادراجها فى دالة

و اجريت عليها الحسابات كما فى الملف المرفق

Function SwapCells5(c1, c2)
SwapCells5 = c1 Xor c2
End Function

و اعطت نفس النتجية النهائية مع وجود فرق فى خطوة وسيطة فى حالة ال binary

و هي ظهور نتيجة التعامل عند تطبيقها علي النظام الثنائي للفرق بين الرقمين 27

و شكرا علي الموضوع المميز

Xor2.zip

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

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

Important Information