The CONCAT function in Excel does one job and does it cleanly. It joins text. You hand it a list of strings, cell references, or whole ranges, and it stitches them together end-to-end into a single string. Three arguments or three hundred โ same syntax, same behavior. =CONCAT(A1, " ", B1) turns "John" and "Smith" into "John Smith" in about as many keystrokes as it takes to type the function name.
Here's what makes CONCAT different from the older CONCATENATE function that you've probably seen in tutorials from 2015. CONCAT accepts ranges. You can hand it =CONCAT(A1:A10) and it'll glue every value in that 10-cell range into one long string. CONCATENATE refused โ you had to comma-separate every single cell. That's the whole reason Microsoft added CONCAT in Excel 2019 and rolled it into 365. The old function still works for backward compatibility, but new spreadsheets should use the newer one. Less typing, fewer errors, easier to maintain when ranges grow.
This guide walks the function from the syntax up to the edge cases. Real examples for combining names, building order numbers, joining a range, adding spaces and separators, concatenating with formatted dates and numbers. Plus the three competing approaches โ CONCAT, TEXTJOIN, and the ampersand operator โ and when each one wins.
You'll also see common errors (the dreaded #VALUE! with arrays, missing separator gotchas), Power Query's Merge Columns alternative, TEXTSPLIT for going the other way, and Mac Excel parity notes. Worth knowing the full toolkit because Excel handles text joining in at least four different ways, and picking the wrong one slows you down.
CONCAT is short for concatenate, which is Latin-derived jargon for "chain together." In plain English: it sticks strings together. "Hello" + " " + "World" becomes "Hello World". That's all it does. No formatting tricks, no calculations, no delimiters added automatically โ you supply every character that ends up in the result, including any spaces or commas between values.
This means CONCAT is a building block, not a finished tool. You combine it with other functions to do real work. Pair it with TEXT() to format dates and numbers before they get joined. Pair it with IF() to conditionally include some pieces and skip others. Pair it with RIGHT(), LEFT(), and MID() to extract substrings before joining. Worth thinking of CONCAT less as a feature and more as glue between other features.
=CONCAT(text1, [text2], ...). Each argument can be a literal string, a cell reference, or a range. Example: =CONCAT(A1, " ", B1) joins A1 and B1 with a space. =CONCAT(A1:A5) joins all five cells with no separator.=TEXTJOIN(", ", TRUE, A1:A5) adds a comma-space between each value and skips blank cells.The most common pattern. You list each piece, with a literal string in between for the separator. =CONCAT(A1, " ", B1) joins A1 and B1 with a space. =CONCAT(A1, ", ", B1, " - ", C1) joins three cells with mixed separators. Every separator has to be typed in explicitly โ CONCAT doesn't guess.
This is the right pattern when each cell needs different formatting around it. First name, space, last name. Order number, dash, customer name. Date, colon, value. The control is total โ but the typing scales linearly with the number of cells.
If you're combining first and last names from two columns into one, that's the textbook CONCAT use case. The opposite operation โ splitting a full name into separate first and last name columns โ uses different functions entirely, covered in separate first and last name in Excel.
CONCAT's killer feature compared to CONCATENATE โ you can hand it a range. =CONCAT(A1:A10) joins every cell in A1 through A10 into one long string. No commas, no spaces between values. They just smash together.
This is brilliant for combining a column of letters into a word, joining product codes, or building file names from row data. The catch: no separator gets added. "Apple", "Banana", "Cherry" in three cells becomes "AppleBananaCherry" โ not "Apple, Banana, Cherry". If you want a delimiter between each, use TEXTJOIN instead.
Ranges can be vertical (A1:A10), horizontal (A1:E1), or rectangular (A1:C5 โ CONCAT reads left-to-right, top-to-bottom). Whole-column references work too: =CONCAT(A:A) joins every populated cell in column A, but be careful โ that scans up to 1,048,576 cells and is slow on big sheets.
You can blend all three argument types in one call. =CONCAT("Order #", B1, " - ", CONCAT(C1:C5)) mixes a literal prefix, a single cell, another literal, and a nested CONCAT of a range. Excel processes left-to-right and outputs the joined result.
Nesting works because CONCAT returns a string, and strings are valid as CONCAT arguments. So you can wrap a range-CONCAT inside an outer CONCAT to add bookends. Useful for building structured output like "[" & CONCAT(A1:A5) & "]" or =CONCAT("Items: ", TEXTJOIN(", ", TRUE, A1:A5), " (total: ", COUNTA(A1:A5), ")").
The mental model: every argument becomes part of the final string. Order matters. Spaces and punctuation only appear if you explicitly type them as literal arguments. There's no "smart" formatting layer in CONCAT โ it's a pure string concatenator.
=CONCAT(A:A) joins every cell in column A into one massive string. Empty cells get skipped silently โ they don't insert blank space, they just don't contribute. Useful for building a single-string export of an entire column.
Performance warning. Whole-column references scan up to 1,048,576 cells. On sheets with 10,000+ rows, CONCAT(A:A) recalculates noticeably slowly. Better to use explicit ranges like CONCAT(A2:A10000) once you know the data extent. Whole-column references are a convenience for small sheets and dashboards that grow over time.
The 32,767-character output cap matters here. If your column has hundreds of long strings, CONCAT may truncate at the limit and you'll get an error. Test on a sample before running on huge data.
=CONCAT(A1, " ", B1) joins A1 ("John") and B1 ("Smith") into "John Smith". Add a middle initial: =CONCAT(A1, " ", LEFT(B1,1), ". ", C1) gives "John A. Smith". The space inside the quotes is critical โ leave it out and you get "JohnSmith".
=CONCAT("Order #", B1, " - ", C1) builds "Order #4521 - Acme Corp" from an order number in B1 and a company name in C1. Add a date: =CONCAT("Order #", B1, " ", TEXT(D1, "yyyy-mm-dd")) โ "Order #4521 2026-05-21".
=CONCAT(A1:A5) where A1-A5 hold "H", "E", "L", "L", "O" returns "HELLO". Range concatenation with no separator. This is the example most beginners try first to confirm CONCAT accepts ranges โ CONCATENATE wouldn't.
=CONCAT("https://practicetestgeeks.com/", A1, "/", B1) builds a full URL from a category in A1 and a slug in B1. Result: "https://practicetestgeeks.com/excel/concat-function-excel". Add error handling with IFERROR if the slug column has blanks.
=CONCAT(A1, IF(B1="", "", " - " & B1)) joins A1 and B1 only when B1 has a value. Skips the separator and B1 entirely when B1 is empty. Cleaner than always-on concatenation that leaves trailing dashes for missing data.
CONCATENATE shipped in every version of Excel from 95 onward. It did the job for two decades. Then in Excel 2019, Microsoft added CONCAT and quietly marked CONCATENATE as deprecated. Old formulas still work โ they don't break โ but new spreadsheets should use CONCAT.
The reason is one feature: ranges. CONCATENATE took a comma-separated list of values. =CONCATENATE(A1, B1, C1, D1, E1) joined five cells. To add five more you typed five more arguments. Joining A1:A50 meant typing 50 arguments by hand. Brutal. CONCAT cut that to =CONCAT(A1:A50) โ one range reference, done.
The second reason was internal cleanup. CONCATENATE's argument handling didn't play well with newer dynamic-array functions like FILTER and UNIQUE. CONCAT was rewritten to integrate cleanly with those โ it spills naturally when arguments are dynamic arrays, and it composes cleanly with the new function family.
For backward compatibility, CONCATENATE still works in every modern Excel. If you inherit a workbook written in 2018 with CONCATENATE everywhere, leave it alone โ there's no benefit to refactoring working formulas. But for anything new, default to CONCAT. The syntax is identical for single-cell arguments. The range support is a free upgrade.
Long before CONCATENATE existed, Excel had the ampersand (&) operator. =A1 & " " & B1 does exactly the same thing as =CONCAT(A1, " ", B1). Three characters shorter, easier to read for short joins, and works in every version of Excel ever shipped. Many veteran users prefer it for two-or-three-cell joins because the prose-like syntax ("this and that and the other") matches how you'd describe the operation out loud.
Where ampersand falls down is ranges. =A1:A10 & "" doesn't join the range โ it spills into a vertical array of the original values. To join a range you have to fall back to CONCAT or TEXTJOIN. So the rule of thumb most experienced users settle on: ampersand for 2-3 cells, CONCAT for ranges, TEXTJOIN for delimited ranges.
TEXTJOIN solves the one thing CONCAT can't. CONCAT joins a range with no separator. TEXTJOIN joins a range and inserts a separator between every item automatically. =TEXTJOIN(", ", TRUE, A1:A5) joins five cells with a comma-space between each, and the TRUE argument tells Excel to skip blank cells (otherwise you get "Apple, , Cherry" with an empty gap).
Three arguments. The first is the delimiter โ any string. The second is ignore_empty โ TRUE or FALSE. The third (and beyond) is the values to join. =TEXTJOIN(" | ", TRUE, A1:A10) joins ten cells with pipe separators. =TEXTJOIN(CHAR(10), TRUE, A1:A10) joins them with line breaks (useful for building multi-line cell content). CHAR(10) is the line-feed character โ combine with cell wrap text formatting to see the breaks.
TEXTJOIN's ignore_empty flag is the killer feature. Real spreadsheets have gaps. Some rows have all five values, some have only three. TEXTJOIN with TRUE handles this gracefully โ empty cells just get skipped, no double-separator artifacts. CONCAT can't do this without an IF wrapper around every argument.
Like CONCAT, TEXTJOIN is Excel 2019+ and 365. It does not exist in 2016 or earlier. If you're stuck on an old version, you're back to ampersand operators and a lot of typing. Worth knowing that Excel cheat sheets often list TEXTJOIN as one of the top three modern functions to memorize, alongside FILTER and XLOOKUP.
The ampersand has been Excel's default string-join operator forever. =A1 & B1 joins A1 and B1. =A1 & " " & B1 adds a space between them. Same result as CONCAT, less typing, more readable for short cases.
It's also more forgiving of mixed types. =A1 & B1 where A1 is a number and B1 is text just works โ Excel coerces the number to its display string and joins. CONCAT does the same, but the ampersand syntax is so compact that most spreadsheet veterans use it as the default for two-cell joins and reach for CONCAT only when ranges are involved.
One thing to watch: when joining numbers, the ampersand uses the underlying value, not the displayed format. If A1 shows "$1,234.56" but is actually stored as 1234.56, =A1 & " total" gives "1234.56 total" โ no dollar sign, no commas. Wrap with TEXT to preserve formatting: =TEXT(A1, "$#,##0.00") & " total".
You're joining 2 or 3 specific cells. The formula stays short and readable. Most beginners learn ampersand first and stick with it forever for simple cases. There's nothing wrong with that โ for two-cell joins, =A1 & " " & B1 is clearer than =CONCAT(A1, " ", B1). Less syntactic noise, same result.
You have a range of cells to join with no separator (or you'll add the separator manually between each piece). =CONCAT(A1:A10) is dramatically cleaner than 10 ampersand operators. Also use CONCAT when you're building structured output by mixing literals, single cells, and ranges in one formula.
You have a range and want the same delimiter between every item. Comma-separated lists, pipe-separated values, line-break-joined text. Plus you want to skip blanks automatically. TEXTJOIN is the only one of the three that handles this without extra IF logic.
CONCAT joins raw values. If a cell holds a date stored as the serial number 45798 but displays as "2025-05-21", CONCAT spits out "45798" โ not the formatted date. To preserve formatting you wrap the cell in TEXT() inside the CONCAT call. =CONCAT(A1, " ", TEXT(B1, "yyyy-mm-dd")) joins A1 and B1 where B1 is a date, formatted as "2025-05-21". The TEXT function converts the underlying value to a formatted string before CONCAT sees it.
Same trick for numbers with formatting. =CONCAT("Price: ", TEXT(B1, "$#,##0.00")) turns the raw number 1234.56 into "Price: $1,234.56". Without TEXT, you'd get "Price: 1234.56" โ accurate but ugly.
Common TEXT format codes worth knowing: "yyyy-mm-dd" for ISO dates, "mmm dd, yyyy" for "May 21, 2026", "$#,##0.00" for currency with two decimals, "0.0%" for percentages with one decimal, "00000" for zero-padded IDs like "00425". The format string follows the same rules as Excel's Format Cells dialog, just in formula form.
If CONCAT gets a value it can't coerce to text โ typically the result of a function that errored โ it returns #VALUE!. Wrap suspect arguments in IFERROR. =CONCAT(IFERROR(A1, ""), " ", B1) swaps any error in A1 for an empty string before joining.
Another #VALUE! cause: passing a 2D array literal directly. =CONCAT({1,2;3,4}) works in 365 but can fail in some 2019 builds. Workaround: put the array in a cell range and reference it instead.
Beginner classic. =CONCAT(A1, B1) with A1="John" and B1="Smith" returns "JohnSmith". CONCAT doesn't add separators โ you have to. Fix: =CONCAT(A1, " ", B1). The space inside the quote marks is the entire fix.
Already covered above. CONCAT uses the underlying value. Wrap with TEXT to preserve formatting. =CONCAT("Total: ", TEXT(A1, "$#,##0.00")).
That's Excel's per-cell content limit. CONCAT will silently truncate if your joined string exceeds it. For long joins of huge ranges, split the result across multiple cells or use Power Query instead.
If CONCAT returns #NAME? immediately, Excel doesn't recognize the function. You're on a pre-2019 build. Use CONCATENATE or the ampersand operator instead. Or upgrade to Excel 2019, 2021, 2024, or Microsoft 365 โ CONCAT is unavailable everywhere else.
For large data sets imported from CSVs or databases, Power Query offers a Merge Columns transform that does the same job as CONCAT โ without writing formulas in the sheet. Load your data into Power Query (Data tab โ Get Data). Select two or more columns. On the Transform tab pick Merge Columns. Choose a separator (space, comma, custom). Name the new merged column. Close and Load.
The advantage: Power Query handles billions of rows efficiently because it processes data outside the cell grid. CONCAT in 100,000 cells slows the workbook. Power Query merge on the same data finishes in seconds and only displays the result.
The disadvantage: Power Query has a learning curve. For one-off joins of 50 rows, CONCAT in the sheet wins on simplicity. For repeating monthly imports of 10,000 rows, Power Query wins because the transform is reusable โ refresh and the merge happens again automatically.
The opposite of CONCAT is TEXTSPLIT, added in Excel 365 in 2022. Where CONCAT joins values into one cell, TEXTSPLIT takes one cell and splits it into many. =TEXTSPLIT("apple,banana,cherry", ",") spills three cells horizontally: apple, banana, cherry. Same syntax as Text-to-Columns but as a live formula.
TEXTSPLIT pairs naturally with CONCAT. You can build complex transformations like "join three columns into a delimited string, then split that string on a different delimiter into more columns" with two formulas. Or use TEXTSPLIT to unpack data that arrived in concatenated form from a legacy system.
The function takes up to four arguments: text, column_delimiter, row_delimiter, ignore_empty. =TEXTSPLIT(A1, ",", ";") splits A1 on commas horizontally and on semicolons vertically โ turning "a,b,c;d,e,f" into a 2ร3 grid.
CONCAT works identically on Mac Excel 2019, 2021, 2024, and 365. No syntax differences. The only quirk is keyboard shortcut differences for formula entry โ F4 to toggle absolute references becomes Cmd+T on Mac. The function itself, its arguments, and its behavior are identical across platforms.
TEXTJOIN, TEXTSPLIT, and the ampersand operator are also fully cross-platform. Workbooks built with these functions on Windows open and recalculate correctly on Mac, and vice versa. The only place you'll hit incompatibility is opening a Mac-365-built workbook in Excel 2016 โ the newer functions won't exist and you'll see #NAME? errors.
Street in A2, City in B2, State in C2, Zip in D2. One row per customer. Make sure all four cells have data โ empty cells will leave gaps in the final string.
Type =CONCAT(A2, ", ", B2, ", ", C2, " ", D2). The commas-space sequences are explicit literals. The space between state and zip is intentional. Press Enter to see the joined address.
Should look like "123 Main St, Springfield, IL 62701". If you see double commas or missing spaces, audit the literal separators between each argument.
For real-world data with gaps, wrap blanks with IF: =CONCAT(A2, IF(B2="", "", ", " & B2), ...). Or switch to TEXTJOIN with ignore_empty=TRUE for cleaner handling.
Double-click the bottom-right corner of E2. Excel auto-fills the formula to every row with adjacent data. One formula, hundreds of joined addresses.
If your data is formatted as an Excel Table (select range, press Ctrl+T), CONCAT plays especially well with structured references. =CONCAT([@FirstName], " ", [@LastName]) reads cleaner than =CONCAT(A2, " ", B2) and self-documents what columns are being joined.
The bigger win is auto-fill. Write the CONCAT formula in any cell of a new table column, press Enter, and Excel auto-fills it down every existing row of the table. Add a new row of data tomorrow, and the formula populates that row automatically. No dragging, no reference updates, no broken formulas when columns get inserted somewhere else. Tables make CONCAT effectively self-maintaining.
Worth pairing this with Excel pivot tables โ pivots love structured tables as their source data. Build a CONCAT calculated column in the table (full name, customer address, order summary), then pivot on that joined field for cleaner group-by reports. The joined string becomes a meaningful dimension instead of two raw columns mashed together at pivot time.
You can use CONCAT inside conditional formatting formulas too. "Highlight any row where the full name matches a value in another column" becomes =CONCAT($A2, " ", $B2)=$D$1. The CONCAT builds the joined value on the fly, comparison runs against the lookup cell, and matching rows get the conditional fill. No helper column needed.
Same trick works in data validation. Build dropdown lists where each entry is a CONCAT of two source columns. Combine with INDIRECT for cascading dropdowns where the second list depends on the first. CONCAT is the glue that makes structured data play nicely with Excel's higher-level features.
CONCAT itself is fast. Joining 10 cells takes microseconds. Where it slows down is when you wrap it around large ranges and apply it in 50,000+ cells. =CONCAT(A:A) in 50,000 cells means Excel scans a million cells fifty thousand times during a recalc. Switch to explicit ranges like =CONCAT(A2:A10000) to skip the empty parts of the column.
For repeated CONCAT operations across huge data sets, prefer Power Query Merge Columns. Power Query processes data outside the cell grid and is orders of magnitude faster on bulk transformations. CONCAT in the sheet is the right tool for ad-hoc joins. Power Query is the right tool for monthly imports with thousands of rows. Same end result, very different performance profile.
=CONCAT(text1, [text2], ...). Each argument can be a literal string, a single cell, or a range. Example: =CONCAT(A1, " ", B1) joins A1 and B1 with a space. =CONCAT(A1:A10) joins a whole range with no separator. Available in Excel 2019, 2021, 2024, and Microsoft 365.=CONCAT(A1:A10) joins ten cells in one argument. CONCATENATE required every cell to be listed separately โ =CONCATENATE(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10). CONCATENATE is deprecated as of Excel 2019 but still works for backward compatibility. For new spreadsheets, always use CONCAT.=CONCAT(A1, B1) with A1="Hello" and B1="World" returns "HelloWorld" โ no space. Same with ampersand: =A1 & B1. Spaces only appear if you explicitly type them as literal strings inside quotes: =CONCAT(A1, " ", B1).=CONCAT(A:A) for an entire column or =CONCAT(A2:A1000) for a specific range. If you want a delimiter between each value, switch to TEXTJOIN: =TEXTJOIN(", ", TRUE, A:A) joins every cell in column A with a comma-space and skips blanks. Watch the 32,767-character cell content limit on large data.=A1 & " " & B1 does the same thing as =CONCAT(A1, " ", B1) and works in every Excel version.=CONCAT(A1, ", ", B1, ", ", C1). Tedious for many cells. With TEXTJOIN, specify the delimiter once: =TEXTJOIN(", ", TRUE, A1:A10) joins ten cells with comma-space between each, automatically. TEXTJOIN is dramatically cleaner for delimited joins of ranges.=CONCAT("Date: ", TEXT(A1, "yyyy-mm-dd")) outputs "Date: 2026-05-21" instead of "Date: 45798" (the raw serial number). TEXT converts the underlying value to a formatted string before CONCAT sees it. Same trick works for currency and percentages.