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

ياسر خليل أبو البراء

المشرفين السابقين
  • Posts

    13,165
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    412

كل منشورات العضو ياسر خليل أبو البراء

  1. تفضل أخي هذا الرابط http://www.officena.net/ib/index.php?showtopic=29972&view=getnewpost
  2. المشكلة أخي أن المرفق به أكثر من جدول فبالتالي يكون العمل على نطاق محدد وليس نطاق ديناميكي فيستحيل على ما أعتقد في هذه الحالة عمل النطاق بشكل ديناميكي ...!! والتعديل على الكود لن يستغرق منك ثواني !!
  3. قم بالتعديل في هذا السطر Set RngCollection = Union(Range("H3:H8"), Range("H15:H20"), _ Range("H27:H32"), Range("H39:H44"), Range("H50:H55"), Range("H62:H67"), Range("H74:H79"))
  4. أخي التاج مشكور على كلامك الكبير اللي مستحقهوش أنا مجرد تلميذ زيكم والله .بس تلميذ دحيح شوية وبذاكر ومهتم ..عشان كدا باين عليا إني شاطر لكن في الحقيقة أنا أخيب من أخيب واحد فيكم تقبل تحياتي
  5. أخي الفاضل ارفق الملف الذي تعمل عليه أو قم بالتعديل على الكود بما يناسب عملك
  6. السلام عليكم إخواني مع حلقة جديدة من حلقات افتح الباب وكل فطير من أم محمد http://www.officena.net/ib/index.php?showtopic=57094&page=11#entry374440 يرجى عدم الردود هنا .. الموضوع للتنويه فقط ولو حابب ترد رد في المكان المناسب في الردود على الموضوع http://www.officena.net/ib/index.php?showtopic=57094 تقبلوا تحياتي يرجى من المشرفين حذف الموضوع بعد مرور أسبوع على الأقل لأن فيه ناس بتتأخر في الدخول .. بالنسبة للواجب : قم بإنشاء قاعدة بيانات مكونة من الاسم والنوع والجنسية (مصري ويمني فقط )والسن ، ورتب بحيث يكون الإناث أولا ثم الذكور ، ثم رتب حسب الجنسية يمني أولا (عشان خاطر عيون العلامة عبد الله باقشير) ثم مصري ، وأخيرا حسب الأسماء قاعدة البيانات لا تقل عن 100 صف (ههههههههه ) لا دي براحتكم المهم أشوف الواجب الليلة عشان أنا مسافر أجازة وهتترحموا من الرغي لمدة 10 أيام تقريبا إلى أن القاكم دمتم بود
  7. الحلقة الثالثة عشر ******************* السلام عليكم ورحمة الله وبركاته إخواني الأحباب في المنتدى الأغر ..نأسف على عدم فتح الباب الفترة اللي فاتت بسبب البرد الشديد ، وبعد ما الجو اتظبط شوية نقدر نفتح الباب عشان الشمس تدخل وتدفنيا.. من أول الحلقة دي إن شاء الله هنبدأ نتعامل مع مهارات التعامل مع محرر الأكواد ، عايزين نوصل للأحتراف .. هنتكلم عن مهارة كتير بنحتاج نتعلمها ، ألا وهي الفرز أو الترتيب أو ما يطلق عليها باللغة اللي مش عربية Sort هنشتغل عملي علطول (أو على عرض ..مش هتفرق كتير) ..نفتح مع بعض ورقة عمل ، ومحدش يستنى مني إني أرفق ملف ، لأنك عشان تتعلم يبقا لازم تشتغل بايدك سيبك بقا من شغل النظري اللي مبيوكلش عيش ده ! افتح يا محسن ، شعارنا في الحلقات افتح (مرة افتح الباب ..افتح مصنف جديد ..افتح الخيارات في البرنامج ..افتح محرر الأكواد .. وشوية واحد هيقولي لو مبطلتش رغي هآجي أفتح دماغك وأريح الناس من رغيك) نفتح ورقة العمل ونكتب شوية بيانات عشان هنشتغل عليها ...وعشان أريحكو أدي شوية بيانات بدل ما تتعبوا ايديكم يا أحباب ، أنا بردو يهمني راحتكم م الاسم النوع 1 ياسر ذكر 2 احمد ذكر 3 ابراهيم ذكر 4 حسام ذكر 5 سليم ذكر 6 ماجدة أنثى 7 هدى أنثى 8 محمد ذكر 9 دينا أنثى 10 نور ذكر 11 رضا ذكر 12 سلمى أنثى 13 فاروق ذكر 14 شهد أنثى 15 كمال ذكر 16 طارق ذكر 17 هدير أنثى 18 سارة أنثى 19 أميرة أنثى حدد البيانات وتعالى لورقة العمل في الخلية A1 ، واعمل كليك يمين ، ثم اختر Paste Special (لصق خاص) ثم اختر من النافذة اللي هتطلع لك Text ، بكدا هتلاقي عندك 3 أعمدة (عمود للمسلسل ودا عشان مسلسل افتح الباب ، وعمود الأسماء ، وعمود النوع.. ) ويا ريت ننسخ البيانات في نطاق تاني مرة تانية لأننا هنجرب عليها أكتر من تجربة (ضعها مرة أخرى في النطاق K1:M20 مثلاً )!! المطلوب : ترتيب البيانات حسب الاسم ، ودا أمر بسيط جدا ومش معقد أبداً .. طريقة الحل : نروح للتبويب Developer ثم نختار Record Macro ثم نقف في الخلية A1 في بداية البيانات ، ونروح للتبويب Data ثم الأمر Sort ونختار من الحقل اللي اسمه Sort By نختار الاسم (لأن هو دا الحقل المطلوب الترتيب على أساسه) ، وفي الحقل الثالث المسمى Order (ودا شكل الترتيب ونختار يا أستاذ مختار A to Z (هتلاقي هو دا الخص الافتراضي أقصد الخيار الافتراضي ) يعني الترتيب أو الفرز حاجة من اتنين يا إما تصاعدي A to Z (من تحت لفوق) ودا بيسموه الجماعة اللي ما يتسموا (Ascending) أو تنازلي Z to A (من فوق لتحت) ودا اللي بيسموه في اللغة الأجنبية Descending ، وعشان ميحصلش عندك لخبطة الكلمة Ascending بتبدأ بحرف الـ A تبقا دي A to Z (الترتيب التصاعدي) !! كل دا إحنا بنسجل يا حسين (اعدل الكرافتة عشان صورتك تطلع حلوة) ..Stop أنا المخرج وبقول Stop يعني وقف التسجيل .. ياااااااه كانت حلقة صعبة أوي الحلقة دي ، التسجيل بيحتاج مجهود جبار عشان تطلع الحلقة حلوة ولذيذة !!! دلوقتي جه وقت الجد ، اللي إحنا منعرفوش ، ندخل المغارة (على رأي الكبير حسام عيسى ..صقر المنتدى) ، هندخل المغارة عن طريق Alt + F11 معلومة قديمة ، طيب هندخل نعمل ايه ؟ أكيد هندخل عشان ندور على الكنز ..مش دي بردو مغارة ياسر بابا !! هنلاقي الكنز بس مدفوووووووون تحت الأنقاض Sub Macro1() ' ' Macro1 Macro ' ' Range("A1:C20").Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B20") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A1:C20") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub دا اللي إحنا سجلناه ..إحنا طلعنا شطار وبنعرف نسجل كويس جداً ..الكنز فين يا نور العين؟ الكنز مدفون ما بين الأسطر ..إزاي نقدر نخرجه.. أقولكم دا كله هتش !! اللي عمله محرر الأكواد في سنين هنختصره إحنا في ثانية واحدة وبسطر واحد (وهي دي الشطارة !!) Range("A1:C20").Sort Key1:=Range("B1:B20"), Order1:=xlAscending, Header:=xlYes ضع هذا السطر اللذيذ في إجراء فرعي وجربه ، هنلاقي إنه يبنفذ نفس الكود الطويل اللي سعادة محرر الأكواد سجله . طيب نهضم السطر اللي اتكتب : أول شيء عشان تقدر تتعامل في أي كود إنك تحدد الخلية أو النطاق اللي هتتشغل عليه ، وأظن دي واضحة جدا ، فالنطاق اللي هنشتغل عليه واللي فيه البيانات هو A1:C20 ، وممكن في الكود نحدد أول خلية في النطاق بس يعني ممكن يكون شكله كدا : Range("A1") بس أنا أفضل إننا نكتب النطاق بالكامل ، وبعد ما حددنا النطاق ، نطلق الحدث أي الفعل ، يعني السؤال المتوقع ايه المطلوب نعمله في النطاق : الإجابة نطبطب عليه وندلعه ، إجاية غير صحيحة ، الإجابة إننا نفرسه (هذه هي الإجابة الصحيحة ..نعم نفرزه ونرتبه زي ما إحنا عايزين) والفرز بيكون بكلمة Sort ونترك مسافة واحدة بالمسطرة بعد الفرز .. ونبدأ نشوف حاجة اسمها بارامترات الحدث Method ، ودي ممكن نشوفها في تسجيل الماكرو اللي قام بيه محرر الأكواد .. إحنا هناخد المهم وبس ، ميهمناش الدش الكتير !! أول بارامتر هو مفتاح الفرز أو الترتيب Key، بمعنى آخر المقصود بيه العمود اللي هيتم على أساسه الفرز ، والعمود هنا هو عمود الأسماء B1:B20 ، ونفس الكلام ممكن نستغنى عن النطاق بالكامل ونذكر فقط أول خلية في العمود B1 بالشكل ده Key1:=Range("B1") طيب محدش سأل ايه الواحد اللي جنب المفتاح (دا الحارس الشخصي للمفتاح عشان محدش يسرقه) ..الواحد ده يا أساتذة هو المفتاح الأول لعملية الفرز ، وهنفهم الحتة دي لما ناخد مثال تاني ... بعد كلمة Key1 نقطتين فوق بعض (Shift + حرف الكاف : ) وسواء وإنت بتكتب عربي أو إنجليزي (الاتنين سواسية).. يليها علامة يساوي .. ومعروف إن علامة يساوي ييجي بعدها قيمة ، ونترجم الكلام ده إن قيمة المفتاح الأول هو النطاق B1:B20 (أفضل إنه يتكتب نطاق العمود بالكامل) ناخد فاصل ، لا مش هنريح يا عبد الله ، أقصد فاصلة مش فاصل ، الفاصلة دي هي اللي بتفصل بين البارامترات يا أحباب .. ننتقل للبارامتر الثاني والمسمى Order ودا ترجمته يا أخ ابو سليمان (الترتيب ..) دلوقتي هتدعي عليه ، وتقولي يا عم إنت مش قلت كلمة Sort دي معناها ترتيب ..أيوا مش هنكر ..بس عشان تتضح الصورة كلمة Sort هنا فعل أو حدث Method ، أما كلمة Order تعتبر زي الاسم وممكن نقول إن البارامترات دي وصف لكيفية حدوث الحدث ، أي الطرق المؤدية لحدوث الحدث !! أنا تهت زيكم بالظبط المهم المقصود منها نوعية الترتيب هنا (هل الترتيب تصاعدي أم تنازلي) ، وبردو كلمة Order جنبها رقم واحد (الحارس الشخصي) ..يليها نقطتين وعلامة يساوي ، وقيمتها إما xlAscending أو xlDescending (أظن مفهومة يا أبو سليمان) ناخد فاصلة تانية وأوعدك دي تكون آخر فاصلة في السطر ده ..البارامتر الثالث هو المسمى Header ودي ترجمتها حقول البيانات أو عناوينها .. نسأل هل للبيانات اللي موجودة عناوين ولا لا ؟؟ م ، والاسم ، والنوع (دي عناوين أو حقول للبيانات) .. الإجابة نعم xlYes معلومة جديدة نستفيد منها إن الحدث Mehod قد يتبعه بارامترات ، وتأتي هذه البارامترات بعد الحدث Method بمسافة بينهما ، يعني اللي بيفصل بين الحدث والبارامترات هي المسافة (دي المحرم..) ..أما البارامترات فبيتم الفصل بين كل واحد وأخوه بفاصلة , .. حاجة تانية لما تلاقي النقطتين فوق بعض وبعدين علامة يساوي تعرف إن دا بارامتر .. يا رب تكون المعلومة مفيدة. طيب سؤال من الأستاذ طارق : هل البيانات لازم يكون فيها عنوان عشان نعمل فرز ؟؟ جاوب إنت يا عبد الكريم ، عبد الكريم : يا أستاذ طارق طالما فيه بارامتر بيسأل هل فيه عنوان أو مفيش ، يبقا أكيد ممكن إننا نفرز من غير عناوين البيانات .. الله ينور عليك يا أستاذ عبد الكريم ، وميحرمناش منك ، فعلا الكلام دا صحيح .. نشوف السطر ده بيأدي نفس الغرض ، استغنينا عن صف العناوين : Range("A2:C20").Sort Key1:=Range("B2:B20"), Order1:=xlAscending, Header:=xlNo النطاق بدأ من A2 بعيداً عن عناوين البيانات ، والمفتاح كمان بدأ من B2 ، ونخلي بالنا من قيمة البارامتر Header هنلاقيه xlNo (يعني مفيش عناوين). ********************************* ننتقل لجزئية تانية .. الجزئية اللي فاتت أخدت حقها وزيادة ، دلوقتي واحد بيبص لي وبيقولي ايه شكل البيانات الملخبطة دي ..حد يفرز الأسماء ويخلي كله مع بعضه (ذكور مع إناث) دا إنت راجل محترم حتى عيب عليك !! ..ردي : أنا آسف والله يا حاج محمد مكانش قصدي ، دا كان مجرد مثال عموما عنيا ليك هنعيد ترتيبهم زي ما إنت عايز (حضرتك أكيد عايز الذكور أولا وبعدين الإناث ) ..رد وقال : كدا عين العقل .. بسيطة يا حاج محمد : السطر الخاص بالفرز هنزود عليه مفتاح كمان ، وشكل لترتيب المفتاح الجديد ... قبل ما أضع السطر ..عايزين نعود نفسنا إننا ندي نفسنا مساحة من التفكير قبل التنفيذ .. الفرز المرة دي هيكون على عمودين (مين قبل مين .. يعني عمود الاسم الأول ولا عمود النوع ؟؟ الإجابة بسيطة عمود النوع عشان نفصل بين الذكور والإناث : أي خدمة يا حاج محمد) إذاً الفرز هكيون لعمود النوع (ذكر ، أثنى ) ، نبص في أول حرف في ذكر وأول حرف في أنثى (محدش يبص على كل الحروف عيب) أول حرف هو حرف الذال في كلمة ذكر ، وألف في كلمة أنثى : طيب الكلمتين دول الألف الأول ، بمعنى تاني لو تركنا الخيار xlAscending اللي هو الترتيب التصاعدي بكدا هيكون الإناث الأول وبعدين الذكور حسب الترتيب الأبجدي ، إذاً في الحالة دي هنكتب xlDescending (عشان تتم عملية الفرز ذكر ثم أنثى) نأتي للتطبيق العملي : ها هو السطر ... Range("A1:C20").Sort Key1:=Range("C1:C20"), Order1:=xlDescending, Key2:=Range("B1:B20"), Order2:=xlAscending, Header:=xlYes هنشبه السطر دا بشقة ليها بابين : أقصد بالبابين عمودين الترتيب (عمود النوع ثم عمود الأسماء) ، كل باب له مفتاح عشان يفتح بيه .. الباب الأول عمود النوع ومفتاحه رقم 1 ، وشكل ترتيبه أو نوع ترتيبه تنازلي (عمود النوع) Key1:=Range("C1:C20"), Order1:=xlDescending والباب التاني ومفتاحه رقم 2 ، وشكل أو نوع ترتيبه تصاعدي (عمود الأسماء) Key2:=Range("B1:B20"), Order2:=xlAscending طبعا المفتاح ده ميشتغلش على ده ، ولا ده يشتغل على ده ، إنما ده لده وده لده (معلش هيست شوية) مفتاح النوع هيعتمد على النطاق C1:C20 ، ومفتاح الأسماء هيعتمد على النطاق B1:B20 ، كل مفتاح يلعب في ملعبه أقصد في بابه ، أقصد في العمود الخاص بيه. وبكدا لما ننفذ السطر اللي فات ، نقدر نحصل على النتيجة التي ينتظرها الحاج محمد.. الحاجة أم محمد شكلها مكشر وزعلت وبتقول بالإنجليزي : Ladies First يا مان (معلش أصلها مثقفة حبتين) أوك يا حاجة ولا تزعلي نفسك .. الفكرة بأبسط مما تتخيلي غيري كلمة واحدة ، وألا أقولك متتعبيش نفسك شيلي حرفين وحطي حرف واحد بس شيلي حرفي De في كلمة Descending وحطي حرف الـ A (شفتي بقا إنها بسيطة .. متنسيش الفطير عشان مستر حسام) يا للروعة !! الحاجة أم محمد مش مصدقة نفسها .عموما جربوا (مش تجربوا الكود .. جربوا فطير أم محمد هيعجبكم جداً ، وبعد ما تاكلوا وتتمتعوا بالفطير جربوا الكود بعد التعديل ..) ********************************* ننتقل لجزئية أخيرة تهم نفس الموضوع ...ألا وهي ألا وهي (تصدقوا نسيت) افتكرت .. إزاي أخلي النطاق غير محدد أو ديناميكي .. إحنا لما اتعاملنا مع النطاق حددنا النطاق لحد الصف رقم 20 في المثالين اللي فاتوا .... عايزين يكون الكود مرن ، يعني يمشي مع أي عدد من الصفوف ، لأن قواعد البيانات معروف إنها مش ثابتة .. يبقا المطلوب الجديد إننا نخلي آخر صف مفتوح ، أو من خلال الكود نخلي محرر الأكواد هو اللي يحدد آخر صف مش إحنا .. مستر حسام عيسى تناول (الفطيرة بتاعت أم محمد) وأيضاً تناول هذه النقطة في شرح رائع له .. نشرحها تاني ..ونخلي بالنا ، وخلينا جد بقا شوية ومركزين أوي لأن الحتة دي تقريبا مفيش مبرمج بيستغنى عنها (آه والله زي ما بقولكم كدا) نفرض دلوقتي إننا مش عارفين آخر صف ..نجيبه إزاي .. الإجاية نسجل ماكرو (واحد مبرق ومش فاهم أيوا هنسجل ماكرو ..بردو مبرق ) بص يا مبرق : ابدأ تسجيل و تعالى في العمود الأول A واقف بعيد تحت بعد البيانات بمسافة كبيرة وليكن مثلا A100 ، وبعدين اضغط Ctrl + سهم لفوق من لوحة الأسهم .بس خلااااص انتهى التسجيل ، نروح لمحرر الأكواد هنلاقي الشكل ده Range("A100").Select Selection.End(xlUp).Select وممكن نختصره في سطر واحد بس إننا نشيل كلمة Selection ونحط مكانها النطاق Range("A100").End(xlUp).Select عايز تطبق الكود ده ، روح لأي خلية بعيدة في أي عمود واضغط Alt+F8 وشوف الماكرو اللي فيه السطر اللي فات اسمه ايه واضغط Run.. نفهم إزاي هنستغل الحتة دي في إننا نعرف آخر سطر به بيانات في العمود A .. نقطة البداية هي A100 ، والكلمة End(xlUp) دي لما ضغطنا Ctrl وسهم لفوق المحرر ترجمها كدا ، يعني اطلع لفوق Up يا سفن أب يا لذيذ يا رايق (ما هو لازم نهضم الفطير اللي أكلناه) طيب واحد بيقولي بس دا مش حل لأني أساسا معرفش البيانات دي آخرها فين ، بلاش استعباط .هرد عليه وأقوله : الله يسامحك ، ما هو لو صبر القاتل ع المقتول كان مات لوحده ... إحنا هنخلي رقم الصف 100 هو آخر صف في ورقة العمل ، بالنسبة لـ 2003 آخر صف 65536 ، أما في 2007 فما فوق فعدد الصفوف 1048576 (يا دي الحيرة ..يعني نغير رقم 100 لأي رقم فيهم) ..اللي يحيرك طيره ، يعني لا هنستخدم الرقم ده ولا ده إحنا هنخلي المحرر هو اللي يعد الصفوف كلها بالسطر ده ، سبق وشرحناه في النافذة الفورية MsgBox Rows.Count بس إحنا مش عايزينها في رسالة ..دا بس عشان تتضح الصورة ، كلمة Rows تعني صفوف يا أبو سليمان ، وكلمة Count يعني يا محرر اتفضل عد. هكيون الناتج لتنفيذ السطر اللي فات مختلف حسب إصدار الأوفيس اللي عندك ، لو 2003 هيطلع الناتج 65536 ، ولو الأوفيس 2007 فما فوق هيطلع الناتج 1048576 (أكيد فيه ناس تاااهت مني .. الفطير عمل عمايله معاكم) يرجع مرجوعنا لموضوعنا الأصلي عرفنا عدد الصفوف من خلال محرر الاكواد ، يبقا هنشيل رقم 100 ونحط Rows.Count وبس Range("A" & Rows.Count).End(xlUp).Select نخلي بالنا الرقم 100 كان داخل أقواس التنصيص ، لكن لما استخدمنا الجملة Rows.Count الأقواس طردتها براها ، لأنها الأقواس مش بتقبل المتغير ، وعدد الصفوف هنا يا أحباب وركزوا متغير حسب الإصدار ، لكنها بردو حنينه مهانش عليها تطرده قامت حضنته بعلامة & عشان يكون جنبها طيب نرجع تاني للهدف من دا كله إننا نعرف رقم آخر صف فيه بيانات ، إحنا بالسطر الأخير عرفنا نحدده لكن إزاي نعرف رقم صفه .. هنشيل Select ونحط Row وبس .. لا محدش يقولي بس !! كدا السطر دا بالشكل ده Range("A" & Rows.Count).End(xlUp).Row لو نفذت السطر ده هيقولك محرر الأكواد يا أهبل ايه ده ويطلع لك رسالة خطأ Invalid Use استخدام خاطيء.. السطر صحيح ، بس السطر عبارة عن رقم (اللي هو رقم الصف الأخير اللي فيه بيانات) بس الرقم دا مينفعش يقف لوحده يخاف ياخد برد .. لازم نحط الرقم ده في متغير .. Dim LR As Long LR = Range("A" & Rows.Count).End(xlUp).Row MsgBox LR عملنا متغير باسم LR ودي اختصار Last Row أو الصف الأخير (بس التسمية اختياري يا شباب) ووضعنا قيمة للمتغير اللي سميناه LR في السطر الثاني ، فأصبح المتغير LR يحمل الآن رقم الصف الأخير وفي السطر الثالث عشان نختبر مدى صحة الكود ونشوف النتيجة عملنا رسالة يظهر فيها قيمة المتغير .. ** ملحوظة هامة : ممكن السطر الثاني نستخدم كلمة Cells بدلاً من كلمة Range بس هيكون التركيب مختلفة شوية ، لأن مع كلمة Cells بيكون فيه جزئين : الجزء الأول رقم الصف والجزء الثاني رقم العمود ، معنى الكلام ده إن Cells بتتعامل مع أرقام ، فيكون شكل الكود اللي فات لو استخدمنا Cells بهذا الشكل : Dim LR As Long LR = Cells(Rows.Count, 1).End(xlUp).Row MsgBox LR طبعاً Rows.Count تمثل رقم آخر صف به بيانات ، ورقم واحد بيمثل رقم العمود الأول A >>>>> نفذ الكود سواء اللي فات أو اللي قبله !! هنلاقي رقم الصف الأخير طلع في رسالة (أنا طلعت عيني وأكيد إنتو كمان .. يعني اللفة الطويلة دي عشان نعرف رقم آخر صف به بيانات.) دلوقتي جه الوقت إني أودعكم .. نشوف شكل الكود في النهاية هيكون عامل إزاي Sub SortData() Dim LR As Long LR = Range("A" & Rows.Count).End(xlUp).Row Range("A1:C" & LR).Sort Key1:=Range("C1:C" & LR), Order1:=xlDescending, Key2:=Range("B1:B" & LR), Order2:=xlAscending, Header:=xlYes End Sub دا الكود اللي هيرتب الذكور ثم الإناث ، وبعدين يرتب الأسماء ، في النطاق اللي بيبدأ من A1:C ورقم آخر صف ..لاحظ إننا شلنا رقم 20 من الكود الأصلي اللي شرحناه من بدري ، واستبدلناه بالمتغير LR والذي يحمل قيمة رقم آخر صف...!! لتجربة الكود أضف اسماً جديدا ونفذ الكود مرة أخرى ستجد أن الاسم الجديد قد انتقل لترتيبه ، وإلى هنا توقفت دماغي (فااااااااااااااصل ومفيش نواصل) أرجو أن أكون قد وفقت في توصيل المعلومة ، وإلى أن نلتقي أترككم في رعاية الله. كان معكم الحاجة أم محمد صاحبة الفطير من منتدى أوفيسنا تقبلوا تحياتي ودمتم بود
  8. روعة وفي منتهى الجمال يا أستاذ جمال.. ومعادلاتك عال العال ، وتغني عن تكرار السؤال تقبل تحياتي
  9. أخي الحبيب في مكتبة الصرح قم بالبحث عن كلمة [مشترك] ستجد كود أعتقد أنه يخص طلبك وهذا رابط آخر إصدار من المكتبة http://www.officena.net/ib/index.php?showtopic=57935&page=10#entry373606 اطلع عليه وجربه
  10. أخي الحبيب منير .. أنا لا أفهم شغل العمولات والحسابات واللف والدوران وكتير من اللي موجودين في المنتدى فبرجاء إخواني والنداء ليس لك وحدك ..عندما يكون هناك طلب انزل بمستوى الشرح للناس العادية ، اتكلم بلغة الإكسيل التي يفهمها الجميع ، ول يكفي أحيانا إرفاق ملف بقدر ما نريد أيضا توضيح وتفصيل للمطلوب ، وأحيانا أيضا لا يكفي فساعتها يستحب إرفاق شكل النتائج المرجوة بعد تنفيذ الكود أو المعادلة .. أعتذر للإطالة .. ولكن وجب التوضيح (وأكرر هذه الملحوظة ليست لك وحدك بل لكل من يطرح موضوعات جديدة بالمنتدى ) ونقطة أخرى هامة جدا أن يكون عنوان الموضوع معبر عن المشكلة أو الطلب نقطة أخرى يستحب رفع الملف على سيرفر المنتدى تقبل تحياتي
  11. بوركت أخي الحبيب أبو سليمان بس كدا الأستاذ رجب يزعل ..بلشاي أبو الكرم والشهامة والنبل (بس فيها عيب صغير مش هقول عليه)
  12. أستاذي طارق محمود لابد أن يكون حلك هو الأفضل الملف الذي قمت بإرفاقه قد يكون مختلف عن الطلب الخاص بالسائل ، ولكني حدثت نفسي بأنه يمكن أن يكون الملف مشابه وأن يطلع عليه السائل ويرى هل هو مشابه أو هناك تغيير كلي في مطلوبه تقبل تحياتي أستاذي وحبيبي في الله الباشمهندس الكبير طارق
  13. جرب الكود بهذا الشكل : Sub GetDataNew() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRow As Long Dim FileName As String Dim WorkBk As Workbook Dim LR As Long, X, I, Y 'اسم ورقة العمل المراد نسخ البيانات إليها Set SummarySheet = ThisWorkbook.Worksheets("ورقة1") '================================================= ''يمكن تغيير المسار من هذا السطر ''FolderPath = ThisWorkbook.Path & "\" '' السطر السابق إذا كانت الملفات المراد جلب البيانات منها مع المصنف الرئيسي في نفس المجلد ''مسار المجلد الذي سيحوي المصنفات التي سيتم جلب البيانات منها FolderPath = ThisWorkbook.Path & "\بيانات الفصول\" '================================================= NRow = 2 'أول صف لنسخ البيانات فيه في المصنف الحالي 'مسح النطاق الذي ستظهر فيه النتائج Range("B2:C1000").ClearContents FileName = Dir(FolderPath & "*.xl*") Application.ScreenUpdating = False Do While FileName <> "" And FileName <> ThisWorkbook.Name For I = 2 To 21 'الصفوف من الصف الثاني إلى الصف الثاني والعشرون X = ExecuteExcel4Macro("len('" & FolderPath & "[" & FileName & "]ورقة1'!R" & I & "C2)") If Not IsError(X) Then If X > 0 Then 'نسخ العمود الثاني SummarySheet.Range("B" & NRow).Value = ExecuteExcel4Macro("'" & FolderPath & "[" & FileName & "]ورقة1'!R" & I & "C2") 'نسخ العمود الرابع SummarySheet.Range("C" & NRow).Value = ExecuteExcel4Macro("'" & FolderPath & "[" & FileName & "]ورقة1'!R" & I & "C4") NRow = NRow + 1 End If End If Next FileName = Dir() Loop Range("A1").Select Application.ScreenUpdating = True End Sub
  14. الأخ الحبيب حلمي (حلمي إن مصر تكون بخير) من فترة كان فيه موضوع مشابه ، وفيه ملف مرفق ..شوف محتواه هل يناسب طلبك أم تريد التعديل على اللي موجود TAX Function.rar
  15. الحمد لله الذي بنعمته تتم الصالحات لا تنساني بدعوة بظهر الغيب .. لن يكلفك الأمر أكثر من نصف ساعة .. لا متخافش !! مش هلزمك بنص ساعة دعاء كفاية أوي ربع ساعة ولا أقولك والله هي دقيقة تبقا زي الفل ..المهم تكون بنية صادقة وبإخلاص تقبل تحياتي يا نجم يا صاعد
  16. أخي الحبيب الغاائب الحاضر ..جاري الغالي .. وأستاذي الكبير رجب بيه جاويش مفتقدين تواجدك بيننا .. لما كل هذه الغيبة الطويلة ..! المهم متهربش مني أنا عازم نفسي عندك لما أنزل البلد ... تقبل تحياتي
  17. أخي الحبيب إبراهيم جرب المرفق التالي عله يفي بالغرض Special Serial.rar
  18. الأخ الحبيب محمد أبو نازل (أنا كمان نازل .. بس نازل أجازة) لم أرى أية أصفار لدي في الخلايا المذكورة .. عموما حدد أي ورقة بالضبط ..أنا ألقيت نظرة على كل الأوراق ومفيش اللي إنت بتقوله ده يا ريت لما تظر مشكلة معاك تكون أكثر تحديدا أخي محمد حتى نصل بسرعة لحل أي مشكلة بإذن الله حدد أي ورقة عمل تقصد وحدد الخلايا التي بها مشكلة هل جربت إدخال قيم في العمود اللي بتظهر فيه أصفار .. وظهر المجموع في الآخر صفر مش فااااااااااهم المشكلة
  19. أخي الفاضل مش عارف ايه ناازل تفضل المرفق التالي .. لاحظ أن أسماء أوراق العمل لا يجوز أن يكون فيها هذه العلامة / ولذلك استبدلتها بـ - بالنسبة للترحيل سيكون دفعة واحدة من كل أوراق العمل التي تم عملها فقط حسب العمود الثالث في ورقة العمل Data بالنسبة للورقة Temp هي تعتبر نموذج للمطلوب ، قم بإظهارها عن طريق كليك يمين على أسماء أوراق العمل ثم Unhide ثم حدد الورقة المسماة Temp ثم أظهرها ، ولكن يجب الحذر وعدم إضافة صفوف أخرى لأن الخلايا بها مرتبطة بالكود ... فقط يمكنك التنسيق في الخلايا من حيث الخط وخلافه وكذلك المعادلات كما تحب .. ولكن يجب الحيطة والحذر .. تفضل المرفق وجربه وشوف (بس يا ريت يكون النهاردة لأني مش هكون متواجد في المنتدى الفترة القادمة لمدة 10 أيام إن شاء الله) تقبل تحياتي Orders Follow.rar
  20. استاذ / محمد لطفي استاذ / محمد لطفي استاذ / محمد لطفي استاذ / محمد لطفي ربنا يبارك فيك ، ويجازيك كل خير .. مشكور على مرورك العطر
  21. أخي الفاضل يرجى التوضيح هناك ورقة عمل باسم ADULT وأخرى باسم ENFENT وأخرى باسم ورقة1 ..إلى أين تريد الترحيل ومن أين وعلى أساس أي عمود ؟؟ راعي أن البعض لا يجيد اللغة الإنجليزية أو الفرنسية !! وأحيانا العربية ههههه تقبل تحياتي
  22. تفضل أخي هذا إصدار آخر به تنسيق شرطي كما أردت في مشاركتك الأولى Count Adjacent Numbers.rar
  23. لم أفهم المطلوب... قم بإرفاق نموذج من شكل المخرجات التي تريدها .. كفكرة يمكنك عمل ورقة عمل بها بيانات كل الفواتير .. وفي ورقة أخرى نموذج للفاتورة .. وتقوم باستدعاء الفاتورة بطريقة ما يمكن استخدام المعادلات العادية بدالة Vloopup
  24. أخي الحبيب مرحبا بك في المنتدى وأهلا بك بين إخوانك ارفق نموذج مبسط وابدأ اشرح عليه المطلوب بالضبط وإن شاء الله تجد من يعاونك
×
×
  • اضف...

Important Information