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

دروس فى VBA Excel _ نتعلم معا برمجه اكسل


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

كلمة روعة أشعر أنها قليلة مقارنة بما تقدمه

بوركت وجزيت خيراً

لا أدري لما التأخر في تثبيت موضوع هام مثل هذا الموضوع

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

  • الردود 196
  • Created
  • اخر رد

Top Posters In This Topic

اخى محمود الشريف

جزاك الله خيرا

نداء الى مديرى الاقسام والمشرفين

نرجو تثبيت الموضوع ... لماذا..

لان الشروحات تقدم جهدا كبيرا من الشارح للموضوع

تخلق جيلا جديدا فى المنتدى من المثقين برمجيا

تشجيع للشارح على جهده

سهولة المتابعة للمتعلمين

الشرح اقضل من الحل لاى موضوع وكلاهما مهم ولكن الاولى للشروحات والدورات

الى االخ الخ......

اعذرونا فهذا ليس تدخل ولكن محبه فيكم وفى المنتدى

اكرمكم الله

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

اخي الكريم شكرا جدا على المجهود الرائع و الشرح فوق الجيد و الممتاز و جزاك الله خيرا عنا جميعا .

و لكن عندي استفسار من حضرتك بالنسبة لتعريف الخلية داخل الكود

هل يمكن استبدال اسم الخلية بدلا من الرقم يعني اكتب d8 بدلا من (4,8 )

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

إخوانى فى الله 

 

الأستاذ القدير // ياسر خليل

الأستاذ القدير// سعد عابد

الأستاذ القدير// ابراهيم ابو ليله

الأستاذ الكبير // محمد الريفى

الأستاذ الكريم // مستخدم جديد 9

الأستاذ الكريم // محمد لطفى

الأستاذ الكريم // محمد القمجى

 

بارك الله فيكم وزادكم الله من فضله 

على مروركم الكريم ودعواتكم الطيبة

 

وتقبلوا منى وافر الاحترام والتقدير

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

أخى الكريم

الأستاذ // رامى جمال

بارك الله فيكم على مروركم الكريم

 

فيما يختص بإستفساركم عن أمر كتابة الخلية

 

يمكن كتابة الخلية بإسمها المعتاد مثلا (( D8))

ويمكن كتابتها بشكلها   ( 4 , 8 )

حيث تمثل 8 رقم الصف و 4 رقم العمود 

 

فالشكل الثانى يكتب فى حالات الترحيل والإستدعاء والإستعلام

ويستخدم مع الدالات عموما وتوضع بين قوسين ( , ) وبينهم فاصله بهذا الشكل

 

أما الشكل الأول يكتب مثلا عند الاشارة الى مسح خليه معينه وتوضع بين قوسين " " بهذا الشكل 

أو اضافة داله عدديه مثل D8+D4  وتوضع كل خليه بين قوسين [ ] بهذا الشكل

 

بإختصار كل كيفية لها استخدام معين مرتبط بمعنى السطر المشار فيه الى تلك الخليه

 

وتقبل منى وافرالإحترام والتقدير

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

أخى فى الله

الأستاذ الكريم // زمزم

بارك الله فيكم وجزاكم الله خيرا 

وتقبل منى وافر الاحترام والتقدير

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

نستكمل الدروس التطبيقية العملية 2

 

البحث والإستعلام ( 2 )

 

حاليا لقد طلب منى المدير معرفة متى بدأ عقد عمل موظف ما

ماذا نفعل ؟

خاصة لو لدينا قاعده بيانات ضخمه لعدد كبير من الموظفين والوقت يداهمنا والمدير يتحدث معى مباشرة على الهاتف الداخلى

هناك طريقة خاصة يتيح الاكسل عملية البحث بالضغط على CTRL+F فيظهر لنا مربع حوار نكتب فيه مثلا اسم الموظف ونستمر فى البحث بشرط ان نكون واقفين على عمود اسم الموظف

ولكن ما أبحث عنه

 هل هناك طريقة من خلال الفيجوال بيسك للقيام بذلك ؟

هناك الكثير من الطرق التى تؤدى هذا الغرض

اذا المطلوب منى ان نقوم بعمل احتياط من ذلك الطلب المفاجىء من قبل المدير حتى لا نفاجىء بذلك

 

ندخل لمرحله تنفيذ هذا الامر والكيفية التى نريد تنفيذ بها ذلك

