13

おそらく珍しい嘆願書かもしれませんが、ここに問題があります。

サードパーティのエクセルを自分の組織に適応させています。Excel は英語で開発されており、私の組織の人々はスペイン語しか話せません。元のワークシートとまったく同じコードを使用したいのですが、触れたくないので(できますが)、メッセージボックスが表示されるたびに(英語のテキストで)関数を使用したいです、msgbox メッセージを翻訳しますが、元のスクリプトには触れません。元のコードで msgbox が呼び出されるたびに呼び出すことができるマスクを探しています。

サードパーティの開発者は頻繁にコードを変更する可能性があり、小さな変更を加えるたびにコードを変更するのは非常に煩わしい可能性があるため、元のコードには触れないことをお勧めします。

それは可能ですか?

4

6 に答える 6

21

どうぞ。

Sub test()
    Dim s As String
    s = "hello world"
    MsgBox translate_using_vba(s)

End Sub

Function translate_using_vba(str) As String
' Tools Refrence Select Microsoft internet Control


    Dim IE As Object, i As Long
    Dim inputstring As String, outputstring As String, text_to_convert As String, result_data As String, CLEAN_DATA

    Set IE = CreateObject("InternetExplorer.application")
    '   TO CHOOSE INPUT LANGUAGE

    inputstring = "auto"

    '   TO CHOOSE OUTPUT LANGUAGE

    outputstring = "es"

    text_to_convert = str

    'open website

    IE.Visible = False
    IE.navigate "http://translate.google.com/#" & inputstring & "/" & outputstring & "/" & text_to_convert

    Do Until IE.ReadyState = 4
        DoEvents
    Loop

    Application.Wait (Now + TimeValue("0:00:5"))

    Do Until IE.ReadyState = 4
        DoEvents
    Loop

    CLEAN_DATA = Split(Application.WorksheetFunction.Substitute(IE.Document.getElementById("result_box").innerHTML, "</SPAN>", ""), "<")

    For j = LBound(CLEAN_DATA) To UBound(CLEAN_DATA)
        result_data = result_data & Right(CLEAN_DATA(j), Len(CLEAN_DATA(j)) - InStr(CLEAN_DATA(j), ">"))
    Next


    IE.Quit
    transalte_using_vba = result_data


End Function
于 2013-09-30T15:45:04.490 に答える
5

これは私がそれを行う方法です。これは、Google 翻訳で使用される言語コードを指すオプションの列挙オブジェクトを持つ関数です。簡単にするために、いくつかの言語コードのみを含めました。また、このサンプルでは、​​Microsoft Internet Controls リファレンスを選択したので、オブジェクトを作成する代わりに、InternetExplorer オブジェクトが使用されています。最後に、出力をクリーンアップする手間を省くために、.innerHTML ではなく .innerText を使用しました。覚えておいてください、Google 翻訳には約 3000 文字の制限があります。また、特にこれを複数回使用する場合は、IE=nothing を設定する必要があります。そうしないと、複数の IE プロセスが作成され、最終的には機能しなくなります。もう。

設定...

Option Explicit

Const langCode = ("auto,en,fr,es")

Public Enum LanguageCode
    InputAuto = 0
    InputEnglish = 1
    InputFrench = 2
    InputSpanish = 3
End Enum

Public Enum LanguageCode2
    ReturnEnglish = 1
    ReturnFrench = 2
    ReturnSpanish = 3
End Enum

テスト...

Sub Test()

Dim msg As String

msg = "Hello World!"

MsgBox AutoTranslate(msg, InputEnglish, ReturnSpanish)

End Sub

関数...

Public Function AutoTranslate(ByVal Text As String, Optional LanguageFrom As LanguageCode, Optional LanguageTo As LanguageCode2) As String

Dim langFrom As String, langTo As String, IE As InternetExplorer, URL As String, myArray

If IsMissing(LanguageFrom) Then
    LanguageFrom = InputAuto
End If
If IsMissing(LanguageTo) Then
    LanguageTo = ReturnEnglish
End If

myArray = Split(langCode, ",")
langFrom = myArray(LanguageFrom)
langTo = myArray(LanguageTo)

URL = "https://translate.google.com/#" & langFrom & "/" & langTo & "/" & Text

Set IE = New InternetExplorer

IE.Visible = False
IE.Navigate URL

    Do Until IE.ReadyState = 4
        DoEvents
    Loop

    Application.Wait (Now + TimeValue("0:00:5"))

    Do Until IE.ReadyState = 4
        DoEvents
    Loop

    AutoTranslate = IE.Document.getElementByID("result_box").innerText

    IE.Quit

    Set IE = Nothing


End Function
于 2015-11-26T15:29:04.940 に答える
0

Uniccoが投稿した回答は素晴らしいです!

テーブルのものを削除して、単一のセルで機能させましたが、結果は同じです。

私が翻訳した一部のテキスト (製造コンテキストでの操作手順) で、Google は時々返される文字列にがらくたを追加し、追加の <"span"> 構造を使用して、応答を倍増させることさえあります。

「Next v」の直後に次の行をコードに追加しました。

s_Translation = RemoveSpan(s_Translation & "")

そして、この関数を作成しました(同じモジュールに追加します):

Private Function RemoveSpan(Optional InputString As String = "") As String

Dim sVal As String
Dim iStart As Integer
Dim iEnd As Integer
Dim iC As Integer
Dim iL As Integer

If InputString = "" Then
    RemoveSpan = ""
    Exit Function
End If

sVal = InputString

' Look for a "<span"
iStart = InStr(1, sVal, "<span")

Do While iStart > 0 ' there is a "<span"
    iL = Len(sVal)
    For iC = iStart + 5 To iL
        If Mid(sVal, iC, 1) = ">" Then Exit For ' look for the first ">" following the "<span"
    Next
    If iC < iL Then ' then we found a "<"
        If iStart > 1 Then ' the "<span" was not in the beginning of the string
            sVal = Left(sVal, iStart - 1) & Right(sVal, iL - iC) ' grab to the left of the "<span" and to the right of the ">"
        Else ' the "<span" was at the beginning
            sVal = Right(sVal, iL - iC) ' grap to the right of the ">"
        End If
    End If
    iStart = InStr(1, sVal, "<span") ' look for another "<span"
Loop
    RemoveSpan = sVal
End Function

振り返ってみると、これをもっと効率的に行うことができたはずですが、うまくいき、先に進んでいます!

于 2015-08-21T12:58:17.867 に答える