السلام عليكم ورحمة الله وبركاته
اخوانى الكرام اكمل لكم سلسلة افتح الباب الخاصة بالاستاذ الكبير ياسر خليل
والتى اوكلنى لنقلها لكم ولم انسى الامر بالطبع
وكنت قد توقفت لفترة بسبب انشغالى وبإذن الله نكملها على خير
والان اترككم مع الاستاذ ياسر خليل فى شرح دوال التعامل مع النصوص
....................................................................................................................................................
السلام عليكم ورحمة الله وبركاته
إخواني الكرام في الصرح العملاق أكاديمية الصقر ، أقدم لكم اليوم موضوع في غاية الأهمية ، ألا وهو التعامل مع السلاسل النصية Strings والدوال الخاصة بالتعامل مع النصوص.
اتعرفنا في حلقات سابقة على المتغير String ، ودا بنستخدمه لتخزين النصوص .. أول شيء بنعلن عن اسم المتغير ونحدد نوعه كـ String بالشكل ده :
CODE
Dim strEmail As String<br />
وقلنا إن الأفضل دايماً لما نسمي متغير يكون معبر ، ففي السطر اللي فات أنا نويت والنية لله إني أخزن نص ، والنص ده عبارة عن إيميل ، فسميت المتغير strEmail أول 3 حروف من كلمة String وبعدين كلمة معبرة عن النص Email ، وحددت نوعه إنه نص String.
طيب تاني سطر ببدأ أضع قيمة للمتغير اللي أعلنت عنه ، ودا بيكون بطريقة معينة ، إننا نحط اسم المتغير على اليسار ، وبأكد على اليسار وبعديه علامة يساوي ، وبعد علامة يساوي أفتح أقواس تنصيص وأكتب النص اللي عايز أخزنه وأقفل أقواس التنصيص (كل اللي بقوله ياسمسم كلام قديم مفيش جديد ..دا في الإنجليزي بيسموه Warm-Up يعني تهيئة للحلقة)
CODE
strEmail = "yakh777@yahoo.com"
طيب هل دايماً لازم نحط نص في قيمة المتغير النصي ولا فيه طريقة تانية ؟ فيه طريقة تانية ..إن يكون النص في خلية معينة وليكن A1 ، ولما نيجي نضع قيمة للمتغير نشير لقيمة الخلية A1 زي كدا :
CODE
strEmail = Range("A1").Value
حط الايميل في الخلية A1 ، وجرب بنفسك .. جرب مرة تكتب النص ، وعن طريق الدالة Msgbox شوف النتيجة ، ومرة تانية جرب السطر الأخير وشوف النتيجة (النتيجة واحدة .. كل السبل تؤدي إلى حلقات افتح الباب) ...
خلصنا المراجعة يا مدحت .. نشوف ايه اللي هنقدمه في حلقة النهاردة ..
أنا صراحة مش مرتب في أفكاري .. ممكن تقول إني عشوائي جداً ، بس الحمد لله ، بتوفيق الله عز وجل بيخرج الموضوع منظم ومتسألش إزاي ..!
أنا همسك دالة دالة من دوال التعامل مع النصوص وهشرحها بالتفصيل ، والله المستعان :
*-------------------------------------------------*
الدالة Len (دالة بسيطة وسهلة وكلنا عارفينها ، وبنستخدمها في ورقة العمل : طبعاً إنتو لما بتقروا الحلقات بيكون فيه ملف إكسيل مفتوح (مش كدا ولا مطنشين) ، عشان نطبق أول بأول ..
في الخلية A1 إحنا كتبنا نص ، عايزين نعرف طول النص ده ، فبنستخدم الدالة Len ، مثلاً في الخلية B1 اكتب المعادلة بهذا الشكل :
CODE
=LEN(A1)<br />
واحد هيقولي إنت مش بتشرح VBA إنت بتخدعنا ، الشغل دا إحنا عارفينه !! أنا عارف إنكم عارفينه ، بس عايزين نربط بين الشغل في ورقة العمل والشغل في محرر الأكواد ، عشان تكون الصورة واضحة ..
نروح للمحرر .. ونكمل الكود اللي كتبنا منه أول سطرين ..
CODE
Dim strEmail As String
Dim X As Integer
strEmail = Range("A1").Value
X = Len(strEmail)
MsgBox strEmail & " : " & X
أظن الكود واضح جداً ، إحنا الحمد لله وصلنا لمرحلة متقدمة نقدر من خلالها نفهم أسطر الكود .. هشرح الجديد بس عشان الناس متحسش بالملل : الجديد يا أستاذ عبد المجيد ، الدالة Len ، ودي وظيفتها إننا بنقدر من خلالها معرفة عدد أحرف النص ، والأحرف مش مقصود بيها الحروف العربية والإنجليزية فقط ، ولكن الرموز أيضاً بيتم حسابها زي علامة @ والنقطة .. لما ننفذ الكود هتطلع رسالة فيها النص الموجود في الخلية A1 وبعدين عدد أحرف النص .. وفصلت بينهم بـ : (Shift + ك)
الدالة أسندناها للمتغير X وخلينا نوعه Integer لأن عدد أحرف النص عدد صحيح (ولا يمكن يكون فيه حرف بنشوفه ربع حرف .. طبعاً لا ... ، الحرف يمثل عدد واحد صحيح)
بعد كتابة الدالة فتحنا قوس ووضعنا المتغير النصي اللي سميناه strEmail وقفلنا القوس (...) ، ننفذ الكود هنلاقي النتيجة إن عدد الأحرف 17 (اتأكد بنفسك لو وقتك يسمح)
*-------------------------------------------------*
ننتقل لدالة تانية : الدالة InStr (شكلها صعبة .. لو عرفت اختصارها هتكون سهلة بإذن الله ..الحرفين In يعني (في) أو (داخل) .. والحروف Str اختصار String .. بمعنى تاني : الدالة دالة بحث عن نص داخل نص (فزورة .. وكلام معقد مش عايزين) .. بالمثال نفهم الكلام المعقد ..(نص فرعي أي جزء من النص داخل سلسلة نصية طويلة) ..بردو الكلام صعب
نفترض إننا في الإيميل اللي كتبناه عايزين نعرف علامة @ موقعها فين في النص ، في الحالة دي هنستخدم الدالة InStr عشان نقدر نحدد موقعها (مش هنحتاج لـ GPRS خاصية البحث عن طريق الأقمار الصناعية) .. ناخد مثال عشان منتوهش !!
CODE
Dim strEmail As String
Dim X As Integer
strEmail = "yakh777@yahoo.com"
X = InStr(strEmail, "@")
MsgBox X
نفس المثال اللي فات تقريباً .. نركز على الجديد ، ونقول دا شكل الدالة ، تقريباً زي الدالة اللي فاتت بس نركز إن فيه بارامتر تاني ، البارامتر التاني هو عبارة عن النص المراد البحث عنه (يعني ممكن نقول إن النص عبارة عن كومة قش ، والنص الفرعي المراد البحث عنه عبارة عن إبرة ، فنشرح الدالة ببساطة إن الدالة بتقوم بعملية البحث عن إبرة في كومة قش .. !!)
الناتج يا جماعة يا متابعين الحلقات بيكون عبارة عن عدد صحيح Integer ، لو جربنا الكود هنلاقي الناتج 8 ، أي أن موقع الإبرة في كومة القش رقم 8 (عد من الشمال يا حاج كمال)
ممكن نكتب النص الأصلي مباشرةً بدل من إسناده لمتغير زي كدا :
CODE
Dim X As Integer
X = InStr("yakh777@yahoo.com", "@")
MsgBox X
بس أنا أفضل دايماً الإعلان عن المتغير ، وإسناد قيمة له ، لسبب إننا لما بنكتب كود ، مش هنشتغل على النص مرة واحدة .. الشغل هيكون أكتر من مرة .. فبالتالي أفضل المثال السابق.
وجه الاستفادة من الدالة دي إنك تتأكد من وجود نص معين في النص الأصلي من عدم وجوده ، يعني لو مش موجود هتكون النتيجة ايه ؟ فكروا شوية قبل ما أقول الإجابة : أكيد صفر ، لأن النص الفرعي (الإبرة) مش موجودة ، بالتالي تكون النتيجة صفر..نجرب المثال التالي :
CODE
Dim strEmail As String
Dim X As Integer
strEmail = "yakh777@yahoo.com"
X = InStr(strEmail, "@")
If X = 0 Then
MsgBox "الإيميل غير صحيح ؛ لأنه لا يحتوي على العلامة اللي متعودين عليها"
Else
MsgBox "الإيميل صحيح يا فصيح ؛ لأنه يحتوي على العلامة اللي زهقنا من شكلها"
End If
نجرب ننفذ الكود مرة ، ونشوف النتيجة ، هنلاقي إن الرسالة التانية هي اللي هتظهر ، لأن قيمة X = 8 ، يعني أكبر من الصفر (ودا دليل على وجود الإبرة في كومة القش)
أما لو شيلنا علامة @ وجربنا الكود مرة تانية ، فهتظهر لنا الرسالة الأولى ، لأن قيمة X=0 ، (ودا دليل على عدم وجود النص الفرعي في السلسلة النصية)
بكدا يكون انتهى الكلام عن الدالة InStr ... لا لسه متستعجلش .. الدالة فيها بارامترات اختيارية واحد بيكون في الأول وواحد في الآخر ، الشكل العام لها كدا :
CODE
InStr(start, Text_To_Search, Find, comapre)<br />
إحنا أخدنا البارامتر التاني اللي هو كومة القش (النص المراد البحث فيه) ، والبارامتر التالت اللي هو الإبرة (النص المراد البحث عنه) ..
بالنسبة للبارامتر الأول دا نقطة البداية ، ولما مش بنكتبها بيكون الافتراضي فيها 1 أي بداية عملية البحث والتنقيب عن الإبرة في كومة القش تبدأ من أول حرف بالنص..
البارامتر الأخير بردو اختياري ودا نادر الاستخدام .. ودا له 4 قيم :
CODE
(vbUseCompareOption) , (vbBinaryCompare) , (vbTextCompare) , (vbDatabaseCompare)<br />
ناخد مثال بسيط عشان نفهم جزء واحد من الخيارات للبارامتر الرابع :
CODE
Dim X As Integer
X = InStr("This is my heart", "t")
MsgBox X
ننفذ الكود نلاقي إن الناتج 16 ، ودا موقع حرف t في النص ، نخلي بالنا إن فيه حرف الـ T في أول النص الأصلي ، طيب نفترض إننا عايزين نعرف موقع أول حرف T سواء كان Capital أي حرف كبير أو Small أي حرف صغير .. في الحالة دي هنستخدم البارامتر الرابع ، وهنستخدم الخيار vbTextCompare (وفي حالة استخدامه بيتم تجاهل حالة الأحرف)
CODE
Dim X As Integer
X = InStr("This is my heart", "t", vbTextCompare)
MsgBox X
ننفذ الكود نتصدم برسالة خطأ .. الغلطة فين ؟ هي مش غلطة ، إنما قاعدة ، إنك لو هتستخدم البارامتر الرابع اللي هو أصلاً اختياري يبقا إجباري عليك تستخدم البارامتر الأول اللي هو اختياري -- أما لو استخدمت البارامتر الأول اللي هو اختياري ، فممكن عادي تستغنى عن البارامتر الرابع اللي هو اختياري (هدوخكم ورايا .. اقرا من الأول عشان تفهمها ) ..
يعني الشكل الصحيح يكون كدا :
CODE
Dim X As Integer
X = InStr(1, "This is my heart", "t", vbTextCompare)
MsgBox X
الناتج هنا هيكون مختلف ، هيكون رقم 1 ، ودا موقع حرف الـ T في أول النص (هنا تم التغاضي عن حالة الأحرف .. يعني كأننا بنقوله ملكش دعوة الحرف كبير أو صغير .. ابحث عنه)
كفاية كدا على الدالة دي (خدت أكتر من وقتها) ..
*-------------------------------------------------*
ننتقل لدالة ثالثة اسمها StrReverse ودي من اسمها نعرف وظيفتها .. Reverse معناها عكس (مضاد : لا مش مضاد .. بقول عكس) يعني بص لها من الآخر ..
يعني مثلا كلمة (الصقر) لما نبصلها من الآخر تبقا (رقصلا) كدا أكيد وصلتكم
ناخد مثال عملي :
CODE
Dim strAlsaqr As String
Dim strResult As String
strAlsaqr = "الصقر"
strResult = StrReverse(strAlsaqr)
MsgBox strResult
نجرب الكود ونشوف النتيجة .. كفاية عليها كدا ، مش مستاهلة نتكلم عنها كتير ..
*-------------------------------------------------*
هختم الحلقة بالدالة الرابعة (نظراً لأن رقم 4 بيغيظ ناس .. وأنا بصراحة من النوع الغياظ المستفز) ..
الدالة التوأم (دالتين هشرحهم مع بعض ) .. بس قبل ما نشرحهم نروح لورقة العمل ونكتب مثلاً yasser في الخلية B3 ، وفي الخلية المجاورة اكتب المعادلة :
CODE
=UPPER(B3)<br />
والخلية B4 اكتب كلمة YASSER كلها حروف كبيرة ، وفي الخلية المجاورة اكتب المعادلة :
CODE
=LOWER(B4)<br />
أظن الأمور واضحة بالنسبة لكم ، نرجع للمحرر ونشوف شكل الدالتين دول في المحرر :
الدالة LCase أول حرف منها L اختصار Lower يعني زيها زي الدالة Lower في ورقة العمل ، والتانية UCase وحرف U اختصار لكامة Upper يعني زيها زي الدالة Upper
بس خلاص .. مش محتاجة شرح .. ممكن ندعم الكلام بمثال فقط :
CODE
Dim strName As String
strEmail = "yasserkhalil"
MsgBox UCase(strEmail)
نجرب نفس المثال ، بس نخلي النص كله حروف كبيرة ، ونستخدم الدالة التانية LCase زي كدا :
CODE
Dim strName As String
strEmail = "YASSERKHALIL"
MsgBox LCase(strEmail)
نأتي إلى الواجب اللي الناس بطلت تعمله :
اكتب كود ، وأعلن عن متغير نصي ، على أن يكون النص المراد تخزينه فيه العلامة @ ، وفي رسالة أظهر النص المخزن في سطر ، وعدد الأحرف للنص في سطر ، موقع العلامة @ في سطر ، وقم بعكس النص في سطر ، وقم بتحويل حروف النص إلى أحرف كبيرة في سطر ، وتحويل حروف النص إلى أحرف صغيرة في نص .. وكفاية كدا عشان متتعبوش ، أنا يهمني راحتكم.
كان معكم أخوكم أبو البراء من منتدى أكاديمية الصقر للتدريب
إلى لقاء متجدد بإذن الله .. دمتم في رعاية الله (خدوا بقا شوية ورد لأحسن أخونا اسلام شكله ناوي يخلص على الورد اللي في المنتدى .. كفاية 4 وردات)
والسلام عليكم ورحمة الله وبركاته