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

دالة sumif من واجهة VBA ل2500 عميل في 100 صنف


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

اعضاء منتدي اوفيسنا الكرام

تحية طيبة وبعد

اعمل على فكرة تسمي في عملي التوزيع

ومعناها عدد العملاء المتعاملين في صنف معين

فلو افترضنا على سبيل المثال انة لدي شيت اكسيل فارغ يوجد اسماء العملاء فية فى قاعدة بيانات العملاء (شيت 1 ) رقم واحد تحت العمود A النطاق A1:A2499 ومتسلسل حتي 2500 عميل

وانة يوجد لدي في فواتير العملاء (شيت 2 ) صفحة رقم 2 فواتير جميع العملاء من بداية الشهر وحتي اخرة حيث ان اسم العميل تحت العمود B النطاق B1:B2499

تبدا الاعمدة متسلسلة في صفحة قاعدة بيانات العملاء (شيت 1 ) بداية من عمود B وحتي العمود  CW عدد 100عمود ( الهدف)

المصفوفة B1:CW2499

تبدا الاعمدة متسلسلة في صفحة فواتير جميع العملاء ( شيت 2 ) بداية من عمود C وحتي العمود CX عدد 100 عمود ( البيانات التي يتم معالجتها)

المصفوفة C1:CX2499

المطلوب

اذا كان لدينا عدد 100 صنف متسلسلين من 1 وحتي 100 ونريد معرفة اذا كان العميل متعامل وليكن على سبيل المثال

هل العميل متعامل في الصنف رقم 1 من خلال الفواتير الموجودة في صفحة فواتير جميع العملاء ام لا

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

محلوظة : كتبت معادلة بالاكسل لتوضيح ماذا اريد ان افعل ولكن ما اريد فعل اريد فعلة بالفيجوال بيسك

شكرا جزيلا

______ _______.rar

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

السلام عليكم

 

جرب و ضع هذه المعادلة في الخلية C2 ثم انسخها في باقي الخلايا .

=SUMIF(INDIRECT("CustmerInvoice!c2";FALSE);CustmerDataBase!$A2;INDIRECT("CustmerInvoice!c"&3+COLUMN(A1);FALSE))

تحياتي

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

و ان اردته كود جرب هذه 

Sub Dahmour()
Application.ScreenUpdating = False
    Range("c2:cx2501").FormulaR1C1 = "=SUMIF(INDIRECT(""CustmerInvoice!c2"",FALSE),CustmerDataBase!RC1,INDIRECT(""CustmerInvoice!c""&3+COLUMN(R[-1]C[-2]),FALSE))"
    Range("c2:cx2501") = Range("c2:cx2501").Value
Application.ScreenUpdating = True
End Sub

تحياتي

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

شكرا استاذ احمد عبد الناصر

على الاهتمام

لقد قمت بتجربة دالة الاكسل اولا ولم اصل إلي النتيجة لانة عند عمل فواتير في صفحة الفواتير لم يظهر اي من العملاء تعامل في اي من الاصناف

بالنسبة لكود الفيجوال بيسك هل يحتاج إلي تكرار ام هو كفيل بعمل تكرار لنفسة

شكرا لتعبك وارجو الايضاح

 

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

 

لقد قمت بتجربة دالة الاكسل اولا ولم اصل إلي النتيجة لانة عند عمل فواتير في صفحة الفواتير لم يظهر اي من العملاء تعامل في اي من الاصناف

 

جرب الملف المرفق فيه بعض البيانات الوهمية ,فهل هذه هي النتيجة التي تريد ؟

 

 

بالنسبة لكود الفيجوال بيسك هل يحتاج إلي تكرار ام هو كفيل بعمل تكرار لنفسة

 

 

يقوم بكامل العمل و حده و لا يحتاج الي اي شيء , لكنه في الاساس يعتمد نفس طريقة المعادلة فان لم تكن المعادلة تؤدي الغرض فلن يفعل الكود .

 

تحياتي 

الفكرة باختصار+.rar

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

 

 

لقد قمت بتجربة دالة الاكسل اولا ولم اصل إلي النتيجة لانة عند عمل فواتير في صفحة الفواتير لم يظهر اي من العملاء تعامل في اي من الاصناف

 

جرب الملف المرفق فيه بعض البيانات الوهمية ,فهل هذه هي النتيجة التي تريد ؟

 

 

بالنسبة لكود الفيجوال بيسك هل يحتاج إلي تكرار ام هو كفيل بعمل تكرار لنفسة

 

 

يقوم بكامل العمل و حده و لا يحتاج الي اي شيء , لكنه في الاساس يعتمد نفس طريقة المعادلة فان لم تكن المعادلة تؤدي الغرض فلن يفعل الكود .

 

تحياتي 

 

 

اشكرك استاذ احمد عبد الناصر

الفكرة كدة مظبوطة فيما عدا شىء واحد هو انة يجب ان تعود إما 1 او بصفر

1= متعامل في هذا الصنف من خلال الفواتير

0= لم يتعامل في هذا الصنف من خلال الفواتير

بمعني اخر بدلا من ان تعود في الخلية C2 في الصفحة CUSTMERDATABASE بقيمة 18 تعود بقيمة 1 وإذا لم يكن تعامل في هذا الصنف تعود بقيمة 0 او خلية فارغة

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

السلام عليكم

 

جرب هذه 

Sub Dahmour()
Application.ScreenUpdating = False
    Range("c2:cx2501").FormulaR1C1 = "=IF(sumif(CustmerInvoice!R2C2:R1048576C2,CustmerDataBase!RC1,CustmerInvoice!R2C[1]:R1048576C[1])>0,1,0)"
    Range("c2:cx2501") = Range("c2:cx2501").Value
Application.ScreenUpdating = True
End Sub

تحياتي

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

السلام عليكم

 

جرب هذه 

Sub Dahmour()
Application.ScreenUpdating = False
    Range("c2:cx2501").FormulaR1C1 = "=IF(sumif(CustmerInvoice!R2C2:R1048576C2,CustmerDataBase!RC1,CustmerInvoice!R2C[1]:R1048576C[1])>0,1,0)"
    Range("c2:cx2501") = Range("c2:cx2501").Value
Application.ScreenUpdating = True
End Sub

تحياتي

ممتاز استاذ / احمد عبد الناصر

هذا هو المطلوب

هل تتكرم بشرح هذة الخطوات السحرية من صاحب الانامل السحرية

اشكرك كثيرا لسرعة استجابتك واهتمامك

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

 

هذا هو المطلوب

 

حمدا لله

 

بالنسبة للشرح 

 

اول و اخر سطر لتسريع عمل الكود 

Application.ScreenUpdating = False
Application.ScreenUpdating = True

هذا السطر يقوم بوضع المعادلة في المدي c2:cx2501 

    Range("c2:cx2501").FormulaR1C1 = "=IF(sumif(CustmerInvoice!R2C2:R1048576C2,CustmerDataBase!RC1,CustmerInvoice!R2C[1]:R1048576C[1])>0,1,0)"

و اخيرا هذا السطر يحول الخلايا الي قيم بدل من المعادلات ليصبح الشيت اسرع و اقل في الحجم

    Range("c2:cx2501") = Range("c2:cx2501").Value

تحياتي

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

الاستاذ احمد عبد الناصر

دائماً احب ان اطلع على اعمالك فهى مبهرة

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

 

شكرا على مرورك الكريم ,جعله الله فى ميزان حسناتك وزادك علماً وبركه وعافية

 

 

رائع استاذ احمد  تسلم ايدك :fff: 

 

شكرا علي مرورك الكريم , تقبل تحياتي

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

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