To add the UNIQUE function you need add it as a Array Formula.
You could enter the formula to a single cell but if the unique values are more than one cell it will only show the first unique value. An Array allows every value to be assigned a cell and the range should be no bigger than the 'Names' range of the Table of course.
I have written the following code to create a workbook adding the UNIQUE formula as an example. The workbook adds its own Sheets, test data and is saved with the name 'Example.xlsx'
The code will insert an Excel Table, 'Table1' using your Header name and then applies the UNIQUE formula as you have written it against the Table in Column E under the Header 'Unique'.
I have also included the DV you are attempting to add. I have moved it to Column F, Cell F2 in this example since the table overwrites 'B3'
If the formula/function is unknown as seems to be the case with 'UNIQUE', prefix with _xlfn
, see formula
variable in code.
import openpyxl
from openpyxl.styles import Alignment
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.worksheet.formula import ArrayFormula
from openpyxl.worksheet.table import Table
# Workbook and Worksheets
wb = openpyxl.Workbook()
target_sheet = wb.active
wb.create_sheet('Data')
ws = wb.worksheets[1]
# Add some data to the Sheets
# 'Data' Sheet
for a in range(1, 11):
ws[f"A{a}"].value = a
# Table data on target_sheet, ('Sheet')
rows = [
('Names', 'ColumnA', 'ColumnB'),
('Tom', 0.51, 'Value1'),
('Fred', 0.26, 'Value2'),
('Tom', 0.07, 'Value1'),
('Vicky', 0.07, 'Value3'),
]
for r in rows:
target_sheet.append(r)
# Create Table
tbl = Table(displayName="Table1", ref="A1:C5")
target_sheet.add_table(tbl)
# Add the Array Formula
formula = "=_xlfn.UNIQUE(Table1[Names])"
target_sheet["E2"].value = ArrayFormula('E2:E5', formula)
# Data Validation
dropdown_range = "'Data'!A1:A10"
dv = DataValidation(type="list", formula1=dropdown_range, showDropDown=False)
target_sheet.add_data_validation(dv)
dv.add(target_sheet['F2']) # Add DV to cell 'F2'
# Some cell formatting
for x in ['A', 'B', 'C']:
target_sheet.column_dimensions[x].width = 12
target_sheet['E1'].value = 'Unique'
target_sheet['E1'].alignment = Alignment(horizontal='center')
target_sheet['F1'].value = 'DV'
target_sheet['F1'].alignment = Alignment(horizontal='center')
# Save workbook
wb.save('Example.xlsx')
Example target_sheet
Showing the formula, this is the same for each cell E2 - E5

Showing the DV dropdown. Data shown is from the 2nd Sheet 'Data' cells A1 - A10

EDIT
The stated requirements in your updated Post is covered in the below examples.
Example 2
Below I have updated the example;
As noted in my comment on your Post, Openpyxl does not evaluate formulas so the UNIQUE formula will not be filled until the workbook is opened in Excel.
The Array formula range is likely to be bigger than it needs to be and thus contains '#N/A' values for the unused cells, which then get inserted into the DV since it also has to cover the same range as the Array given you cannot know at the time what cells contain #N/A .
Example code 2
import openpyxl
from openpyxl.styles import Alignment, Font
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.worksheet.formula import ArrayFormula
from openpyxl.worksheet.table import Table, TableStyleInfo
wb = openpyxl.Workbook()
ws = wb.active
data = [
["Names", "Age"],
["Alice", 30],
["Bob", 25],
["Charlie", 35],
["Alice", 30],
["David", 40],
["Bob", 25],
]
for row in data:
ws.append(row)
table_range = f"A1:B{len(data)}"
table = Table(displayName="Table1", ref=table_range)
style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=True, showRowStripes=True, showColumnStripes=True)
table.tableStyleInfo = style
ws.add_table(table)
# Add the Array Formula
formula = "=_xlfn.UNIQUE(Table1[Names])"
ws["E2"].value = ArrayFormula('E2:E7', formula)
dropdown_range = "'Sheet'!E2:E7"
dv = DataValidation(type="list", formula1=dropdown_range, showDropDown=False)
ws.add_data_validation(dv)
dv.add(ws['F2'])
# Some cell formatting
for x in ['A', 'B']:
ws.column_dimensions[x].width = 12
ws['E1'].value = 'Unique'
ws['E1'].font = Font(bold=True)
ws['E1'].alignment = Alignment(horizontal='center')
ws['F1'].value = 'DV'
ws['F1'].font = Font(bold=True)
ws['F1'].alignment = Alignment(horizontal='center')
file_path = 'example_with_dropdown.xlsx'
wb.save(file_path)
Updated example Sheet 2

