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

نجوم المشاركات

  1. Foksh

    Foksh

    أوفيسنا


    • نقاط

      26

    • Posts

      4025


  2. عبدالله بشير عبدالله
  3. Ali Mohamed Ali

    Ali Mohamed Ali

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


    • نقاط

      15

    • Posts

      11643


  4. منتصر الانسي

    منتصر الانسي

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


    • نقاط

      11

    • Posts

      1102


Popular Content

Showing content with the highest reputation since 09/12/25 in all areas

  1. Private Sub txtserch_Change() Dim r As Long, lastRow As Long, txt As String, ColArr, i As Integer Dim tmps As Double, xPrice As Double, xPieces As Double If ComboBox1.Value = "" Or ComboBox2.Value = "" Or Trim(txtserch.Value) = "" Then ListBox1.Clear Exit Sub End If txt = UCase(Trim(txtserch.Value)) TextBox1 = "": TextBox2 = "": TextBox3 = "" ListBox1.Clear ColArr = Array("التاريخ", "اللون", "كيلو", "متر", "قطع", "العميل") With ListBox1 .AddItem ColArr(0) For i = 1 To UBound(ColArr) .list(.ListCount - 1, i) = ColArr(i) Next i End With lastRow = WS.Cells(WS.Rows.Count, "A").End(xlUp).Row For r = 2 To lastRow If UCase(Left(WS.Cells(r, criterion).Text, Len(txt))) = txt Then With ListBox1 .AddItem WS.Cells(r, "A").Text .list(.ListCount - 1, 1) = WS.Cells(r, "D").Text .list(.ListCount - 1, 2) = WS.Cells(r, "E").Value .list(.ListCount - 1, 3) = WS.Cells(r, "G").Value .list(.ListCount - 1, 4) = WS.Cells(r, "H").Value .list(.ListCount - 1, 5) = WS.Cells(r, "I").Text End With tmps = tmps + Val(WS.Cells(r, "E").Value) xPrice = xPrice + Val(WS.Cells(r, "G").Value) xPieces = xPieces + Val(WS.Cells(r, "H").Value) End If Next r TextBox1 = Format(tmps, "#,##0.00") TextBox2 = xPrice TextBox3 = Format(xPieces, "#,##0") End Sub mohamed1 V3 .xlsm
    4 points
  2. السلام عليكم طبعا الفكره قديمه واحد الاخوه كان عامل مثلها ولاكن انا عدلت عليها بطريقه تكون سهلة وبسيطة وبدون اي شرح اليكم الببرنامج رسائل.zip
    3 points
  3. وعيكم السلام ورحمة الله وبركاته ,, جرب هذه الفكرة البسيطة ، في زر داخل الورقة "2025" ، تم استخدام الكود التالي :- Sub Btn_Tr_Click() Dim wsSource As Worksheet Dim lastRow As Long, i As Long Dim cityName As String Dim wsTarget As Worksheet Dim sourceRow As Range Dim targetRow As Range Dim targetLastRow As Long Dim isDuplicate As Boolean Dim col As Variant Dim keyCols As Variant Dim copiedCount As Long, skippedCount As Long Dim skippedList As String Dim pasteType As XlPasteType Dim userChoice As VbMsgBoxResult Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.DisplayAlerts = False userChoice = MsgBox("هل ترغب في الترحيل مع التنسيق الكامل" & vbCrLf & _ "اضغط 'نعم' للترحيل مع التنسيق ، أو 'لا' للترحيل بالقيم فقط", vbYesNoCancel + vbQuestion + vbMsgBoxRight, "") If userChoice = vbCancel Then GoTo Cleanup If userChoice = vbYes Then pasteType = xlPasteAll Else pasteType = xlPasteValues End If Set wsSource = ThisWorkbook.Sheets("2025") lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row keyCols = Array(1, 2, 3, 4, 5, 6) For i = 3 To lastRow cityName = Trim(wsSource.Cells(i, 2).Value) If cityName <> "" Then On Error Resume Next Set wsTarget = ThisWorkbook.Sheets(cityName) On Error GoTo 0 If Not wsTarget Is Nothing And wsSource.Cells(i, 2).Value = wsTarget.Name Then Set sourceRow = wsSource.Range(wsSource.Cells(i, 1), wsSource.Cells(i, 10)) isDuplicate = False For targetLastRow = 3 To wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row Set targetRow = wsTarget.Range(wsTarget.Cells(targetLastRow, 1), wsTarget.Cells(targetLastRow, 10)) isDuplicate = True For Each col In keyCols If sourceRow.Cells(1, col).Value <> targetRow.Cells(1, col).Value Then isDuplicate = False Exit For End If Next col If isDuplicate Then Exit For Next targetLastRow If Not isDuplicate Then targetLastRow = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1 sourceRow.Copy wsTarget.Range("A" & targetLastRow).PasteSpecial Paste:=pasteType Application.CutCopyMode = False copiedCount = copiedCount + 1 End If Else skippedCount = skippedCount + 1 skippedList = skippedList & "- " & cityName & vbCrLf End If End If Next i MsgBox "? تم الترحيل بنجاح" & vbCrLf & _ copiedCount & ":عدد الصفوف المنسوخة " & vbCrLf & _ skippedCount & ": عدد الصفوف التي تم تجاهلها " & IIf(skippedCount > 0, vbCrLf & ": المدن التي تم تجاهلها " & vbCrLf & skippedList, ""), vbInformation + vbMsgBoxRight, "" Cleanup: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.DisplayAlerts = True End Sub TR 2025.zip
    3 points
  4. نعم استاذى الفاضل Foksh صدفت وشكرا لتنبيهك كما اشكر صاخب السؤال الفاضل soik225998 على تنبيهنا للامر تم معالجة الامر ان شاء الله المرشحين2.xlsb
    3 points
  5. وعليكم السلام ورحمة الله تعالى وبركاته أخي @mohamedyousef ردا على استفساركم بخصوص توقف البحث عن رقم الإذن في الفورمات (رقم 10-3- 4) نحيطكم علما أنه قد تم دمج جميع النماذج السابقة في يوزرفورم موحد جديد بإسم (UserForm2) يشمل كافة أنواع البيانات: الوارد - المنصرف - المرتجع لتنفيذ عملية البحث الآن يرجى اتباع الخطوات التالية: 1) اختيار إسم الورقة (الوارد / المنصرف / المرتجع) من القائمة الأولى 2) إختيار عمود البحث (رقم الإذن أو غيره) من القائمة الثانية 3) إدخال قيمة البحث في خانة البحث (txtserch) ستظهر النتائج مباشرة في الجدول أدناه مع إجماليات الكميات والأسعار هذا التحديث جاء لتسهيل العمل وتوحيد الواجهة بدل إستخدام عدة نماذج منفصلة ويجب أن يعمل بالشكل المطلوب بالتوفيق........ ملاحظة: تم الاستغناء عن النماذج السابقة (نموذج 3 و 4 و 10) mohamed1 V2.xlsm
    3 points
  6. هذا بيت القصيد لن يشعر بما صنعته له .. ولن يختلف عليه شيء المعنى ان التوقيع الأول حضور والثاني انصراف .. بناء على : معيار تاريخ اليوم .. ويمكننا جعل وقت الدوام مفتوح خلال اليوم ولا نحصره بين ساعات محددة ومنعا للتكرار الغير مقصود ( ودوما يحصل ) نجعل شرط فاصل وقت _ دقيقة مثلا _ بين التوقيع الأول والتوقيع الثاني
    2 points
  7. وفيت وكفيت .. بارك الله فيك .. حل محكم شروحاتي ليست موجهة للسائل بعينه وانما اثراء للموضوع لمن يمر من هنا
    2 points
  8. وعليكم السلام ورحمة الله وبركاته .. باعتقادي أن الطريقة التي تم تسجيل فيها وقت الحضور ، و وقت الخروج لكل موظف هي بحد ذاتها غير سليمة ( لم أقل غير صحيحة ) . فالأصل ان يتم تسجيل الحضور والخروج بشرطين . رقم الموظف وتاريخ اليوم . هذا اذا كان الموظف لا يسجل حضور في تاريخ ويسجل خروج في تاريخ اليوم التالي ( كأن يكون هناك شفت أو وردية ليلية ) . ولكن لتلبية طلبك ، جرب هذا الاستعلام :- SELECT T1.emp_name AS [اسم الموظف], T1.emp_ID AS السجل, T1.StartDate AS التاريخ, T1.StratTime AS [وقت الدخول], (SELECT EndTime FROM Tbl1 WHERE emp_ID = T1.emp_ID AND StartDate = T1.StartDate AND EndTime IS NOT NULL) AS [وقت الخروج], Format(DateDiff("n",T1.StratTime,(SELECT EndTime FROM Tbl1 WHERE emp_ID = T1.emp_ID AND StartDate = T1.StartDate AND EndTime IS NOT NULL))\60,"00") & ":" & Format(DateDiff("n",T1.StratTime,(SELECT EndTime FROM Tbl1 WHERE emp_ID = T1.emp_ID AND StartDate = T1.StartDate AND EndTime IS NOT NULL)) Mod 60,"00") AS [عدد ساعات العمل] FROM Tbl1 AS T1 WHERE (((T1.StratTime) Is Not Null)); عذراً ، معلمي الفاضل @ابوخليل ، صدقاً لم أنتبه الى ردك ، حيث كنت في الصفحة ولم ألحظ الإشعار بوجود رد .. لكن ما قمت بطرحه وهو جوهر السبيل الصحيح فقد كان تلخيصاً لخبرتك التي نتعلم منها فعلاً ..
    2 points
  9. أخواني وأساتذتي ومعلمينا ( دون استثناء ) بعد قراءتي لموضوع الأخ @mohammed farhat في هذا الموضوع :- ازالة لوحة المفاتيح العربية الزائدة الناتجة عن اعدادت اللغة لتشغيل الاكسيس تبادر لي استخراج فكرة من مشروعي السابق ( تغيير لغة النظام في Unicode ) ، بحيث كانت فعلاً مشكلة تؤرق مطوري ومبرمجي آكسيس . حيث كانت النتيجة من تعداد الملفات التي نقوم بتحميلها تؤدي إلى إضافة أكثر من لغة في لوحات المفاتيح في نسخة الويندوز الخاصة بالمطور . وهنا يجدر بي الذكر إلى أن أحد أهم الأسباب أن بعض ملفات قواعد البيانات التي نقوم بتحميلها تأتي مرفقة بإعدادات لغة أو تخطيط لوحة مفاتيح مخصصة حسب جهاز المصدر ، خاصة إذا تم إنشاؤها أو تعديلها على أنظمة تشغيل بلغات مختلفة . فعند تشغيل الملف ، قد يقوم النظام تلقائياً بإضافة تلك اللغات لتوافق التنسيق أو الترميز المستخدم . وهنا ذَهبَت بي الحلول بعد تعددها إلى إنشاء باتش يجبر الويندوز عند التشغيل لإستعادة لوحات المفاتيح التي تهم المطور وهي عادةً :- اللغة الإنجليزية + اللغة العربية الخاصة ببلده . وفي التالي صورة من الموضوع الأصلي لشكل لوحات المفاتيح الغير مرغوب بها :- وسيلاحظ المستخدم إنه سيضطر للضغط على مفاتيح التبديل بين لغات لوحة المفاتيح اكثر من مرة للوصول الى اللغة التي يريدها . ومن هنا خرجتُ بفكرة الباتش الذي ما علينا إلا تشغيله مرة واحدة فقط لا غير ، واختيار البلد الذي نرغب بتثبيت لغة لوحة مفاتيحها ، من خلال الواجهة التالية :- لاحظوا أنني قمت بإضافة الدول العربية فقط لا غير ( الفكرة قابلة للتطوير لاحقاً للغات أخرى ثابتة ) . فمثلاً ولنفترض أنني اريد تثبيت لوحة المفاتيح العربية للأردن ، فسنختار رقم 3 ( كمثال ) ثم مفتاح الإدخال Enter فقط . وسيتكفل الباتش بترتيب الأمور بحيث عند كل تشغيل للويندوز سيتم تثبيت فقط اللغة الانجليزية والعربية للأردن كما في المثال . الباتش يعمل بصمت من خلال الأكواد التالية ، وقد تم إضافة شرح بسيط لكل حدث تلافياً من الخوف من أي ملفات أو خطوات غامضة :- ::attrib +r "%~f0" @echo off @echo off mode con:cols=75 lines=35 setlocal enabledelayedexpansion for /f %%a in ('echo prompt $E^| cmd') do set "ESC=%%a" set "blue=%ESC%[1;34m" set "green=%ESC%[1;32m" set "cyan=%ESC%[1;36m" set "red=%ESC%[1;31m" set "yellow=%ESC%[1;33m" set "magenta=%ESC%[1;35m" set "reset=%ESC%[0m" echo. echo %blue%**********************************************%reset% echo %green%*** ***%reset% echo %cyan%*** %yellow%FFFFF%red%F %magenta%OOO %blue%KK KK %green%SSSS %cyan%HH HH %cyan%***%reset% echo %yellow%*** %red%FF %magenta%O O %blue%KK KK %green%SS %cyan%HH HH %yellow%***%reset% echo %red%*** %magenta%FFFFF %blue%O O %green%KKK %cyan%SS %yellow%HHHHHH %red%***%reset% echo %magenta%*** %blue%FF %green%O O %cyan%KK KK %yellow%SS %red%HH HH %magenta%***%reset% echo %blue%*** %green%FF %cyan%OOO %yellow%KK KK %red%SSSSS %magenta%HH HH %blue%***%reset% echo %green%*** ***%reset% echo %cyan%********************%yellow%2 %red%0 %magenta%2 %blue%5%cyan%*******************%reset% echo. :: باقي الكود يبقى كما هو... echo Select the Arabic country to add its keyboard layout: echo 1 - Egypt echo 2 - Saudi Arabia echo 3 - Jordan echo 4 - Iraq echo 5 - Morocco echo 6 - UAE echo 7 - Syria echo 8 - Lebanon echo 9 - Tunisia echo 10 - Algeria echo 11 - Kuwait echo 12 - Bahrain echo 13 - Oman echo 14 - Qatar echo 15 - Libya echo 16 - Sudan echo 17 - Yemen set /p choice=Enter the number of your choice (1-17) or 'X' to remove startup task: :: التحقق إذا كان المستخدم يريد إزالة المهمة if /i "%choice%"=="X" ( echo. echo Removing startup task... :: حذف المهمة المجدولة schtasks /Delete /TN "KeyboardShutdownFix" /F 2>nul :: حذف الملفات من مجلد Startup if exist "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\KeyboardFix.bat" ( del "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\KeyboardFix.bat" ) if exist "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\RunHidden.vbs" ( del "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\RunHidden.vbs" ) echo Startup task removed successfully! echo. echo Closing automatically in: timeout /t 1 /nobreak >nul & echo 3... timeout /t 1 /nobreak >nul & echo 2... timeout /t 1 /nobreak >nul & echo 1... exit /b ) set "localeID=" set "localeName=" if "%choice%"=="1" set localeID=00000C01& set localeName=ar-EG if "%choice%"=="2" set localeID=00000401& set localeName=ar-SA if "%choice%"=="3" set localeID=00002C01& set localeName=ar-JO if "%choice%"=="4" set localeID=00000801& set localeName=ar-IQ if "%choice%"=="5" set localeID=00001801& set localeName=ar-MA if "%choice%"=="6" set localeID=00003801& set localeName=ar-AE if "%choice%"=="7" set localeID=00002801& set localeName=ar-SY if "%choice%"=="8" set localeID=00003001& set localeName=ar-LB if "%choice%"=="9" set localeID=00001C01& set localeName=ar-TN if "%choice%"=="10" set localeID=00001401& set localeName=ar-DZ if "%choice%"=="11" set localeID=00003401& set localeName=ar-KW if "%choice%"=="12" set localeID=00003C01& set localeName=ar-BH if "%choice%"=="13" set localeID=00002001& set localeName=ar-OM if "%choice%"=="14" set localeID=00004001& set localeName=ar-QA if "%choice%"=="15" set localeID=00001001& set localeName=ar-LY if "%choice%"=="16" set localeID=00002C01& set localeName=ar-SD if "%choice%"=="17" set localeID=00002401& set localeName=ar-YE if not defined localeID ( echo. echo Invalid selection. Exiting... timeout /t 3 /nobreak >nul exit /b ) echo Applying keyboard settings immediately... reg delete "HKCU\Keyboard Layout\Preload" /f >nul 2>&1 reg delete "HKCU\Keyboard Layout\Substitutes" /f >nul 2>&1 reg add "HKCU\Keyboard Layout\Preload" /v 1 /t REG_SZ /d 00000409 /f reg add "HKCU\Keyboard Layout\Preload" /v 2 /t REG_SZ /d %localeID% /f reg add "HKCU\Keyboard Layout\Substitutes" /v %localeID% /t REG_SZ /d %localeID% /f set psFile=%TEMP%\UpdateLang.ps1 echo $langList = Get-WinUserLanguageList > "%psFile%" echo $langList.Clear() >> "%psFile%" echo $langList.Add("en-US") >> "%psFile%" echo $langList.Add("%localeName%") >> "%psFile%" echo Set-WinUserLanguageList $langList -Force >> "%psFile%" powershell -ExecutionPolicy Bypass -File "%psFile%" set "shutdownScript=%TEMP%\KeyboardShutdownFix.bat" echo @echo off > "%shutdownScript%" echo reg delete "HKCU\Keyboard Layout\Preload" /f >nul 2^>^&1 >> "%shutdownScript%" echo reg delete "HKCU\Keyboard Layout\Substitutes" /f >nul 2^>^&1 >> "%shutdownScript%" echo reg add "HKCU\Keyboard Layout\Preload" /v 1 /t REG_SZ /d 00000409 /f >> "%shutdownScript%" echo reg add "HKCU\Keyboard Layout\Preload" /v 2 /t REG_SZ /d %localeID% /f >> "%shutdownScript%" echo reg add "HKCU\Keyboard Layout\Substitutes" /v %localeID% /t REG_SZ /d %localeID% /f >> "%shutdownScript%" echo exit >> "%shutdownScript%" set "taskName=KeyboardShutdownFix" set "taskXml=%TEMP%\ShutdownTask.xml" echo ^<?xml version="1.0" encoding="UTF-16"?^> > "%taskXml%" echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^> >> "%taskXml%" echo ^<RegistrationInfo^> >> "%taskXml%" echo ^<Description^>Fix keyboard layout before shutdown^</Description^> >> "%taskXml%" echo ^</RegistrationInfo^> >> "%taskXml%" echo ^<Triggers^> >> "%taskXml%" echo ^<SessionStateChangeTrigger^> >> "%taskXml%" echo ^<Enabled^>true^</Enabled^> >> "%taskXml%" echo ^<StateChange^>SessionLock^</StateChange^> >> "%taskXml%" echo ^</SessionStateChangeTrigger^> >> "%taskXml%" echo ^</Triggers^> >> "%taskXml%" echo ^<Principals^> >> "%taskXml%" echo ^<Principal id="Author"^> >> "%taskXml%" echo ^<UserId^>%USERDOMAIN%\%USERNAME%^</UserId^> >> "%taskXml%" echo ^<LogonType^>InteractiveToken^</LogonType^> >> "%taskXml%" echo ^<RunLevel^>HighestAvailable^</RunLevel^> >> "%taskXml%" echo ^</Principal^> >> "%taskXml%" echo ^</Principals^> >> "%taskXml%" echo ^<Settings^> >> "%taskXml%" echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^> >> "%taskXml%" echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^> >> "%taskXml%" echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^> >> "%taskXml%" echo ^<AllowHardTerminate^>true^</AllowHardTerminate^> >> "%taskXml%" echo ^<StartWhenAvailable^>false^</StartWhenAvailable^> >> "%taskXml%" echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^> >> "%taskXml%" echo ^<IdleSettings^> >> "%taskXml%" echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^> >> "%taskXml%" echo ^<RestartOnIdle^>false^</RestartOnIdle^> >> "%taskXml%" echo ^</IdleSettings^> >> "%taskXml%" echo ^<AllowStartOnDemand^>true^</AllowStartOnDemand^> >> "%taskXml%" echo ^<Enabled^>true^</Enabled^> >> "%taskXml%" echo ^<Hidden^>false^</Hidden^> >> "%taskXml%" echo ^<RunOnlyIfIdle^>false^</RunOnlyIfIdle^> >> "%taskXml%" echo ^<WakeToRun^>false^</WakeToRun^> >> "%taskXml%" echo ^<ExecutionTimeLimit^>PT5M^</ExecutionTimeLimit^> >> "%taskXml%" echo ^<Priority^>7^</Priority^> >> "%taskXml%" echo ^</Settings^> >> "%taskXml%" echo ^<Actions Context="Author"^> >> "%taskXml%" echo ^<Exec^> >> "%taskXml%" echo ^<Command^>"%shutdownScript%"^</Command^> >> "%taskXml%" echo ^</Exec^> >> "%taskXml%" echo ^</Actions^> >> "%taskXml%" echo ^</Task^> >> "%taskXml%" schtasks /Delete /TN "%taskName%" /F 2>nul schtasks /Create /TN "%taskName%" /XML "%taskXml%" /F set "startupBat=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\KeyboardFix.bat" set "vbsFile=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\RunHidden.vbs" echo @echo off > "%startupBat%" echo reg add "HKCU\Keyboard Layout\Preload" /v 1 /t REG_SZ /d 00000409 /f >> "%startupBat%" echo reg add "HKCU\Keyboard Layout\Preload" /v 2 /t REG_SZ /d %localeID% /f >> "%startupBat%" echo reg add "HKCU\Keyboard Layout\Substitutes" /v %localeID% /t REG_SZ /d %localeID% /f >> "%startupBat%" echo exit >> "%startupBat%" echo Set WshShell = CreateObject("WScript.Shell") > "%vbsFile%" echo WshShell.Run "cmd /c call ""%startupBat%""", 0, False >> "%vbsFile%" echo. echo Keyboard settings applied successfully! echo. echo English (US) set as default. echo Arabic layout for selected country added as secondary. echo. echo Note: The system will maintain these settings automatically echo on every startup (no window will be visible). echo. echo Closing automatically in: timeout /t 1 /nobreak >nul & echo 3... timeout /t 1 /nobreak >nul & echo 2.. timeout /t 1 /nobreak >nul & echo 1. النتيجة مرهونة بتجاربكم طبعاً 😊 . الباتش تمت تجربته على العديد من إصدارات ويندوز 10 فما فوق . أي لم يتم تجربته على الإصدارات الأقل من ويندوز 10 ❌ الفكرة غير موجودة في أي منتدى عربي أو غربي . وهذا ما يميز منتديات أوفيسنا 😎 Foksh Layout.zip
    2 points
  10. السلام عليكم ورحمة الله وبركاته يمكن الاستغناء عن العمود المساعد واستبدال المعادلات في العمود v باخرى ولكنها ستكون طويلة الملف ارقام النتائج عربي2.xlsm
    2 points
  11. رغم أني لم أجرب هذه الطريقة من قبل ولكني وبنظرة سريعة على الملف المرفق أعتقد أنه لاتوجد مشكلة فيها فقد قمت بتجربة إضافة أكثر من مليون سجل ولم يتأثر كلا من الترقيم التلقائي و حجم القاعدة بعد أن قارنت الحجم بوجود التنسيق وبدونه هناك طرق أخرى لتطبيق نفس التنسيق على أي رقم بإستخدام دالة Format فلو إفترضنا أن الحقل ID هو ترقيم تلقائي بدون اي تنسيق إضافي يمكنك الحصول على نفس النتيجة هذه في الاستعلام أو النماذج بهذا السطر Format([ID];"0000000") ويوجد هناك طرق أخرى لتخصيص الترقيم التلقائي يمكنك التعرف على بعضها في هذا الموضوع هنا وقد تجد أيضا الكثير من الطرق بالبحث في المنتدى
    2 points
  12. معذرة خطأى فى نسخ بيانات Bad Rev Report لكن لاحظ أن عمود B أصبح معادلة فى ملف ALL Rev Report تفضل للتعديل وإضافة أية بيانات V2 Monthly Review Report.xls
    2 points
  13. أخواني وأساتذتي ومعلمينا ( دون استثناء ) أدعوكم لتجربة فكرة جديدة تم تنفيذها من خلال آكسيس ( هذا العملاق الصغير 😅 ) . بحيث أُجري تطويراً على فكرة تدعم المبرمجين والمطورين وتمكنهم من إنشاء نظام تفعيل عن بعد ( Online - سحابي ) ؛ بحيث لا يكون على المستخدم سوى إرسال رقم معرف جهازه فقط للمطور ، وما على المطور إلى تفعيل حسابه حسب المدة ( أنواع الإشتراكات ) التي يقدمها مطور البرنامج . وعليه فإنه في هذه المرحلة ، سأطلب ممن يرغب بالمشاركة ( فضلاً وكرماً منه لا أمراً ) أن يقوم بإرسال صورة لواجهة البرنامج الذي سأرفقه تالياً ، مع رقم معرف جهازه فقط . وسأقوم بدوري بتفعيل البرنامج المؤقت له بأشتراكات متنوعة لتجربة الفكرة . وكفكرة على المطلوب ، سأبدأ بنسخة من جهازي كتجربة لتتوضح لكم آلية المشاركة .. عند فتح القاعدة لأول مرة ، سيتم الإتصال بالسيرفر لتسجيل رقم جهازك ( أول مرة فقط ) . لذا شكراً لانتظارك وصبرك 😇 بعد الإتصال بالسيرفر ، سيتم اعتماد مدة تجريبية = 14 يوم وهذه الصورة المطلوبة منك عزيزي القارئ ثم من زر النسخ ، إنسخ رمز المعرف لجهازك ، وألصقه كاملاً كما في مثالي التالي 🤗 ID-0223222033111131825422051 التفعيل يعتمد على اتصال الجهاز بالإنترنت ، حالنا كحال الشركات التي تعتمد على سيرفر خاص بها بالتفعيل 😎 ، لذا لن تفيدك المحاولة بدون اتصال بالإنترنت . نسخة تعمل على النواة 64 :- Officena 64.zip نسخة تعمل على النواة 32 :- Officena 32.zip لحذف ملفات التفعيل السابقة ، استخدم ملف الحذف التالي حسب إصدار الأوفيس لديك . Clear64.zip أو Clear32.zip
    2 points
  14. نعم الموقع يقوم بإرسال أشعار بالفعل إذا قمت أنت بتفعيل هذه الخاصية يوجد أسفل الموضوع زر اسمه ( نبهني بالردود) قم بتفعيله أي رد جديد سيرسل لك الموقع رسالة على بريدك الالكتروني =================== أخي الحبيب : من أول ما فتحت ملفك عرفت أن الاكسل يمكن أن يحل مشكلتك بسهولة ولكن حتى لا أقوم بالمخاولة والخطأ (لأنني لم افهم شغلك) ويطول الوقت فقد طلبت منك التوضيح ومن خلال خبرتي في هذا الموقع فمن الأفضل أن ترفع ملف فيه بعض الحسابات (فيه أرقام) أنت أرفقت ملفك أعلاه ولم يكن فيه إلا القليل من الحسابات التي لا تفي بالغرض الرجاء وضع أرقام في الخلايا لو أنت تريد فقط ترحيل أرقام من خلايا في ملف إلى ملف آخر فهذا بسيط ولكنك تريد أيضا حساب إجمالي العهد المصروفة المطلوب منك تساعد في تقريب المسألة حتى يتم حلها كيف يتم حساب إجمالي العهد المصروقة , لا أريدك أن تشرح لي ولكن في الجدول الموجود في الملف ضع رقما في العمود (إجمالي العهد المصروفة) وأنا سأتابع كيف تم حساب العهد المصروفة هذا الرقم الذي ستضعه لن يأتي عشوائيا ولكن سيأتي من مجموع عدة خلايا لن أطيل عليك أخي الكريم لذلك لم تجد التجاوب السريع من الأعضاء على مشاركتك لوجود الغموض الخلاصة : قم بتعبئة الملف بالبيانات ثم ارسله هنا حتى يتم متابعة المشكلة وحلها بإذن الله تقبل تحياتي
    2 points
  15. الاستاذ الكريم/ عباس إليك برنامج كامل و بسيط لشئون الطلاب و به طلبك و كل شيء يخص التعليم الابتدائي و البرنامج مجاني للأستاذ / سالم بدوي جزاه الله خيرا كلمة السر 1 اسم المستخدم 1 البسيط لشئون الطلاب 01-03-2025.zip
    2 points
  16. ملاحظة بسيطة للأخ @أحمد العيسى في طريقة الأخ @Foksh إعتبر أن أي رقم قومي يبدأ بالرقم 2 فسيكون صاحبه من مواليد ماقبل عام 2000 مالم فسيكون من بعد عام 2000 وهذا لم يؤخذ بالإعتبار في الدالة Date_Sex_Province صراحة لا أعلم إذا ما كانت هذه الملاحظة ذات أهمية أم لا ولكن ذكرتها كتنبيه عن الاختلاف بين الحلين فإذا كان الإختلاف مهم فسيكون تأثيره كبير تحياتي
    2 points
  17. مرحبا بكم و من بعد اذن جميع الاعضاء الغاليين جدا على قلبي و الذي تعلمت الكثير منهم ارجوا الاطلاع على الملف المرفق حيث يحتوي على موديول المطلوبة لارفاقها الى برنامجك ملاحظة: اكتب الكود التالي في حدث عند الفتح لكل نماذجك Private Sub Form_Open(Cancel As Integer) On Error Resume Next Me.KeyPreview = True Set frmResize = New FormResize Set frmResize.Form = Me DoCmd.Maximize End Sub ReSizeToAllReseluotion.accdb
    2 points
  18. قمت بالتعديل على ملفك وإن شاء الله يكون هو الحل المطلوب كل شيئ موضح في الملف المرفق تحياتي basetimes.rar
    2 points
  19. لو عندك اكسيل حديث 365 مثلا يمكن استعمال الصيغة التالية =TEXTJOIN("",TRUE,القرار!AM24:AM39,القرار!AN24:AN39) و يمكن بالأكواد مع الاصدارات القديمة و ده يلزم وجود ملف عشان نتأكد من النتيجة
    2 points
  20. بارك الله فيك وجزاك الله خير استاذي الفاضل @Foksh سوف اجرب ماذكرت باذن الله والف شكر لك استاذي ماقصرت حفظك الله
    1 point
  21. بارك الله فيك وجزاك الله خير استاذي الفاضل اباخليل نصحيتك مقبوله وعلى العين والراس وانت بمثابة الاب والاخ الكبير في هذا المنتدي جعلك تسلم لكن استاذي الغالي بالنسبه للتاريخ فعلا هذا خطا مني اني اجعله بهذا الشكل وسوف اتقيد بماذكرت والمشكله الكبيره هي ان العميل اللي يريد البرنامج بهذا الشكل هو عنده موظفين ويبي يسوي لهم حضور وانصراف بهذا الشكل لانه هو الي يدخل التحضير والانصراف الموظفين ماعنده احد منهم هم بمكان وهو بمكان اخر وبناء على فكرته سويت له جدول بهذا الطريقه على اساس سرعة التحضير اليدوي من قبله وعنده باركود لكل موظف مبطوع بكشف للموظفين فهو الصباح يحضرهم عن طريق الباركود ونهاية الدوادم نفسه ايضا ويرسل الكشف للاداره حقته فقط يعني كل فنيات برامج الحضور والانصراف ماهو محتاجها في الغالب هو يحتاج هذه الجزئيه فقط وهذا ترا اجتهاد منى حتي يتناسب البرنامج مع فكرة العميل جزاك الله وبارك فيك استاذي وكل نصائحك الكريمه بعين الاعتبار والتقدير🌹🌹
    1 point
  22. إلى كل من ساهم في إنجاح فكرتي ، والتي ترتكز على تطوير فكرة التفعيل من خلال الإنترنت ( دون الحاجة إلى أي رمز تفعيل يتلقاه المستخدم أو العميل من خلال مطور ومبرمج قاعدة البيانات ) . وقد تم من خلال التجارب التي شاركتموني إياها الحصول على جميع الأخطاء ، وحلها بشكل كامل وجذري بإذن الله . وقد تم تحديث الملفين السابقين ( للإصدارين 64 و 32 ) ليتعاملا مع الأخطاء المكتشفة سابقاً . فعلى من يرغب باستمرار دعمه بتجربة الملف بعد إصلاح الأخطاء فله وللجميع جزيل الشكر على دعمه لي . الملف بإصدار النواة التي توافق إصدار الأوفيس لديك .. سخة تعمل على النواة 64 :- Officena 64.zip سخة تعمل على النواة 32 :- Officena 32.zip المشاركة إختيارية وليست إجبارية ، ولا عتب على من لا يرغب ، يكفينا أنه أنار المنتدى بمروره الكريم ، وسيتم تفعيل اشتراك أي مستخدم تلقائياً لحذف ملفات التفعيل السابقة ، استخدم ملف الحذف التالي حسب إصدار الأوفيس لديك . Clear64.zip أو Clear32.zip
    1 point
  23. يغلق .. آخر مشاركة عمرها 9 سنوات .. تستطيع فتح موضوع جديد والإشارة إلى هذا الموضوع إذا أردت أي طلب وتعديل خاص .
    1 point
  24. أستاذ محمد ، تم تفعيل اشتراكك بنجاح .. جرب الآن الدخول الى البرنامج وانقر زر "تحقق من تفعيل النسخة" وللتأكيد انقر على زر علامة التعجب في اقصى اليسار في الأعلى ، وارسل صورة للنتيجة
    1 point
  25. 1 point
  26. تحية طيبة أخي @منتصر الانسي بعد التجربة وبدون مجاملة إبداع ما بعده ابداع . روعة ما بعدها روعة هذا ما اريد بالضبط وبالتفصيل وخاصة الأسلوب الثاني بالاعتماد على مربع القائمة لانك تشتغل وكل شيئ أمامك يعني العمل في نفس النموذج جزاك الله كل خير وجعلها في ميزان حسناتك وصدقة جارية لك وألبسك لباس الصحة والعافية و الخير _ أميـــــن
    1 point
  27. تم التفعيل أستاذنا العزيز من باب التفعيلات المتنوعة ، تم التفعيل لسنة ، وإذا سمحت لك الفرصة ، النقر على زر "تحقق من تفعيل النسخة" ، وإعلامنا بالنتيجة والمدة الحالية لديك مهندسنا الغالي .. نسختك مفعة كاملة مسبقاً 😁 ، يعني التاريخ ليس له قيمة الآن في التفعيل الكامل 😂
    1 point
  28. و إياكم. لو تكرمت قم بتعليم المشاركة على أنها الحل
    1 point
  29. 1 point
  30. السلام عليكم ورحمة الله وبركاته اهلا وسهلا بك في منتدى اوفيسنا اطلعتُ على الموضوع أكثر من ثلاث مرات، ثم تركته بسبب غموض الطلب وعدم وجود شرح مفصّل. وفي المرة الرابعة، جلستُ في جلسة فجرية على قهوة العميد (Foksh)، فتمت معرفة طلب أخينا الفاضل بإذن الله. في ورقة CLASS2، وأثناء وضع المعاينة، وجدتُ تقسيمًا للصفوف، حيث تظهر أسماء الصفوف في رأس الصفحة، وفي التذييل التوقيعات. كل صف يحتوي على 50 طالبًا، باستثناء الصف الأخير الذي يضم 51 طالبًا. ويُفترض أن يكون كل 50 طالبًا في ورقة واحدة، موزّعين على عمودين. وإن كان ما فهمته صحيحًا من طلبك، فإليك الملف وفيه محاولة للحل. أما إذا لم يكن هذا هو المطلوب، فإن الشرح الوافي يُسهّل على أعضاء المنتدى الإقبال على المساعدة أكثر. second2026 - Copy.xlsb نخياتي
    1 point
  31. اعتقد تعنى الفورم1 اظهار العناوين في LISTBOX.xlsm
    1 point
  32. السلام عليكم اظافة صور المعاملات الطريقة اضغط زر معاملة جديدة ثم املأ البيانات ثم زر اظافة تاتى رسالة باظافة صورة او لا اختر نعم قم باختيار الصورة من الجهاز من اي مكان في جهازك وباي اسم يتم خفظ الصورة. لاظهار صورة المعاملة استخدم البحث يفضل عمل مجلدين للصور للصادر والاخر للوارد لتجميع الصور في مكان محدد والامر اختياري يعود اليك فالكود يتعامل مغ اي صورة قي الجهاز وبأي امتداد االمراسلات الإدارية3.xlsm
    1 point
  33. الى هنا تنتهى رحلة من أمتع رحلات حياتى ادين بكل الفضل بعد رب العالمين لكل اساتذتى العظماء جزاكم الله خيـــــــــــــــــــــــــــــــــــــــــــــــــــــرا ها انا اكتب كلماتي الأخيرة هنا...... اليوم أعلن رحيلي عنكم وكلي تألما وتحسرا على فراقكم ولكني وصلت إلى نقطة النهاية..... رسالتي الاخيرة اوجهها إلى كل الاصدقاء الذين كانوا لهم مكانة عالية في قلبي .... إلى كل من أكن لهم كل الاحترام... أشخاص لم أراهم ولم أتعرف عليهم شخصيا ولكن تركوا الاثر الكبير في نفسي...... هناك أشخاص رائعون....رائعون أحببتهم دون أن أراهم كانوا لي أخوة وأخوات..... ولكن هي مراحل بحياتنا..... نرحل ونودع من نحب.... أتمنى أن أكون تركت بصمة طيبة لدي البعض منكم...... إنتهت لحظاتي الجميلة بينكم..... كما ينتهي كل شيئ جميل في هذه الحياة بسرعة......... ولكن لا بد أن نصحو يوما على حقيقة الوداع.... التي نعيشها....... احببتكم وأحببت تواجدي بينكم..... أرجوا أن تذكروني بالخير وإن كنت أسأت لأحدكم فسامحوني وشكرا للجميع......
    1 point
  34. بارك الله فيك استاذ هشام وزادك الله من فضله
    1 point
  35. 1 point
  36. وعليكم السلام-تفضل يمكنك استخدام هذه المعادلة =IF($A2="أربيل",0,IF(AND($C2>=DATE(2022,6,1),$A2="حلة"),10000,5000)) تعديل على معادلة العمولة1.xlsx
    1 point
  37. وعليكم السلام-تقضل وكما ترى الفورم بفتح ويعمل بكل كفاءة Searchable Dropdown Settings Example.xlsm
    1 point
  38. تفضل هذه بنواة 64 بت -بعد اذن جميع الأساتذة فالملف ليس به اى مشكلة فإن واجهتكم مشكلة فاعلم انها من عندك انت فلابد كما أخبرنا من تحميل الأداة والمكتبة الناقصة رابط تحميل السيلينيوم https://github.com/florentbr/SeleniumBasic/releases/download/v2.0.9.0/SeleniumBasic-2.0.9.0.exe رابط تحميل الدريفر الخاص بالسلينيوم https://chromedriver.storage.googleapis.com/102.0.5005.27/chromedriver_win32.zip الكروم درايفر لابد ان يكون اصداره مثل اصدار الكروم المصطب على جهازك نظام ادارة شؤون التلاميذ الاصدار 1.00.rar
    1 point
  39. السلام عليكم ورحمة الله وبركاته اخوتي الكرام ، احببت المشاركة واثراء هذا المنتدى بفكرة وطريقة جديدة لتوزيع الفترات الدراسية على المعلمين خلال اسبوع والفكرة سهلة ويسيرة وقابلة للتطوير والاضافة وتقوم على اعطاء كل حصة رقم معرف فريد يخصها ابتداء من الحصة الأولى لأول يوم حضور وحتى الحصة الأخيرة لآخر يوم دراسي في الاسبوع والعملية تعتمد على جدولين أساسين فقط tblFsl جدول الفصول و tblTechData جدل بيانات المعلم والجدول الثالث tbldivision هو لتوزيع العملية نتيجة العملية استعلامين : 1- جدول الفصول faslTable 2- جدول المعلمين teachersTable ومع المثال يكتفى عن اطالة المقال jadwal.rar
    1 point
  40. الحلقة الرابعة عشر ***************** السلام عليكم ورحمة الله وبركاته وحشتكم !! أكيد لا .. لأني لو وحشتكم كنتو فتحتوا الباب وسألتوا عليا .. عموما إنتو وحشتوني ، وعشان وحشتوني هاقدم لكم حلقة جديدة يمكن تفتكروني. النهاردة هتكلم عن حاجة ناس كتير شرحوها ، وشرحوها بشكل ممتاز ، ودا خلاني مش عارف أشرح إزاي ، لأن اللي شرحوها وفوا شرحها صراحة .. هنتكلم عن الحلقات (بس مش حلقات افتح الباب) الحلقات اللي هنتكلم عنها الحلقات التكرارية ، ومن اسمها هي عبارة عن حلقات بتتكرر (إضافة عظيمة!) اسمها بالإنجليزي Loops ودي مهمة جداً في عالم الأكواد ، محدش يقدر يستغنى عنها تقريباً .. نفترض إني دخلت الفصل (بما إني معلم) ولسه دي أول مرة أتعرف على الطلبة اللي في الفصل ..يا ترى أنا عندي استعداد أخلى طالب طالب يقوم وأنا أقوله قول اسمك والطالب اللي بعديه قول اسمك .. أعتقد إن ريقي هينشف ودماغي هتصدع ودا طبعا مش يرضيكم (مش كدا ولا ايه) ..أنا من النوع الكسول فكل اللي هعمله هعمل تكرار من أول طالب في الفصل لآخر طالب ، وأعطي الأمر مرة واحدة .. من أول طالب إلى آخر طالب قووووول اسمك يا حبيبي الطالب التالي هو دا شكل الحلقة التكرارية .. نبرمجها بلغة الـ VBA ... هنقول إن الفصل فيه 60 طالب (معلش دا واقع الفصول في مصر) .. نقطة مهمة مننساش إن الطالب متغير مش ثابت ، فنرمز للطالب المتغير بالرمز X مثلاً ... Sub Loops() Dim X As Long For X = 1 To 60 'Say your name Next X End Sub طبعاً الكود دا شوية له علاقة بالبرمجة وشوية هتش .. ايه اللي هنعمله ..زي ما اتعودنا (دايما) إننا نعرف المتغير .. ونركز في السطر الثاني بدأ بكلمة For متبوعة باسم المتغير اللي هو X وبعدين علامة يساوي عشان نحدد قيمة X المتغيرة (أو الطالب المتغير) وهنا القيمة ليها بداية وليها نهاية (كل شيء له بداية ونهاية) وبيفصل بين البداية والنهاية حرف الجر To وفي آخر الحلقة التكرارية جملة Next X وممكن نقول Next ونسكت ، ومحرر الأكواد هيفهم لوحده .. بس أنا تقليدي شويتين فخلينا نكتب المتغير ، عشان الكود ممكن يكون فيه أكتر من حلقة تكرارية .. الجزء المهم هو الجزء اللي بين السطرين ، وهو دا الأمر المطلوب تكراره ، السطر اللي هنا مجرد تعليق وهتش وملوش علاقة بالبرمجة .. بس حبيت أقرب لكم الفكرة بأسلوب جديد.. كدا لما أنفذ الكود اللي فات ، كل اللي عملته إني أعطيت الأمر مرة واحدة وبس (وأنا حاطط رجل على رجل ... الدورة تلف على طالب طالب ، ويقول اسمه ، ولما يخلص ، الدورة تنتقل للطالب اللي بعديه وهكذا إلى أن ينتهي الطلاب ، ولما الـ 60 طالب يخلصوا ..يتم إيقاف تنفيذ الكود... ناخد أول مثال بجد عشان نقدر نتعلم إزاي نستفيد من الحلقات التكرارية :: لنفترض أننا عايزين نرقم النطاق A1:A10 بالأرقام من 1 إلى 10يعني الخلية A1 = 1 والخلية A2=2 وهكذا ..طبعا الموضوع بسيط جدا Sub NumberRange() Range("A1").Value = 1 Range("A2").Value = 2 Range("A3").Value = 3 Range("A4").Value = 4 Range("A5").Value = 5 Range("A6").Value = 6 Range("A7").Value = 7 Range("A8").Value = 8 Range("A9").Value = 9 Range("A10").Value = 10 End Sub كود في منتهى الروعة .. شايف حسام بيضحك ويقولي عايزك ترقم النطاق من A1:A100 (وابتسم ابتسامة فيها شماته !!) نفكر شوية .. بقول نفكر شوية (بلاش تكمل الحلقة غير لما تبص في الكود وتفكر شوية .. فكر شوية واكسب التوفير في الوقت والجهد) ايه المشترك في أسطر الكود .. وايه المختلف .. المتشابه في كل الأسطر Range("A ").Value = والمختلف هو الرقم بعد حرف الـ A ، والقيمة اللي بعد علامة يساوي .. في السطر الأول الرقم اللي بعد حرف الـ A هو 1 ، والقيمة بعد علامة يساوي بردو 1 ، ونفس الكلام مع السطر رقم 2 ، ورقم 3 وهكذا يبقا أول حاجة تفكر فيها إنك المختلف أو المتغير أو الشيء الغير ثابت تضعه في متغير ، ودا لأنه مش ثابت ومتغير .. فنضع متغير باسم X مثلاً ونعمل حلقة تكرارية من 1 إلى 10 (دي القيم اللي هيحملها المتغير) Sub NumberRange() Dim X As Long For X = 1 To 10 Range("A" & X).Value = X Next X End Sub نفس الكود اللي شرحناه من شوية ، الاختلاف في السطر اللي بين سطري التكرار .. الحلقة هتدور 10 مرات ، وفي كل مرة المتغير X بيحمل قيمة مختلفة (نرررررركز في الجزئية اللي جاية لأنها مهمة جداً جداً ) مش هنفذ الكود مرة واحدة .. سنقوم بعملية التنفيذ واحدة واحدة ، اللي مستعجل يروح ينفذ الكود مرة واحدة ، واللي مش مستعجل أنا معاه ..عشان يعرف حاجة مش هيعرفها الأخ المستعجل ... ضع مؤشر الماوس في أي مكان في الكود .. جميل >> اضغط F8 من لوحة المفاتيح ، وجمد قلبك وقول يا رب .. لاحظت ايه يا عبد المحسن؟ عبد المحسن ناااااااام مني (الله يسامحك) ..عبد المحسن : شايف الدنيا صفرا ليه ، هو فيه عاصفة النهاردة كمان؟ .. رديت عليه : لا يا عبد المحسن كمل نومك ، السطر الأصفر اللي ظهر ده سببه إننا ضغطنا F8 .. ودا فايدته إننا هنقوم بعملية التنفيذ واحدة واحدة .. سطر سطر .. السطر الأصفر على أول سطر في الكود Sub NumberRange() اضغط F8 مرة تانية ، ايه اللي حصل انتقل السطر الأصفر للسطر التالت ، طيب والسطر التاني يا معلم .. ملوش لازمة !!! أكبر خطأ إنك تعتقد إنه ملوش لازمة ، لما ضغطنا F8 للمرة التانية ، محرر الأكواد خزن في الذاكرة كل المتغيرات الموجودة في الكود عايز تتأكد من كلامي ، حرك مؤشر الماوس اللي على شكل حرف I (فيه شرطة فوق وشرطة تحت) حرك الماوس من غير ما تدوس كليك .. واقف على المتغير X هتلاقي تلميح في مستطيل صغير بيقولك المتغير X=0 ، دي كدا القيمة المبدئية للمتغير ... لما تضغط F8 للمرة التالتة ، روح شوف قيمة X مرة تانية هتلاقي قيمة X=1 (ايه اللي خلاها 1 مش كانت صفر من لحظة ) اللي حصل إننا انتقلنا من السطر For X = 1 To 10 والسطر دا هيبدأ في عمل الحلقة التكرارية اللي بنقول عليها ، والحلقة بدايتها 1 زي ما حددنا (وطبعاً ممكن نغير نقطة البداية يا شباب .. مش شرط 1) حرك مؤشر الماوس من غير ما تدوس على المتغير X في السطر المظلل بالأصفر Range("A" & X).Value = X هنلاقي زي ما قلت إن X =1 يعني محرر الأكواد هيعمل ايه دلوقتي ، هيشيل كل X ويحط مكانه القيمة 1 ، فيصبح السطر في الذاكرة بهذا الشكل Range("A1").Value = 1 لحد كدا تمام التمام ، صغر محرر الأكواد بحيث تكون ورقة العمل ظاهرة بالنسبة لك واتأكد إن النطاق A1:A10 فارغ ليس به أي بيانات ، وركز في ورقة العمل ، واضغط F8 عشان تنقل السطر الأصفر إلى هذا السطر ، ولاحظ ورقة العمل Next X لاحظت يا منصور الخلية A1 وضعت فيها القيمة 1 ، نخلي بالنا إن السطر الأصفر بيتم تنفيذه بعد الخروج منه ، فلما خرجنا من السطر تم تنفيذ الأمر وأعطى القيمة 1 للخلية A1 .. اضغط F8 مرة أخرى ، ونلاحظ إن السطر الأصفر انتقل للسطر اللي قبليه ، مش لبداية الحلقة التكرارية ، يعني ببساطة السطر اللي بيحدد بداية الحلقة ونهايتها بيعدي عليه مرة واحدة فقط .. أما سطر الأمر والسطر اللي فيه كلمة Next بيبدل السطر الأصفر عليهم... نبص دلوقتي على قيمة المتغير X هنلاقيها بقت 2 فيتم تنفيذ السطر بمجرد الضغط على F8 ويضع القيمة 2 في الخلية A2 وهكذا ..جرب واضغط F8 وفي كل مرة شوف قيمة المتغير X وشوف النطاق A1:A10 في كل مرة أول ما توصل قيمة المتغير X إلى الرقم 10 تتوقف الحلقة التكرارية ، وينتقل السطر الأصفر لجملة End Sub .. وينتهي عمل الكود .. عارف إني طولت في النقطة اللي فاتت ، بس كان لازم أطول فيها ، عشان أنا فاضي ومفيش ورايا شغل ، فقلت أصدعكم شوية!! ننتقل لمثال آخر --------------- عشان نقدر نفهم إزاي نستفيد من الحلقات التكرارية .. عايزين نعد الاسم (أحمد) في النطاق A1:A10 نفترض إني عندي الأسماء دي في النطاق A1:A10 أحمد ياسر سليم حسام عيسى أحمد أحمد خليل عبد الله أحمد المطلوب : نشوف الاسم (أحمد) كم مرة تم تكراره .. المعطيات : استعن بالله ثم بالحلقة التكرارية .. الفكرة : هنعمل اختبار صغير بقاعدة IF وهنقول لو قيمة الخلية بتساوي "أحمد" .. زود المتغير Counter بقيمة واحد Sub CountName() Dim X As Long Dim Counter As Long For X = 1 To 10 If Range("A" & X).Value = "أحمد" Then Counter = Counter + 1 Next X MsgBox Counter End Sub عملنا متغير جديد باسم Counter عشان لما يتحقق الشرط ويلاقي الاسم "أحمد" يقوم يخلي المتغير Counter يساوي نفسه + 1 طيب ليه يساوي نفسه ، عشان في كل مرة يلاقي أحمد قيمته هتتغير فلازم نضيف واحد لكل Counter جديد النتيجة في الآخر هتظهر في رسالة ، وهي 4 .. طيب نجرب نشيل الواحد في هذا السطر Counter = Counter + 1 لو شيلنا الواحد هتكون النتيجة 0 ، لأن المتغير قيمته المبدئية صفر ، فلما يتحقق الشرط مش هيزيد المتغير إلا لما نضيف واحد في كل مرة يتحقق الشرط. هناخد مثال آخر ---------------- عندنا درجات في النطاق A6:A15 ، عايزين نكتب ناجح أوراسب في الخلية المجاورة للدرجة ، لو الدرجة أكبر من أو يساوي 50 يبقا ناجح ، مكانش يكون راسب ... نخلي بالنا أنا غيرت بداية النطاق عشان الحلقة التكرارية بردو هتتغير بدايتها ونهايتها طبقاً للصفوف الجديدة 58 41 88 40 50 40 98 94 60 35 نجرب الكود التالي .. Sub LoopsTest() Dim X As Long For X = 6 To 15 If Cells(X, 1).Value >= 50 Then Cells(X, 2).Value = "ناجح" Else Cells(X, 2).Value = "راسب" End If Next X End Sub نلاحظ الحلقة التكرارية بدأت من 6 إلى 15 (ودا متغير للصفوف من الصف رقم 6 إلى الصف رقم 15) ووضعنا الشرط بين سطري الحلقة التكرارية ، لو الخلية اللي في الصف X والعمود الأول أكبر من أو يساوي 50 يقوم يعمل ايه؟ يضع القيمة النصية "ناجح" في الخلية اللي في العمود الثاني والصف X (نفس الصف بالطبع لأن قيمة X في الحالة دي هي هي نفس القيمة لأننا في نفس اللفة) .. إذا لم يتحقق الشرط قام بتنفيذ الجزء الثاني بأن يكتب النص "راسب" ثم إغلاق جملة IF بالجملة End IF ومننساش القفلة زي ما اتعودنا.. ننتقل لآخر مثال في الحلقة دي (عشان أنا تعبت وإنتو كمان أكيد تعبتو) في الأمثلة اللي فاتت عملنا حلقات تكرارية للصفوف .. واحد بيقولي طيب والأعمدة ملهاش نصيب في الدوخة اللي إحنا فيها دي .. أقوله أكيد ليها نصيب .. المطلوب إننا في الصف الرابع ، نكتب معادلة =COLUMN() بس في الأعمدة من العمود رقم 1 إلى العمود رقم 15 (A To O) نعقدها شوية ونقول في الأعمدة اللي رقمها فردي بس (الأعمدة اللي رقمها زوجي مش محتاجينها) يعني ببساطة عايزين نحط المعادلة في الأعمدة A C E G I K M O Sub ColumnsLoop() Dim X As Long For X = 1 To 15 Step 2 Cells(4, X).Formula = "=COLUMN()" Next X End Sub الحلقة التكرارية بدأت من العمود الأول حتى العمود رقم 15 (البداية والنهاية) معلومة جديدة Step 2 (دي معناها إننا هنقفز ..والقفز هيكون بمقدار 2 أي خطوتين) بدأنا بـ 1 فلما نقفز بمقدار 2 ، هنروح لرقم 3 ، أي أن المتغير سيكون رقم فردي في كل مرة 1 ، 3 ، 5 ، 7 ، 9 ، 11 ، 13 ، 15 (وهو دا المطلوب بالضبط) سطر الأمر فيه الخاصية Formula ودي عشان نقدر نضع معادلة من خلالها .. والمعادلة ببساطة زي ما شفناها من شوية بس بتكون بين أقواس تنصيص .. طيب الجزء الأول من السطر نلاحظ إننا استخدمنا Cells ودي بتكون متبوعة بقوسين ، وبين القوسين رقم الصف ثم فاصلة ثم رقم العمود ، وبما إن رقم الصف ثابت اللي هو رقم 4 ، فكتبناه زي ما هو .. اما رقم العمود فمتغير فوضعنا رقم العمود X ... جرب الكود وشوف النتيجة بنفسك أرجو أن أكون قد وفقت في توصيل المعلومة بأسلوب مبسط كان معكم أخوكم أبو البراء من تراك أوفيسنا (لف على الحلقات من الحلقة رقم 1 إلى الحلقة رقم 14 .. لو عايز تتعلم الـ VBA) ويا رب ميكونش فيه حد جاله دووووووووخة من كتر اللف .. والله أنا اللي دوخت أستودعكم الله .. دمتم في رعاية الله تقبلوا تحياتي .. دمتم بود
    1 point
  41. بارك الله فيك استاذي شكر ممتاز من بعد إذنك إسمح لي بهذه الإضافة للتحديد النطاقات Range("A1:B5,D2:F10").Select
    1 point
  42. متابعة الواجبات ************* الأخ الفاضل صلاح 15 صلاح (مش كان كفاية علينا صلاح واحد) بسم الله ما شاء الله يبدو أنك متمكن ، مش بس عملت الواجب وكمان بتشرح كل جزئية فيه .. أول ملحوظة كمعلومة جديدة كمان عشان الكل يستفيد .. فيه جملة اسمها Option Explicit دي يفضل الاعتياد على استخدامها ، ودي بتخلينا وتجبرنا لما نشتغل نعلن عن المتغيرات غصب عننا طول ما هي موجودة ، ودي بتتكتب مرة واحدة في أول الموديول وبتكون منفصلة عن الإجراء الفرعي يعني بتكون بالشكل ده Option Explicit Sub Officena() MsgBox "Hello Salah15Salah. Thank you very much" End Sub ولو حبينا نعلن عن متغير نصي هيكون بالشكل ده Option Explicit Sub Officena() Dim MyString As String MyString = "Hello Salah15Salah. Thank you very much" MsgBox MyString End Sub هنا فيه متغير نصي من النوع String وتم الإعلان عنه .. ممكن لو مفيش الجملة Option Explicit ممكن يتم الاستغناء عن الجملة الأولى ..جملة الإعلان وهنلاقي الكود تم تنفيذه ومفيش مشكلة نجرب الكود مرة تانية بس هنحط تعليق في بداية الجملة وفي بداية سطر الإعلان ونشوف النتيجة!! 'Option Explicit Sub Officena() 'Dim MyString As String MyString = "Hello Salah15Salah. Thank you very much" MsgBox MyString End Sub طيب دلوقتي بقا جرب تشيل التعليق من بداية جملة Option Explicit ونفذ الكود هتلاقي محرر الأكواد بيطلع لك رسالة خطأ ويقولك معناها إن المتغير لم يتم الإعلان عنه ..اضغط على علامة المربع الأزرق اللي على يمين المثلث الأخضر الخاص بتنفيذ الكود .. المربع الأزرق ده اسمه Reset عشان الكود دلوقتي في حالة Break زي فاصل .. وهيفضل محرر الأكواد معلم لك على سطر باللون الأصفر إشارة إلى إن فيه شيء خطأ ، ومش هيسيبك لحد ما تصلح غلطك ..لكن ممكن نهرب منه مؤقتا بالضغط على Reset (أضف إلى معوماتك) طيب جرب تنفذ تاني يمكن يحن عليك المرة دي وينفذ لك الكود (والله لو قعدت جنبه من هنا للقرن الجاي) مش هينفذ كودك طول ما الجملة دي موجودة. واحد هيقولي وأنا أربط نفسي بيها ليه سيبك منها دي باين عليها جملة رخمة وغلسة وهتقطع عليا ..! هقولك لا حاول تعود نفسك ع الصح عشان تتعلم صح .. إحنا قلنا قبل كدا إننا لازم نفشل عشان ننجح .. عمر ما فيه نجاح من غير فشل (دا حتى كدا يبقا نجاح طعمه بايخ)!! طيب معلومة تانية ..هل كل مرة أعمل موديول جديد هكتب الجملة دي بنفسي ؟ قولك لا عمنا بيل جيتس وضع في خيارات المحرر من قايمة Tools ثم Options اللي هي الخيارات اللي بيحب دائما إضافتها في البرامج بتاعته (أصله بيعز الخيار شوية).. هنلاقي تبويب اسمه Editor وفيه تاني جملة جنبها مربع فاضي نحط فيه علامة صح الجملة اسمها Require Variable Declaration وبكدا لما نيجي نعمل إضافة موديول جديد هنلاقي الجملة موجودة في كل موديول كبداية إجبارية للإعلان عن المتغيرات.. طيب نرجع لصلاح الراجل زمانه خد برد مننا بسبب التذنيبة دي من بدري (حضرتك جملة option Explicit موجودة مرتين ..دا كلام !! أكيد إنت بتعزها شويتين ، بس معزتك ليها متخلكش تخرج برا القاعدة اللي بتقول إن الجملة دي تيجي مرة واحدة بس ) ، ودي الرسالة اللي هتظهر لك لما تبدأ التنفيذ بس عموما برافو عليك ..إنت خلتني أعمل حلقة من غير حلقة وأضفنا للزملاء معلومات جديدة . حاجة تانية أخي الحبيب صلاح MyString = "ÓÈÍÇä Çááå æÇáÍãÏ ááå æáÇ Åáå ÅáÇ Çááå æÇááå ÃßÈÑ" With æÑÞÉ1 .Range("C5").Value = MyString End With يفضل إن تكون جملة الإعلان عن المتغير ووضع قيمة له في الأول قبل جملة With ... End With على فكرة الكود اللي لصقته دلوقتي فيه حاجة مش مظبوطة ... أنا تعمدت إن أسيبه كدا عشان تشوفوا اللغة العربية لما نلصقها هنا بتكون بالشكل ده (لا هي إنجليزي ولا هي عربي ..هي تيجي على عبري شوية) .. طبعا كمعلومة جديدة بالنسبة لناس كتير عشان اللغة العربية تيجي معانا بشكل صحيح بنعمل حاجة بسيطة جدا بنخلي اتجاه الكتابة في الكود باللغة العربية وبعدين نعمل نسخ ولصق هنلاقي المشكلة اتحلت (شفتوا البطاطا أقصد البساطة) Dim MyString As String MyString = "سبحان الله والحمد لله ولا إله إلا الله والله أكبر" With ورقة1 .Range("C5").Value = MyString End With الحمد لله اتحلت المشكلة .. بصراحة أشكر الأخ الغالي صلاح نظرا إنه ألهمنا بمعلومات جمة وجميلة (جمة وجميلة) من خلال متابعة الواجب الخاص بيه (بصراحة روعة يا صلاح) هو دا اللي فعلا بدور عليه إنت بالنسبة لي طالب مجتهد ومثالي!! معلومة جميلة بيقدمها لنا الأخ صلاح إننا ممكن بدل ما نكتب سطرين لوضع قيمة لمتغيرين مثلا ..ممكن نخليهم في سطر واحد وبنفصل بينهم بنقطتين i = 100: t = 150 وكمان الإعلان عن متغيرين ممكن يكون في سطر واحد زي كدا Dim i As Integer, t As Integer نشكر الأخ الحبيب صلاح من أعماق قلوبنا متمنين له دوام التوفيق (ومتحرمناش من الواجب الجميل ده .عايزين كل يوم من ده) بكدا نكون اتعلمنا من صلاح معلومات غاية في الأهمية.. الأخت الفاضلة morestudy معلش اتأخرنا عليكي في التصحيح (صلاح خد وقتنا كله ، بس كله في النهاية بيصب ليكم) المرة دي فيه تحسن ملحوظ .. الواجب جميل جدا والحمد لله مفيش أخطاء! بالنسبة لسؤالك الأول : اللي هيجاوب عليه أخونا حماده عمر من خلال المشاركة دي http://www.officena.net/ib/index.php?showtopic=56983#entry361677 السؤال التاني : نعم يمكن تنفيذ الأمر بدون أزرار لكن الزر لتسهيل التعامل مع التنفيذ ، ولكن يمكن الضغط على Alt+F8 هيطلع لنا نافذة فيها كل الأكواد اللي عملناه بنختار الكود ونضغط Run . أما بالنسبة لمعرفة الكود تم تنفيذه أم لا فدا العين هي اللي تقرره .. يعني مثلا أنا هشتغل غلى الخلية C5 أقوم أمسحها وأنفذ الكود ، لو طلعت النتيجة في الخلية زي ما انا متوقعها يبقا كدا تم التنفيذ بنجاح ..لو حصل العكس براجع الكود مرة تانية عشان أعرف الغلطة فين (حد عرف الغلطة فين؟ الغلطة فين؟ ساب الباب مفتوح ! أكبر غلطة ممكن يغلطها المبرمج إنه يسيب الباب مفنتوح (شركة الرعب المحدودة)) .. طبعا قفلنا بقوسين عشان فتحنا قوسين ..ودي مهمة في البرمجة (إننا لو فتحنا قوس يبقا مننساش نقفل القوس شفتوا الطالب النبيه اللي خد باله إني مقفلتش القوس في السطر اللي فات برافو عليك .. بس أنا كنت لسه بكمل كلامي) السؤال التالت : هناك طرق أخرى يمكن فيها الاستغناء عن Run ولكن ليس هذا هو الوقت المناسب للحديث عنها ممكن نقول باختصار إنها أكواد مرتبطة بحدث الصفحة أو المصنف ودي هييجي الكلام عنها بعدين إن شاء الله دمتم في رعاية الله وحفظه وعونه وتوفيقه والسلام عليكم
    1 point
  43. الحلقة الخامسة **************** السلام عليكم ورحمة الله وبركاته نستكمل حلقاتنا للي متابعين .. وللي مش متابعين بردو! هنتكلم النهاردة عن النطاقات في VBA وطرق تحديدها ... نبدأ الأول نعرف معنى كلمة نطاق : هل النطاق مجموعة خلايا متجاورة (جنب بعض) ولا مجموعة خلايا غير متجاورة (خلايا زعلانة ومتخاصمة فبعيد عن بعض) ؟ أعتقد إن فيه كتير فاهمين كلمة نطاق غلط .. أولا نطاق بالانجليزي Range والنطاق في الإكسيل بيكون مطاطي (مرن) بيشمل مجموعة كبيرة من المفاهيم :: الخلية الواحدة اسمها نطاق .. واحد يقولي يعني A1 دي نطااااااااااق .. إنت كدا خليت الخلية تاخد أكبر من حجمها هي مجرد خلية ، أرد وأقوله .. الخلية نطاق ومجموعة الخلايا المتجاورة نطاق ، ومجموعة الخلايا الغير متجاورة نطاق ، والصف الواحد نطاق ، ومجموعة صفوف نطاق ، والعمود الواحد نطاق ، ومجموعة أعمدة نطاق .. بس خلاااص (الحاجة الوحيدة اللي لا تصلح إنك تحدد نطاق في أكتر من ورقة عمل .. يعني الشغل كله في تحديد النطاقات بيكون في ورقة واحدة .. بمعنى آخر ميجيش واحد ويقول عايز أحدد مجموعة خلايا في الورقة الأولى + مجموعة خلايا في الورقة التانية دي لسه بيل جيتس معلمهاش) جميل لحد دلوقتي يبقا كدا اتعرفنا على لفظ نطاق ..طيب كلنا عارفين إننا عشان نقدر ننفذ أمر معين لازم الأول نحدد النطاق اللي هيتم التنفيذ عليه .. مينفعش أقول مثلا نسق الخلايا ولونها وخلي حجمها 14 - طبيعي إن اللي بيفكر كدا يبقا فاهم إن الكمبيوتر بيسمعه وعارف عايز ايه ، مفيش خلاف إننا لما بنتعامل مع الكمبيوتر مننساش إننا بنتعامل مع آلة ، يعني مهما كانت درجة تفوقها فهي غبية ، والغباء هنا صفة مش مذمومة ، الغباء اللي أقصده إنه لازم تمشي خطوات منطقية ومنطقية جدا عشان تقدر تحقق هدفك .. فأول خطوة دايما للتعامل غالبا بتكون تحديد النطاق اللي هشتغل عليه .. عشان كدا هافرد الشرح عن تحديد الخلايا والنطاقات بشكل تفصيلي .. ادعوا لي ربنا يوفقني في توصيل المعلومة) نبدأ على بركة الله .. واحد هيقولي : كل دي بداية دا إنت هتطلع عنينا ، على ما نعرف المعلومة (بس أحب أوضح إن الأمور لما تكون مفهومة تمام الفهم والإدراك ، دا بيسهل عملية التعلم بشكل كبير ؛ عشان كدا متستغربوش إني برغي كتير .. الهدف في النهاية توصيل المعلومة بأسلوب غير تقليدي) بصراحة أنا مش مرتب هشرح إزاي الموضوع نظرا لأن فيه معلومات كتير وخايف تتوهوا مني .. بس دلوقتي خطرت لي فكرة إننا نقسم الموضوع ، ونتعامل مع جزئية جزئية أول جزئية هنتكلم عليها الخلية المفردة (الخلية : زي ما إحنا عارفين عبارة عن التقاء الصف مع العمود ..معلومة قديمة .. والصف بيكون عبارة عن رقم ، والعمود عبارة عن اسم حرف .. بردو معلومة قديمة .. والخلية لما بنسميها بتكون عبارة عن اسم العمود وبعديها رقم الصف .. بردو معلومة قديمة!!) (شكلي كدا معنديش معلومة جديدة أديهالكم النهاردة !!) مثال : لو قلنا الصف الرابع والعمود الخامس ، هنعبر عنه إزاي ؟ نحسبها : نبدأ الأول بالعمود (نظرا لأن العمود رأسي وأنا رأسي مشغولة بالفكرة) ، العمود الخامس دا فين .. عشان نعرف يبقا لازم ناخد درس إنجليزي الأول ونركز على الحروف (أصلي معلم إنجليزي وعايز أسوق لنفسي دروس) ..نبدأ نقول مع بعض : A و B و C و D و E (بس خلاص وصلنا للحرف الخامس يبقا العمود الهدف هو العمود E .. بلغة البرمجة Target.Column=5 .. محدش يدقق أوي في الجملة دي ، بعدين هنعرفها ، دا كان حرف العمود ، والرقم مش محتاج نحسبه لأن الصف الهدف هو الرابع .. بلغة البرمجة Target.Row=4 (بكدا تكون عنوان الخلية الهدف هي الخلية E4 .. وبلغة البرمجة Target.Address=$E$4 السؤال الأول : كيف يمكن تحديد الخلية E4 في محرر الأكواد ؟ الإجابة : الإجابات متنوعة ، نشوف كل الطرق عشان نتعلم ... أول طريقة : استخدام الخاصية Range >> نطبق على الخلية E4 مثلا Range("E4").Select هنا لازم بعد الخاصية Range بنفتح قوس ) وبعد القوس قوس تنصيص " وبعدين عنوان الخلية .. وزي ما اتعودنا القفلة يا رجالة ... كدا إحنا أشرنا للخلية E4 ، ونقول لمحرر الأكواد حددها بكلمة Select تاني طريقة : استخدام الخاصية Cells ، ودي مختلفة شوية Cells(4, 5).Select هنا بنفتح قوس بعد الخاصية Cells وبنستخدم أرقام (رقم الصف الأول ، وبعدين رقم العمود) ودي شرحناها بالتفصيل وعرفنا إن رقم الصف 4 ، ورقم العمود E هيكون رقم 5 ، ونفس القصة بعد الإشارة للخلية الهدف نقول لمحرر الأكواد حددها بكلمة Select تالت طريقة زي تاني طريقة ..إننا نستخدم Cells بردو (إزاي دي ؟؟!!) Cells(4, "E").Select هنا لو موضوع رقم العمود دا مضايقك ، ولا يهمك هنشوف لك بديل ، ممكن تكتب اسم العمود بس مننساش أقواس التنصيص !! رابع طريقة : طريقة الباشمهندس طارق محمود (أنا سميتها كدا لأنها المفضلة عند الباشمهندس طارق) [E4].Select ويا ريت نعرف كل الطرق ، لأن كل طريقة وليها استخدامها في مواقف معينة .. دي بتيجي مع الخبرة .. نقطة أخيرة قبل ما ننتقل للجزئية التانية .. افتراضيا الشغل بالشكل ده على ActiveSheet يعني كل الأسطر اللي كتبناها ممكن نضيف قبل كل سطر كلمة ActiveSheet متبوعة بنقطة (عشان لما نبدأ نتعامل مع أكتر من ورقة نخلي بالنا .. بس لو شيلناها بيفهم محرر الأكواد إننا بنتعامل مع المصنف النشط الورقة النشطة) @ انتهى الجزء الأول@ السؤال التاني : كيف يمكن تحديد النطاق A1:C10 في محرر الأكواد؟ الإجابة : أجب بنفسك (ارحموني شوية كله عليا لوحدي ، أنا تعبت!!) Range("A1:C10").Select هنا استخدمنا الخاصية Range (واحد هيسأل هي Range خاصية ولا كائن .. أقولك هي كائن وخاصية ، هي من ضمن خواص ورقة العمل ، وفي نفس الوقت كائن (يعني ممكن نقول تابع ومتبوع) ...هنا عشان نحدد نطاق الموضوع في منتهى البساطة بنحدد أول خلية في النطاق وآخر خلية في النطاق (لما نجرب نحدد بالماوس الخلية A1 وبعدين نضغط Shift من لوحة المفاتيح ونحدد الخلية C10 هنلاقي النطاق اللي ما بين الخليتين تم تحديده بالكامل ، أنا قلت الحتة دي ليه ؟ ؛ عشان أوصلكم معلومة إننا كل اللي بيهمنا عشان نحدد نطاق بدايته ونهايته ..... نلاحظ إننا فصلنا بين البداية والنهاية بالعلامة دي : طريقة تانية : Range("A1", "C10").Select زيها بس الفصل بين البداية والنهاية بيكون بفاصلة .. وهنا لاحظ الاختلاف بنفسك (مش كل حاجة لازم نشرحها بالتفصيل .. فيه ناس بدأت تحس بالملل والرتابة ) طريقة تالتة : اننا نستخدم Range و Cells مع بعض Range(Cells(1, 1), Cells(10, 3)).Select واحد هيبص للسطر اللي فات ويقولي ايه الكلكعة دي إنت كنت ماشي زي الفل والأمور واضحة ..مالها بقت ضلمة ليه كدا ؟؟ يا حاج سعد ولا ضلمة ولا حاجة إنت بس ركز كد .. الخاصية Range بيكون وراها قوسين بين القوسين بداية ونهاية .. البداية Cells(1, 1) اللي هي مرادف الخلية A1 والنهاية Cells(10, 3) اللي هي الخلية C10 بكدا نكون حددنا البداية والنهاية داخل الخاصية Range ...أظن الأمور كدا بقت واضحة يا شوقي !! طريقة رابعة إننا نسمي النطاق في ورقة العمل .. وطبعا دي أمرها بسيط ..داخل ورقة العمل بحدد A1:C10 وأسميها عن طريق وضع الماوس في صندوق الاسم ونكتب اسم وليكن Officena Range("Officena").Select ومننساش إن Officena دي اسم للنطاق ، والاسم نص ، والنص يؤكل إذاً الجبن يؤكل ..أعتذر (سرحت في الفلسفة : الخوف جبن والجبن يؤكل إذاً الخوف يؤكل ..دا منطق فاسد) أما المنطق بتاعنا مش فاسد الحمد لله ... الاسم نص والنص يوضع بين أقواس تنصيص. خامس طريقة (طريقة باشمهندس المنتدى .. من أحب الناس لقلبي) [A1:C10].Select @انتهى الجزء الثاني@ الجزء الثالث عن طريقة تحديد خلايا أو نطاق في ورقة عمل أخرى داخل المصنف .. ودي بسيطة بس ركزوا لأنها مختلفة شوية أد كدا (طبعا محدش شايف ايدي والحمد لله ، لأنكم لو شفتوا ايدي هتدعوا عليا !!..) Application.Goto Sheets(3).Range("A1:C10") الخاصية Goto دي مش خاصية يا متنورين ، دي Method لأنها حدث أو فعل (نسينا ..كله يراجع تاني ، وإلا مش هكمل ) معناها( اذهب إلى ) ، وبعدين مسافة ، وبنحدد المكان اللي هيروحله محرر الأكواد .. نخلي بالنا هنا مستخدمناش Select والله يا أبطال مستخدمناها ، ولو استخدمناها محرر الأكواد هيفضحنا برسالة خطأ الـ Method هنا اللي اسمها Goto أغنت عن الـ Method اللي اسمها Select .. لأنه ببساطة مينفعش فعلين في نفس الوقت .. هو دا النظام إذا كان عاجبكم ... مينفعش حدثين مع بعض يا إما Select يا إما Goto طيب نجرب نستعمل Select ونشيل Goto اللي إحنا مش متعودين عليها كدا نجرب ، وإحنا واقفين في الشيت رقم واحد وننفذ السطر التالي Sheets(3).Range("A1:C10").Select شكلها صح ، لكن للأسف غلط ..لأننا دلوقتي بنتعامل مع ورقة عمل تانية ، بالتالي لازم عشان نعمل سطر زي ده ، وميكونش فيه رسالة خطأ ، لازم ولابد وحتما إننا ننشط ورقة العمل اللي هنشتغل عليها بـ Method اسمها Activate (نشط) Sheets(3).Activate Sheets(3).Range("A1:C10").Select كدا نتلاشى رسالة الخطأ ، والحمد لله ..خلاصة الكلام إننا لو استخدمنا Select أثناء التعامل مع ورقة عمل أخرى ، يبقا لازم ننشط ورقة العمل (نديها منشطات عشان متهنجش مننا .. ممكن نستعين بالأستاذ الغالي اللي غايب عننا رجب جاويش) وحتى النطاقات المسماة زي النطاق اللي سميناه من بدري باسم Officena لو أنا في ورقة عمل تانية ، مش هينفع أستخدم Select معاها بردو .. فالأفضل في التعامل مع أوراق العمل الأخرى استخدام Goto Application.Goto Range("Officena") @انتهى الجزء التالت@ وانتهت الحلقة .. مش عارف إذا كنت استوفيت الموضوع النهاردة بالتفصيل ولا لا .. بس عموما لو حد عنده إضافات بالنسبة لتحديد النطاقات يفيدنا بيها .. أنا قلت اللي عندي ، قولوا إنتو اللي عندكو (بارك الله فيكم على حسن المتابعة ، وإلى لقاء مع حلقة جديدة ومعلومات جديدة ..أستودعكم الله) الواجب : متروك لكم حرية عمل مصنف ، وتنوع فيه الطرق المختلفة للتحديد .. كان معكم على الهواء تحديداً في الكرسي الأخير من الصف الأخير في قاعة أوفيسنا .. قاعة أوفيسنا.الصف الأخير.الكرسي الأخير.تحديد(أبو البراء) دمتم في رعاية الله
    1 point
  44. الحلقة الرابعة طبعا أنا ايدي بتترعش وأنا بكتب كلمة الحلقة (الرابعة) ، دا عشان رقم 4 بقا من المحرمات في مصر .. وربنا يستر ومحدش يبلغ عننا!! فيه نقطة معينة في الشرح تعمدت إن أسيبها عشان حبيت إن حد يسألني عليها بس للأسف محدش سألني ، ودا معناه إن اللي بيتابع الحلقات مجرد متلقي يعني مش فعال .. أو فعال وخايف إنه يسأل لأحسن أضربه .. متخافوش مش بضرب ولا بحب الضرب وبحب اللي يسألني ، حتى لو كان السؤال تافه .. لإن السؤال هو طريق المعرفة .. ومن غير السؤال مش هنتعلم !! النقطة اللي بتكلم عليها حفظ الملف اللي فيه أكواد .. محدش فيكم جاتله رسالة زي دي؟ طبعا النقطة دي كان لازم نشرحها ولازم تسألوا عليها .. طبعا أول ما بتفتح الإكسيل وتشتغل عليه بيكون الملف الافتراضي xlsx .. وطول مفيش أكواد بتتم عملية الحفظ بشكل طبيعي ، أما لو كتبت إجراء فرعي أو بمجرد كتابة اسم إجراء فرعي بس حتى لو كان جواه فاضي مفيهوش أكواد ، وجيت تحفظ هتلاقي الرسالة دي ، لأن صيغة الملف اللي بيحتوي على ماكرو مختلفة عن الصيغة العادية ، بتكون الصيغة xlsm. طيب نعمل ايه ؟ أكبر غلطة إنك تضغط Yes مش أي حد يقولنا نعم نقوله ماشي غلط .. هنا لو ضغطت Yes هيحفظ الملف بدون أكواد .. لازم تتمرد وتضغط No وتحدد اسم الملف في حقل File Name أظن دي كلنا عارفينها ، وفي الحقل التالي فيه قايمة منسدلة بنختار منها تاني اختيار Excel Macro-Enabled ، وبكدا نقدر نحفظ الملف اللي فيه أكواد . طبعا هتلاقي ملف تاني موجود في المكان اللي فيه الملف الأول بس الصيغة مختلفة .. الحمد لله حفظنا الملف اللي هنشتغل عليه !! نبدأ الحلقة : هنرغي النهاردة عن المتغيرات .. لاحظت في كل الشروحات اللي شفتها إن درس المتغيرات بيكون دمه تقيل ورخم ؛ لأن كله بيكون غالبا نظري أكتر منه عملي وبيكون في درس واحد مرة واحدة . إحنا لأننا اتبعنا أسلوب مختلف تماما هنتكلم عنه واحدة واحدة متغير متغير ، وبالأمثلة والتطبيق ، ومش مهم الكم بقدر الكيف (ومحدش يفهم الكيف دي غلط) نفهم الأول يعني ايه متغير .. يعني مش ثابت (صح يا حسام .. حد عنده إجابة تانية كله ساكت يعني مفيش غير حسام اللي عارف ..)! لما نبدأ في عالم البرمجة ، مع الوقت هتلاقي نفسك محتاج الذاكرة إنها تخزن لك أرقام معينة أو نصوص ؛ عشان تستدعيها في وقت اللزوم ، وتبدأ تتعامل مع لما تستدعيها (ربنا يكفينا شر الاستدعاء) عشان نقدر نخزن الأرقام والنصوص دي لازم نستعين بالمتغير .. ييجي المتغير ويقولنا تحت أمرك يا فندم أنا في الخدمة ، وطبعا الذاكرة بردو متأخرتش عننا في تقديم المساعدة. بس المتغير له شروط عشان نقدر نستفيد منه ..أولاً عايز حاجة تسنده عشان بيتكسف يقف لوحده فبنستدعي كلمة اسمها Dim ، ومن غير الكلمة دي يبقا المتغير وحيد ومش هيرضى يساعدك (هي دي اللي بنعلن بيها عن المتغيرات) ثانياً بنديله اسم تمام .. فاكرين شروط تسميه الإجراء الفرعي تقريبا نفس شروط تسمية المتغير .. يعني مينفعش يبدأ برقم لكن ممكن الرقم ييجي بعدين في الاسم بس في أول الاسم لا .. وممنوع الحروف الخاصة زي علامة # $ % ^ & * @ عموما لو فيه حاجة غلط محرر الأكواد هيظهر لك رسالة Syntax error تعرف إن فيه حاجة غلط.. دا كان الشرط التاني للمتغير إن يكون له اسم ، تالت شرط اللي هو نوع المتغير ( ودا ضروري بس اختياري ) فزورة دي ..>> أيوا هو اختياري يعني ممكن ميتكتبش ومفيش مشكلة ، بس طبعا ذوي الخبرة يعرفوا إن كدا محرر الأكواد بيحدد نوعه بردو ، بس بيحدده نوع اسمه Variant ودا له ميزة وعيب .. ميزته إنك لو مش عارف نوع المتغير بيكون دا الافتراضي وبيعفيك من تعريف نوع المتغير .. وعيبه إنه بيستهلك مساحة كبيرة في الذاكرة .. يعني لما ربنا يكرمكم وتكتبوا أسطر كتيرة من الأكواد لو معرفناش نوع المتغير ، هيكون الكود بطيء جدا مقارنة بإننا نعرف الكود بنوع محدد ..! عشان كدا قلنا إنه ضروري يعني هو اختياري ، بس ممكن إحنا نخليه إجباري ؛ عشان نتعود على الصح من البداية (مش كدا ولا ايه!) طيب إحنا هنعرف نوعه إزاي ؟؟ إنت اللي بتحدد نوعه حسب ما تريد وهنتعرف على الأنواع بس بالراحة عليا ..أنا أحب أرغي وآخد وقتي في الرغي قبل ما أكمل بكدا نكون عرفنا شكل السطر اللي هيتم الإعلان فيه عن المتغير ، هيكون ببساطة بالشكل اللي جاي حالا هنفترض إني هخزن في الذاكرة رقم صحيح وهنسميه MyNumber Dim MyNumber As Integer أيوا نحفظ بقا الشكل دا كويس ونشوف الشروط اللي قلنا عليها انطبقت ولا لا ! أول شرط الكلمة Dim اللي هتخلي المتغير ميخافش ، وتاني شرط اسم المتغير وهو هنا MyNumber ودا أنا اللي سميته مش محرر الأكواد عشان محدش يفكر إنه لازم يكون بالاسم ده يعني الاسم إنت حر فيه إن شا الله تسميه (مكرونة) ، وبعدين هنلاقي كلمة من حرفين As ودي متكلمناش عليها دي اللي بتفصل بين الاسم والنوع .. صحيح الاسم مرتبط بالنوع بس لسه في مرحلة الخطوبة والخطوبة هتطول فنفصل بينهم بمحرم اللي هو As وأخيرا النوع Integer ودا بيستخدم للأرقام الصحيحة (أول نوع خلصنا منه الحمد لله)... يبقا خلاصة الكلام السطر ده بنقول لمحرر الأكواد إننا هنستخدم متغير باسم MyNumber وهيكون نوعه عدد صحيح (إحنا كدا بنوفر في الذاكرة مساحة وبنخلي الكود يكون أسرع لما نحدد النوع) طبعا الطالب الناصح هيقولي هو فين الرقم اللي إحنا خزناه في الذاكرة دا ملوش أثر هقوله لسه الحتة دي جاية دلوقتي .. السطر دا بس كأننا بنكلم الذاكرة ونقولها : استعدي أيتها الذاكرة آتٍ إليكي متغير بهذا الاسم ومعاه بطاقة الرقم القومي بتاعته ابدأي اتعاملي معاه .. فالذاكرة تشوف اسمه لو كان اسمه صحيح تقوله اتفضل ، وتشوف نوعه وتحجز له مكان مناسب على أده .. ما هو كل نوع على أد حجمه (زي المثل اللي بيقول كل برغوت على أد دمه) ..يعني النوع Integer غلبان وصحته على أده هتحجزله مكان صغير ، أما Variant فربنا يديله الصحة هياخد مكان لا بأس به (يا ريت تكون النقطة دي بقت واضحة) طيب بعد ما عرفنا المتغير .. نديله قيمة وعشان ندي قيمة قلنا قبل كدا لازم علامة = يساوي ، وتكون القيمة اللي عايزين نخزنها على اليمين بعد علامة يساوي مش قبليها ومينفعش نحط القيمة الأول كدا غلط .. عايزين نتعلم صح ! زي ما أخدنا في الخصائص إن كل خاصية ليها قيمة بنحددلها قيمة .. بردو المتغير بنحدد له قيمة زي كدا MyNumber = 70 يبقا إحنا كدا حددنا قيمة المتغير بـ 70 طيب واحد يقولي يعني عشان أخزن الرقم 70 في الذاكرة هكتب سطرين ، طب ما نختصرهم في سطر واحد يا معلمي (طبعا هو مش معلمي بضم الميم لا دا بقولها بكسر الميم ، على أساس إننا قاعدين على قهوة) .. وبعدين يقولي هختصره كدا Dim MyNumber As Integer = 70 هقوله جرب بنفسك هتلاقي محرر الأكواد أظهر لك رسالة خطأ .. اللي اشتغل على Visual Basic.Net الفكرة دي مقبولة لكن هنا في الـ VBA غير مقبولة.. طيب دلوقتي نطبق عملي السطرين اللي فاتوا .عايزين مثلا نحط قيمة المتغير في الخلية A1 >> Range("A1").Value = MyNumber الخلية A1 وبعدين نقطة متبوعة بخاصية أول مرة تقابلنا دلوقتي ، ودي مهمة جدا ومعناها القيمة Value .. يعني خلي قيمة الخلية A1 تساوي المتغير اللي اسمه MyNumber ، فيقوم محرر الأكواد يروح للذاكرة يسألها عندك متغير اسمه MyNumber ، ترد تقوله أيوا قاعد مرزوع هناك أهو .. يقوم المحرر يشده من قفاه (شكلها كدا أنا اللي هيتعمل فيا كدا النهاردة .. مش جايبها لبر من بدري عمال أقول 4 واستدعاء وشد من القفا ربنا يستر ..) المحرر يشوف قيمة المتغير اللي تم تخزينها ويحطها في الخلية A1 .. اعذروني إذا كنت بشرح اللي بيحصل بالتفصيل بس التفصيل دا مهم .. واحد تاني مخه شغال هيقولي طيب أنا أقدر أختصر الكود بتاعك اللي هو 3 أسطر في سطر واحد وهيطلع الناتج صح Dim MyNumber As Integer MyNumber = 70 Range("A1").Value = MyNumber هيقولي بص بقا السحر أهو الكود بتاعك في سطر واحد Range("A1").Value = 70 هقوله برافو عليك دا صحيح بس مش هو دا المهم إننا نحط القيمة 70 في الخلية A1 وخلصت الحكاية .. الفكرة إن المتغير هنستخدمه مثلا في أكتر من سطر .. وليكن هستخدمه 10 مرات .. لو أنا سمعت كلامك يا نبيه يبقا لو حبيت أغير قيمة المتغير لـ 100 مثلا هضطر أدور على القيمة 70 في كل أسطر الكود وأغيرها 10 مرات .. لكن بالطريقة اللي قلت عليها المتغير لو حبيت أغيره هغيره مرة واحدة بس في أول الكود وخلصت الحكاية!! دي نقطة نقطة تانية إن ممكن يتم على المتغير عمليات حسابية متداخلة ، فلو استعملنا القيمة من غير المتغير هيكون صعب التعامل مع الكود طيب نجرب نحذف كلمة Dim من الكود ونخلي الكود بالشكل ده MyNumber As Integer MyNumber = 70 Range("A1").Value = MyNumber شيلنا كلمة Dim الغريب إن محرر الأكواد مبيديش خطأ لما بتشيلها .. لكن ساعة التنفيذ يخضك برسالة ويقولك معنى الكلام ده إن المتغير مينفعش يتم الإعلان عنه إلا بكلمة Dim ، وإلا سيتعبر الإعلان غير قانوني وسيتم إحالة الكود للمحاكمة (مش بقولكم مش جايبها لبر) بكدا نكون اتعرفنا على أول نوع من المتغيرات اللي هو Integer !! نتعرف سريعا على نوع تاني مشهور جدا اللي هو String ودا بيكون للقيم النصية بالمثال يتضح المقال : Dim Myname As String Myname = "Yasser" MsgBox Myname طبعا بقت الأمور أوضح دلوقتي المتغير اسمه Mname ونوعه String يعني نص .. وتم وضع القيمة النصية Yasser له ، ومننساش مع النصوص أقواس التنصيص .. وآخر سطر مش محتاج إني أشرحه بس نلاحظ في آخر سطر فايدة تانية للإعلان عن المتغيرات .. هنا لما حطينا القيمة النصية Yasser وأسندناها للمتغير Myname ، لما نيجي بعد كدا نستخدمه خلاص هنرتاح من أقواس التنصيص .. وهنعتبر دي فايدة تانية يلا بقا خدوا الواجب عشان أنا تعبت ... 1 - قم بالإعلان عن متغير بأي اسم يعجبك من أي نوع يعجبك وخليه يظهر في الخلية C5 ويظهر معاه رسالة مضمونها أنه قد تم وضع القيمة للمتغير اللي إنت سميته في الخلية C5 2 - قم بالإعلان عن متغيرين من النوع Integer وقم بعمل عملية جمع وناتج الجمع في الخلية E5 إلى لقاء مع حلقة جديدة من حلقات افتح الباب وزغردي يا رباب (دا إذا عدا اليوم بسلام ومكانش فيه استدعاء) دمتم في عون الله وحفظه
    1 point
×
×
  • اضف...

Important Information