ایجاد سوال
dark_mode
0 دوستدار 0 امتیاز منفی
23 visibility
موضوع: آفیس توسط:

گیب قبلا از ماکروها برای تبدیل اعداد (مانند 355) به کلمات (سیصد و پنجاه و پنج) استفاده کرده است. اگر یک ماکرو داشته باشد که بتواند برعکس عمل کند و کلماتی را که انتخاب می کند دوباره به اعداد تبدیل کند، بسیار مفید خواهد بود. با این حال، او مطمئن نیست که چگونه چنین ماکرو ایجاد کند.

یک ماکرو برای مدیریت این نوع تبدیل بیشتر از آنچه که انتظار می رود درگیر است، اما می توان با محدود کردن ماکرو به گونه ای که فقط اعداد کامل را کنترل کند، کمی ساده تر می شود. دو ماکرو زیر (یکی زیربرنامه و دیگری تابعی است که از زیربرنامه فراخوانی می شود) هر متن انتخاب شده را تا 999,999,999 تبدیل می کند.

Sub TextToNumbers()
    Dim NText() As Variant
    Dim NB() As Variant
    Dim aRange As Range
    Dim k As Long
    Dim L As Long
    Dim LL As Long
    Dim LLL As Long
    Dim s As String
    Dim j As Long
    Dim m As Long
    Dim mm As Long
    Dim mmm As Long
    Dim gA() As Long
    Dim gB() As Long
    Dim wCount As Long
    Dim ThousandsComma As Boolean

    ThousandsComma = True  " --- gives thousands commas ----

    NText = Array("AND", "-", "ONE", "TWO", "THREE", "FOUR", "FIVE", _
      "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", _
      "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN", _
      "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", _
      "NINETY", "HUNDRED", "THOUSAND", "MILLION", "$%$%")

    NB = Array(0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, _
      11, 12, 13, 14, 15, 16, 17, 18, 19, _
      20, 30, 40, 50, 60, 70, 80, 90, _
      100, 1000, 1000000, 0)

    " ------ Check selected text for validity ---------------
    Set aRange = Selection.Range
    If Right(aRange.Text, 1) = Chr(13) Then
        aRange.MoveEnd Unit:=wdCharacter, Count:=-1
    End If
    s = aRange.Text
    If Right(s, 1) = "." Then aRange.MoveEnd Unit:=wdCharacter, Count:=-1
    If aRange.Paragraphs.Count > 1 Then
        MsgBox "Selection cannot span paragraphs"
        Exit Sub
    End If
    If Trim(aRange.Text) = "" Then
        MsgBox "Selection does not include a word"
        Exit Sub
    End If
    " ------------------------------

    wCount = aRange.Words.Count
    ReDim gA(wCount + 1)
    ReDim gB(wCount + 1)

    For k = 1 To wCount   " aRange.Words.Count
        s = UCase(Trim(aRange.Words(k)))
        If s = Chr(13) Or s = "" Then
            gB(k) = 1
            gA(k) = 0
            GoTo FF2
        End If
        For m = 0 To UBound(NText) - 1
            If s = NText(m) Then GoTo FF1
        Next m
        MsgBox "The word " & """" & aRange.Words(k) & """" & " is non numeric"
        Exit Sub
FF1:
        gA(k) = NB(m)
        If m > UBound(NText) - 5 Then
            gB(k) = 2
        Else
            gB(k) = 1
        End If