Example 3
If you want to go the extra mile and use another module to clean up your DV a bit then here is the example using Xlwings to check the unique data range and setting the DV to the range of actual names only.
Since I am using Xlwings to open the workbook in Excel (to update the Unique List I have used the same to insert the DV.
However, if you still wanted to use Openpyxl to add the DV/other detail you would need to open the workbook in Excel and save it then re-open (load_workbook) the saved workbook using Openpyxl.
It should not be necessary to re-open with data_only=True
as only the first cell 'E2' should have the formula. The rest of the cells, in this case 'E3:E7' should have the name or '#N/A' as it's value.
You can then get the max used row in the Unique list as done in this code and then use Openpyxl to update the DV entry.
Example code 3
import openpyxl
import xlwings as xw
from openpyxl.styles import Alignment, Font
from openpyxl.worksheet.formula import ArrayFormula
from openpyxl.worksheet.table import Table, TableStyleInfo
from xlwings import constants
file_path = 'example_with_dropdown.xlsx'
wb = openpyxl.Workbook()
ws = wb.active
data = [
["Names", "Age"],
["Alice", 30],
["Bob", 25],
["Charlie", 35],
["Alice", 30],
["David", 40],
["Bob", 25],
]
for row in data:
ws.append(row)
table_range = f"A1:B{len(data)}"
table = Table(displayName="Table1", ref=table_range)
style = TableStyleInfo(name="TableStyleMedium9", showFirstColumn=True, showRowStripes=True, showColumnStripes=True)
table.tableStyleInfo = style
ws.add_table(table)
# Add the Array Formula
formula = "=_xlfn.UNIQUE(Table1[Names])"
formula_rng = 'E2:E7'
ws["E2"].value = ArrayFormula(formula_rng, formula)
# Some cell formatting
for x in ['A', 'B']:
ws.column_dimensions[x].width = 12
ws['E1'].value = 'Unique'
ws['E1'].font = Font(bold=True)
ws['E1'].alignment = Alignment(horizontal='center')
ws['F1'].value = 'DV'
ws['F1'].font = Font(bold=True)
ws['F1'].alignment = Alignment(horizontal='center')
wb.save(file_path)
# Open workbook in Xlwings to Update UNIQUE formula cells to check which cells have actual names
with xw.App(visible=False) as app:
wb2 = xw.Book(file_path)
ws2 = wb2.sheets['Sheet']
# Get the last row in the Unique list with a valid name.
max_used_row = max([x.row for x in ws2.range(formula_rng) if x.value is not None])
# Set the range of the DV to cover start to last row determined above
dv_range = f'=E2:E{max_used_row}'
# Add the DV to the Sheet
ws2.range('F2').api.Validation.Add(
Type=constants.DVType.xlValidateList,
AlertStyle=constants.DVAlertStyle.xlValidAlertStop,
Operator=constants.FormatConditionOperator.xlBetween,
# Formula1="=$E$2:$E$5"
Formula1 = dv_range
)
ws2.range('F2').IgnoreBlank = True
ws2.range('F2').api.Validation.InCellDropdown = True
ws2.range('F2').api.Validation.InputTitle = ""
ws2.range('F2').api.Validation.ErrorTitle = ""
ws2.range('F2').api.Validation.InputMessage = ""
ws2.range('F2').api.Validation.ErrorMessage = ""
ws2.range('F2').api.Validation.ShowInput = True
ws2.range('F2').api.Validation.ShowError = True
# Save workbook with updated DV
wb2.save(file_path)
Updated example Sheet 2

showDropDown=True
means the drop down list will be hidden. For it to be visibleshowDropDown
must be set to False.