vba

2013-09-30 7 views
6

का उपयोग करके पाठ का अनुवाद शायद दुर्लभ याचिका हो सकती है, लेकिन यहां समस्या है।vba

मैं अपने संगठन के लिए किसी तीसरे पक्ष के एक्सेल का अनुकूलन कर रहा हूं। एक्सेल अंग्रेजी में विकसित किया गया है और मेरे संगठन के लोग सिर्फ स्पेनिश बोलते हैं। मैं मूल वर्कशीट के समान कोड का उपयोग करना चाहता हूं, मैं इसे छूना नहीं चाहता (अलथॉट मैं इसे कर सकता हूं), इसलिए मैं एक फ़ंक्शन का उपयोग करना चाहता हूं जो हर बार एक संदेश बॉक्स (अंग्रेजी में पाठ के साथ) , मैं संदेश संदेश का अनुवाद करता हूं लेकिन मूल स्क्रिप्ट को छूए बिना। मैं एक मुखौटा की तलाश में हूं जिसे हर बार कहा जा सकता है कि मूल कोड में एक संदेश बॉक्स लगाया जाता है।

मैं मूल कोड को छूना पसंद नहीं करता क्योंकि तीसरे पक्ष के डेवलपर इसे अक्सर बदल सकते हैं, और हर बार कोड बदलने के लिए यह बहुत परेशान हो सकता है कि वे कुछ भी बदलाव करते हैं।

क्या यह संभव है?

+6

हाँ, यह संभव है। –

उत्तर

15

यहां आप जाते हैं।

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

End Sub 


Function transalte_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 
+3

+1 धीमी गति से लेकिन प्रभावी :) –

+0

इस उत्तर अनुवाद के लिए बहुत उपयोगी के लिए धन्यवाद। आमतौर पर मैं एक ऐसा फ़ंक्शन रखना चाहता हूं जो हर बार एक संदेश बॉक्स कहा जाता है जिसे यह अनुवाद फ़ंक्शन बुलाया जाता है। – MariPlaza

+0

@ user1827572 msgbox डेमो उद्देश्य के लिए था। आप उस मान को स्ट्रिंग में ले सकते हैं और इसका उपयोग कर सकते हैं। – Santosh

0

अद्यतन: बेहतर For Each v In arr_Response -iteration, विशेष charactors की इजाजत दी। अनुवाद संसाधित होने पर माउस-कर्सर परिवर्तन जोड़ा गया। अनुवादित output_string को बेहतर बनाने के तरीके पर एक उदाहरण जोड़ा गया।

मुफ्त अनुवाद एपीआई के बाहर बहुत सारे हैं, लेकिन वास्तव में कोई भी गुगल अनुवाद सेवा, जीटीएस (मेरी राय में) को हरा नहीं देता है। मुक्त जीटीएस-उपयोग पर गूगल्स के प्रतिबंधों के परिणामस्वरूप, सर्वोत्तम वीबीए-दृष्टिकोण को आईई.विगेशन में संकुचित किया गया है - क्योंकि संतोष के उत्तर पर जोर दिया जाता है।

इस दृष्टिकोण का उपयोग करके, कुछ समस्याएं उत्पन्न होती हैं। आईई-इंस्टेंस नहीं जानते कि पृष्ठ पूरी तरह से लोड होने पर, और IE.ReadyState वास्तव में भरोसेमंद नहीं है। इसलिए कोडर को Application.Wait फ़ंक्शन का उपयोग करके "देरी" जोड़नी पड़ती है। इस फ़ंक्शन का उपयोग करते समय, आप अनुमान लगा रहे हैं कि पृष्ठ पूरी तरह से लोड होने से पहले कितना समय लगेगा। ऐसी परिस्थितियों में जहां इंटरनेट वास्तव में धीमा है, यह कठोर समय, पर्याप्त नहीं हो सकता है। निम्न कोड सुधारित रीडस्टेट के साथ इसे ठीक करता है।

ऐसी परिस्थितियों में जहां शीट के अलग-अलग कॉलम होते हैं, और आप प्रत्येक सेल में अलग-अलग अनुवाद जोड़ना चाहते हैं, मुझे सबसे अच्छा तरीका मिल जाता है जहां अनुवाद-स्ट्रिंग को क्लिपबोर्ड पर असाइन किया जाता है, बल्कि फिर से वीबीए-फ़ंक्शन को कॉल करना सूत्र। इस प्रकार आप आसानी से अनुवाद पेस्ट कर सकते हैं, और इसे एक स्ट्रिंग के रूप में संशोधित कर सकते हैं।

Columns in Excel

