لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 06/24/24 في كل الموقع
-
السلام عليكم اريد معرفه الطريقه الصحيحه للمذاكره في هذا الكورس والاستفاده اكبر قدر ممكن وشكرا3 نقاط
-
هل يمكن للمطورين الويب ان يعملوا في تطوير لتطبيقات السيارات ؟ هل التقنيات نفسها التي يتم استعمالها في الويب ام توجد مكتبات و تقنيات اخرى ؟3 نقاط
-
1 نقطة
-
السلام عليكم. أواجه مشكل في جلب البيانات من الخادم حيث لايتسنى إظهار هذه البيانات على الواجهة الأمامية إلا بعد تحديث الصفحة. الكود. إضافة كتاب (الواجهة الخلفية) // method POST // route api/books // desc Create new book // access Private | admin const createBook = asyncHandler(async(req, res) => { try{ // Image Validation if (!req.file) { return res.status(400).json({ message: "no image provided" }); } // Upload Photo const imagePath = path.join(__dirname, `../images/${req.file.filename}`); const result = await cloudinaryUploadImage(imagePath); // Save new post in database const book = await Book.create({ title: req.body.title, description: req.body.description, category: req.body.category, user: req.userId, image: { url: result.secure_url, publicId: result.public_id, }, author: req.body.author, language: req.body.language, PublicationDate: req.body.PublicationDate, }); // Send response to the client res.status(201).json(book); // 6. Remove image from the server fs.unlinkSync(imagePath); } catch (err) { console.log(err.message) res.status(500).send('Server error') } }); إضافة كتاب الواجهة الأمامية // bookSlice getBooks(state, action) { state.books = action.payload; }, setBooks(state, action) { state.books = [...state.books, action.payload] }, // bookApiCall export function addBook(newBook) { return async (dispatch, getState) => { try { dispatch(bookActions.setLoading()) const {data} = await axios.post(`${BOOK_URL}`, newBook, { headers: { "authorization": getState().auth.user.accessToken } }); dispatch(bookActions.setBooks(data)); dispatch(bookActions.clearLoading()); } catch (error) { toast.error(error?.response?.data.message); dispatch(bookActions.clearLoading()); } }; } /** * Add New Book */ const [fileName, setFileName] = useState(null); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [category, setCategory] = useState(""); const [author, setAuthor] = useState(""); const [PublicationDate, setPublicationDate] = useState(""); const [language, setLanguage] = useState(""); const formSubmitHandler = (e) => { e.preventDefault(); if (title.trim() === "") return toast.error("Book Title is required"); if (category.trim() === "") return toast.error("Book Category is required"); if (description.trim() === "") return toast.error("Book Description is required"); if (author.trim() === "") return toast.error("Book Author is required"); if (language.trim() === "") return toast.error("Book Language is required"); if (PublicationDate.trim() === "") return toast.error("Book Publication Date is required"); if (!fileName) return toast.error("Book Image is required"); const formData = new FormData(); formData.append("image", fileName); formData.append("title", title); formData.append("description", description); formData.append("category", category); formData.append("author", author); formData.append("language", language); formData.append("PublicationDate", PublicationDate); dispatch(addBook(formData)) setFileName(null) setTitle("") setDescription("") setCategory("") setAuthor("") setPublicationDate("") setLanguage("") }; /** * Fetch All Books With Pagination */ useEffect(() => { dispatch(fetchBooks()); }, [dispatch]); شكرا على المساعدة.1 نقطة
-
عند عمل الامر npm run build لمشروع html scss js كأن الاصدار من ال node لايتوافق ويظهر هذا الخطاء > company@1.0.0 build > webpack serve --mode production (node:22464) [DEP0111] DeprecationWarning: Access to process.binding('http_parse r') is deprecated. (Use `node --trace-deprecation ...` to show where the warning was created) i 「wds」: Project is running at http://localhost:9000/ i 「wds」: webpack output is served from undefined i 「wds」: Content not from webpack is served from C:\Users\Mohsen\ALaravel\compan y-website\build node:internal/crypto/hash:69 this[kHandle] = new _Hash(algorithm, xofLen); ^ Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:69:19) at Object.createHash (node:crypto:138:10) at BulkUpdateDecorator.hashFactory (C:\Users\Mohsen\ALaravel\company-website \node_modules\webpack\lib\util\createHash.js:138:18) at BulkUpdateDecorator.update (C:\Users\Mohsen\ALaravel\company-website\node _modules\webpack\lib\util\createHash.js:44:50) at RawSource.updateHash (C:\Users\Mohsen\ALaravel\company-website\node_modul es\webpack-sources\lib\RawSource.js:64:8) at NormalModule._initBuildHash (C:\Users\Mohsen\ALaravel\company-website\nod e_modules\webpack\lib\NormalModule.js:736:17) at handleParseResult (C:\Users\Mohsen\ALaravel\company-website\node_modules\ webpack\lib\NormalModule.js:800:10) at C:\Users\Mohsen\ALaravel\company-website\node_modules\webpack\lib\NormalM odule.js:853:4 at processResult (C:\Users\Mohsen\ALaravel\company-website\node_modules\webp ack\lib\NormalModule.js:624:11) at C:\Users\Mohsen\ALaravel\company-website\node_modules\webpack\lib\NormalM odule.js:675:5 { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED' } Node.js v20.5.1 كيف العمل مع هذه المشكلة1 نقطة
-
هذا يعتمد على مدي حجم المشروع والمكتبات التي يتم إستخدامها . حيث إذا كان حجم المشروع كبيرا فستجد أنه بمجرد تحديث حزمة ستحدث مشاكل كثيرة لديك بسبب تداخل إصدارات الحزم وإعتمادها علي بعضها البعض ولذلك يفضل في تلك الحالة تحميل إصدار nodejs يتوافق مع جميع تلك الحزم . أو محاولة تحديث جميع الحزم لديك ولكنك يتوجب عليك التغير كثيرا في الكود . لذلك إذا كان المشروع صغيرا في الحجم فيفضل تحديث مكتبة webpack و حل أى مشكلة تظهر لك بسبب الإعدادت القديمة وإستبدالها بالجديدة و لكن إذا كان المشروع كبيرا فيفضل تحميل نسخة nodejs قديمة تتوافق معه1 نقطة
-
بحل المشكلة من جذورها وليس الإلتفاف بتغيير إصدار node.js نفسه، فكما ذكرت لك مكتبة Webpack غير متوافقة مع الإصدار الحديث لديك وهو 20، عليك تحديث كل من webpack و webpack CLI لأحدث إصدار، وتعديل الإعدادات فيwebpack.config بما يتناسب مع الإصدار الحديث.1 نقطة
-
نعم سوال عام ماهي أفضل طريقة يتم التعامل بها مع إختلاف الاصدار لل nodejs1 نقطة
-
بالطبع لا فالأمر مختلف، فأنت لا تقوم بتطوير تطبيق لسيارة من خلال لغة جافاسكريبت فهي غير مناسبة لذلك. فأنت بحاجة إلى لغة منخفضة المستوى مثل C وC++ وأحيانًا assembly، وذلك للتطبيقات الخاصة بنظام السيارة. بالطبع يتوفر نظام مثل Android Auto الذي يُتيح لك تطوير تطبيقات للسيارة من خلال لغة مثل كوتلين، لكن ستظل بحاجة إلى أساسيات C++ على الأقل.1 نقطة
-
نعم يمكنهم ذلك ولكن المطورين الويب يمكنهم الانتقال إلى تطوير تطبيقات السيارات، ولكن قد يتطلب ذلك تعلم تقنيات جديدة. ففي تطوير الويب، يتم استخدام لغات وتقنيات مثل HTML، CSS، JavaScript، وأطر العمل مثل React.js و Angular. اما في تطوير تطبيقات السيارات، قد تحتاج إلى تعلم لغات وتقنيات مختلفة. على سبيل المثال: لغة C++: تستخدم بشكل واسع في برمجة أنظمة السيارات نظرا لأدائها العالي. لغة Python: تُستخدم في تحليل البيانات وتطوير الذكاء الاصطناعي والأنظمة المدمجة. أنظمة تشغيل مدمجة: مثل نظام تشغيل السيارات QNX أو نظام التشغيل المدمج Linux. وتوجد مكتبات وأدوات لتطوير تطبيقات السيارات اشهرها: AUTOSAR: هو معيار مفتوح لتطوير البرمجيات المدمجة في السيارات. ROS (Robot Operating System): يُستخدم في تطوير الأنظمة الروبوتية ويمكن استخدامه في السيارات ذاتية القيادة. المطورين الويب الذين يرغبون في الانتقال إلى تطوير تطبيقات السيارات يحتاجون إلى تعلم الأساسيات في الهندسة المدمجة وبرمجة الأنظمة ذات الزمن الحقيقي. بشكل عام، المهارات الأساسية في البرمجة والتفكير المنطقي التي يمتلكها المطورون الويب يمكن أن تساعدهم بشكل كبير في تعلم التقنيات الجديدة المطلوبة لتطوير تطبيقات السيارات1 نقطة
-
السلام عليكم ورحمة الله وبركاته لد استفسار لدي موقع حجوزات سيارات فيه عدة خيارات للمستخدم ذهاب-ذهاب واياب-وجهات متعددة المشكلة الي تواجهني بالاسعار الوجهات من مدينة الاخرى لدي 30 مدينة وكل واجهة من مدينة لاخرى السعر يختلف ايضا على مستوى نوع السيارة مثلا سعر حجز سيارة المرسيدس من الرياض لجدة تختلف عن الفورد من الرياض لجدة كيف اعمل ذلك1 نقطة
-
1 نقطة
-
إذا كنتي تقصدين التمارين التي يطلبها المدرب في نهاية الدرس فتلك التمارين يمكنكي حلها و إرفاقها أسفل الدرس للتحقق من صحتها أو لو توجد لديكي أى أخطاء يتم تصحيحها لكي أو يمكنك متابعة الدرس التالي لها الذى سوف يقوم المدرب بحل تلك التمارين . أما إذا كان سؤالك بخصوص تسليمها للحصول على الشهادة فمن شروط الحصول على الشهادة رفع المشاريع على حسابك على GitHub لذلك يجب عليك رفع المشاريع التي قمت بها للحصول على الشهادة. ويمكنكي قراءة الإجابات التالية :1 نقطة
-
بشكل بسيط الشبكات العصبية في التعلم العميق Deep Learning تحتوي على العديد من الطبقات المخفية غالبًا 5 أو أكثر، مما يمكنها من تعلم تمثيلات أكثر تعقيدًا. والطبقات هي كالتالي: الطبقات العميقة: تحتوي على العديد من الطبقات المخفية (يمكن أن تكون عشرات أو حتى مئات الطبقات). الطبقات المتخصصة: مثل طبقات الالتفاف Convolutional Layers في الشبكات العصبية التلافيفية CNNs وطبقات الذاكرة Recurrent Layers في الشبكات العصبية المتكررة RNNs. العصبونات Neurons: مشابهة للعصبونات في التعلم الآلي التقليدي لكنها أكثر تعقيدًا بسبب العدد الكبير من الطبقات والوصلات. التنشيط Activation: تستخدم دوال تنشيط أكثر تعقيدًا مثل Leaky ReLU، Parametric ReLU، وSoftmax. والقدرة على تعلم الميزات من البيانات الخام بدون الحاجة إلى تصميم ميزات يدوية، وتُستخدم في تطبيقات متقدمة مثل معالجة الصور (التعرف على الصور، التعرف على الوجوه)، معالجة اللغة الطبيعية (الترجمة الآلية، تحليل المشاعر)، والتعلم المعزز (الألعاب، الروبوتات). بينما الشبكات العصبية في التعلم الآلي Machine Learning تحتوي على طبقة أو طبقتين مخفيتين فقط، وتستخدم في الغالب لنماذج أبسط، مثل التنبؤ والتصنيف في مجموعات بيانات محدودة، وتستطيع استخدامها في تطبيقات مثل التصنيف البسيط، التنبؤات الزمنية، والتعرف على الأنماط، وأداء النماذج محدودًا في المهام المعقدة. والطبقات هي: الطبقة المدخلة Input Layer: تستقبل البيانات المدخلة. الطبقات المخفية Hidden Layers: عادة تكون واحدة أو اثنتين، تتوسط بين الطبقة المدخلة والطبقة المخرجة، حيث يتم تنفيذ معظم العمليات الحسابية. الطبقة المخرجة Output Layer: تعطي نتيجة التنبؤ أو التصنيف. بينما التعلم الآلي يتطلب موارد حسابية أقل، ويمكن تشغيله على أجهزة كمبيوتر عادية، بينما التعلم العميق يتطلب موارد حسابية عالية، غالبًا ما يحتاج إلى وحدات معالجة الرسوميات أو حتى وحدات معالجة متخصصة (TPUs). ويقدم أداءً ممتازًا في المهام المعقدة بفضل قدرته على تعلم التمثيلات المعقدة من البيانات.1 نقطة
-
حاليًا لا يوجد فرق. بشكل عام التعلم العميق هو أحد أفرع تعلم الآلة لذلك فعليًا ستكون الشبكات العصبية في كليهما نفس المفهوم. الفرق هو في البدايات، عندما تم ابتكار الشبكات العصبية لم يكن هناك ما يعرف بالتعلم العميق، و قد بدأت الشبكات العصبية على شكل طبقتين أو ثلاثة. مع تطور القدرات الحسابية و بعض التقنيات أصبح بالإمكان إنشاء شبكات عصبية تحوي على الكثير من الطبقات و هنا بدأ ما يسمى التعلم العميق. بالتالي في الحالتين هما شبكات عصبية، في حال كان هناك طبقات كثيرة فهي أيضًا تتبع للتعلم العميق. تحياتي.1 نقطة
-
السلام عليكم ورحمة الله و بركاته احتاج اعدل الصلاحيات الخاصة بملف php في xampp في Windows حيث احتاج تعديل صلاحيات ملف .php إلى 555 مثل الأستضافات المدفوعة1 نقطة
-
1 نقطة
-
وعليكم السلام ورحمة الله وبركاته في نظام تشغيل Windows مع XAMPP، لا يمكنك تعيين صلاحيات الملفات بنفس الطريقة التي تفعلها في أنظمة Linux أو Unix. في Windows، الصلاحيات تتحكم بشكل أساسي من خلال خصائص الملفات والأذونات التي تسمح أو تمنع الوصول إلى الملفات و حيث تستخدم أنظمة Linux خصائص (attributes) مختلفة عن التي يستخدمها windows. وإذا كنت ترغب في جعل ملف PHP يشابه الصلاحيات التي تجدها في بيئات الاستضافة المدفوعة (مثل 555)، يمكنك القيام بالتالي: 1-فتح خصائص الملف: انقر بزر الماوس الأيمن على ملف PHP الذي ترغب في تعديل صلاحياته. اختر properties "الخصائص" من القائمة المنسدلة. 2-تعديل الأذونات: انتقل إلى علامة التبويب security "الأمان". انقر على زر Edit "تعديل" لتعديل الأذونات. 3-تعيين الأذونات: سترى نافذة "الأذونات للملف"، حيث يمكنك تعيين الصلاحيات المناسبة. في حالة 555، يمكنك تحديد خيارات "قراءة" (Read) للجميع (Everyone) وعدم تحديد خيارات الكتابة (Write) أو التنفيذ (Execute). بعد تعيين الصلاحيات المناسبة، انقر على "تطبيق" ثم "موافق". هذه الخطوات ستسمح لك بتعيين الصلاحيات على ملف PHP بطريقة تقليدية في نظام Windows. يرجى ملاحظة أن XAMPP نفسه يعمل عادة باستخدام حساب مستخدم محلي لنظام Windows، وليس باستخدام حسابات مستخدم قابلة للتخصيص مثلما هو الحال في الخوادم التي تعتمد على Linux أو Unix، لذا تعديل الأذونات في XAMPP يختلف قليلاً عن التعامل معه في بيئات الخوادم.1 نقطة
-
لعمل حلقة (loop) في قالب HTML لمدونة بلوجر، يمكنك استخدام لغة Blogger Template (التي تعتمد على XML) لاستدعاء التدوينات المنشورة. حيث يمكنك استخدام Blogger Template Tags في قالب HTML الخاص بك و يمكنك استخدام بعض الوسوم المتاحة في Blogger لاستدعاء التدوينات. الوسم الأساسي هو <b:loop> هذا الوسم يمكن أن يشبه حلقة for loop في البرمجة حيث يكرر نفسه لكل تدوينة في المدونة. مثال على استخدام الوسم <b:loop> <b:loop values='data:posts' var='post'> <!-- هنا نقوم بوضع العناصر التي تريد عرضها لكل تدوينة --> <h2><a expr:href='data:post.url'><data:post.title/></a></h2> <!-- عرض محتوى التدوينة --> <p><data:post.body/></p> </b:loop> data:posts: هذا يشير إلى كافة التدوينات المنشورة في المدونة. var='post': هذا هو المتغير الذي يتم تكريره في كل دورة من الحلقة، والذي يمكنك استخدامه للوصول إلى معلومات التدوينة مثل العنوان <data:post.title/> والمحتوى <data:post.body/> والرابط <data:post.url/> وهكذا . ويصبح الكود كالتالي بالمثال الذى أرفقته : <b:loop values='data:posts' var='post'> <div class='article'> <h3 class='article-title'><data:post.title/></h3> <p class='article-content'><data:post.body/></p> <a expr:href='data:post.url'><button class='view-details'>عرض المقال</button></a> </div> </b:loop>1 نقطة
-
الشبكة العصبية هي نموذج مستوحى من طريقة عمل الدماغ البشري. تتكون من طبقات من العقد (neurons) المتصلة ببعضها. بنستخدم هذه الشبكات العصبية البسيطة لحل مشاكل محددة مثل التصنيف أو التنبؤ. على سبيل المثال، يمكن استخدام شبكة عصبية بسيطة لتصنيف البريد الإلكتروني إلى بريد عادي أو بريد غير مرغوب فيه. - الشبكات العصبية في التعلم الآلي neural network in machine learning عادة ما تحتوي على عدد قليل من الطبقات (قد تكون طبقة أو اثنتين فقط). التعلم العميق Deep learning هو جزء من التعلم الآلي، ولكنه يستخدم شبكات عصبية ذات بنية أكثر تعقيدا وتحتوي على العديد من الطبقات (من هنا جاءت كلمة "عميق" لأنها تعني العديد من الطبقات). تستخدم الشبكات العصبية العميقة لحل مشاكل أكثر تعقيدا مثل التعرف على الصور، الترجمة الآلية، والسيارات ذاتية القيادة. بسبب العمق والتعقيد، يمكن لهذه الشبكات التعلم من كميات كبيرة من البيانات وتحليلها بشكل أكثر دقة على سبيل المثال، يمكن استخدام شبكة عصبية عميقة للتعرف على الوجوه في الصور أو حتى للفهم التلقائي للغة الطبيعية.1 نقطة
-
يحتاج تدقيق البرنامج عند كتابته باستخدام VBA في إكسل إلى إيقاف البرنامج مؤقتًا في نقاط محددة للتعديل والتدقيق ثم إعادة تشغيله عددًا من المرات، مما يحتاج إيجاد أنسب وأسرع الوسائل للإيقاف المؤقت والتشغيل والمراقبة سنستعرض بعضًا منها. تشغيل الشيفرة أو واجهة المستخدم UserForm في VBA Exel يمكن تشغيل الشيفرة في إكسل VBA بثلاث طرائق نختار الأسرع منها أثناء مراقبة سير عمل البرنامج وتتبع الأخطاء: من علامة التبويب Run > Run Sub/UserForm. الضغط على مفتاح الاختصار F5 من لوحة المفاتيح. النقر على زر Run Sub/UserForm من شريط الأدوات. إدراج أو إزالة نقاط توقف مؤقت Toggle Breakpoint في VBA Exel قد نحتاج إلى إيقاف تنفيذ الشيفرة البرمجية مؤقتًا في VBA عند نقطة معينة في البرنامج من أجل ملاحظة النتائج المرحلية عند تلك النقطة وتدقيق عمل البرنامج لإجراء أي تعديلات لازمة. يمكن إدراج نقطة التوقف المؤقت عند سطر برمجي معين لإعطاء الأمر Toggle Breakpoint بخمسة طرائق: نضع المؤشر عند السطر المطلوب، ثم نذهب إلى علامة التبويب Debug > Toggle Breakpoint. النقر بزر الفأرة الأيمن على السطر الذي نريد إدراج نقطة التوقف عنده فتظهر قائمة منسدلة نختار منها Toggle فتظهر قائمة منسدلة جديدة نختار منها Breakpoint. نضع المؤشر عند السطر المطلوب ثم نضغط الزر F9 اختصارًا للخطوة السابقة. ننقر بالمؤشر على الهامش الذي إلى يسار السطر المطلوب. لإدراج نقطة توقف من داخل الشيفرة البرمجية يمكن كتابة الكلمة المفتاحية Stop في السطر الذي يسبق السطر البرمجي الذي نريد إيقاف تنفيذ البرنامج عنده. تؤدي أي من الطرائق السابقة إلى ظهور إشارة مستديرة لونها أحمر داكن أو بني إلى جوار السطر المطلوب في الهامش الرمادي مما يعني أنه تم تعيين نقطة توقف مؤقت عند هذا السطر، ويُميَّز السطر بنفس اللون. إعطاء نفس الأمر مرة ثانية في VBA بأي من الطرائق السابقة يؤدي إلى إزالة نقطة التوقف المؤقت وإزالة الإشارة المستديرة والتمييز من ذلك السطر البرمجي. إن إعطاء الأمر Run لأول مرة في اكسل VBA بوجود نقطة توقف ينفذ الشيفرة البرمجية من بداية البرنامج إلى السطر السابق لنقطة التوقف ليتوقف تنفيذ البرنامج مؤقتًا عند السطر البرمجي الذي وضعنا عنده هذه النقطة ويميز السطر بالأصفر وتظهر إشارة سهم أصفر في الهامش الرمادي إلى يسار ذلك السطر، ويدخل البرنامج في طور الإيقاف المؤقت Break Mode. وفي حال وجود نقاط توقف أخرى فإن تشغيل الشيفرة مرة جديدة يجعل البرنامج يتابع التنفيذ بين نقطتي توقف متتاليتين ابتداءً من نقطة التوقف الأخيرة التي وقف عندها وميزها بالأصفر. مثال: يكتب المثال التالي أرقام الصفوف في المجال C2:F4 بالدخول في حلقتين متداخلتين في الإجراء الأصلي Sub1Write الحلقة i لتحديد رقم الصف والحلقة j لتحديد رقم العمود، بعد إنهاء الحلقتين والخروج منهما يستدعي الإجراء الثاني Sub2Format الذي يلون الخط في خلايا السطر الواحد بنفس اللون بالدخول أيضًا في حلقتين متداخلتين i و j مشابهتين للحلقتين السابقتين. Sub Sub1Write() For i = 2 To 4 For j = 3 To 6 Worksheets("Sheet1").Cells(i, j) = i Next j Next i Call Sub2Format End Sub Sub Sub2Format() For i = 2 To 4 For j = 3 To 6 Worksheets("Sheet1").Cells(i, j).Font.ColorIndex = i + 1 Next j Next i End Sub يمكن إضافة أكثر من نقطة توقف مؤقت لمراقبة سير البرنامج في مراحل مختلفة تكون مفصلية في عمل الشيفرة. ويمكن إدراج نقاط التوقف في أكثر من إجراء لمقاطعة التنفيذ عند الانتقال بين الإجراءات الأصلية والإجراءات المستدعاة. تساعد هذه النقاط في فهم آلية عمل البرنامج بشكل أفضل. حيث يتوقف تنفيذ الإجراء مؤقتًا كلما وصل إلى إحدى تلك النقاط مما يسمح بملاحظة التغييرات الحاصلة. وبتكرار إعطاء الأمر بالتشغيل يدويًا بالضغط على زر F5 أو النقر على زر Run، يتابع البرنامج التنفيذ من نقطة التوقف الحالية حتى نقطة التوقف التالية أو إلى نهاية الشيفرة إن لم توجد نقاط توقف تالية. يمكن إعطاء الأمر بمتابعة تنفيذ خطوة واحدة في VBA فقط بدءًا من نقطة التوقف الحالية بإعطاء الأمر Step Into أو Step Over، أو متابعة التنفيذ من نقطة التوقف الحالية حتى مكان المؤشر باستخدام الأمر Run To Cursor، أو متابعة التنفيذ من نقطة التوقف الحالية إلى نهاية الإجراء باستخدام الأمر Step Out. أو تحديد الخطوة التالية بإعطاء الأمر Set Next Statement ثم نقر الزر Run. غير أن نقاط التوقف المدرجة تستطيع أن تقاطع جميع أوامر التشغيل والخطو السابقة وتوقف التنفيذ عندها. ملاحظة: لا يوجد أي ارتباط بين المتغيرين i و j في الحلقة الأولى في الإجراء الأصلي والمتغيرين i و j في الحلقة الثانية في الإجراء الفرعي، فقد انتهت الحلقتين الأولين في الإجراء الأصلي تمامًا لتبدأ الحلقتين الأخريين في الإجراء الفرعي بقيم i و j جديدة. كما أنه لم يتم تعريف أي من المتغيرين كمتغير عام لذا تمسح قيم كل منهما بمجرد الانتقال بين الحلقتين، باختصار يمكن أن نعتبر المتغيرات i و j في الإجراء الثاني متغيرات جديدة تمامًا كما لو كانا باسمين جديدين k و F. إزالة جميع نقاط التوقف Clear All Breakpoints في VBA Exel عند إضافة عدد كبير من نقاط التوقف في VBA، قد نحتاج إلى إزالتها كلها، ولكن البحث عن كل نقطة توقف وتكرار الأمر Toggle Breakpoint لإزالتها يدويًا واحدة تلو الأخرى يحتاج بعض الوقت. يمكن إزالة جميع نقاط التوقف من علامة التبويب Debug > Clear All Breakpoints أو بالضغط على أزرار الاختصارCtrl+Shift+F9. انظر مجددًا إلى المثال الأول: تشغيل الشيفرة حتى المؤشر Run to Cursor يعمل الأمرRun to Cursor بطريقة مشابهة لنقاط التوقف فيجري تنفيذ الشيفرة أو متابعة تنفيذها حتى يتوقف موضع المؤشر، ولكن لا تبقى نقطة التوقف البنية المستديرة والتمييز البني موجودين هنا كما في الأمر Toggle BreakPoint كما أن تأثيرها يزول بعد انتهاء الأمر Run to Cursor. لتنفيذ الشيفرة حتى مكان المؤشر، نضع المؤشر على السطر الذي نريد إيقاف تنفيذ التعليمات البرمجية مؤقتا فيه ثم نذهب إلى شريط القوائم Debug > Run to Cursor، كما يمكن الضغط على أزرار الاختصار CTRL + F8. تعمل Run to Cursor عندما يكون التطبيق في وضع التصميم، يمكن أن تفيد لتنفيذ عدد كبير من الخطوات البرمجية لا نحتاج إلى مراقبة تفاصيلها كالحلقات الكبيرة مثلًا. كما يمكن استخدام الأمر Run to Cursor للانتقال في تنفيذ الأوامر البرمجية بين نقاط في الإجراءات الأصلية والفرعية المستدعاة. مثال: نطبق الأمر Step into لتنفيذ خطوة واحدة من الشيفرة السابقة من شريط القوائم أو بضغط زر الاختصار F8 ولتجنب الخطوات الكثيرة في الحلقات في كلي الإجراءين نضع المؤشر في المكان الذي نريد التنفيذ عنده ثم نطلب الأمر Run to Cursor من شريط القوائم أو بالضغط على أزرار الاختصار CTRL + F8. تعيين السطر التالي في التنفيذ Set Next Statement في VBA Exel عندما ننتقل في الشيفرة خطوة خطوة نلاحظ أن السطر البرمجي الذي سينفَّذ في الخطوة التالية يميَّز باللون الأصفر مع ظهور سهم أصفر يشير إليه في منطقة الهامش إلى يسار ذلك السطر. يمكن تغيير السطر التالي الذي سينفذ فينتقل التمييز والسهم الأصفر إليه بأحد الطرق الثلاثة التالية: من علامة التبويب Debug > Set Next Statement. نضع المؤشر عند السطر المطلوب ثم نضغط أزرار الاختصار Ctrl +F9 اختصارًا للخطوة السابقة. النقر على السهم الأصفر بزر الفأرة الأيسر وسحبه إلى أي سطر نريد. يؤدي استعمال أي من الأساليب السابقة طبعًا إلى تغيير ترتيب تنفيذ أوامر الشيفرة البرمجية. يفيد هذا بشكل خاص عندما نجري تعديلًا ما في أحد الأسطر بعد أن تم تنفيذه، ونريد إعادة متابعة التنفيذ ابتداءً من هذا السطر. مثال: نشغل الشيفرة السابقة حتى سطر الاستدعاء في الإجراء الأول بإدراج إشارة إيقاف مؤقت Breakpoint عند السطر Call Sub2Format فتُملأ الخلايا بأرقام الأسطر، ثم نكمل التشغيل حتى نهاية الإجراء الثاني المستدعى فيلوَّن الخط بلونٍ دليلُه يساوي رقم الصف +1، نغير الرقم المضاف إلى رقم الصف i والذي يمثل دليل اللون ونعيد تشغيل الحلقة في الإجراء الثاني من بدايتها لنلاحظ تغير لون الخط. ملاحظة: يمكن تطبيق Set Next Statement فقط على الأسطر القابلة للتنفيذ ضمن نفس الإجراء الذي يجري التنفيذ فيه، فلا يمكن الانتقال بين الإجراءات المستدعاة والإجراءات الأصلية. لا يكون الأمر Set Next Statement فعالًا إلا في وضع الإيقاف المؤقت Break Mode بعد أن نكون قد نفذنا جزءًا من الشيفرة. إظهار العبارة البرمجية التالية Show Next Statement في VBA Exel عند استخدام الأمر Show Next Statement في VBA ينتقل مؤشر الكتابة إلى بداية السطر التالي في التنفيذ والذي يكون مميزًا بالأصفر بشكل آلي. يكون هذا الأمر مُفَعَّلًا في وضع الإيقاف المؤقت Break Mode فقط. خاتمة إن مهارة المبرمج في اختيار أماكن الإيقاف المؤقت ومرونته في التشغيل والإيقاف وتحديد نقطة التنفيذ التالية بأكثر من طريقة يسهل عليه معرفة الخلل في الشيفرة في VBA، وذلك من خلال إيقاف البرنامج مؤقتًا في النقاط التي يتوقع أن الخلل فيها أو التي تحوي متغيرات أو تعبيرات برمجية تؤثر على عمل الشيفرة ومن ثم مراقبة قيمها في تلك المرحلة. اقرأ أيضًا التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل تصحيح الأخطاء في VBA: الخطأ في الشيفرة صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA1 نقطة
-
قد يسهل علينا أثناء كتابة الشيفرة في برمجة VBA ضمن إكسل الإشارة إلى المراجع نسبة إلى الجدول أو المجال الموجودة فيه بدلًا من نسبته إلى ورقة العمل كاملة. سنستعرض أهم الأدوات التي تساعدنا في الإشارة إلى المراجع ضمن مجال في ورقة العمل في VBA Excel. يكون ذلك بالتعامل مع المجال ككائن وإضافة خاصية الصفوف Rows أو الأعمدة Columns أو المجال Range إليه. الإشارة إلى صفوف في مجال Range.Rows في VBA Exel يشار إلى الصفوف داخل مجال في إكسل VBA بالصيغة التالية: Range.Rows وترجع كائن مجال يمثل الصفوف الموجودة في المجال. حيث أن الخاصية Rows تعمل نسبةً للكائن Range المذكور قبلها في الشيفرة، وليس نسبةً لجدول البيانات بأكمله. مثال: الإجراء التالي يحدد الصف الثاني في المجال C3:I9 Worksheets("Sheet1").Range("C3:I9").Rows(2).Select الإشارة إلى أعمدة في مجال في VBA Exel يشار إلى الصفوف داخل مجال بالصيغة التالية: Range.Columns ترجع كائن مجال يمثل الأعمدة الموجودة في المجال. حيث أن الخاصية Columns تعمل نسبةً للكائن Range المذكور قبلها في الشيفرة، وليس نسبةً لجدول البيانات بأكمله. مثال: الإجراء التالي يحدد العمود الثالث في المجال C3:I9 Worksheets("Sheet1").Range("C3:I9").Columns(3).Select مثال: يلون الإجراء التالي الصف الثاني ثم يلون العمود الثالث في المجال C3:I9 باللون الزهري: Sub RangeRowsColumns() Worksheets("Sheet1").Range("C3:I9").Rows(2).Select Worksheets("Sheet1").Range("C3:I9").Columns(3).Select End Sub ملاحظة: عندما تطبق هاتان الخاصيتان على كائن مجال متعدد التحديد، ترجعان الصفوف والأعمدة في المنطقة الأولى فقط للمجال متعدد المناطق. مثال: يلون الإجراء التالي الصف الثاني ثم يلون العمود الثالث في التحديد باللون الزهري، فإذا حددنا أكثر من مجال طبق الإجراء على المجال الذي حددناه أولًا فقط. Sub RangeRowColٍSelection() Application.Selection.Rows(2).Interior.ColorIndex = 7 Application.Selection.Columns(3).Interior.ColorIndex = 7 End Sub ملاحظة: إذا نسبنا الصفوف أو الأعمدة إلى كائن ورقة العمل بشكل مباشر أشارت إلى صفوف وأعمدة في ورقة العمل عمومًا، ويعتبر هذا هو الخيار الافتراضي لكائني الصف والعمود، فإذا لم ننسب الصف أو العمود إلى كائن أشارا إلى صف أو عمود في كامل رقة العمل. مثال: فلتحديد الصف الثالث من الورقة Sheet1 يمكن استخدام أي من الشيفرتين التاليتين: Rows(3).Select Worksheets("Sheet1").Rows(3).Select الإشارة إلى الصف أو العمود الأخير في مجال معين في إكسل VBA إذا كان عدد الصفوف متغيرًا وفقًا للإدخالات اليدوية يمكن الإشارة إلى المجال لتنسيقه مثلًا أو إجراء عمليات حسابية أو منطقية عليه. يشار إلى ترتيب الصف الأخير في ورقة العمل باستخدام الخاصية Range.Rows.Count والتي ترجع عدد الصفوف في المجال. ويشار إلى ترتيب العمود الأخير في ورقة العمل باستخدام الخاصية Range.Columns.Count والتي ترجع عدد الأعمدة في المجال. يرجع الإجراء التالي عدد صفوف المجال C2:I9 في الخلية A1. ويرجع عدد أعمدته في الخلية في الخلية A2، ثم يكتب 7 في آخر خلية في المجال ثم يحددها. Sub LastRangeCell() Worksheets("Sheet1").Cells(1, 1) = Range("C2:I9").Rows.Count Worksheets("Sheet1").Cells(2, 1) = Range("C2:I9").Columns.Count Cells(Range("C2:I9").Rows.Count, Range("C2:I9").Columns.Count) = 7 Cells(Range("C2:I9").Rows.Count, Range("C2:I9").Columns.Count).Select End Sub الإشارة إلى مجال ضمن مجال آخر Range.Range في VBA Exel يشار إلى مجال داخل مجال آخر باستخدام الخاصية Range المتعلقة بالكائن Range: Range.Range ملاحظة: يمكن تطبيق الخاصية Range على نوعين من الكائنات: كائنات ورقة العمل أو كائنات المجال. فتطبيق خاصية المجال على كائن المجال Range.Range يشير إلى مجال داخل مجال آخر. في حين أن تطبيق خاصية المجال على كائن ورقة العمل Worksheets.Range يشير إلى مجال يتعلق بورقة العمل بأكملها. باستخدام الخاصية Range يمكن تغيير خصائص كامل المجال أو تطبيق تابع على جميع خلاياه مرة واحدة. حيث يجري التعامل مع المجال ككائن، واي خاصية تأتي بعده تطبق على هذا الكائن. مثال: يعرف الإجراء التالي متغيرًا يسميه OriginalRange ككائن مجال. Dim OriginalRange As Range ثم يسند إليه المجال C3:I9 من الورقة Sheet1. Set OriginalRange = Worksheets("Sheet1").Range("C3:I9") ثم ينسق خلاياه بإحاطتها بحدود ذات خط مستمر OriginalRange.Borders.LineStyle = xlContinuous هنا الخاصية Range تتبع ورقة العمل بأكملها حيث أنها أسندت إلى كائن ورقة العمل، نريد الآن تحديد المجال الذي يمتد بدءًا من الخلية الواقعة في الصف الثاني والعمود الثاني من المجال OriginalRange (الخلية D4) إلى الخلية الواقعة في الصف الرابع والعمود الخامس منه (الخلية G6). يمكن أن نسمي الخلية التي اسمها D4 نسبة لورقة العمل بالاسم B2 نسبة للمجال OriginalRange حيث أنها تقع في الصف الثاني والعمود الثاني منه. و نسمي الخلية التي اسمها G6 نسبة لورقة العمل بالاسم E4 نسبة للمجال OriginalRange حيث أنها تقع في الصف الرابع والعمود الخامس منه. فلتحديد المجال D4:G6 يمكن استخدام الشيفرة التالية: OriginalRange.Range("B2:E4").Select فتكون كامل الشيفرة: Sub RangeRange() Dim OriginalRange As Range Set OriginalRange = Worksheets("Sheet1").Range("C3:I9") OriginalRange.Borders.LineStyle = xlContinuous OriginalRange.Range("B2:E4").Select End Sub ملاحظة: لقد استخدمنا في المثال السابق اسم المجال OriginalRange عوضًا عن عنوانه في ورقة العمل Worksheets("Sheet1").Range("C3:I9") ومع ذلك، فعند استخدام أي منهما يعطي نفس النتيجة. الإشارة إلى المجال المستخدم في ورقة العمل في إكسل VBA يشار إلى المجال المستخدم في ورقة العمل باستخدام الخاصية Worksheets("اسم ورقة العمل").UsedRange كما يمكن استخدامها كخاصية تابعة لورقة العمل النشطة: ActiveSheet.UsedRange وترجع كائن مجال يمثل المجال الذي استُخدم في ورقة العمل. مثال: يحدد الإجراء التالي المجال المستخدم في ورقة العمل. نلاحظ أن المجال المشار إليه يتضمن جميع الخلايا بين أول وآخر خلية تحوي قيمةً أو تنسيقًا بما في ذلك كافة الفراغات التي بينهما. Sub MyUsedRange1() ActiveSheet.UsedRange.Select End Sub الإشارة إلى أطراف المجال في VBA Exel يشار إلى أطراف المجال باستخدام الخاصية End التي تنسب إلى المجال المصدر قبلها، ويأتي بعدها الاتجاه الذي يحدد منه طرف المجال. تكتب بالصيغة: Range(المجال الصدر).End(الاتجاه) المجال المصدر هو خلية مفردة يتحدد من صفها أو عمودها طرف المجال المطلوب، فإذا كان المجال المصدر مكونًا من أكثر من خلية اعتمدت الشيفرة على أول خلية فيه لتحديد طرف المجال. تنطلق الشيفرة من الخلية المصدر إلى الاتجاه المذكور لتقف عند أول خلية مليئة تصادفها تليها خلية فارغة. تُرجع الخاصية End كائن مجال يمثل الخلية الموجودة في نهاية المنطقة التي تحوي المجال المصدر وفق الاتجاه المذكور. تماثل في إكسل الضغط على زر END مع أزرار أسهم الاتجاهات الأربعة في لوحة المفاتيح. يبين الجدول التالي رموز الاتجاهات في VBA. table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الرمز القيمة الاتجاه xlUp -4162 أعلى xlDown -4121 أسفل xlToRight -4161 إلى اليمين xlToLeft -4159 إلى اليسار يمكن كتابة الاتجاه بين قوسين في صيغة الشيفرة برمزه المبين في الجدول أو بقيمته الرقمية المبينة. مثال: يحدد الإجراء التالي أطراف المجال المكتوب انطلاقًا من الخلية المصدر H6 وفق الاتجاهات الأربعة على التوالي، طرف المجال هو نهاية الصف أو العمود الذي يمر من الخلية المصدر التي بداخله على أن تكون الخلايا بين الخلية المصدر وطرف المجال كلها مليئة ليس بينها خلايا فارغة: Sub RangeEnd() Range("H6").End(xlUp).Select Range("H6").End(xlDown).Select Range("H6").End(xlToRight).Select Range("H6").End(xlToLeft).Select End Sub كما يمكن كتابة الشيفرة بالرموز الرقمية للاتجاهات وتعطي نفس النتيجة: Sub RangeEnd2() Range("H6").End(-4162).Select Range("H6").End(-4121).Select Range("H6").End(-4161).Select Range("H6").End(-4159).Select End Sub ملاحظة: يجب أن تكون المنطقة من الخلية المصدر وفق الاتجاه المذكور عبارة عن خلايا متجاورة مليئة لا يفصل بينها خلايا فارغة. فإذا فصلت بينها خلايا فارغة انتهى المرجع إلى أول خلية مليئة تليها خلية فارغة. كما أن مدى المنطقة يتعلق فقط بصف وعمود الخلية المرجع وقد يكون أطول أو أقصر من مدى الأعمدة أو الصفوف المجاورة. مثال: نطبق الشيفرة السابقة على نهايات المجالات التي تمر من H6 في حالتين: الأولى المجالات أطول من مجاوراتها، والثانية نقطع مجالات الصفوف والأعمدة التي تمر من H6 بمسح محتويات أحد الخلايا من كل جانب ثم نقوم بتمييز الخلايا الفارغة لملاحظة التحديد الذي ينفذه الإجراء بعد التغيير: ملاحظة: إذا كانت الخلايا من المجال المصدر إلى الاتجاه المذكور عبارة عن خلايا فارغة، عندها تشير الشيفرة إلى نهايات ورقة الإكسل كاملة وفق تلك الاتجاهات. مثال: إذا طبقنا الإجراء السابق على نفس الجدول ومسحنا صف الخلية المصدر H6 وعمودها كاملين يحدد Range("H6").End(xlToRight).Select الخلية XFD6 الموجودة في الصف 6 نفسه والعمود XFD الذي هو آخر عمود في إكسل، كما يحدد Range("H6").End(xlDown).Select الخلية H1048576 المجودة في الصف رقم 1048576 الذي هو آخر صف في إكسل والعمود H. ملاحظة: إذا كانت المنطقة المحيطة بالخلية المصدر خلايا فارغة يليها خلايا مليئة انتقل التحديد إلى أقرب خلية مليئة من الخلية المصدر. مثال: نطبق الشيفرة السابقة على مجال يحوي خلية مصدر محاطة بخلايا فارغة يليها خلايا مليئة: يمكن استخدام الصيغة Range.End للإشارة إلى خلية البداية أو خلية النهاية لمجال. مثال: يحدد المثال التالي المجال من الخلية G9 إلى خلية النهاية العليا للمجال المكتوب انطلاقًا من الخلية المصدر H6 والتي تمثلها الصيغة Range("H6").End(xlUp)، ثم يحدد المجال من الخلية G9 إلى خلية النهاية اليسرى للمجال المكتوب انطلاقًا من الخلية المصدر H6 والتي تمثلها الصيغة Range("H6").End(xlToTeft): Sub RangEndSelect() Range("G9", Range("H6").End(xlUp)).Select Range(Range("H6").End(xlToTeft) ,"G9").Select End Sub مثال: يحدد المثال التالي المجالات انطلاقاً من الخلية المصدر إلى أطراف المجال الأربعة على التوالي: Sub Rang4EndSelect() Range("H6", Range("H6").End(xlUp)).Select Range(Range("H6").End(xlDown), "H6").Select Range(Range("H6").End(xlToRight), "H6").Select Range(Range("H6").End(xlToLeft), "H6").Select End Sub الخاتمة تعد الإشارة إلى المراجع ضمن مجال في ورقة العمل من الأساليب المهمة للإشارة إلى المجالات وتستخدم مختلف الصيغ لتختصر الوقت والجهد أثناء كتابة الشيفرات المتعلقة بالمجالات المكتوبة. وينبغي أن ننوه أنه على المبرمج حين يستخدم أية تابع أو صيغة برمجية أن يعرف كل تفاصيلها في جميع حالاتها تجنبًا لوقوعه في الأخطاء أولًا، وحتى يكتسب مهارات دقيقة تمكنه من حل المشاكل البرمجية بأقصر وأدق الأساليب. اقرأ أيضًا برمجة واجهات إدخال البيانات باستخدام مايكروسوفت إكسل VBA المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل1 نقطة