FF2:
    Next k
   " Arrays gA & gB hold word values and the operator on that word

    wCount = removeZeros(gA(), gB(), wCount)

    " ----- combine multiple numbers and remove zero entries -----
    For k = 1 To wCount - 1
        If gB(k) = 1 And gB(k + 1) = 1 Then
            gA(k + 1) = gA(k + 1) + gA(k)
            gA(k) = 0
        End If
    Next k
    wCount = removeZeros(gA(), gB(), wCount)

    m = 1
    Do
        m = m + 1
    Loop Until m > wCount Or gA(m) = 1000000
    If m <= wCount Then " 1000000 is at gA(m)
        " check that there are no 1000s
        j = 1
        Do
            j = j + 1
        Loop Until j >= m Or gA(j) = 1000
        If j < m Then
            MsgBox "Cannot process thousands of millions"
            Exit Sub
        End If

        j = 1
        Do
            j = j + 1
        Loop Until j >= m Or gA(j) = 100
        If j < m Then
            gA(j) = gA(j) * gA(j - 1)
            gA(j - 1) = 0
            gB(j) = 1
        End If
        LL = 0
        For j = 1 To m - 1
            L = L + gA(j)
            gA(j) = 0
            gB(j) = 0
        Next j
        gA(m) = L * gA(m)
        gB(m) = 1
    Else
        m = 0
    End If " 1000000 processed

    mm = j + 1
    If mm  wCount Or gA(mm) = 1000
    End If
    If mm <= wCount Then " 1000 is at ga(mm)
        j = m + 1
        Do
            j = j + 1
        Loop Until j >= mm Or gA(j) = 100
        If j < mm Then " have 100 preceeding 1000
            gA(j) = gA(j) * gA(j - 1)
            gA(j - 1) = 0
            gB(j) = 1
        End If
        LL = 0
        For j = m + 1 To mm - 1
            LL = LL + gA(j)
            gA(j) = 0
            gB(j) = 1
        Next j
        gA(mm) = LL * gA(mm)
        gB(mm) = 1
    Else
        mm = m
    End If " 1000 is at mmth entry

    mmm = mm + 1
    If mmm  wCount Or gA(mmm) = 100
    End If
    If mmm 
Function removeZeros(gA() As Long, gB() As Long, ByVal wCount As Long) As Long
    Dim q As Long
    Dim z As Long

    For q = wCount To 1 Step -1
        If gA(q) = 0 Then
            z = q
            Do While z < wCount
                gA(z) = gA(z + 1)
                gB(z) = gB(z + 1)
                z = z + 1
            Loop
            wCount = wCount - 1
        End If
    Next q
    removeZeros = wCount
End Function

برای استفاده از ماکرو، کلماتی را که می خواهید تبدیل کنید انتخاب کنید و سپس TextToNumbers را اجرا کنید. کلان مخرب است. کلمات واقعی را به معادل عددی آنها تبدیل می کند. (اگر می خواهید کلمات اصلی را حفظ کنید، قبل از اجرای ماکرو آنها را کپی کنید.)

اگر خواستی، با این لینک از ما حمایت کن

پاسخ شما

looks_5نام شما برای نمایش - اختیاری
حریم شخصی : آدرس ایمیل شما محفوظ میماند و برای استفاده های تجاری و تبلیغاتی به کار نمی رود
عدد چهار رقمی در تصویر را وارد کنید

برای جلوگیری از این تایید در آینده, لطفا وارد شده یا ثبت نام کنید.
اگر حساب گوگل دارید به راحتی وارید شوید

0 پاسخ وجود دارد

سوالات مشابه

برای دسترسی راحت به مطالب سایت ، اپلیکیشن سایت را نصب کنید
و لطفا بعد از نصب امتیاز دهید. با تشکر از حمایت شما
0 دوستدار 0 امتیاز منفی
0 پاسخ 36 visibility
ارسال شده در 26 تیر 1402 موضوع: آفیس توسط: Admin
0 دوستدار 0 امتیاز منفی
0 پاسخ 27 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 38 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 31 visibility
ارسال شده در 27 تیر 1402 موضوع: آفیس توسط: Admin
0 دوستدار 0 امتیاز منفی
0 پاسخ 32 visibility

24.3k سوال

9.6k پاسخ

614 دیدگاه

11.2k کاربر

321 نفر آنلاین
0 عضو و 321 مهمان در سایت حاضرند
بازدید امروز: 8969
بازدید دیروز: 25180
بازدید کل: 20346320
...