Excel users often work with large amounts of unstructured text data, whether it’s customer reviews, survey responses, business emails, or social media comments. Extracting structured insights from this text—such as identifying names of people, places, dates, and organizations—has traditionally required manual analysis, making it tedious, time-consuming, and error-prone.
Named entity recognition (NER) is a powerful natural language processing technique that automates this process by quickly detecting and categorizing these key informational entities within text data. Thanks to Excel’s new COPILOT() function, users can now seamlessly integrate advanced NER capabilities directly into their spreadsheets, significantly simplifying and accelerating text analysis tasks.
You can follow along with this exercise using the download file below. Keep in mind, this function is still rolling out to users, so it may not yet be available to you. Check out this post for notes on availability.
COPILOT() function syntax
The function uses a straightforward syntax:
=COPILOT(prompt_part1, [context1], [prompt_part2], [context2], ...)
The arguments alternate between prompt parts and optional context arguments. A prompt part is simply a piece of natural-language text instructing the AI model on what you want it to do. The optional context arguments are Excel cell or range references providing data that the AI model should analyze or utilize when generating its response.
For example, if you’ve collected customer reviews in Excel and want to categorize each comment, you might use:
=COPILOT("Classify this feedback", D4:D18)
In this formula, the prompt (“Classify this feedback”) clearly tells the AI model what to do, and the context argument (D4:D18
) provides the specific data to analyze. COPILOT() will instantly return the categorized results directly into your spreadsheet.
Named entity recognition demo
Now onto our full example. We’ve got a series of short text messages stored in an Excel table called messages
, and we want to quickly identify and categorize entities such as people, places, organizations, and dates mentioned within these messages. We’ll start with some simple prompts to get comfortable with the COPILOT function and gradually move to more complex analyses.
Let’s start by asking Copilot to identify all the people named in the message_text
column:
=COPILOT("Identify people", messages[message_text])

COPILOT() returned the results (Susan, John Doe, and Emily) as a spilled dynamic array, automatically populating the cells below. Because our data is stored in an Excel table and referenced using structured references, updates to the table will immediately reflect in the array. If you’re new to combining Excel tables with dynamic arrays, check out my book, Modern Data Analytics in Excel:
In this next example, we’ll expand our prompt to extract multiple entity types simultaneously, asking COPILOT() to return names of people, places, dates, and organizations from each message in separate columns:
=COPILOT(
"Extract names of people, places, dates, and organizations",
messages[message_text],
"Return results as separate columns with one row per input"
)

COPILOT() returned a structured table of extracted entities as a spilled dynamic array, automatically populating rows and columns based on the extracted data (as shown in the attached output).
However, there are some limitations with this approach. For instance, the function doesn’t explicitly label or separate different entity types (people, places, organizations, dates) clearly into individual labeled columns, which can make interpreting the output less intuitive. Additionally, it has difficulty handling relative date expressions such as “next summer” or “next month,” as these terms remain uncategorized or inconsistently handled compared to specific dates like “March 12” or “July 2025.”
Similarly, certain nuanced entities, such as event names (“product launch event,” “workshop,” “conference”) and venue names (“The French Laundry”) aren’t explicitly extracted as distinct categories. These subtleties illustrate some of the current limitations of relying solely on a general instruction without further explicit guidance in the prompt.
This next version of the formula is an improvement because it explicitly instructs COPILOT() to categorize entities into clearly labeled columns. The formula:
=COPILOT(
"Classify people, places, organizations, and dates",
messages[message_text],
"Separate into labeled columns"
)

guides COPILOT() to return results organized into columns named Person, Organization, Place, and Date. As you can see from the output, entities now appear aligned under their appropriate headers, significantly enhancing readability and usability.
However, even this structured approach has some limitations. Relative date expressions such as “next summer,” “next month,” or “yesterday” are listed without conversion to precise dates, which could limit analytical use. Additionally, some entities remain uncategorized or ambiguous—for instance, events (“conference,” “workshop”) or certain venues (“The French Laundry”) might deserve their own category to improve clarity further.
Overall, while this structured labeling approach is more intuitive, you might still need to provide additional prompting or post-process these results to handle nuanced or ambiguous entity types more effectively.
In this next prompt, we’ll shift gears slightly. Rather than listing every entity from each message, we’ve asked COPILOT() to summarize the entities mentioned most frequently, grouped by category:
=COPILOT(
"Summarize most frequently mentioned entities by category",
messages[message_text]
)

The output provides a clear summary, categorizing entities into groups like Company, Person, Location, and Institution, alongside their frequency of occurrence. This structure allows you to quickly identify the most prominent entities in your dataset and easily grasp overall patterns or themes.
Since this is a smaller dataset, each entity currently appears only once. However, because this result is dynamic, it will automatically update as your dataset grows. This approach could be particularly helpful for quickly understanding the big-picture trends in your data, especially given that COPILOT() naturally returns results as a vertical array, making it challenging to view all entities row-by-row across multiple columns. As this function is still new, there’s definitely more experimenting and learning ahead!
In this final prompt, we’ll ask COPILOT() to explicitly identify relationships between people and organizations mentioned in our messages:
=COPILOT(
"Identify relationships between people and organizations mentioned",
messages[message_text],
"Present results in two columns, labeled Person and Organization"
)

COPILOT() returned a neatly structured output with clear pairings of people to their associated organizations, automatically organized into two labeled columns (“Person” and “Organization”). This approach is especially valuable because it directly extracts meaningful relationships from messy or ambiguous text data. Rather than manually parsing or guessing these connections, COPILOT() simplifies and clarifies the task, providing precise outputs that can greatly enhance data quality and analysis in Excel, particularly when dealing with large or complex datasets.
Conclusion
Using the COPILOT() function for named entity recognition directly in Excel quickly unlocks structured insights from messy text data. Throughout this post, we’ve seen how simple it is to move from basic entity extraction to more detailed categorization, summarization, and relationship analysis tasks. Such capabilities offer immediate wins in areas like analyzing customer feedback, identifying market trends, and clarifying ambiguous data relationships.
At the same time, we encountered some limitations: COPILOT() currently struggles with relative date expressions and doesn’t always intuitively categorize nuanced entities like event names or venues without extra prompting. As this feature evolves, these capabilities will undoubtedly improve, and Excel users will discover even more creative applications. For now, embrace COPILOT() for its clear time-saving benefits, stay mindful of these constraints, and look forward to its continued development and enhancement.