نجلس مع أنفسنا ونحلل الشيت الذى به جدول تجميعى لبيانات الموظفين

ونسأل أنفسنا عده أسئلة

س / ماذا لو قمت بالبحث من خلال الاسم ؟

ج / طبعا سنصل  للنتيجة

 

س / ماذا لو قمت بالبحث من خلال رقم الموظف أى كود الموظف ؟

ج / سنصل للنتيجة .. بل ستكون دقيقة مائة بالمائة لأننا نعرف أن رقم الموظف لن يتشابه مع موظف آخر

ولكن هل أنا سأحفظ جميع أكواد الموظفين بأساميهم لدرجه لو سألنى أحد عن موظف هعرف رقمه الوظيفى

س / ماذا لو طلب منى تجهيز كشف جميع العاملين بفرع ما أو مشروع  ؟

اذن يجب أن يكون البحث مرتبط بإسم مشروع أو الفرع

 

السؤال الذى يطرح نفسه

كيف ننفذ ما سبق ؟

 

نبدأ بالبحث بكود الموظف بالإستعانه بالمثال العملى السابق والخاص بالترحيل

 

نجهز شيت آخر ونسمية استعلام مثلا خاص بالاستعلام عن موظف ما من خلال الرقم الكودى للموظف

بهذا الشكل

jt8PuR.jpg

 

نريد الاستعلام حاليا عن الموظف صاحب الكود رقم 1

 

اذا نقوم بالحفظ ونفتح محرر الأكواد وندخل الى محرر الاكواد الخاص بحدث الصفحة نفسها

ونبدأ بكتابه الكود كما أشرنا سابقا بالدروس السابقة

 

