بحث مخصص من جوجل فى أوفيسنا
![]()
Custom Search
|
نجوم المشاركات
Popular Content
Showing content with the highest reputation on 08/05/25 in all areas
-
تفضل الملف بعد اجراء التحسينات اللازمة عليه مثل اضافة قائمة منسدلة لاختيار تم أو لم يسدد ثم عمل كود لترحيل البيانات لورقتي عمل الحساب.xlsm3 points
-
و عليكم السلام ورحمة الله وبركاته إليك المطلوب فئات الانتفاع.xlsx2 points
-
2 points
-
بعد التجربة أخي @Foksh رائع جدا جدا شغال بامتياز وبدون مشاكل هذا هو المطلوب بالضبط جزاك الله كل الخير -أمين- كما أتوجه بخالص الشكر والامتنان لأستاذنا @ابوخليل وطريقة التصميم الذي تكلم عنها معه حق- فأنا إمكانياتي البرمجية محدودة فاجتهد وابحث واطرح الأسئلة واستفيد منكم- لتقديم يد المساعدة لزملائي في العمل حاليا هذا العمل يفي بالغرض سأوظفه . و عن قريب إن شاء الله سأجرب جمع معايير التقييم في نمودج رغم اختلاف الأنواع : معلمين - مهنسين لكن يستلزم تعديل الكود الخاص بالأستاذ @Foksh وجعل typ= "مهندسين" أو "معلمين" مرة أخرى جزاكمـــا اللـــه كل الخير وبارك الله فيكما ألف شكر وامتنان1 point
-
أولا تم تعديل المعادلة لتكون: =IF(G2="";"";IF(G2<1;"أقل من فدان";IF(AND(G2>=1; G2<3);"من 1 إلى أقل من 3 فدان";IF(AND(G2>=3; G2<5);"من 3 إلى أقل من 5 فدان";IF(AND(G2>=5; G2<10);"من 5 إلى أقل من 10 فدان";IF(AND(G2>=10; G2<20);"من 10 إلى أقل من 20 فدان";IF(AND(G2>=20; G2<=25);"من 20 إلى 25 فدان";"أكثر من 25 فدان"))))))) شرح المعادلة: تستخدم الدالة IF بشكل متداخل لتصنيف قيمة موجودة في الخلية G إلى فئات مختلفة بناء على مدى هذه القيمة مع افتراض أن القيمة تمثل مساحة بالأفدنة تماما مثل إظهار نتيجة الطلاب بالتقديرات IF(G2="";"") إذا كانت الخلية G2 فارغة، فإن الناتج يكون فارغًا أيضا لا يعرض شيء. هذا يجنب ظهور نتائج غير مرغوبة عند عدم وجود بيانات. IF(G2<1;"أقل من فدان") إذا كانت القيمة في G2 أقل من 1 لكن ليست فارغة يعرض: "أقل من فدان". IF(AND(G2>=1; G2<3) إذا كانت القيمة أكبر من أو تساوي 1 ولكن أقل من 3 يعرض: "من 1 إلى أقل من 3 فدان". وهكذا باقي المساحات أما المعادلة =IF(AND(ISNUMBER(D2); ISNUMBER(E2); ISNUMBER(F2)); F2 + E2/24 + D2/576; "") تستخدم لتحويل وحدات الأراضي (الفدان، القيراط، السهم) إلى قيمة عشرية واحدة تعبر عن المساحة الكلية بالفدان. الوحدات المستخدمة في مصر: الفدان (F2) ← الوحدة الأساسية. القيراط (E2) ← 1 فدان = 24 قيراط. السهم (D2) ← 1 قيراط = 24 سهم → إذن 1 فدان = 576 سهم (24 × 24) ثانيا: ملفك الأصلي فيه بعض الملاحظات فهناك صفوف فارغة تماما و أيضا الخلايا فارغة ليس بها أي رقم المفروض نضع صفر في الخلايا الفارغة لتدخل ضمن حساب المعادلة أيضا هناك أسماء لا تملك حتى سهم و بالتالي لا تدخل ضمن الأفراد ذوي الملكية بعد التعديلات ستلاحظ أن العدد مضبوط فئات الانتفاع2.xlsx1 point
-
فقط قم بإزالة الجزء من Or لغاية 0 If IsNull(rs!evalu_moubadara_chaksia) Then1 point
-
مش عارف الحل ده ممكن واللا لا انا اساسا مش عارف اذا كنت اساسا فهمت المطلوب Private Sub mjal_AfterUpdate() Dim strSQL As String ' تحديد مصدر السرد بناء على الاختيار Select Case Me.mjal.Column(1) Case "فردي1", "فردي2" ' إخفاء "زوجي" strSQL = "SELECT ac_id, ac_Name FROM tbl_Mjal WHERE ac_Name NOT IN ('زوجي')" Case "زوجي" ' إخفاء "فردي1" و"فردي2" strSQL = "SELECT ac_id, ac_Name FROM tbl_Mjal WHERE ac_Name NOT IN ('فردي1', 'فردي2')" Case Else ' إظهار جميع الخيارات strSQL = "SELECT ac_id, ac_Name FROM tbl_Mjal" End Select ' تحديث مصدر مربع السرد Me.mjal.RowSource = strSQL Me.mjal.Requery End Sub Private Sub Form_Load() ' تعيين مصدر السرد الافتراضي عند تحميل النموذج Me.mjal.RowSource = "SELECT ac_id, ac_Name FROM tbl_Mjal" Me.mjal.Requery End Sub المرفق Database2.accdb1 point
-
1 point
-
السلام عليكم ورحمة الله وبركاته الحمد لله وبعد عدة محاولات في اضافة التعديل للشرط تمت العملية وارفق القاعدة للفائدة العامة وتحياتي للبشمهندس ناقل بارك الله فيه كشف الحضور2.accdb1 point
-
كانت المشكلة في وضع قيمة افتراضية في النموذج لبعض الحقول المحسوبة في الاستعلام =0 فقط ازلت القيمة وانتهت المشكلة طبعا ازلت الكل ولكن كان يكفي فقط ازالة القيمة الافتراضية للحقول المحسوبة الشايب1 point
-
القيمة الافتراضية ستكون عقبة مستقبلا هذه القيم التي تضعها قد تتغير من فصل الى آخر ومن سنة الى اخرى هل اذا تغيرت ستدخل مستقبلا الى التصميم وتغيرها ؟؟ هذه ليست برمجة فكر بطريقة تجعل هذه القيم بيد المستخدم .. يغيرها كيف ومتى شاء1 point
-
دالة InStr من أهم وأقوى الدوال المستخدمة في التعامل مع السلاسل النصية تستخدم لتحديد موضع أول ظهور لسلسلة فرعية داخل سلسلة نصية أخرى يمكن الاعتماد عليها في التحقق من وجود رموز أو مقاطع نصية داخل محتوى مثل: التحقق من وجود امتداد ملف البحث عن كلمة في اسم ملف فحص تنسيقات أو كجزء من معالجة متقدمة للنصوص الشكل العام: InStr(Start, String1, String2 , Compare) شرح المعاملات: Start (اختياري): >>---> رقم الموضع الذي تبدأ منه عملية البحث في String1 (يبدأ من 1) String1: >>---> السلسلة الأساسية التي يتم البحث بداخلها String2: >>---> السلسلة الفرعية المطلوب العثور عليها Compare (اختياري): >>---> نوع المقارنة يمكن استخدام: vbBinaryCompare (افتراضي): مقارنة حساسة لحالة الأحرف vbTextCompare : مقارنة تتجاهل حالة الأحرف الناتج: ترجع الدالة رقم موضع أول تطابق (Starting from 1) أو 0 إذا لم يتم العثور على أي تطابق أمثلة توضيحية شاملة 1- اختبار حالات مختلفة للدالة InStr Dim strText As String Dim strSearch As String Dim intStart As Integer Dim intResult As Integer ' البحث عن أول ظهور للحرف "a" strText = "Mohesam" strSearch = "a" intStart = 1 intResult = InStr(intStart, strText, strSearch) 'M o h e s a m '1 2 3 4 5 6 7 Debug.Print "الحالة 1: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' البحث من موقع مختلف intStart = 4 intResult = InStr(intStart, strText, strSearch) Debug.Print "الحالة 2: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' البحث عن حرف غير موجود strSearch = "z" intStart = 1 intResult = InStr(intStart, strText, strSearch) Debug.Print "الحالة 3: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' البحث في نص فارغ strText = "" strSearch = "a" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 4: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' البحث عن كلمة داخل جملة strText = "Access VBA" strSearch = "VBA" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 5: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' البحث المتكرر لنفس الكلمة strText = "abcabcabc" strSearch = "abc" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 6: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' البحث من منتصف السلسلة intResult = InStr(5, strText, strSearch) Debug.Print "الحالة 7: InStr(5, """ & strText & """, """ & strSearch & """) = " & intResult ' البحث مع اختلاف حالة الأحرف strText = "TestCase" strSearch = "case" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 8: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult & " (Compare = Binary افتراضي)" ' استخدام vbTextCompare لتجاهل حالة الأحرف intResult = InStr(1, strText, strSearch, vbTextCompare) Debug.Print "الحالة 9: InStr(1, """ & strText & """, """ & strSearch & """, vbTextCompare) = " & intResult Public Sub TestInStrFunction() Dim strText As String Dim strSearch As String Dim intStart As Integer Dim intResult As Integer Debug.Print String(70, "=") Debug.Print "اختبار دالة InStr" Debug.Print String(70, "=") ' الحالة 1: البحث عن حرف موجود من البداية strText = "Mohesam" strSearch = "a" intStart = 1 intResult = InStr(intStart, strText, strSearch) Debug.Print "الحالة 1: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 2: البحث بعد الموضع الابتدائي intStart = 4 intResult = InStr(intStart, strText, strSearch) Debug.Print "الحالة 2: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 3: البحث عن حرف غير موجود strSearch = "z" intStart = 1 intResult = InStr(intStart, strText, strSearch) Debug.Print "الحالة 3: InStr(" & intStart & ", """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 4: سلسلة فارغة strText = "" strSearch = "a" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 4: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 5: البحث عن كلمة كاملة strText = "Access VBA" strSearch = "VBA" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 5: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 6: البحث عن نفس الكلمة مكررة strText = "abcabcabc" strSearch = "abc" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 6: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 7: بدء البحث من منتصف النص intResult = InStr(5, strText, strSearch) Debug.Print "الحالة 7: InStr(5, """ & strText & """, """ & strSearch & """) = " & intResult ' الحالة 8: حساس لحالة الأحرف strText = "TestCase" strSearch = "case" intResult = InStr(1, strText, strSearch) Debug.Print "الحالة 8: InStr(1, """ & strText & """, """ & strSearch & """) = " & intResult & " (Compare = Binary افتراضي)" ' الحالة 9: تجاهل حالة الأحرف باستخدام vbTextCompare intResult = InStr(1, strText, strSearch, vbTextCompare) Debug.Print "الحالة 9: InStr(1, """ & strText & """, """ & strSearch & """, vbTextCompare) = " & intResult End Sub 2- ملخص سريع مباشر للحالات Public Sub TestInStrCases() Debug.Print "==================================================" Debug.Print "اختبار دالة InStr" Debug.Print "==================================================" Debug.Print "الحالة 1: InStr(1, ""Mohesam"", ""a"") = "; InStr(1, "Mohesam", "a") Debug.Print "الحالة 2: InStr(4, ""Mohesam"", ""a"") = "; InStr(4, "Mohesam", "a") Debug.Print "الحالة 3: InStr(1, ""Mohesam"", ""z"") = "; InStr(1, "Mohesam", "z") Debug.Print "الحالة 4: InStr(1, """", ""a"") = "; InStr(1, "", "a") Debug.Print "الحالة 5: InStr(1, ""Access VBA"", ""VBA"") = "; InStr(1, "Access VBA", "VBA") Debug.Print "الحالة 6: InStr(1, ""abcabcabc"", ""abc"") = "; InStr(1, "abcabcabc", "abc") Debug.Print "الحالة 7: InStr(5, ""abcabcabc"", ""abc"") = "; InStr(5, "abcabcabc", "abc") Debug.Print "الحالة 8: InStr(1, ""TestCase"", ""case"") = "; InStr(1, "TestCase", "case") Debug.Print "الحالة 9: InStr(1, ""TestCase"", ""case"", vbTextCompare) = "; InStr(1, "TestCase", "case", vbTextCompare) Debug.Print "==================================================" End Sub استخدام احترافي البحث عن رموز داخل نص دالة InStr يمكن توظيفها داخل دوال أكثر تقدما للبحث عن مجموعة من الرموز داخل نص معين Public Function GetSymbolsInText(ByVal strText As String, ByVal arrSymbols As Variant, ByRef arrFound() As String) As Boolean Dim varSymbol As Variant Dim colFound As Collection Set colFound = New Collection ' البحث عن كل رمز في النص For Each varSymbol In arrSymbols If InStr(strText, varSymbol) > 0 Then On Error Resume Next ' لتجنب تكرار العناصر في المجموعة colFound.Add varSymbol, CStr(varSymbol) On Error GoTo 0 End If Next ' تجهيز النتائج النهائية If colFound.Count > 0 Then ReDim arrFound(0 To colFound.Count - 1) Dim i As Long For i = 1 To colFound.Count arrFound(i - 1) = colFound(i) Next i GetSymbolsInText = True Else ReDim arrFound(-1 To -1) GetSymbolsInText = False End If End Function تجربة هذه الدالة Public Sub TestGetSymbolsInText() Dim arrSymbols As Variant Dim arrFound() As String Dim bolFound As Boolean Dim strTest As String arrSymbols = Array(",", ";", "|", "/", "\", "-", "_") strTest = "Mohesam-2025/Report_Aug" ' تنفيذ البحث bolFound = GetSymbolsInText(strTest, arrSymbols, arrFound) ' عرض النتائج If bolFound Then Debug.Print "تم العثور على الرموز التالية:" Dim i As Long For i = LBound(arrFound) To UBound(arrFound) Debug.Print arrFound(i) Next i Else Debug.Print "لا يوجد أي رمز" End If End Sub Sub TestTextCompareBehavior() Dim str1 As String Dim str2 As String str1 = "Access" str2 = "access" ' المقارنة الثنائية (تراعي حالة الأحرف) ' - لن تنجح Debug.Print "BinaryCompare: "; InStr(1, str1, str2, vbBinaryCompare) ' المقارنة النصية (تتجاهل حالة الأحرف) ' - ستنجح Debug.Print "TextCompare: "; InStr(1, str1, str2, vbTextCompare) End Sub الكود السابق يوضح الفرق بين نمطي المقارنة في دالة InStr vbBinaryCompare: يقارن مع مراعاة حالة الأحرف (case-sensitive) vbTextCompare: يقارن بدون مراعاة حالة الأحرف (case-insensitive) النتيجة 0 في المقارنة الثنائية تعني أن "access" لم يتم العثور عليها داخل "Access" بسبب اختلاف حالة الحروف أما في TextCompare فتم العثور على "access" في بداية "Access" لأن الحالة تم تجاهلها المعامل الرابع في InStr InStr(Start, String1, String2 , Compare) إذا لم يتم تحديد CompareMethod فإن Access يستخدم الإعداد الافتراضي (غالبا vbBinaryCompare) لذلك ينصح دائما بتحديد نوع المقارنة صراحة لتفادي النتائج غير المتوقعة خاصة عند تجاهل حالة الأحرف الخلاصــــــــــة InStr تعيد موضع أول ظهور لسلسلة داخل سلسلة أخرى (يبدأ من 1) تعيد 0 إذا لم يتم العثور على تطابق يمكن تخصيص نوع المقارنة باستخدام المعامل الرابع مفيدة لبناء دوال متقدمة لمعالجة النصوص والرموز لتجاهل حالة الأحرف استخدم vbTextCompare لا تعتمد على القيمة الافتراضية في Compare حددها دائما لتفادي النتائج غير المتوقعة هناك دالة مكملة لـ InStr تسمى InStrRev تقوم بالبحث من نهاية النص إلى بدايته قد تكون مفيدة جدا في بعض الحالات (مثل البحث عن آخر امتداد أو آخر فاصل) InStr(1, "file.name.txt", ".") ' 5 InStrRev("file.name.txt", ".") ' 10 بكده الشرح انتهى ولتحقيق اكبر قدر ممكن من الاستفادة وفيما يخص النقطة التالية: مفيدة لبناء دوال متقدمة لمعالجة النصوص والرموز دى فكرة كود داخل وحدة نمطية عامة فى الاعتماد على كل من InStr , InStrRev اتركها لكم للاستمتاع بها Option Compare Database Option Explicit Public Enum TextCase AsIs = 0 ' كما هو Lower = 1 ' أحرف صغيرة Upper = 2 ' أحرف كبيرة Proper = 3 ' أول حرف كبير End Enum ' تعريفات الأنواع Public Enum FilePartType FileNameWithExtension ' اسم الملف مع الامتداد FileNameOnly ' اسم الملف بدون الامتداد FileExtensionOnly ' الامتداد بدون النقطة FileExtensionWithDot ' الامتداد مع النقطة FullFolderPath ' المسار الكامل للمجلد ContainingFolderName ' اسم المجلد الحاوي فقط RootDrive ' الجذر (مثل C:\ أو اسم السيرفر) VersionOnly ' الإصدار فقط (مثل v1.2) DateOnly ' التاريخ فقط (مثل 2025-07-17) FullUNCPath ' المسار الكامل بصيغة UNC FileURL ' المسار بصيغة URL FileNameWithoutVersionOrDate ' اسم الملف بدون الإصدار أو التاريخ ServerAndShare ' السيرفر والمشاركة من مسار UNC End Enum ' كائنات على مستوى الوحدة لتحسين الأداء Private objFSO As Object Private objRegEx As Object ' الدالة الرئيسية لاستخراج أجزاء المسار Public Function ExtractFilePartPro( _ ByVal strPath As String, _ Optional ByVal enmPart As FilePartType = FileNameWithExtension, _ Optional ByVal enuTextCase As TextCase = AsIs, _ Optional ByRef strVersion As String = "", _ Optional ByRef strDate As String = "", _ Optional ByRef strError As String = "" _ ) As String Dim strResult As String Dim lngPos As Long Dim strFileName As String Dim strFolder As String Dim strExt As String Dim strParent As String Dim colMatches As Object Dim vMatch As Variant ' تهيئة رسالة الخطأ إلى فارغة strError = "" ' إنشاء الكائنات إذا لم تكن موجودة If objFSO Is Nothing Then Set objFSO = CreateObject("Scripting.FileSystemObject") If objRegEx Is Nothing Then Set objRegEx = CreateObject("VBScript.RegExp") With objRegEx .Global = True .IgnoreCase = True ' نمط محسن لدعم إصدارات مع أحرف وتواريخ بصيغ مختلفة .Pattern = "(v[\d\.]+[a-zA-Z-]*)|((?:19|20)\d{2}[-_/]?\d{2}[-_/]?\d{2}|\d{8})" End With End If On Error GoTo ErrHandler ' تنظيف المسار strPath = Trim(strPath) ' التحقق من المسار الفارغ If strPath = "" Then strError = "المسار فارغ" ExtractFilePartPro = "" Exit Function End If ' استخراج اسم الملف If objFSO.FileExists(strPath) Or InStrRev(strPath, "\") > 0 Then strFileName = Mid(strPath, InStrRev(strPath, "\") + 1) Else strFileName = strPath End If ' استخراج المسار الكامل للمجلد strFolder = Left(strPath, Len(strPath) - Len(strFileName)) ' استخراج الامتداد (يدعم الامتدادات المركبة مثل .tar.gz) If InStr(strFileName, ".") > 0 Then lngPos = InStrRev(strFileName, ".") strExt = Mid(strFileName, lngPos) If LCase(strExt) = ".gz" And InStrRev(strFileName, ".tar.gz") > 0 Then strExt = ".tar.gz" End If Else strExt = "" End If ' استخراج اسم المجلد الحاوي If Right(strFolder, 1) = "\" Then strFolder = Left(strFolder, Len(strFolder) - 1) If InStrRev(strFolder, "\") > 0 Then strParent = Mid(strFolder, InStrRev(strFolder, "\") + 1) Else strParent = "" End If ' استخراج الإصدار والتاريخ باستخدام RegExp If objRegEx.Test(strFileName) Then Set colMatches = objRegEx.Execute(strFileName) For Each vMatch In colMatches If Left(LCase(vMatch), 1) = "v" Then strVersion = vMatch Else strDate = vMatch End If Next End If ' اختيار الجزء المطلوب Select Case enmPart Case FileNameWithExtension strResult = strFileName Case FileNameOnly If strExt <> "" Then strResult = Left(strFileName, Len(strFileName) - Len(strExt)) Else strResult = strFileName End If Case FileExtensionOnly If strExt <> "" Then strResult = Mid(strExt, 2) Case FileExtensionWithDot strResult = strExt Case FullFolderPath strResult = strFolder Case ContainingFolderName strResult = strParent Case RootDrive If Left(strPath, 2) = "\\" Then strResult = Split(strPath, "\")(2) ' اسم السيرفر فقط Else strResult = Left(strPath, 3) End If Case VersionOnly strResult = strVersion Case DateOnly strResult = strDate Case FullUNCPath strResult = strPath Case FileURL If Left(strPath, 2) = "\\" Then strResult = "file://" & Replace(strPath, "\", "/") Else strResult = "file:///" & Replace(strPath, "\", "/") End If Case FileNameWithoutVersionOrDate strResult = objRegEx.Replace(strFileName, "") Case ServerAndShare If Left(strPath, 2) = "\\" Then Dim arrParts As Variant arrParts = Split(strPath, "\") If UBound(arrParts) >= 3 Then strResult = "\\" & arrParts(2) & "\" & arrParts(3) Else strResult = "" End If Else strResult = "" End If End Select ' تنسيق النص حسب الخيار المحدد Select Case enuTextCase Case Lower strResult = LCase(strResult) Case Upper strResult = UCase(strResult) Case Proper strResult = StrConv(strResult, vbProperCase) Case Else ' AsIs, لا تغيير End Select ExtractFilePartPro = strResult ExitHere: Set colMatches = Nothing Exit Function ErrHandler: strError = "خطأ: " & Err.Description ExtractFilePartPro = "" Resume ExitHere End Function ' روتين اختبار موسع Public Sub TestEnhanced() Dim strPath As String Dim strUNCPath As String Dim strResPath As String Dim strRes As String Dim strVer As String Dim strDat As String Dim strError As String ' تعيين مسارات الاختبار strPath = "C:\Test\MyDataBase\Officena.Accdb" strUNCPath = "\\Server\Myhiba\Officena.Accdb" strResPath = "C:\Test\MyFile_v3.4_2025-07-17.tar.gz" Debug.Print String(70, "=") Debug.Print "اختبارات استخراج أجزاء المسار" Debug.Print String(70, "=") ' اختبار الأجزاء الأساسية Debug.Print "اختبار الأجزاء الأساسية" Debug.Print String(70, "-") Debug.Print " الاسم مع الامتداد : " & ExtractFilePartPro(strPath, FileNameWithExtension) Debug.Print " الاسم فقط : " & ExtractFilePartPro(strPath, FileNameOnly) Debug.Print " الامتداد فقط : " & ExtractFilePartPro(strPath, FileExtensionOnly) Debug.Print " الامتداد مع النقطة : " & ExtractFilePartPro(strPath, FileExtensionWithDot) Debug.Print " اسم المجلد الحاوي : " & ExtractFilePartPro(strPath, ContainingFolderName) Debug.Print " المسار بدون اسم الملف : " & ExtractFilePartPro(strPath, FullFolderPath) Debug.Print " الجذر : " & ExtractFilePartPro(strPath, RootDrive) Debug.Print " المسار بصيغة UNC : " & ExtractFilePartPro(strUNCPath, FullUNCPath) Debug.Print " المسار بصيغة URL : " & ExtractFilePartPro(strUNCPath, FileURL) Debug.Print String(70, "-") ' اختبار استخراج الإصدار والتاريخ strRes = ExtractFilePartPro(strResPath, FileNameOnly, AsIs, strVer, strDat) Debug.Print "اختبار استخراج الإصدار والتاريخ" Debug.Print " الاسم : " & strRes Debug.Print " الإصدار : " & strVer Debug.Print " التاريخ : " & strDat ' اختبار الخيارات الجديدة Debug.Print " FileNameWithoutVersionOrDate: " & ExtractFilePartPro(strResPath, FileNameWithoutVersionOrDate) Debug.Print " ServerAndShare : " & ExtractFilePartPro(strUNCPath, ServerAndShare) ' اختبار معالجة الأخطاء strRes = ExtractFilePartPro("", FileNameWithExtension, AsIs, , , strError) Debug.Print " Empty path result : " & strRes & ", Error: " & strError strRes = ExtractFilePartPro("C:\Invalid\Path", FileNameWithExtension, AsIs, , , strError) Debug.Print " Invalid path result : " & strRes & ", Error: " & strError ' اختبار تنسيق الحروف Debug.Print " Upper case : " & ExtractFilePartPro(strPath, FileNameWithExtension, Upper) Debug.Print "======================================================" End Sub1 point
-
السلام عليكم ... لاحظت من خلال وجودي في المنتدى قلة المواضيع التي تناقش إمكانيات الاكسل في المجال الإحصائي ، وعليه فسأقوم إن شاء الله بإدراج مجموعة من المواضيع (بشكل متعاقب) تبين الإمكانيات الكبيرة للاكسل في المجال الإحصائي و التوزيعات الاحتمالية المختلفة ، وهذه دعوة أيضاً لجميع الأعضاء بطرح ما يعرفونه عن هذه الإمكانيات حتى تعم الفائدة على الجميع . سنبدأ اليوم بأساسيات الإحصاء ، وسنبين طريقة إنشاء الجداول التكرارية بواسطة الاكسل : من المحتمل جداً أنك تساءلت يوماً من أين أبدأ؟ ، و ذلك عندما طلب منك دراسة مجموعة ضخـمــــــــــــــــة من البيانات الخام العائدة لظاهرة معينة !!! الجواب علي سؤالك سيكون بتلخيص هذه البيانات أولاً و تفريغها في جدول توزيع تكراري ، ولكن كيف؟ يلجأ الباحثون عادةً إلى تصنيف وتبويب البيانات الخام وعرضها بطريقة مختصرة تساعد على فهمها وتحليلها إحصائياً للتعرف عليها ووصفها ومقارنتها بغيرها من الظواهر دون ضياع يذكر من تفصيلاتها ، وتستند فكرة الجداول التكرارية إلى توزيع البيانات الخام على فئات (مجموعات) رقمية متجانسة و غير متقاطعة ، تحتوي كل فئة على كافة المفردات التي تشترك بخاصية كمية محددة سلفاً . ملاحظة : سنقوم في هذا الدرس بشرح كيفية إنشاء الجداول التكرارية لبيانات كمية فقط (طول ، وزن ، درجة ، ...، الخ) وذلك طبعاً باستخدام برنامج الاكسل. لتوضيح الفكرة نورد الحالة التالية : في ما يلي توجد درجات لستين طالباً لمقرر معين في أحد الجامعات العربية : 60,51,48,98,64,84,79,59,80,55 68,38,32,41,44,63,74,10,42,74 42,56,63,57,27,71,95,88,35,25 54,15,40,68,78,93,29,52,61,25 53,76,18,37,54,44,20,32,58,36 66,82,42,55,30,50,65,98,46,62 البيانات السابقة معروضة على شكل مفردات (حسب العرف الإحصائي) . لاحظ أخي أن البيانات السابقة عارية عن أية دلالة إحصائية و لا يمكننا استنتاج أي معلومة من خلال النظر المجرد إليها ، وبالتالي فلا مناص من توزيع هذه المفردات على فئات (مجموعات) وذلك حتى تسهل عملية تحليلها في المستقبل . ولكن كيف نحدد هذه الفئات؟ تحديد الفئات يكون بوضع مجال خاص لكل فئة بحيث تنتمي المفردات إلى الفئات المختلفة عن طريق مجالاتها . مثلاً : الفئة الأولى محددة بالمجال : Bin1 : [0,10[ أي : المجال السابق مفتوح بالنسبة لليمين و مغلق بالنسبة لليسار (الدائرة البيضاء تدل على عدم انتماء القيمة 10 إلى مجال الفئة Bin1 ، و الدائرة السوداء تدل على انتماء القيمة 0 إلى مجال الفئة Bin1). وهكذا بالنسبة لبقية الفئات : Bin2 : [10,20[ Bin3 : [20,30[ Bin4 : [30,40[ Bin5 : [40,50[ Bin6 : [50,60[ Bin7 : [60,70[ Bin8 : [70,80[ Bin9 : [80,90[ Bin10 : [90,100] لاحظ أخي بأنه من أجل عدم تقاطع الفئات المختلفة ، فإن المجال يكون مفتوحاً من الطرف الذي يكون فيه المجال مغلقاً من قبل الفئة الأخرى. بعد تحديد مجال الفئات تأتي مرحلة تفريغ البيانات على الفئات المحددة ، وذلك عن طريق رسم جدول توضع فيه الفئات مع التكرار المقابل لها (عدد المفردات التي تنتمي إليها) ، وذلك كما سنرى لاحقاً . عند إعداد الجداول التكرارية و تصنيف البيانات الخام يجب التقيد بالملاحظات التالية : 1.يجب أن لا يقل عدد الفئات عن خمس و لا يزيد عن عشرين فئة ، وذلك تبعاً لطبيعة البيانات الخام وحجمها. 2. يجب أن لا تكون الفئات متباعدة أو متداخلة أو متقاطعة (كما رأينا سابقاً) ، و الهدف من ذلك ضمان عدم وقوع أي مفردة من مفردات البيانات الخام في الفجوات الواقعة بين الفئات المتتالية و كذلك ضمان عدم وقوع أي مفردة بأكثر من فئة. 3. اختيار طول ملائم للفئة ، بحيث لا يكون طويلاً جداً فتضيع بذلك معالم البيانات و يفقدها الكثير من التفاصيل الهامة ، و لا قصيراً جداً فتفقد عملية تصنيف و تلخيص البيانات الخام الهدف منها (و اختيار الطول الملائم يرجع طبعاً لنوع البيانات الخام التي يجري التعامل معها)، وكما ينصح أيضاً بأن تكون الفئات متساوية الأطوال وذلك تسهيلاً لإجراء عمليات التحليل الإحصائي . 4. يجب أن يتضمن الجدول التكراري كافة مفردات البيانات الخام من دون استبعاد أي منها. 5. يجب أن تكون مراكز الفئات (مركز الفئة: العدد الذي ينصف الفئة و هو عبارة عن الوسط الحسابي للحدين الأعلى و الأدنى) ملائمة لطبيعة البيانات الخام ، فمن غير المعقول أن يكون مركز الفئة في الجدول التكراري للبيانات الخام التي لا يمكن أن تتضمن أعداداً كسرية إلا عدداً صحيحاً! 6. يجب أن تكون مشاهدات الفئة (المفردات التي فرغت في هذه الفئة) قريبة قدر الإمكان من مركزها ، الأمر الذي يقلل من الخطأ الناتج عن تبويب البيانات الخام في الجدول التكراري . و الآن وبعد أن حصلنا على المعرفة النظرية الخاصة بإنشاء الجداول التكرارية تعالوا لنرى كيف يمكننا عمل ذلك بسهولة بالغة في برنامج الاكسل . نحتاج من أجل ذلك للوظيفة الإضافية Histogram التي يمكن الحصول عليها كما يلي : من القائمة Tools نختار Add-Ins لتظهر لنا النافذة التالية : إذا لم يكن مربع الاختيار Analysis ToolPak مفعلاً فقم بتفعيله ثم اضغط OK . قم باختيار القائمة Tools مرة أخرى وستجد الخيار Data Analysis قد أدرج ضمنها : قم باختيار Data Analysisحتى تظهر لك نافذة ، ستجد ضمنها الوظيفة Histogram : ما يطلبه منا البرنامج هو مجال البيانات التي نريد تبويبها (البيانات الخام) ، و حدود الفئات المقترحة مرتبة بشكل تصاعدي . عملية إدخال حدود الفئات يكون بكتابة الحد الأعلى لكل فئة (حيث يقوم البرنامج باعتبار مجال الفئة ممتداً على جميع البيانات التي تكون قيمها أصغر من أو تساوي الحد الأعلى للفئة المحددة و أكبر تماماً من الحد الأعلى للفئة السابقة). لتوضيح الصورة بشكل أكبر نقوم بإدراج بيانات المثال السابق (علامات الطلاب) في جدول تكراري : ملاحظة : لقد اعتمدت في الحل على تقديري الشخصي الذي يحتمل الخطأ. المرحلة الأولى : تحديد مجال الفئات المقترحة : لقد اعتمدت في تحديدي لتبويبات الجدول التكراري (مجال الفئات في الجدول) على الافتراضات التالية : 1. جميع العلامات هي عبارة عن أرقام صحيحة (الفواصل تجبر) تنتمي للمجال التالي : [0,100] 2. يعتبر كل من حصل على نتيجة أكبر من أو تساوي 50 درجة ناجحاً (حد النجاح 50 درجة) . 3. تقديرات النجاح موزعة على الشكل التالي : - أكثر شيء مهم من وجهة نظري هو جعل حد النجاح بين فئتين متتاليتين ، بحيث تتضمن أحد الفئتين أفضل الراسبين و تتضمن الفئة التي تليها أسوأ الناجحين. - من البديهي جعل مدى كل فئة 10 درجات ، وذلك تماشياً مع تقديرات النجاح (بحيث تحتوي كل فئة واقعة فوق حد النجاح على بيانات الطلاب المتماثلين بتقديرات النجاح). مما سبق نستنتج بأن مدى الفئة سيكون 10 درجات ، وأن الفئات ستكون 10 موزعة على المجال العام البيانات (من0 إلى 100) . - نلاحظ أنه لا يوجد أي طالب ينتمي للفئة الأولى : [0,10[ و بالتالي فلا داعي لوجود هذه الفئة ، أي يمكننا الاقتصار على تسع فئات فقط. من خلال المناقشة السابقة : يمكننا القول بأن هذا هو التحديد الأمثل للفئات في الجدول التكراري المقترح : Bin1 : [10,20[ Bin2 : [20,30[ Bin3 : [30,40[ Bin4 : [40,50[ Bin5 : [50,60[ Bin6 : [60,70[ Bin7 : [70,80[ Bin8 : [80,90[ Bin9 : [90,100] ملاحظة : يمكننا دمج الفئات 1 و 2 و 3 و 4 في فئة واحدة ، ولكن من الأفضل تركهم على حالهم لتفادي الإرباكات التي قد يسببها هذا الدمج عند تحليل هذه البيانات في المستقبل ، و للاستفادة أيضاً من الفوائد الناتجة عن جعل المدى العائد لكل فئات الجدول التكراري متساوي . المرحلة الثانية : تنظيم مجال الفئات بصورة مفهومة للاكسل : كما قلنا سابقاً فإن الاكسل يتعرف على الفئات من خلال وضعها في عامود يحتوي على الحدود العليا لهذه الفئات مرتبة بشكل تصاعدي . ولكن المشكلة التي تواجهنا الآن في مثال درجات الطلاب هو أن المجالات التي وضعناها للفئات تختلف بعض الشيء عن المجالات الافتراضية للفئات في برنامج الـ Histogram ، كيف : من خلال الشرح السابق نجد أن الفئة الثانية (مثلاً) يتعرف عليها برنامج الـ Histogram على النحو التالي : Bin2 : ]20,30] بينما نحن حددناها على الشكل التالي : Bin2 : [20,30[ و لذلك (و بالاستفادة من كون جميع العلامات عبارة عن أعداد صحيحة) فلا مناص من ترتيب الفئات على النحو التالي (المجال C1:C9) : المرحلة الثالثة : تشغيل معالج الـ Histogram : الآن وبعد أن وضعنا البيانات الخام في المجال A1:A60 و الحدود العليا للفئات المقترحة في المجال C1:C9 نبدأ بتشغيل معالج الـ Histogram لتظهر لنا النافذة التالية : - في المربع Input Range نضع مجال البيانات الخام (المجال A1:A60) . - في المربع Bin Range نضع المجال التي توجد فيه الحدود العليا للفئات بترتيب تصاعدي (المجال C1:C9) ، حيث يتم عد جميع القيم الأصغر من الحد الأعلى للفئة الأولى ، و جميع القيم الأكبر من الحد الأعلى للفئة الأخيرة (في التبويب More) . أما إذا أهمل هذا المربع فيقوم الاكسل عندئذ بإنشاء مجموعة من الفئات الموزعة بين القيمتين العليا Max و الدنيا Min للبيانات الخام . - حدد خانة الاختيار Label في حالة وجود ترويسة (عنوان) لعامودي البيانات الخام و الحدود العليا للفئات المقترحة ، و أزل تحديده في حال عدم وجود ترويسة. - في المربع Output Range يمكننا وضع مرجع للخلية الموجودة في الزاوية العليا من جدول الإخراج (في حال رغبتك بإدراج جدول الإخراج في نفس ورقة البيانات الخام أو في مجال محدد من ورقة أخرى) . - في المربع New Worksheet Ply يمكننا وضع اسم ورقة العمل التي نريد إدراج جدول الإخراج فيها ، و يمكننا ترك هذا المربع فارغ في حال رغبتنا بإدراج جدول الإخراج في ورقة عمل جديدة باسم افتراضي . - نحدد الخيار New Workbook في حال رغبتنا بإدراج جدول الإخراج في مصنف عمل جديد . - حدد الخيار Chart Output في حال رغبتك بإدراج مدرج تكراري للجدول التكراري المنشأ. - حدد الخيار Cumulative Percentage في حال رغبتك بإنشاء عامود النسب المئوية التراكمية في جدول الإخراج ، و إنشاء المنحني التجميعي الصاعد في نفس مساحة الرصد التي يوجد فيها المدرج التكراري (في حال تفعيل الخيار Chart Output) . - حدد الخيار Pareto في حال رغبتك بإدراج التحليل من نوع Pareto المفهرس ، و الذي يعطي نتائج التحليل بشكل مفهرس تنازلياً .ً الآن و بعد الضغط على زر OK يقوم الاكسل بإدراج جدول الإخراج و المخطط البياني (في حال تحديدك لذلك) . يمكنك تطوير جدول الإخراج ، و ذلك بإضافة مجال الفئات و التقدير و التكرار النسبي Frequency % ، كما هو موضح في الشكل التالي : ملاحظة1 : يعتبر التكرار النسبي مفيداً جداً في حالة مقارنة التوزيع التكراري لعينتين مختلفتين بالحجم . ملاحظة2 : يمكننا تكبير التخطيط الناتج عن طريق سحب أحد مقابضه (المربعات الموجودة في زواياه) أو تغيير مكان توضعه إلى ورقة مستقلة عن طريق الخيار Location الموجود في القائمة Chart . ملاحظة3 : يمكننا تغيير المدرج التكراري الناتج إلى مضلع تكراري أو منحنى تكراري عن طريق الخيار Chart Type الموجود في القائمة Chart . ملاحظة4 : نلاحظ من التوزيع التكراري الناتج أنه يشبه التوزيع الطبيعي ، و يقترب بشكل كبير من التوزيع المتماثل و ذلك نتيجة كون قيم الوسط الحسابي و الوسيط و المنوال متقاربة فيه بشكل كبير . ملاحظة5 : في المدرج التكراري يجب أن تكون الأشرطة غير متلاصقة ، و يفضل أن تكون المسافة بين الأشرطة مساوية إلى نصف قاعدة الشريط أو إلى ثلثيها ، ويمكنك التحكم بذلك عن طريق التغيير في تنسيق هذه الأشرطة. أرجو أن أكون قد وفقت في منحكم شيئاً ذو فائدة . مرفق مثال عن الحالة السابقة : بالتوفيق Bin1.rar Histogram.rar1 point