بحث مخصص من جوجل فى أوفيسنا
![]()
Custom Search
|

Ahmos
الخبراء-
Posts
112 -
تاريخ الانضمام
-
تاريخ اخر زياره
-
Days Won
3
نوع المحتوي
المنتدى
مكتبة الموقع
معرض الصور
المدونات
الوسائط المتعددة
كل منشورات العضو Ahmos
-
سؤال لو سمحت دلوقتي احنا عندنا 3 أرقام - رقم الجزء مثال 1 وفي حال كانت ص يتم استبدالها بـ 1 - رقم الصفحة وهو يأتي بنبسة 100% بعد رقم الجزء / وقدياتي حديث في صفحتي فالصفجة الاولي تاتي أولاً ومن ثم الثانية بهذه الكيفية 132-133 رقم الحديث وهو الموجود في العمود B_Hno وفق ما فهمت فقد ياتي اسم الحديث بعده اما - رقمه - او الجزء والصفحة - الصفحة - او الصفحة ويرمز لها بـ ص وقد لا يرمز لها هل من الممكن ان تجتمع الاحتمالات الثلاثة ؟ اما أفكر فيه حالياً هو ان نستهدف عن القص أبعد رقم قد يرد وليكون الرقم المستهدف هو رقم الصفحة والحمد لله قد افضنا الي دالة القص خاصية تسمح لنا بزيادة الجزء المقتطع من النص فمثلاً لو كان النص يتمن كتاب (232) - (1 / 132-133) فإذا تم قص النص برقم الصفحة 132 سنفقد باقي الحديث ولكن يمكن ان نخبر الدالة ان تزيد بعد الرقم وليكن 8 خانات أخري حتي نضمن الجزء المتبقي للبحث يتضمن كافة المعلومات التي قد نحتاج اليها ومن ثم تقوم بعمل دالة تقوم بعمل إستبدال لـ ص او (ص او ( ص بـ 1 / وتستبدل أيضاً و( او و ( باسم الحديث ( النتيجة اننا لدينا نص الان تم معالجته ولم يعد هناك أرقام تاتي في مواضع متأخرة ومن ثم يمكن تطبيق نمط لنفحص تطابق النتيجة من عدمها في انتظار مراجعتك وتعليق ودعواتك بالتوفيق
-
افكر في حل مختلفة هذه المرة باستخدام النمط لان الجزء والصفحة يأتي بعد الكتاب مباشرة فيمكن العمل علي نمط يتتبعه اي اننا لن نواجه نتائج في مواضع متأخرة صحيح ؟
-
السلام عليكم ورحمة الله وبركاته اللهم لك الحمد كله، ولك الشكر كله، ولك الملك كله، وبيدك الخير كله، وإليك يرجع الأمر كله؛ علانيته وسره أوله وأخره، ظاهره وباطنه...لك الحمد يا مالك الملك في الأولى والآخرة، حمداً دائمًا طيبًا نقيًا مباركًا فيه؛ يملأ السماوات والأرض وما بينهما، كما ينبغي لجلال وجهك وعظيم سلطانك بسم الله ولا حول ولا قوة إلا بالله وعلي الله توكلنا وهو نعم المولى ونعم النصير كما فهمت انك ستقوم بالتمييز يدوياً ماذا لو كمنا بإعداد عمو في جدول TAB مثل wipedNass نقوم في باستبدال ص إذا جاءت منفردة او بعد ( مثلاً بـ 1/ وبهذه الطريقة نكون قد وحدنا النص كما يمكنك إعداد بعض النصوص كعينة للتجربة وإرسالها مع الإشارة الي مواضع البحث او النتائج المتوقعة حتي تتضح الفكرة أكثر عن التحديات والاحتمالات لدي فكرة وأحتاج إلي مساعدتك بجانب ما نقوم به اريد ان نستفيد من هذه البيانات كان نبدء في كل عملية بحث بتكوين قائمة بالكتب مثلاً الأن وجدنا تتطابق لإستخراج الـ MNO ماذا لو جمعنا القيم البحثية وهي اسم الكتاب والرقم وفي خطوة لاحقه سنجد ان قاعدة البيانات تحتوي علي MNO واسم كتاب ورقمه فنقوم بعمل دليل ان هذا الرقم يحتوي علي هذه الكتب طبعاً انا بفكر معاك بصوت عالي انا مش عارف انت شغال علي ايه بالظبط لكن عايز تفكر ازاي تقدر تستفيد من البيانات اللي بتوصلها بحيث متعرفش ان ممكن تحتاجها ازاي بما انك ماشي فالداتا بتحللها وتظبطها يعني قصدي ان لو في حاجه نقدر نعملها واحنا ماشين ومش هتعطلنا ممكن نعملها
-
أخي الكريم تفضل هذا النمط إن شاء الله يتضمن الاحتمالات الممكنة pattern = "(?:" & bookName & "\s*[|_/\\ -]*\s*[\s*|'\(\[\{""]*" & bookNum & "[\s*|'\)\]\ -}""]*)" يتم استبداله هنا بانتظار تجربتك للعديد من الاحتمالات وإذا قمت بتنشيط هذا الجزء من نفس الكود فيمكنك اختبار الدالة هكذا وستطبع النتيجة Sub testIsBookExist() Dim inputText As String Dim bookName As String Dim bookNum As String bookName = "المطالب" bookNum = "3298" inputText = DLookup("[NASS]", "TAB", "[MNO]=33976") inputText = Replace(inputText, "(", "|(") inputText = Replace(inputText, ")", " )''") If isBookInText(inputText, bookName, bookNum) Then Debug.Print "YES" Else Debug.Print "NO" End If End Sub أرجو من الله التوفيق والسداد
-
مساكم الله بالخير والنور والسرور فيما يخص التطبيق 1- يبحث بإسم الكتاب من مربع النص والرقم من الجدول 2 - يبحث بإسم الكتاب فقط بدون الرقم هي فقط تجربة للأنتقال غلي المرحلة التي تليها فالتفكير كنت بفكر بصوت عالي 😄 وبعدين فكرت ان احنا ممكن نعمل نمط يتتبع اسماء الاكتب وأرقمها فممكن مثلاً في الجدول TAB نضيف عمود نستخرج في من النص الكتب الموجودة فيه بس ده هيحتاج اننا يكون معانا كل اسماء الكتب وكل الطرق اللي ممكن تورد بيها *معلومة عند إنشاء دالة تتبع النمط بـ Regex يمكن وضع أكثر من نمط كبدائل ان لم يجد هذا النمط يبحث عن أخر عموماً ده لو هيساعد معاك ممكن نشتغل عليها بس حاول توفرلي الانماط عشان ابداء اشتغل علي الدالة وأختبرها إن شاء الله وبعد كدا نشوف هنشغلها ازاي مع أسماء الكتب صورة من التطبيق الثاني : 😁 شكراً علي التوضيح ده علي الاقل في كولكشين الاستبعاد ممكن بدل ما نكتب 3 بدائل نكتب عساكر او البيهقي ده لو متاح انا بحاول اوصل الفكرة بعض الأسئلة 1- هل في قائمة بجميع الكتب وبدائلها 2- هل يوجد قائمة بأسماء الكتب وأرقامها 3- هل العمود MNOX ده موجود وانت بتحاول تصححه 4- متي سننتقل للبحث بأرقام الصفحات والاحتمالات الاخري ؟ ملحوظة : الان جميع الاكواد التي تعمل تعمد بشكل أساسي في التحقق من MNO أولاً فاذا كان موجود تنتقل اللي السجل التالي فقط إذا كان فارغاً تعمل وهذا توفيراً للوقت وخاصةً عن البحث باسم بديل فحتي لا يبدأ من جديد مع كامل القائمة يذهب فقط إلي الخانات الفارغة علي أي حال كل هذا يمكن تعديله فقد كنت حريصاً علي أنت تصل الي ما تريده وتطمئن إلي ان والحمد لله الأمر ممكن تحقيقه بفضل الله اذا كنت بحاجه إلي تعديل أي شئ فلا تتردد بالتوفيق
-
الأستاذة / حنان @hanan_ms قمت بعمل مديول لحساب الوفق بشكل عام وأضفت له هذه الدالة Public Function ClassifySpeed() As RequestSpeed لقياس سرعة استجابة الاتصال بالأنترنت لجلب معلومات علي سبيل المثال عن طريق oXMLHttp = CreateObject("MSXML2.ServerXMLHTTP") وبالطبع يمكن التعديل والإضافة علي القيم إذا كان هناك قاعدة لتمييز الوقت المحدد للاستجابة
-
السلام عليكم ورحمة الله وبركاته أخي الكريم @nssj تم بحمد الله العمل علي التعديلات المطلوب الملف بالمرفقات كما تم التعديل علي بعض الأكواد سأحاول تغطية التعديلات وإن كان هناك أي استفسار أو طلب أخر فلا تتردد بانتظار التجربة والإفادة 1- فيما يخص التعديل الأول فما أردته هو ان يتم كل شي فالبحث كما هو ولكن فقط أردت تثبيت اسم الكتاب وعليه تم التعديل في الكود نفسه ليتضمن هذا الاحتمال دون أن يتأثر القديم فكانت التعديلات هي إضافة (Optional constName As Boolean = False) حتي يتم التمييز إذا كان اسم الكتاب ثابت ام متغير وبشكل افتراضي هي False فالاختيار الأساسي هو ان الاسم متغير يعتمد علي خانة اسم الكتاب بالجدول وهذا ما تم تعديله علي الكود If constName = False Then BookName = Nz(Trim(.Fields(bookNameCol)), "") Else BookName = Trim(bookNameCol) End If كما يجب التنبيه ان هذا الكود يعتمد بشكل أساسي علي الجدول TAB ومحتوياته بما فيها wipedNass تم التعديل علي (createBooksCollection) تم إضافة تحقق إذا كان العمود الثاني موجود لإضافة ما فيه وللعلم فالمطلوب لعمل هذا الكولكشين هو جزء يميز اسم الكتاب مثال اذا كان الكتاب الاسم الأول معجم ابن عساكر والثاني ابن عساكر في معجمه فيكفي ان يكون الاسم ابن عساكر في البحث او الاستبعاد ----------------------------------------------------- فيما يخص الطلب الثاني فقد تم عمل المطلوب بهذه الطريقة Public Function isBookInText(ByVal fullText As String, _ ByVal BookName As String, _ Optional ByVal bookNum As String = "") As Boolean On Error GoTo ErrorHandler Dim regex As Object Dim matches As Object Dim match As Object Dim pattern As String Set regex = CreateObject("VBScript.RegExp") If bookNum = "" Then pattern = "(?:" & BookName & "\s*-?\s*\(\d+(?:[/\\,\-_]\d+)*\))" Else pattern = "(?:" & BookName & "\s*-?\s*\(" & bookNum & "\))" End If With regex .Global = False .MultiLine = True .IgnoreCase = False .pattern = pattern End With Set matches = regex.Execute(fullText) If Not matches Is Nothing And matches.count > 0 Then ' Debug.Print "Book(s) found in text:" ' For Each match In matches ' Debug.Print " - " & match.Value ' Next isBookInText = True Else isBookInText = False End If CleanAndExit: If Not regex Is Nothing Then Set regex = Nothing If Not matches Is Nothing Then Set matches = Nothing Exit Function ErrorHandler: Debug.Print "Error: " & Err.Description isBookInText = False Resume CleanAndExit End Function فهذه الدالة يمكن استخدامها للبحث عن الكتاب برقم او بدون رقم وهي تبحث داخل النص وفق هذه الشروط اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم ( ثم رقم مع فواصل او بدون ثم ) إذا تم تحديد نص للرقم اسم الكتاب يتبعه أي عدد من المسافات - او بدون ثم أي عدد من المسافات ثم ( النص المحدد ) هذا السطر من الكود (.Global = False) اذا كنت تريد للبحث ان يتوقف بعد اول نتيجة تم عمل هذه الدالة لتعود بـ True or False ولكن يمكن التعديل عليها لتعود بكامل النص مثلاً او تعود بالكتب الموجودة داخل النص التي ينطبق عليها الشروط السابقة تم تطبيق فكرة هذا التعديل للبحث برقم او بدون رقم في الملف المرفق تم إضافة كود لعمل تحديث للفورم قبل التنفيذ حتي يتأثر بالمتغيرات علي مربع النص بالتوفيق Smart_Search_Nssj_V6.zip
-
أخي الكريم بارك الله فيك 1- عندي استعداد وربنا يقدرني ويستخدمني 2- لو ممكن توضح التعديلات المطلوبة أكتر مع أمثلة 3- نعم يمكن وضع نمط للبحث وفي هذه الحالة انت لا تستهدف أرقام الكتب التي تأتي في مواضع متأخرة حاول توضيح المطلوب اكثر مع الذكر الحالات والأمثلة وإن شاء الله سنتمكن من الوصول لحل 4- ولقد حاولت في الكود الحالي ان يتعامل مع المتغيرات فيمكنك استدعائه من أي جدول ومع أي عمودين إذا كان لديك أي استفسار فلا تتردد أخي الكريم بانتظار توضيحك بالتوفيق
-
لقد قمت بتعديل بسيط علي هذه الدالة حتي تتعرف أيضاً علي المسافات بين الاقواس بعد مراجعة طلبك وذلك بإضافة | \s* | للمقطع الأوسط النسخة بعد التعديل بالمرفق Public Function nssjWipeCondition(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(\d+\s*-\s*\()([\d-/_,\s*\\]+)(\))" End With nssjWipeCondition = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function Smart_Search_Nssj_V5.zip
-
السلام عليكم ورحمة الله وبركاته أخي الكريم صبحك الله بالخير والنور والسرور تم بحمد الله عمل التعديلات المطلوبة وتم تعديل بعض الأكواد واضافة بعض الاكواد والوظائف الملف بالمرفقات راجعني بعد التجربة بالنتائج والاستفسارات إن شاء الله بالتوفيق Smart_Search_Nssj_V4.zip
-
تفضل أخي الكريم تم تعديل الوظائف بالشروط الجديدة يمكنك تجربتها كما انه قد خطرت لي فكرة ستساعد بإذن الله في تسريع عمل الكود Public Function nssjWipeNumbers(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(\d+\s*-\s*\()(\d+)(\))" End With nssjWipeNumbers = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function Public Function nssjWipeCondition(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(\d+\s*-\s*\()([\d-/_,\\]+)(\))" End With nssjWipeCondition = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function Public Function nssjWipeAny(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(\d+\s*-\s*\()([^)]*)(\))" End With nssjWipeAny = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function
-
اذا اردت ان تضيف العمود BookName2 بشكل منفصل في الجدول BOOKSLIST فلا يوجد مشكلة إن شاء الله ساعدل الوظيفة لتضيف منه ايضاً ففي هذا الامر لا يهم الترتيب ولكن يجب إضافته في الجدول BOOKS كما ذكرت سابقاً
-
أرجو لك من الله التوفيق أخي الكريم نبدأ من حيث انتهيت بالنسبة للأسماء البديلة يجب انت تضافي في موضعين 1- في الجدول BOOKSLIST في نفس العمود BookName لان هذا العمود هو ما يضاف للكولكشين التي تقوم باستبعاد الكتب التي تقع بين اسم الكتاب الذي نبحث عنه ورقمه ان جاء متأخراً 2- يضاف العمود BookName2 في الجدول Books وكل اسم في العمود BookName يقابله البديل الخاص به في العمود BookName2 وإذا أردت إضافة BookName3 فافعل وفق احتياجاتك وسارعي إن شاء الله إمكانية استخدام الكود مع أكثر من عمود حتي تتمكن إذا اردت إضافة بدائل في المستقبل تتمكن من استخدم الكود معها --------------------------------- بالنسبة لإمكانية التعديل علي النمط فهي متاحة إن شاء الله ولكن إريد منك حصر الاحتمالات بأمثلة ولو انت تكتبها ك حديث 217 - (123,135) مثلاً إذا كان هناك عدد للأرقام لا يقل ولا يزيد عنه إذا كنت ترغب ان يتضمن الشرط عدد مسافات معينة اريد أن أعلم الاحتمالات الممكن حتي نتمكن إن شاء الله من عمل نمط يستوعبها -------------------------------- كل الدوال التي تم مشاركتها يمكنك استخدامها منفردة ويمكن ان تستخدمها للتعديل علي النص الحالي او إنشاء عمود جديد معدل فيما عدا الدالة التي سبق وذكرت انها بحاجه لرقم حتي تبحث عنه وتطابقه وتمسحه ----------------------------- بالتوفيق
-
جرب أحد الدوال التي قمت بمشاركتها منذ قليل فالبتأكيد ستكون اسرع لانها لن تبحث وتطابق رقم كما يمكنك تجربتها في إنشاء عمود جديد بقاعدة البيانات معد للبحث فقط أختار اي واحدة منهم حتي أقوم بالتعديل علي الكود وسيصبح أسرع إن شاء الله كما يمكن إضافة كود يظهر يطبع لك رسالة كل 1000 او يظهر رسالة او يظهر رسالة مؤقتة وتختفي تلقائياً ويستكمل الكود عمله اختر ايهم تريد وسوف أعمل علي ذلك إن شاء الله
-
الحمد لله والشكر لله بالتوفيق أخي الكريم هذه الدالة (wipeValueFormString) لا تعمل هكذا فهي بحاجه الي رقم بعينة حتي تبحث عن وتطابقه ثم تحذفه وبالتالي لن تعمل بشكل عام فتستخدم هكذا wipeValueFormString([nass],"25") ولكن قد قمت بفضل الله بعمل ثلاث دوال أخرى تطابق الشروط التالية تبحث عن - متبوعة بأي عدد من المسافات ثم ( وبعد ذلك يوجد محتوي كل دالة تتعامل مع المحتوي بشكل مختلف ثم ) مثال علي أحد الدوال وفرصة لعرض إمكانية Regex في التحقق من نمط بداخل نص وانا لم أتعمق كثيراً في استخدامتها ولكن أحتجتها قريباً وبدأت اقراء عنها وغالباً ما اعتمد فالبحث وأدوات الذكاء مؤخراً حتي أصل للنمط المناسب حتي وانا أبحث هذه المرة تعرفت علي معلومة جديد Public Function wipeNumbersInCondition(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(-\s*\()(\d+)(\))" End With wipeNumbersInCondition = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function Public Function wipeAllInCondition(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(-\s*\()([\d/-]+)(\))" End With wipeAllInCondition = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function Public Function wipeAnyInCondition(ByVal fullText As String) As String Dim regex As Object Set regex = CreateObject("VBScript.RegExp") With regex .Global = True .MultiLine = True .IgnoreCase = False .Pattern = "(-\s*\()([^)]*)(\))" End With wipeAnyInCondition = regex.Replace(fullText, "$1$3") If Not regex Is Nothing Then Set regex = Nothing End Function فالأكواد الثلاثة كلها تتبع نفس النمط وفق ما ذكرت سابق ولكن تختلف كل واحدة في تميز المحتوي 1- wipeNumbersInCondition تحذف المحتوي إذا كان ارقام فقط 2- wipeAllInCondition تحذف المحتوي إذا ارقام / ارقام 3- wipeAnyInCondition تحذف المحتوي مهما كان مثال إذا أردت التعديل علي النمط حتي لا يبحث عن عدد لا نهائي من المسافات بين الـ - والـ ( اريدة فقط ان يبحث عن مسافة واحدة او بدون مسافات كل ما علي فعله هو أستبدال \s* بـ \s? في النمط "(-\s*\()(\d+)(\))" حيث ان ؟ تعني بدون مسافة او مسافة واحد والمعلومة الجديدة التي تعلمتها هي هنا تتم عملية الاستبدال للنمط المطابق regex.Replace(fullText, "$1$3") ومن الممكن ان يتم الاستبدال هكذا regex.Replace(fullText, "-()") ولكن $1 يشير إلي أول جزء في النمط و $3 تشير الي الجزء الثالث في النمط وبتالي ستيم الاستبدال بالقبم الملتقطة فلن يتغير اي شي علي النص فقط المحتوي ما بين الـ () يمكنك استخدام أي واحدة من الدوال الثلاثة بالطريقة التي ذكرتها كما يمكنك أختيار واحدة منهم لأضعها فالكود المستخدم بدلاً من تحديد رقم بعينة إذا أردت ذلك ------------------- بالنسبة للكود الذي سيعمل بإذن الله علي اسم الكتاب الأخر كنت أفضل لو تشارك نموذج به مثال حتي أتمكن من معاينة النتيجة وأيضاً حتي يوافق الكود التكوين الخاص بك والاسماء اما إذا أردت ان أضيف عمود وأم انا بالتسمية و ،،، فسوف أعمل عليه إن شاء الله بانتظار إجابتك
-
-
النص بعد حذف الأرقام أصبح مصنفات البختري (15)، و269 - () حدثنا محمد .. اليك النسخة بالمرفقات Smart_Search_NSSJ_V2.accdb
-
أخي الفاضل عندما قمت بتطبيق الوظيفة الجديدة تبين ما يلي كما تري لم اجد تطابق لهذا الحديث مع انه كان يظهر في البداية وعندما بحثت وجدت ان الرقم 25 ينطبق عليه شروط الاستبعاد هل يمكنك ان تخبرني اذا كانت الوظيفة الجديدة تعمل بشكل جيد واستبعدت بالفعل ما يجب استبعاده ؟
-
نعم أخي الكريم يمكن عمل ذلك ولكن أفضل تطبيقه بالطريقة التالية الأجراء الحالي كما هو ثم نقوم بعمل إجراء أخر يبدأ بالتحقق من الخانات الفارغة بالعمود mno ومن ثم يذهب للقيمة بـ Bookname2 والرقم والحمد لله ان ما قلته قد اوحي لك بهذه الفكرة مع ان المقصود من كلامي بعيد كل البعد عن هذه الفكرة 😁 فالمقصود بإضافة نص اختياري هنا الاتي لنفترض ان لدينا النص التالي "كل الكتاب المتاحة في المكتبة هي 4000 كتاب وفي مجال الحديث 2000 كتاب" إذا اردنا قص النص باستخدام الوظيف فيجب تحديد نقطة البداية ونقطة النهاية دائماً رقم فمثلاً البداية مع كلمة الكتاب والنهاية مع الرقم 4000 فستقوم الوظيفة بذلك ولكن ماذا لو اردنا ان نزيد علي القص بعض الخانات الاضافية فيكون الاستخدام هكذا trimString("fullText","الكتاب","4000",True,5) وتكون النتيجة الكتاب المتاحة في المكتبة هي 4000 كتاب إذا طبقت المثال بالمشركة السابق سيتضح الأمر إن شاء الله تصورت بهذه الطريقة قد نحتاج إلي زيادة بعض الخانات الإضافية التي قد نحتاج إليها في البحث او التمييز بالنسبة لطلبك الأخر الحمد لله والشكر لله تم التوصل للمطلوب يتم البحث اولاً عن جميع الارقام المطابقة بنسبة 100 ومن ثم التحقق إذا كان يسبق الرقم )- او ) - يتم إستبعاد الرقم من النص الكلي وجاري العمل علي التطبيق وسيتم المشاركة قريباً إن شاء الله
-
السلام عليكم ورحمة الله وبركاته أخي الكريم بارك الله فيك، إليك نسخة محسنة مع بعض الإضافات التي قد نحتاج إليها مستقبلاً "بالمرفقات" - تم إزالة الاكواد الزائدة - تم تعديل الوظيفة الخاصة بقص النص وإضافة بعض المميزات - تم إضافة جدول أسماء الكتب إليك بعض التوضيحات 1- الكود المسؤول عن إضافة أسماء الكتب للكولكشين هو "createBooksCollection" ويمكن التعديل عليه لتغير المصدر الخاص بأسماء الكتب من خلال التعديل علي اسم الجدول : booksSourceTable = "BOOKSLIST" اسم العمود : booksColumn = "BookName" يتم تطيبق هذا الاجراء داخل الكود الاساس من خلال هذه الاكواد 1- يجب تعريف الكوليكشين Dim BooksCollection As Collection ثم التطبيق createBooksCollection BooksCollection 2- تم تعديل الوظيفة الخاصة بالنص حتي تسمح بالاتي هي فالاول كانت تقوم بالبحث عن اول الكلمة (إسم الكتاب) ثم تبحث عن أخر رقم مطابق الان التعديلات هي 1- البحث عن أقرب رقم مطابق وهو الافتراضي 2- البحث عن أخر رقم مطابق 3- إمكانية إضافة نص أختياري بعد الرقم المطابق مثال Sub TestTrimString() Dim fullText As String fullText = "I have too many books contain this subject book 35 and book 353 and book 35/4 and book 135 search in any" ' حتي نحصل علي أقرب نتيجة مطابقة Debug.Print trimString(fullText, "books", "35") ' حتي نحصل علي أبعد نتيجة مطابقة Debug.Print trimString(fullText, "books", "35", False) ' حتي نحصل علي أقرب نتيجة مطابقة ثم نضيف 4 خانات من النص الاساسي Debug.Print trimString(fullText, "books", "35", True, 4) ' حتي نحصل علي أبعد نتيجة مطابقة ثم نضيف 5 خانات من النص الاساسي Debug.Print trimString(fullText, "books", "35", False, 5) End Sub هذه الأكواد متعلقة بوجود العمود MNOX وكما فهمت هذا العمود لن يكون موجود تم وضعه للأختبار فقط لذا يجب تعليق هذه الاكواد في حالة عدم وجودة If CStr(Nz(!MNO, "")) = CStr(Nz(!MNOX, "")) Then !select1 = True Else !select1 = False End If Debug.Print "Total Match is " & DCount("[select1]", "BOOKS", "[select1]=True") & " / " & DCount("*", "BOOKS") & " Total Records" تم إضافة هذا الكتاب لجدول الكتب تم إضافة العمود الخاص بعدد النتائج والعمود الخاص بجميع الـ MNO بها لو أمكنك مشاركة هذه النتيجة عند التجربة علي قواعد بيانات كبيرة It Takes | 78MS | To resolve | 33 | Records لمعرفة كم احتاجت من الوقت أرجو لك من الله التوفيق Smart_Search_NSSJ.accdb
-
أخي الكريم إجابةً علي هل هناك طرق أخري فحسب معلوماتي يوجد طريقة أخري عني طريق تحديد أنماط للبحث داخل النص باستخدام (regEx) ولكن فيما يتناسب مع الحالات التي قد ترد هو المسار المختار الان ونسأل الله التوفيق لماذا ؟ لان المشكلة الحقيقية ليست البحث داخل النص عن أسم الكتاب ومقطع أخر المشكلة ان المقطع الأخر قد يرد قبله اسم كتاب اخر ولذا هداني الله لهذه الطريقة ان نقوم بتحديد النص المراد عن طريق الحدود وهي اسم الكتاب ورقم البحث ومن ثم إذا كانت نتيجة التصفية 1 فلا يوجد مشكلة وهنا تطابق 100% اما اذا كانت أكثر نقوم بالبحث داخل هذه النتائج فإن كان هناك اسم كتاب أخر بين اسم الكتاب والرقم فهذا يعني بان الرقم يخص الكتاب الأخر فنستبعد هذا الاحتمال ولذلك من المهم جداً ان تعرض جميع الحالات الممكنة حتي يتم مراعاتها كما يمكن ان نقوم بأكثر من عملية للوصول إلي أوثق نتيجة بإذن الله والاضافة الحالية التي قد تساعدك ان نقوم بإضافة عمود نضع فيه عدد النتائج التي ظهرت في التصفية وعمود أخر نجمع في ارقام الـ MNO الخاصة بهذه النتائج حتي نقلص وقت المراجعة
-
أخي الكريم تم عمل التعديل كالتالي 1- تقوم الوظيفة بقص النص الأساسي الي مقطع ما بين اسم الكتاب واخر رقم يطابق الرقم الخاص بالبحث 2- وهو خطوة مهم جداً يجب ان تحتوي قاعدة البيانات التي سوف تعم عليها جميع أسماء الكتب لاننا سنضعها داخل كولكشين ونبدأ بعمل التالي الان لدينا النص الذي نريد البحث بداخله ولدينا جميع اسماء الكتب فحتي اتبين ان الرقم يخص الكتاب الخاص بالبحث وليس كتاب اخر سوف اقوم باستبدال جميع اسماء الكتب الاخرى بكلمة محددة حتي اتمكن من عدها لاحقاً إذا وقعت بين الكتاب الاساس في البحث والرقم الخاص بالبحث ومن ثم اقم بالعدد فمثلاً في هذه الحالة عندما أضفت اسم الكتاب الفوائد المعللة لأبي زرعة الي الجدول BOOKS أصبحت النتيجة صحيحة وهنا إذا اضفنا المجمع لقائمة الكتب ستصبح النتيجة صحيحة وهكذا ،،، تم إضافة هذا الجزء حتي يقوم بمقارنة النتيجة بالرقم mnox ويقوم بعمل select1 true or false If CStr(Nz(!MNO, "")) = CStr(Nz(!MNOX, "")) Then !select1 = True Else !select1 = False End If أتمني ان يقوم هذا بالمطلوب وكما أخبرتك سابقاً يفضل إضافة مثال يحتوي علي كل او معظم الحالات حتي نتمكن من وضع تصور يسمح بالتعامل مع أغلب الحالات قدر المستطاع وفقك الله وحفظك بانتظار التجربة علي ملف يحتوي علي عدد كبير ويفضل ان يحتوي علي جميع أسماء الكتب Smart_Search_New02.accdb
-
في فكرة تانية جت فدماغي دلوقتي ان شاء الله الفكرة دي هتضمنلك نتيجة 100% بإذن الله 1- عايزين نحذف ما قبل اسم الكتاب وما بعد الرقم 2- الجزء المتبقي معانا هيبقي فيه احتمالين - ان يكون في اسم كتاب تاني - او مفيهوش وفالحالة دي احنا ناخد اللي مافيهوش اسم كتاب تاني وده هشان نحل مشكلة الارقام اللي بتيجي فمواضع متاخرة يبقي احنا دلوقتي هنروح نضيف اسماء الكتب في كولكشين ونمنع التقرار وبعدين نعمل لوب كولكشين دي جوة نتيجة البحث اذ كان في حاجه فيهم موجودة بين اسم الكتاب والرقم معنا كدا ان الرقم ده خاص بالكتاب اللي موجود في الكولكشين فنستبعد النتيجة دي إن شاء الله هتظبط وهتدعيلي
-
دلوقتي عملت تعديل بعد حذف الجزء ما قبل اسم الكتب والبحث عن الرقم في الجزء المتبقي ظهرت الحالة التالية فمحاولتي الان هي ان يتم التميز بين النتائج واختيار الرقم الأقرب لأسم الكتاب هذه هي الفكرة التي أعمل عليها الان حتي نتأكد من اختيار الناتج الصحيح ولكن عندي سؤال هل دائماً نبحث عن الرقم لو قد نبحث عن 73/2