وعليكم السلام أخي الكريم (.........)
يرجى مراعاة أن يكون الشرح والوصف بمسميات الإكسيل ولغة الإكسيل ، فأنا أو غيري قد لا نفهم طبيعة عملك ، ولكن نجتمع سوياً في فهم لغة الإكسيل (ورقة عمل - نطاق - خلية - فورم كذا - تكست بوكس 1 - ليست بوكس 2 وهكذا)
يرجى التأكيد أن يكون الموضوع لنقطة واحدة فقط ، وقد وجدت أن الموضوع به أكثر من نقطة ، وأنا عن نفسي إذا أحببت المشاركة فلن أشارك في أكثر من نقطة في الموضوع ، فالمنتدى ليس خدمي يقوم ببناء البرامج للأعضاء إنما هو تعليمي ، وإذا كان تعليمي فلابد من التركيز على مشكلة محددة ومعرفة تفاصيلها ووضع حل لها يفهمه جميع الأعضاء ليستفيدوا منه ، وليس الهدف الوصول لحل المشكلة وفقط وإلا يفقد المنتدى الهدف الرئيسي منه.
أعتذرإن كنت قد أطلت عليك ، ولكني أحببت أن أنوه لتلك النقاط
>> في الملف المرفق يوجد 3 يوزر فورم ، والفورم المطلوب العمل عليه هو الفورم المسمى Invoice ولن أقول فورم الفواتير (إنما أسمي الفورم باسمه لتتضح الصورة للأعضاء الذي يريدون متابعة الموضوع) ، يوجد ListBox1 ، والمطلوب تعبئة الليست بوكس بالأصناف الموجودة في ورقة العمل Items في العمود الثاني ، وعند النقر عليها وتحديدها يتم وضع اسم الصنف في TextBox1 ويتم وضع العدد الكلي في TextBox2
>> إليك الكود التالي الذي يقوم بالمطلوب السابق
CODE
Dim wsItems As Worksheet
Private Sub UserForm_Initialize()
Dim lr As Long
Set wsItems = ThisWorkbook.Worksheets("Items")
lr = wsItems.Cells(Rows.Count, 2).End(xlUp).Row
With Me.ListBox1
.ColumnCount = 2
.ColumnWidths = "150,0"
.List = wsItems.Range("B3:C" & lr).Value
End With
End Sub
Private Sub ListBox1_Click()
Dim i As Long
With Me.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) Then
TextBox2.Value = .List(i, 0)
TextBox3.Value = .List(i, 1)
Exit For
End If
Next i
End With
End Sub
>> شرح الكود:
أول سطر بالكود في أول موديول الفورم Invoice هو جملة Option Explicit وتستخدم لإجبار المبرمج على استخدام المتغيرات والإعلان عنها بشكل صحيح ، وهذه عادة جيدة يجب أن تتعود عليها.
في السطر الثاني يتم الإعلان عن متغير wsItems ليشير إلى ورقة العمل Items التي بها الأصناف وقد جعلت المتغير في أول الموديول ليكون عام أي يتم تعيين قيمة للمتغير مرة واحدة عند بدء تشغيل الفورم ، ويظل محتفظ بقيمته لاستخدامه في إجراءات فرعية أخرى.
الجزء الأول من الكود خاص ببدء تشغيل الفورم حيث يتم تعيين قيمة للمتغير wsItems ليشير لورقة العمل Items ثم معرفة رقم آخر صف به بيانات اعتماداً على العمود الثاني وتخزين الرقم في متغير باسم lr ، ثم يتم ضبط بعض الخصائص لليست بوكس وهنا عدد الأعمدة 2 ثم عرض الأعمدة 150 وصفر ، والصفر هنا لأخفاء العمود الثاني ، ليظهر فقط العمود الأول الخاص بالأصناف أما عمود العدد الكلي فمخفي ولكن نحتاجه فيما بعد ليظهر لنا في الـ TextBox2
وأخيراً يتم تعبئة الليس بوكس بالأصناف والعدد الكلي من ورقة العمل المسماة Items
الجزء الثاني في الكود يخص التعامل عند النقر في الـ ListBox1 ، فعند اختيار صنف يتم عمل حلقة تكرارية على الأصناف الموجودة في الليست بوكس ، فإذا كان العنصر محدداً يتم التعامل معه بهذا الشكل:
يتم وضع قيمة اسم الصنف الموجودة في العمود الأول بالليست بوكس داخل التكست بوكس رقم 1 (اسم الصنف)
يتم وضع قيمة العدد الكلي الموجودة في العمود الثاني بالليست بوكس داخل التكست بوكس رقم 2 (العدد الكلي) .. وهو العمود المخفي والذي عرضه يساوي صفر