سؤال

أعطيت لي الوظيفة التالية من خلال إجابة طرحتها في وقت سابق اليوم.

ما أحاول القيام به هو إزالة حرف من سلسلة في Excel باستخدام VBA.ومع ذلك، عند تشغيل الدالة، ينتهي الأمر بمسح القيمة المخزنة وإرجاع ملف #!VALUE خطأ.يبدو أنني لا أستطيع معرفة ما يجري.من لديه مانع يشرح البديل:

Function ReplaceAccentedCharacters(S As String) As String
    Dim I As Long

With WorksheetFunction
For I = 1 To Len(S)
    Select Case Asc(Mid(S, I, 1))
        ' Extraneous coding removed. Leaving the examples which 
        ' do work and the one that is causing the problem.
        Case 32
            S = .Replace(S, I, 1, "-")
        Case 94
            S = .Replace(S, I, 1, "/")

        ' This is the coding that is generating the error.
        Case 34
            S = .Replace(S, I, 1, "")
        End Select

    Next I

End With

ReplaceAccentedCharacters = S

End Function

عندما تحتوي السلسلة على " (أو رمز الحرف 34 بالنظام العشري، 22 بالنظام الست عشري...لقد استخدمت كليهما) من المفترض إزالة علامة الاقتباس.ومع ذلك، بدلاً من ذلك، يتجاهلها Excel، ويستمر في إرجاع الملف " علامة على أي حال.

ثم حاولت المضي قدمًا واستبدال .Replace() جملة بقيمة أخرى.

        Case 34
            S = .Replace(S, I, 1, "/")
        End Select

باستخدام الكود أعلاه، يقوم البرنامج النصي بالفعل باستبدال " بـ /.

انتهى بي الأمر بالعثور على المثال التالي هنا في Stack Overflow:https://stackoverflow.com/a/7386565/692250

وفي الإجابة المقدمة، أرى نفس مثال الكود الدقيق المشابه لذلك الذي قدمته ولا شيء.لا يزال Excel يتجاهل علامة الاقتباس.حتى أنني ذهبت إلى أبعد من ذلك لتوسيع التعريف باستخدام الأقواس المتعرجة وما زلت لم أحصل على أي شيء.

هل كانت مفيدة؟

المحلول

تم تصميم هذه الوظيفة لاستبدال حرف بآخر.لم يتم تصميمه لاستبدال الشخصية بلا شيء.ما يحدث عندما تحاول استبدال حرف بلا شيء هو أن عداد التكرار خلال الكلمة سيبحث الآن (في التكرار الأخير) عن موضع الحرف الأكبر من طول الكلمة.لا يُرجع ذلك شيئًا، وعندما تحاول تحديد ASC(<لا شئ>) يحدث خطأ.ستحدث أخطاء أخرى في روتين الاستبدال أيضًا عند تغيير طول السلسلة أثناء تشغيل التعليمات البرمجية

لتعديل الروتين لاستبدال حرف بلا شيء، أود أن أقترح ما يلي:

في أقوال القضية:

Case 34
        S = .Replace(S, I, 1, Chr(1))

وفي بيان التكليف:

ReplaceAccentedCharacters = Replace(S, Chr(1), "")

لاحظ أن VBA Replace يختلف عن Worksheetfunction Replace

نصائح أخرى

جرب هذا:

Function blah(S As String) As String
    Dim arr, i

    'array of [replace, with], [replace, with], etc
    arr = Array(Chr(32), "-", Chr(94), "/", Chr(34), "")

    For i = LBound(arr) To UBound(arr) Step 2
        S = Replace(S, arr(i), arr(i + 1))
    Next i

    blah = S
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top