उपयोग कैसे करें:

  1. एक कस्टम VBA-मॉड्यूल
  2. बदलें में प्रक्रियाओं डालें 4 कॉन्स्ट की अपनी इच्छा को (देखें ऊपरी TranslationText)
  3. एक निरुपित TranslationText -प्रोसेचर
आग करने के लिए शॉर्टकी

Shortkey Excel

  1. सेल आप अनुवाद करना चाहते को सक्रिय करें। भाषा-टैग के साथ समाप्त होने वाली पहली पंक्ति की आवश्यकता होती है।आदि "_da", "_en", "_de"। यदि आप किसी अन्य कार्यक्षमता चाहते हैं, आप बदल ws_ActiveWS.Cells(r_ActiveCell.Row, r_InputRange.Column)

enter image description here

  1. प्रेस 4. से shortkey (आदि Ctrl + शर्ट + S)। अपनी प्रोसेसबार (एक्सेल के नीचे) में प्रोसेस देखें। पेस्ट करें (Ctrl + V) जब अनुवाद किया प्रदर्शित होता है:

enter image description here Translation done

Option Explicit 

    'Description: Translates content, and put the translation into ClipBoard 
    'Required References: MIS (Microsoft Internet Control) 
    Sub TranslateText() 

    'Change Const's to your desire 
    Const INPUT_RANGE As String = "table_products[productname_da]" 
    Const INPUT_LANG As String = "da" 
    Const PROCESSBAR_INIT_TEXT As String = "Processing translation. Please wait... " 
    Const PROCESSBAR_DONE_TEXT As String = "Translation done. " 

    Dim ws_ActiveWS As Worksheet 
    Dim r_ActiveCell As Range, r_InputRange As Range 
    Dim s_InputStr As String, s_InputLang As String, s_OutputLang As String, arr_Response() As String, s_Translation As String 
    Dim o_IE As Object, o_MSForms_DataObject As Object 
    Dim i As Long 
    Dim v As Variant 

    Set o_MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 
    Set ws_ActiveWS = ThisWorkbook.ActiveSheet 
    Set r_ActiveCell = ActiveCell 
    Set o_IE = CreateObject("InternetExplorer.Application") 
    Set r_InputRange = ws_ActiveWS.Range(INPUT_RANGE) 

    'Update statusbar ("Processing translation"), and change cursor 
    Application.Statusbar = PROCESSBAR_INIT_TEXT 
    Application.Cursor = xlWait 

    'Declare inputstring (The string you want to translate from) 
    s_InputStr = ws_ActiveWS.Cells(r_ActiveCell.Row, r_InputRange.Column) 

    'Find the output-language 
    s_OutputLang = Right(ws_ActiveWS.Cells(1, r_ActiveCell.Column).Value, 2) 

    'Navigate to translate.google.com 
    With o_IE 

     .Visible = False 'Run IE in background 
     .Navigate "http://translate.google.com/#" & INPUT_LANG & "/" _ 
      & s_OutputLang & "/" & s_InputStr 

     'Call improved IE.ReadyState 
     Do 
      ImprovedReadyState 
     Loop Until Not .Busy 

     'Split the responseText from Google 
     arr_Response = Split(.Document.getElementById("result_box").innerHTML, "<span class") 

     'Remove html from response, and construct full-translation-string 
     For Each v In arr_Response 
      s_Translation = s_Translation & Replace(v, "<span>", "") 
      s_Translation = Replace(s_Translation, "</span>", "") 
      s_Translation = Replace(s_Translation, """", "") 
      s_Translation = Replace(s_Translation, "=hps>", "") 
      s_Translation = Replace(s_Translation, "=atn>", "") 
      s_Translation = Replace(s_Translation, "=hps atn>", "") 

      'Improve translation. 
      'This could etc. be moved to seperate sheets (containing every language), and make the lookup in a dynamic table/sheet. Futurely it'd be possible to hook on the changeevent, and automatically improve the translation-algoritmen. 
      'If Google can't translate the etc. the word "Lys", you can extend the translation, with an auto correction. This example shows to autocorrect the word "Lys" -> "ljus". 
      If (s_OutputLang = "sv") Then 
       s_Translation = Replace(s_Translation, "lys", "ljus") 
      End if 
     Next v 

     'Put Translation into Clipboard 
     o_MSForms_DataObject.SetText s_Translation 
     o_MSForms_DataObject.PutInClipboard 

     If (s_Translation <> vbNullString) Then 
      'Put Translation into Clipboard 
      o_MSForms_DataObject.SetText s_Translation 
      o_MSForms_DataObject.PutInClipboard 

      'Update statusbar ("Translation done"). If the input_string is above 70 chars (which is roughly the limitation in processbar), then cut the string, and extend with "...". 
      Application.Statusbar = PROCESSBAR_DONE_TEXT & """" & IIf(Len(s_InputStr) < 70, s_InputStr, Mid(s_InputStr, 1, 70) & "...") & """" 
     Else 
      'Update statusbar ("Error") 
      Application.Statusbar = PROCESSBAR_ERROR_TEXT 
     End If 

     'Cleanup 
     .Quit 

     'Change cursor back to default 
     Application.Cursor = xlDefault 

     Set o_MSForms_DataObject = Nothing 
     Set ws_ActiveWS = Nothing 
     Set r_ActiveCell = Nothing 
     Set o_IE = Nothing 

    End With 

End Sub 

Sub ImprovedReadyState() 

    Dim si_PauseTime As Single: si_PauseTime = 1 'Set duration 
    Dim si_Start As Single: si_Start = Timer 'Set start-time 
    Dim si_Finish As Single 'Set end-time 
    Dim si_TotalTime As Single 'Calculate total time. 

    Do While Timer < (si_Start + si_PauseTime) 
     DoEvents 
    Loop 

    si_Finish = Timer 

    si_TotalTime = (si_Finish - si_Start) 

End Sub 
0

जवाब Unicco द्वारा पोस्ट की गई बहुत अच्छा है!

मैं मेज सामान हटा दिया है और यह एक एकल कक्ष बंद काम किया है, लेकिन परिणाम एक ही है।

कुछ पाठ जो मैं अनुवाद करता हूं (विनिर्माण संदर्भ में ऑपरेशन निर्देश) Google कभी-कभी वापसी 0 स्ट्रिंग स्ट्रिंग में बकवास जोड़ता है, कभी-कभी < "अवधि"> संरचनाओं का उपयोग करके प्रतिक्रिया को दोगुना कर देता है।

मैं सही होने के बाद 'अगला वी' कोड में निम्नलिखित पंक्ति कहा:

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 

पीछे मुड़कर देखें तो मुझे लगता है मैं इसे और अधिक कुशलतापूर्वक कर सकता था, लेकिन, यह काम करता है और मैं आगे बढ़ रहा हूं!

4

यह मैं इसे कैसे करना होगा है। यह वैकल्पिक गणना वस्तुओं के साथ कार्य करता है जो Google अनुवाद द्वारा उपयोग किए जाने वाले भाषा कोड को इंगित करता है। सादगी के लिए मैंने केवल कुछ भाषा कोड शामिल किए। इसके अलावा, इस नमूने में मेरे द्वारा चुने गए माइक्रोसॉफ्ट इंटरनेट नियंत्रण तो बजाय एक वस्तु बनाने के संदर्भ, वहाँ एक InternetExplorer इस्तेमाल किया वस्तु है। और अंत में, आउटपुट को साफ करने से छुटकारा पाने के लिए, मैंने अभी .inner HTML के बजाय .innerText का उपयोग किया। ध्यान रखें, वहाँ लगभग 3000 की वर्ण सीमा तय है या तो गूगल अनुवाद के साथ, और यह भी, आप 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 
1

आधुनिक समाधान गूगल अनुवाद एपीआई का उपयोग करके Google सक्षम करने के लिए में से एक अनुवाद API, सबसे पहले आपको प्रोजेक्ट और क्रेडेंशियल्स बनाना चाहिए। यदि आपको 403 (दैनिक सीमा) प्राप्त होती है, तो आपको अपने Google क्लाउड खाते में भुगतान विधि जोड़नी होगी, फिर आपको तुरंत परिणाम मिलेंगे।

Private Function GoogleTranslateJ(ByVal text, ByVal resLang, ByVal srcLang) As String 
Dim jsonProvider As Object 

Dim jsonResult As Object 
Dim jsonResultText As String 

Dim googleApiUrl As String 
Dim googleApiKey As String 

Dim resultText As String 

Set jsonProvider = CreateObject("MSXML2.ServerXMLHTTP") 

text = Replace(text, " ", "%20") 
googleApiKey = "ijHF28h283fjijefiwjeofij90f2h923" 'YOUR GOOGLE API KEY 

googleApiUrl = "https://translation.googleapis.com/language/translate/v2?key=" & googleApiKey & "&source=" & srcLang & "&target=" & resLang & "&q=" & text 

jsonProvider.Open "POST", googleApiUrl, False 
jsonProvider.setRequestHeader "Content-type", "application/text" 
jsonProvider.send ("") 
jsonResultText = jsonProvider.responseText 

Set jsonResult = JsonConverter.ParseJson(jsonResultText) 
Set jsonResult = jsonResult("data") 
Set jsonResult = jsonResult("translations") 
Set jsonResult = jsonResult(1) 

resultText = jsonResult("translatedText") 

GoogleTranslateJ = resultText 
End Function 

 संबंधित मुद्दे