شكل الكود كاملا

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = [h2].Address Then
[A2:f65000].ClearContents
Dim Lr As Integer 
Lr = Sheets("list").Cells(Rows.Count, 2).End(xlUp).Row
For Each cl In Sheets("list").Range("A2:A" & Lr)
If cl = [h2] Then
cl.Offset(0, 1).Resize(1, 6).Copy
Range("A" & [A65000].End(xlUp).Row + 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
Application.EnableEvents = True
End If
Next
End If
End Sub

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

 

نبدأ بتبسيط الأمر ثم شرح الكود

عندما أردت ان أقوم بعمليه الاستعلام بكود الموظف

جهزنا الشيت ووضعنا شرط ألا وهو الاستعلام بكود الموظف

اذا عند تجهيز الشيت لا نحتاج الى عمود كود الموظف لأننا نبحث عن موظف معين من خلال الرقم الكودى الخاص به

 

 

ولكننا نريد كافه البيانات الأخرى

لذلك قمنا بوضعها كما هو موضح بشكل الشيت

 

ونريد عند كل استعلام ان يتم مسح محتويات خلايا شيت الاستعلام تجهيزا للإستعلام عن موظف آخر

 

هنا عندما تقوم بعملية البحث العادية التى يتيحها برنامج اكسل داخل شيت البحث أى شيت جدول كامل بيانات الموظفين من خلال الضغط على CTRL+F وتقوم بالوقوف على عمود كود الموظف قبل الضغط

تظهر لك نافذة تكتب فيها رقم الموظف ثم تضغط موافق الى ان تجد الرقم المراد البحث عنه

قد يكون هناك تكرار أو رقمين متشابهين فى بدايتهم فأحيانا تبدأ اكواد الموظفين بنظام معين تتشابه فيه الأرقام الأولى

 

 

اذن توصلنا لتوضيح الفكرة لكى نكتب الكود

 

·      سنكتب الكود بحدث الشيت مع اختيار كل تغيير كما اشرنا سابقا

·      سنضع شرط كتابه الكود بالخلية المعنية بذلك

·      سنستخدم متغير لكى ننبه الجهاز أن يقوم بعملية تخزين البيانات ومن ثم جلبها لشيت الاستعلام

·      سنستخدم حلقة تكرارية لعملية البحث

·      سنطلب جلب بيانات كل موظف ماعدا الكود

·      سنقوم بمسح محتويات الكشف فى كل مرة سنستعلم فيها

·      ننبه الجهاز ألا تقوم بعمليه قص ولصق بل نريد نسخ فقط

·      نضع فى اعتبارنا انه لابد من البحث فى كافة أسطر شيت البحث

 

فكيف نكتب الكود بما يتوافق مع تلك الأفكار

الأمر ليس معقدا بل بعد توضيح المطلوب أصبح كتابه الكود أمرا يسيرا

 

وستجد ان كل الأفكار السابقة هى الموجوده بالكود فقط

 

شرح الكود

 

-       السطر الأول بداية الكود بحدث الشيت مرتبط بكل تغيير يحدث والمقصود بالتغيير اى ادخال بيانات جديده بالخلية H2 .

-       السطر الثانى يستعمل هذا السطر عندما يكون هناك اكثر من كود للصفحة الواحدة ، ويعمل هذا السطر على تجميد الاكواد الاخرى ويتم تنفيذ الكود في هذا الحدث فقط .

-       السطر الثالث هذا يعنى لو حصل اى تغيير بالخليه المعنيه بإدخال شرط البحث قم بتنفيذ التالى ولا ننسى إنهاء IF  بنهاية الكود.

-       السطر الثالث قم بمسح المدى تجهيزا لإستقبال بيانات جديدة .

-       السطر الرابع اضافة وتسمية متغير لتخزين البيانات .

-       السطر الخامس المتغير يساوى بدءا من الصف الثانى بشيت البحث وحتى آخر صف .

-       السطر السادس حلقة تكرارية لكل خليه بشيت البحث بالمدى المحدد حتى آخر صف .

-       السطر السابع نضع الشرط من خلال قاعده IF ولا ننسى إنهائها بنهاية الكود

-       السطر الثامن وضعنا داله Offset  مع الحلقة التكرارية C1 على أساس انه فى حال الحلقة التكرارية تعادل خليه البحث استخدم داله اوفيست التى تعين الخليه فى ورقة البحث وتقوم بنقل بيانات الأعمده بدءا من العمود التالى لعمود البحث ونسخ الأعمدة السته التاليه لعمود البحث بما يتوافق مع البيان داخل خلية H2

-       السطر التاسع نسخ بدءا من العمود الأول + الصف الثانى فى المدى المحدد بالعمود A و ذكرنا الصف + 1 حتى لا ينسخ على صف رأس الجدول بشيت الاستعلام

-       السطر العاشرننبه البرنامج على ألا تقوم بعمليه قص ولصق

-       السطر الحادى عشر استخدمنا هذه الامر لإعادة تفعيل الاكواد الاخرى وذلك بوضع هذا السطر في نهاية الكود وذلك إرتباطا إلزاميا بالسطر الثانى ببداية الكود

أى عند كتابة السطر الثانى بالكود يجب كتابة هذا السطر فى نهاية الكود

-       السطر الثانى عشر انهاء IF  الأولى

-       السطر الثالث عشر تنفيذ الجزء التالى بعد  IF

-       السطر الرابع عشر انهاء IF الثانية ثم إغلاق الكود

نذهب لتطبيق الجزء الخاص

بالإستعلام عن طريق اسم المشروع

 

للإستفادة القصوى من الكود السابق

يمكن الاستعانه به فى تنفيذ هذا الاستعلام

كل ما عليك فقط التغيير

بدلا من جعل الخليه H2 مرتبطه بكود الموظف نجعلها مرتبطه باسم المشروع وهكذا مجرد تباديل بسيطه بالكود

نغير هذا السطر

من :

For Each cl In Sheets("list").Range("A2:A" & Lr)

حيث أن عمود A يمثل عمود كود الموظف

إلى :

For Each cl In Sheets("list").Range("G2:G" & Lr)

حيث أن عمود G يمثل عمود الفرع

ونغير هذا السطر

من :

cl.Offset(0, 1).Resize(1, 6).Copy

حيث أن مدى البحث والجلب للبيانات يبدأ من بعد العمود الأول بشيت البحث (0, 1)

الى :

cl.Offset(0, -6).Resize(1, 6).Copy

حيث أن مدى البحث والجلب للبيانات يبدأ من قبل عمود الفرع او المشروع الى اول عمود بشيت البحث (0, -6)

 

وبذلك اصبح الكود يقوم بالإستعلام بالمشروع

مع تغيير شكل الشيت بإضافة عمود لكود الموظف فى بداية الشيت والإستغناء عن عمود الفرع والذى يمثل المشروع

 

بالمثال العملى المرفق ليس به تطبيق للإستعلام بإسم المشروع تركته لمن يريد التطبيق والإستفاده

ولكن 

به تطبيق آخر للإستعلام بإسم المشروع من خلال كود آخر وبطريقة أخرى

وشكل الشيت كما بالصورة التالية

bK4QpR.jpg

 

والكود الخاص به مضاف بموديول مستقل مربوط من خلال زر بشيت الاستعلام

واليكم الكود المستخدم

Sub MZM_1()
Dim iNm As String
Dim Lr As Long, i As Long
Dim R As Integer
Dim M1 As Integer, M2 As Integer
''''''''''''''''
iNm = Range("D2").Value
M1 = Range("D3").Value2
M2 = Range("D4").Value2
''''''''''''''''
Range("C7:I500").ClearContents
''''''''''''''''
Application.ScreenUpdating = False
With æÑÞÉ2
    Lr = .Cells(.Rows.Count, "G").End(xlUp).Row
    For i = 2 To Lr
        If iNm = CStr(.Cells(i, "G")) Then
            Select Case .Cells(i, "A").Value2
                Case M1 To M2
                R = R + 1
                Cells(R + 6, "B").Value = R
                Cells(R + 6, "C").Resize(1, 7).Value = .Cells(i, "A").Resize(1, 2).Value
                    Cells(R + 6, "D").Value = .Cells(i, "B").Value
                    Cells(R + 6, "E").Value = .Cells(i, "C").Value
                    Cells(R + 6, "F").Value = .Cells(i, "D").Value
                    Cells(R + 6, "G").Value = .Cells(i, "E").Value
                    Cells(R + 6, "H").Value = .Cells(i, "F").Value
                    Cells(R + 6, "I").Value = .Cells(i, "G").Value
                
            End Select
       
    

Application.ScreenUpdating = True
End If
Next
End With
End Sub

بالمثال العملى تجد داخل الكود السابق الشرح الخاص به

 

وتقبلوا منى وافر الاحترام والتقدير

 

 

تطبيق 2.rar

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

أخى الكريم

الأستاذ // صلاح الصغير

 

ان شاء الرحمن عندما أنتهى من كامل الدروس 

سأرفق ملف مجمع به كامل الدروس

لأنى ما زلت بالجزء الأول 

الأساسيات وكيف نطبقها

وكل جزء سأرفقه ان شاء الرحمن كاملا بعد الانتهاء منه 

والله المستعان 

وتقبل منى وافر الاحترام والتقدير

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

 

أخى الكريم

الأستاذ // رامى جمال

بارك الله فيكم على مروركم الكريم

 

فيما يختص بإستفساركم عن أمر كتابة الخلية

 

يمكن كتابة الخلية بإسمها المعتاد مثلا (( D8))

ويمكن كتابتها بشكلها   ( 4 , 8 )

حيث تمثل 8 رقم الصف و 4 رقم العمود 

 

فالشكل الثانى يكتب فى حالات الترحيل والإستدعاء والإستعلام

ويستخدم مع الدالات عموما وتوضع بين قوسين ( , ) وبينهم فاصله بهذا الشكل

 

أما الشكل الأول يكتب مثلا عند الاشارة الى مسح خليه معينه وتوضع بين قوسين " " بهذا الشكل 

أو اضافة داله عدديه مثل D8+D4  وتوضع كل خليه بين قوسين [ ] بهذا الشكل

 

بإختصار كل كيفية لها استخدام معين مرتبط بمعنى السطر المشار فيه الى تلك الخليه

 

وتقبل منى وافرالإحترام والتقدير

 

شكرا اخي الكريم على الاهتمام أولا ثم على التوضيح ثانيا

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

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

  • 3 weeks later...
  • 3 weeks later...

استاذى الفاضل

محمود الشريف

بارك الله فيك والله مجهود اكثر من رائع جعله الله فى ميزان حسناتكم 

والله لو الاخوة تعلمو واستفادو من هذه الدروس سيقل طلبات الاستفسار والمساعده بنسبة 50% على الاقل

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

ولى رجاء من ادارة المنتدى تثبيت الموضوع  

 مالا نهاية : 1  For

 

then لو الموضوع غير مثبت  if

 

"الرجاء تثبيت الموضوع"msgbox

end if

next

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

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

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



×
×
  • اضف...

Important Information