The first thing most people do when they need to translate text in Excel is copy-paste into Google Translate, then paste back—row by row. That’s not just slow. It breaks formulas, scrambles formatting, and loses cell references like A2 or Sheet2!C5:C20. Worse: you’ll overwrite adjacent data if you misalign the paste. (Trust me, I learned this the hard way after translating 437 product descriptions for a Dubai client.)
The Problem
You’ve got a list of customer feedback in Spanish, Japanese, and Arabic—and your sales team only reads English. You try =GOOGLETRANSLATE(A2,"auto","en") in Excel Online? It fails. You try Add-Ins? Most are paywalled, outdated, or inject malware. You’re stuck with manual work—or worse, inaccurate machine translations that misrepresent tone or intent.
Here’s what your raw data actually looks like in Sheet1:
| A1: ID | B1: Original Text | C1: Language Detected | D1: Status |
|---|---|---|---|
| 101 | El producto llegó dañado. No lo recomiendo. | es | Pending |
| 102 | 商品の品質が非常に悪いです。返金を要求します。 | ja | Pending |
| 103 | المنتج غير مطابق للوصف. أريد استرداد المبلغ. | ar | Pending |
| 104 | Je suis très déçu par le service client. | fr | Pending |
| 105 | Dieser Artikel ist nicht das, was ich bestellt habe. | de | Pending |
| 106 | O produto veio com defeito e sem nota fiscal. | pt | Pending |
The Solution
Yes—Excel can automatically translate languages. But only via Power Query + Microsoft Translator API. No macros. No third-party add-ins. And no credit card required for up to 2 million characters/month.
- Get a free Azure Translator key: Go to azure.microsoft.com/try/cognitive-services, sign in with your Microsoft account, select "Translator", and click "Get Started for Free". Copy your
KEY 1andREGION(e.g.,eastus). Save them in Notepad—we’ll use them in step 3. - Load data into Power Query: Select your table (
A1:D106), go to Data → From Table/Range (Alt+A, T). Make sure "My table has headers" is checked. - Add custom translation column: In Power Query Editor, go to Transform → Run R Script → Advanced Editor. Paste this (replace
YOUR_KEYandYOUR_REGION):= Json.FromValue(Web.Contents("https://YOUR_REGION.api.cognitive.microsoft.com/translator/text/v3.0/translate?api-version=3.0&to=en", [Headers=["Ocp-Apim-Subscription-Key"="YOUR_KEY", "Content-Type"="application/json"], Content=Json.FromValue({[Text=[B2], To="en"]})]))
Wait—don’t run it yet. That’s fragile. Instead: go to Home → Advanced Editor, and replace the entire script with this robust version (it handles empty cells and errors):
let
Source = #"Changed Type",
AddTranslation = Table.AddColumn(Source, "English Translation", each
let
text = [B2],
key = "YOUR_KEY",
region = "YOUR_REGION",
url = "https://" & region & ".api.cognitive.microsoft.com/translator/text/v3.0/translate?api-version=3.0&to=en",
body = Json.FromValue({[Text=text, To="en"]}),
response = try Json.FromValue(Web.Contents(url, [Headers=["Ocp-Apim-Subscription-Key"=key, "Content-Type"="application/json"], Content=body])) otherwise null,
result = if response <> null and List.Count(response) > 0 and Record.HasFields(response{0}, {"translations"}) then response{0}[translations]{0}[text] else "[ERROR]"
in result)
in
AddTranslation
Replace YOUR_KEY and YOUR_REGION with your values. Press Done. Wait 1–3 seconds per row (depends on internet speed).
Here’s the clean output you’ll get in Sheet2:
| ID | Original Text | Language Detected | English Translation |
|---|---|---|---|
| 101 | El producto llegó dañado. No lo recomiendo. | es | The product arrived damaged. I do not recommend it. |
| 102 | 商品の品質が非常に悪いです。返金を要求します。 | ja | The quality of the product is very poor. I request a refund. |
| 103 | المنتج غير مطابق للوصف. أريد استرداد المبلغ. | ar | The product does not match the description. I want a refund. |
| 104 | Je suis très déçu par le service client. | fr | I am very disappointed with customer service. |
| 105 | Dieser Artikel ist nicht das, was ich bestellt habe. | de | This item is not what I ordered. |
| 106 | O produto veio com defeito e sem nota fiscal. | pt | The product arrived defective and without an invoice. |
Going Further
You can translate into multiple languages at once. Just change the &to=en part in the URL to &to=en&to=fr&to=de. Power Query will return a list—expand it with Transform → Expand Column → Expand to New Rows.
Need to detect language first? Use https://YOUR_REGION.api.cognitive.microsoft.com/translator/text/v3.0/detect instead—and feed the result into the translator step. We did that for a client with mixed-language support tickets from Istanbul, Mumbai, and São Paulo.
Pro tip: If your dataset has 10,000+ rows, break it into chunks of 1,000. Azure throttles requests over 10/sec. Use Table.Split in Power Query to auto-split, process, then recombine.
And yes—you can trigger this from a button. Insert a shape (Insert → Shapes → Rectangle), right-click → Assign Macro, then paste a VBA wrapper that refreshes the query. But honestly? Just press Alt+F5 to refresh all queries—it’s faster.
When NOT to Use This
- Legal contracts or medical consent forms: Azure Translator isn’t certified for HIPAA or GDPR-regulated documents. Use human translators for anything binding.
- Names, brands, or product codes: It will “translate”
iPhoneasآيفون(Arabic script)—but you probably want it left as-is. Add a conditional step before translation:if Text.Contains([B2], "iPhone") or Text.Length([B2]) < 4 then [B2] else ... - Rows with special characters in formulas: If
B2contains=CONCATENATE(C2," - ",D2), the API sees the formula text—not the result. Pre-calculate withValueor paste as values first. - Offline work: This requires internet. No workaround. Keep a local glossary sheet (
Sheet3!A1:B500) for common phrases and useVLOOKUPas fallback.
Keyboard Shortcuts
| Action | Shortcut | Notes |
|---|---|---|
| Open Power Query Editor | Alt+A, T | From any selected table |
| Refresh all queries | Alt+F5 | Saves 3 clicks vs. Data → Refresh All |
| Open Advanced Editor | Ctrl+Shift+E | In Power Query Editor only |
| Toggle formula bar | Ctrl+` | Useful when checking translated results against source |
| Paste values only | Alt+E, S, V | Critical before sending translated data externally |