كيفية التكرار من خلال سلسلة والتحقق من قيمة البايت لكل حرف؟
سؤال
الكود عندي :
cell_val = CStr(Nz(fld.value, ""))
Dim iter As Long
For iter = 0 To Len(cell_val) - 1 Step 1
If Asc(Mid(cell_val, iter, 1)) > 127 Then
addlog "Export contains ascii character > 127"
End If
Next iter
هذا الرمز لا يعمل.هل يعرف أحد كيف يفعل هذا؟ليس لدي أي فكرة عن VB أو VBA.
المحلول
أعتقد أن مشكلتك تكمن في أن فهارس سلسلة VBA تبدأ من 1 وليس من 0.حاول القيام بما يلي:
For iter = 1 To Len(cell_val)
If Asc(Mid(cell_val, iter, 1)) > 127 Then
addlog "Export contains ascii character > 127"
End If
Next
نصائح أخرى
باستخدام VBA، VB6، يمكنك فقط الإعلان عن مصفوفة بايت وتعيين قيمة سلسلة لها وسيتم تحويلها لك.وبعد ذلك يمكنك التكرار من خلاله مثل المصفوفة العادية.
على سبيل المثال
Dim b() as byte
Dim iter As Long
b = CStr(Nz(fld.value, ""))
For iter = 0 To UBound(b)
if b(iter) > 127 then
addlog "Export contains ascii character > 127"
end if
next
يجب تعديل المثال الخاص بك بحيث لا يحتوي على تبعيات خارجية، فهو يعتمد الآن على Nz وaddLog.
على أي حال، يبدو أن المشكلة هنا هي أنك تقوم بالتكرار من 0 إلى len()-1.في VBA سيكون هذا من 1 إلى n.
Dim cell_val As String
cell_val = "øabcdæøå~!#%&/()"
Dim iter As Long
For iter = 1 To Len(cell_val)
If Asc(Mid(cell_val, iter, 1)) > 127 Then
'addlog "Export contains ascii character > 127"
Debug.Print iter, "Export contains ascii character > 127"
End If
Next iter
هل قمت بتصحيح ذلك؟;) هل أنت متأكد من أن cell_val ليس فارغًا؟كما أنك لا تحتاج إلى "الخطوة 1" في الحلقة For لأنها الافتراضية.وأيضًا ما الذي تتوقع إنجازه باستخدام التعليمات البرمجية الخاصة بك؟هل يسجل ما إذا كانت أي قيم ascii أعلى من 127؟ولكن هذا كل شيء - لا يوجد تفرع حسب النتيجة؟
جرب AscW()
هل قمت بتصحيح ذلك؟؛) هل أنت متأكد من أن cell_val غير فارغ؟كما أنك لا تحتاج إلى "الخطوة 1" في الحلقة لأنها افتراضية.أيضا ماذا تتوقع أن تتلاشى مع الكود الخاص بك؟يسجل إذا كانت أي قيم ASCII أعلى من 127؟ولكن هذا كل شيء - لا يوجد تفرع اعتمادًا على النتيجة؟
لم أقم بتصحيحه، وليس لدي أي فكرة عن كيفية استخدام vba أو أي من الأدوات المصاحبة له.نعم أنا متأكد من أن cell_val ليس فارغًا.كان الكود تمثيليًا، كنت أتأكد من أن حالة الفرع تعمل قبل كتابة الفرع نفسه.
أعتقد أن مشكلتك تكمن في أن فهارس سلسلة VBA تبدأ من 1 وليس من 0.
آه، الشيء الدقيق الذي يتماشى مع vba والذي كان من المحتم أن أفتقده، شكرًا لك.
تعتمد سلاسل VB/VBA على الواحد بدلاً من الصفر لذا تحتاج إلى استخدام:
For iter = 1 To Len(cell_val)
لقد تركت أيضا step 1
لأن هذا هو الافتراضي.