@luquimbo/bi-superpowers 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +8 -0
- package/.mcp.json +25 -0
- package/AGENTS.md +244 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/bin/build-plugin.js +30 -0
- package/bin/cli.js +1064 -0
- package/bin/commands/add.js +533 -0
- package/bin/commands/add.test.js +77 -0
- package/bin/commands/build-desktop.js +166 -0
- package/bin/commands/changelog.js +443 -0
- package/bin/commands/diff.js +325 -0
- package/bin/commands/lint.js +419 -0
- package/bin/commands/lint.test.js +103 -0
- package/bin/commands/mcp-setup.js +246 -0
- package/bin/commands/pull.js +287 -0
- package/bin/commands/pull.test.js +36 -0
- package/bin/commands/push.js +231 -0
- package/bin/commands/push.test.js +14 -0
- package/bin/commands/search.js +344 -0
- package/bin/commands/search.test.js +115 -0
- package/bin/commands/setup.js +545 -0
- package/bin/commands/setup.test.js +46 -0
- package/bin/commands/sync-profile.js +405 -0
- package/bin/commands/sync-profile.test.js +14 -0
- package/bin/commands/sync-source.js +418 -0
- package/bin/commands/sync-source.test.js +14 -0
- package/bin/commands/watch.js +206 -0
- package/bin/lib/generators/claude-plugin.js +266 -0
- package/bin/lib/generators/claude-plugin.test.js +110 -0
- package/bin/lib/generators/index.js +116 -0
- package/bin/lib/generators/shared.js +282 -0
- package/bin/lib/licensing/index.js +35 -0
- package/bin/lib/licensing/storage.js +364 -0
- package/bin/lib/licensing/storage.test.js +55 -0
- package/bin/lib/licensing/validator.js +213 -0
- package/bin/lib/licensing/validator.test.js +137 -0
- package/bin/lib/microsoft-mcp.js +176 -0
- package/bin/lib/microsoft-mcp.test.js +106 -0
- package/bin/lib/skills.js +84 -0
- package/bin/mcp/powerbi-modeling-launcher.js +38 -0
- package/bin/postinstall.js +44 -0
- package/bin/utils/errors.js +159 -0
- package/bin/utils/git.js +298 -0
- package/bin/utils/logger.js +142 -0
- package/bin/utils/mcp-detect.js +274 -0
- package/bin/utils/mcp-detect.test.js +105 -0
- package/bin/utils/pbix.js +305 -0
- package/bin/utils/pbix.test.js +37 -0
- package/bin/utils/profiles.js +312 -0
- package/bin/utils/projects.js +168 -0
- package/bin/utils/readline.js +206 -0
- package/bin/utils/readline.test.js +47 -0
- package/bin/utils/tui.js +314 -0
- package/bin/utils/tui.test.js +127 -0
- package/commands/contributions.md +265 -0
- package/commands/data-model-design.md +468 -0
- package/commands/dax-doctor.md +248 -0
- package/commands/fabric-scripts.md +452 -0
- package/commands/migration-assistant.md +290 -0
- package/commands/model-documenter.md +242 -0
- package/commands/pbi-connect.md +239 -0
- package/commands/project-kickoff.md +905 -0
- package/commands/report-layout.md +296 -0
- package/commands/rls-design.md +533 -0
- package/commands/theme-tweaker.md +624 -0
- package/config.example.json +23 -0
- package/config.json +23 -0
- package/desktop-extension/manifest.json +37 -0
- package/desktop-extension/package.json +10 -0
- package/desktop-extension/server.js +95 -0
- package/docs/openrouter-free-models.md +92 -0
- package/library/examples/README.md +151 -0
- package/library/examples/finance-reporting/README.md +351 -0
- package/library/examples/finance-reporting/data-model.md +267 -0
- package/library/examples/finance-reporting/measures.dax +557 -0
- package/library/examples/hr-analytics/README.md +371 -0
- package/library/examples/hr-analytics/data-model.md +315 -0
- package/library/examples/hr-analytics/measures.dax +460 -0
- package/library/examples/marketing-analytics/README.md +37 -0
- package/library/examples/marketing-analytics/data-model.md +62 -0
- package/library/examples/marketing-analytics/measures.dax +110 -0
- package/library/examples/retail-analytics/README.md +439 -0
- package/library/examples/retail-analytics/data-model.md +288 -0
- package/library/examples/retail-analytics/measures.dax +481 -0
- package/library/examples/supply-chain/README.md +37 -0
- package/library/examples/supply-chain/data-model.md +69 -0
- package/library/examples/supply-chain/measures.dax +77 -0
- package/library/examples/udf-library/README.md +228 -0
- package/library/examples/udf-library/functions.dax +571 -0
- package/library/snippets/dax/README.md +292 -0
- package/library/snippets/dax/business-domains.md +576 -0
- package/library/snippets/dax/calculate-patterns.md +276 -0
- package/library/snippets/dax/calculation-groups.md +489 -0
- package/library/snippets/dax/error-handling.md +495 -0
- package/library/snippets/dax/iterators-and-aggregations.md +474 -0
- package/library/snippets/dax/kpis-and-metrics.md +293 -0
- package/library/snippets/dax/rankings-and-topn.md +235 -0
- package/library/snippets/dax/security-patterns.md +413 -0
- package/library/snippets/dax/text-and-formatting.md +316 -0
- package/library/snippets/dax/time-intelligence.md +196 -0
- package/library/snippets/dax/user-defined-functions.md +477 -0
- package/library/snippets/dax/virtual-tables.md +546 -0
- package/library/snippets/excel-formulas/README.md +84 -0
- package/library/snippets/excel-formulas/aggregations.md +330 -0
- package/library/snippets/excel-formulas/dates-and-times.md +361 -0
- package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
- package/library/snippets/excel-formulas/lookups.md +169 -0
- package/library/snippets/excel-formulas/text-functions.md +363 -0
- package/library/snippets/governance/naming-conventions.md +97 -0
- package/library/snippets/governance/review-checklists.md +107 -0
- package/library/snippets/power-query/README.md +389 -0
- package/library/snippets/power-query/api-integration.md +707 -0
- package/library/snippets/power-query/connections.md +434 -0
- package/library/snippets/power-query/data-cleaning.md +298 -0
- package/library/snippets/power-query/error-handling.md +526 -0
- package/library/snippets/power-query/parameters.md +350 -0
- package/library/snippets/power-query/performance.md +506 -0
- package/library/snippets/power-query/transformations.md +330 -0
- package/library/snippets/report-design/accessibility.md +78 -0
- package/library/snippets/report-design/chart-selection.md +54 -0
- package/library/snippets/report-design/layout-patterns.md +87 -0
- package/library/templates/data-models/README.md +93 -0
- package/library/templates/data-models/finance-model.md +627 -0
- package/library/templates/data-models/retail-star-schema.md +473 -0
- package/library/templates/excel/README.md +83 -0
- package/library/templates/excel/budget-tracker.md +432 -0
- package/library/templates/excel/data-entry-form.md +533 -0
- package/library/templates/power-bi/README.md +72 -0
- package/library/templates/power-bi/finance-report.md +449 -0
- package/library/templates/power-bi/kpi-scorecard.md +461 -0
- package/library/templates/power-bi/sales-dashboard.md +281 -0
- package/library/themes/excel/README.md +436 -0
- package/library/themes/power-bi/README.md +271 -0
- package/library/themes/power-bi/accessible.json +307 -0
- package/library/themes/power-bi/bi-superpowers-default.json +858 -0
- package/library/themes/power-bi/corporate-blue.json +291 -0
- package/library/themes/power-bi/dark-mode.json +291 -0
- package/library/themes/power-bi/minimal.json +292 -0
- package/library/themes/power-bi/print-friendly.json +309 -0
- package/package.json +93 -0
- package/skills/contributions/SKILL.md +267 -0
- package/skills/data-model-design/SKILL.md +470 -0
- package/skills/data-modeling/SKILL.md +254 -0
- package/skills/data-quality/SKILL.md +664 -0
- package/skills/dax/SKILL.md +708 -0
- package/skills/dax-doctor/SKILL.md +250 -0
- package/skills/dax-udf/SKILL.md +489 -0
- package/skills/deployment/SKILL.md +320 -0
- package/skills/excel-formulas/SKILL.md +463 -0
- package/skills/fabric-scripts/SKILL.md +454 -0
- package/skills/fast-standard/SKILL.md +509 -0
- package/skills/governance/SKILL.md +205 -0
- package/skills/migration-assistant/SKILL.md +292 -0
- package/skills/model-documenter/SKILL.md +244 -0
- package/skills/pbi-connect/SKILL.md +241 -0
- package/skills/power-query/SKILL.md +406 -0
- package/skills/project-kickoff/SKILL.md +907 -0
- package/skills/query-performance/SKILL.md +480 -0
- package/skills/report-design/SKILL.md +207 -0
- package/skills/report-layout/SKILL.md +298 -0
- package/skills/rls-design/SKILL.md +535 -0
- package/skills/semantic-model/SKILL.md +237 -0
- package/skills/testing-validation/SKILL.md +643 -0
- package/skills/theme-tweaker/SKILL.md +626 -0
- package/src/content/base.md +237 -0
- package/src/content/mcp-requirements.json +69 -0
- package/src/content/routing.md +203 -0
- package/src/content/skills/contributions.md +259 -0
- package/src/content/skills/data-model-design.md +462 -0
- package/src/content/skills/data-modeling.md +246 -0
- package/src/content/skills/data-quality.md +656 -0
- package/src/content/skills/dax-doctor.md +242 -0
- package/src/content/skills/dax-udf.md +481 -0
- package/src/content/skills/dax.md +700 -0
- package/src/content/skills/deployment.md +312 -0
- package/src/content/skills/excel-formulas.md +455 -0
- package/src/content/skills/fabric-scripts.md +446 -0
- package/src/content/skills/fast-standard.md +501 -0
- package/src/content/skills/governance.md +197 -0
- package/src/content/skills/migration-assistant.md +284 -0
- package/src/content/skills/model-documenter.md +236 -0
- package/src/content/skills/pbi-connect.md +233 -0
- package/src/content/skills/power-query.md +398 -0
- package/src/content/skills/project-kickoff.md +899 -0
- package/src/content/skills/query-performance.md +472 -0
- package/src/content/skills/report-design.md +199 -0
- package/src/content/skills/report-layout.md +290 -0
- package/src/content/skills/rls-design.md +527 -0
- package/src/content/skills/semantic-model.md +229 -0
- package/src/content/skills/testing-validation.md +635 -0
- package/src/content/skills/theme-tweaker.md +618 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Dynamic Array Formulas (Excel 365+)
|
|
2
|
+
|
|
3
|
+
Modern Excel formulas that return multiple values.
|
|
4
|
+
|
|
5
|
+
## FILTER Function
|
|
6
|
+
|
|
7
|
+
### Basic Filter
|
|
8
|
+
```excel
|
|
9
|
+
=FILTER(tbl_Sales, tbl_Sales[Region]="North")
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Filter with Multiple Criteria (AND)
|
|
13
|
+
```excel
|
|
14
|
+
=FILTER(tbl_Sales, (tbl_Sales[Region]="North")*(tbl_Sales[Amount]>1000))
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Filter with Multiple Criteria (OR)
|
|
18
|
+
```excel
|
|
19
|
+
=FILTER(tbl_Sales, (tbl_Sales[Region]="North")+(tbl_Sales[Region]="South"))
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Filter with Default Value
|
|
23
|
+
```excel
|
|
24
|
+
=FILTER(tbl_Sales, tbl_Sales[Product]=A2, "No results found")
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Filter Specific Columns
|
|
28
|
+
```excel
|
|
29
|
+
=FILTER(CHOOSECOLS(tbl_Sales, 1, 3, 5), tbl_Sales[Status]="Active")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Top N with Filter
|
|
33
|
+
```excel
|
|
34
|
+
=FILTER(tbl_Sales, tbl_Sales[Amount]>=LARGE(tbl_Sales[Amount], 5))
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## SORT Function
|
|
38
|
+
|
|
39
|
+
### Basic Sort (Ascending)
|
|
40
|
+
```excel
|
|
41
|
+
=SORT(tbl_Sales)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Sort by Specific Column
|
|
45
|
+
```excel
|
|
46
|
+
=SORT(tbl_Sales, 3, -1)
|
|
47
|
+
```
|
|
48
|
+
- `3` = column index
|
|
49
|
+
- `-1` = descending, `1` = ascending
|
|
50
|
+
|
|
51
|
+
### Sort by Multiple Columns
|
|
52
|
+
```excel
|
|
53
|
+
=SORT(tbl_Sales, {1, 3}, {1, -1})
|
|
54
|
+
```
|
|
55
|
+
- First by column 1 ascending, then column 3 descending
|
|
56
|
+
|
|
57
|
+
### Combined Filter and Sort
|
|
58
|
+
```excel
|
|
59
|
+
=SORT(FILTER(tbl_Sales, tbl_Sales[Region]="North"), 3, -1)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## SORTBY Function
|
|
63
|
+
|
|
64
|
+
### Sort by Another Column
|
|
65
|
+
```excel
|
|
66
|
+
=SORTBY(tbl_Products[Name], tbl_Products[Sales], -1)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Sort by Multiple Criteria
|
|
70
|
+
```excel
|
|
71
|
+
=SORTBY(tbl_Data, tbl_Data[Category], 1, tbl_Data[Amount], -1)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Sort by External Range
|
|
75
|
+
```excel
|
|
76
|
+
=SORTBY(A2:C10, D2:D10, -1)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## UNIQUE Function
|
|
80
|
+
|
|
81
|
+
### Unique Values
|
|
82
|
+
```excel
|
|
83
|
+
=UNIQUE(tbl_Sales[Customer])
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Unique Rows
|
|
87
|
+
```excel
|
|
88
|
+
=UNIQUE(tbl_Sales)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Unique Values that Appear Once
|
|
92
|
+
```excel
|
|
93
|
+
=UNIQUE(tbl_Sales[Customer], FALSE, TRUE)
|
|
94
|
+
```
|
|
95
|
+
- Second parameter: by column (TRUE) or row (FALSE)
|
|
96
|
+
- Third parameter: exactly once (TRUE)
|
|
97
|
+
|
|
98
|
+
### Unique Combinations
|
|
99
|
+
```excel
|
|
100
|
+
=UNIQUE(CHOOSECOLS(tbl_Sales, 1, 3))
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## SEQUENCE Function
|
|
104
|
+
|
|
105
|
+
### Simple Sequence
|
|
106
|
+
```excel
|
|
107
|
+
=SEQUENCE(10)
|
|
108
|
+
```
|
|
109
|
+
Results: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
|
|
110
|
+
|
|
111
|
+
### Rows and Columns
|
|
112
|
+
```excel
|
|
113
|
+
=SEQUENCE(5, 3)
|
|
114
|
+
```
|
|
115
|
+
Creates 5 rows x 3 columns matrix
|
|
116
|
+
|
|
117
|
+
### Custom Start and Step
|
|
118
|
+
```excel
|
|
119
|
+
=SEQUENCE(10, 1, 0, 5)
|
|
120
|
+
```
|
|
121
|
+
Results: 0, 5, 10, 15, 20, 25, 30, 35, 40, 45
|
|
122
|
+
|
|
123
|
+
### Date Sequence
|
|
124
|
+
```excel
|
|
125
|
+
=SEQUENCE(12, 1, DATE(2024,1,1), 30)
|
|
126
|
+
```
|
|
127
|
+
Creates monthly dates (approximately)
|
|
128
|
+
|
|
129
|
+
### Weekly Dates
|
|
130
|
+
```excel
|
|
131
|
+
=SEQUENCE(52, 1, DATE(2024,1,1), 7)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## RANDARRAY Function
|
|
135
|
+
|
|
136
|
+
### Random Numbers
|
|
137
|
+
```excel
|
|
138
|
+
=RANDARRAY(5, 3)
|
|
139
|
+
```
|
|
140
|
+
5 rows x 3 columns of random decimals
|
|
141
|
+
|
|
142
|
+
### Random Integers
|
|
143
|
+
```excel
|
|
144
|
+
=RANDARRAY(10, 1, 1, 100, TRUE)
|
|
145
|
+
```
|
|
146
|
+
10 random integers between 1 and 100
|
|
147
|
+
|
|
148
|
+
### Random Sample
|
|
149
|
+
```excel
|
|
150
|
+
=INDEX(tbl_Products, RANDARRAY(5, 1, 1, ROWS(tbl_Products), TRUE), 0)
|
|
151
|
+
```
|
|
152
|
+
5 random rows from table
|
|
153
|
+
|
|
154
|
+
## LET Function
|
|
155
|
+
|
|
156
|
+
### Basic LET (Named Variables)
|
|
157
|
+
```excel
|
|
158
|
+
=LET(
|
|
159
|
+
sales, SUM(tbl_Sales[Amount]),
|
|
160
|
+
target, 100000,
|
|
161
|
+
variance, sales - target,
|
|
162
|
+
IF(variance >= 0, "Above Target", "Below Target")
|
|
163
|
+
)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### LET with Complex Calculations
|
|
167
|
+
```excel
|
|
168
|
+
=LET(
|
|
169
|
+
data, FILTER(tbl_Sales, tbl_Sales[Year]=2024),
|
|
170
|
+
total, SUM(INDEX(data, , 3)),
|
|
171
|
+
count, ROWS(data),
|
|
172
|
+
average, total/count,
|
|
173
|
+
"Total: " & total & " | Avg: " & ROUND(average, 2)
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Reusing Calculated Values
|
|
178
|
+
```excel
|
|
179
|
+
=LET(
|
|
180
|
+
filtered, FILTER(tbl_Sales, tbl_Sales[Status]="Active"),
|
|
181
|
+
sorted, SORT(filtered, 3, -1),
|
|
182
|
+
top5, TAKE(sorted, 5),
|
|
183
|
+
top5
|
|
184
|
+
)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## TAKE and DROP Functions (Excel 365+)
|
|
188
|
+
|
|
189
|
+
### Take First N Rows
|
|
190
|
+
```excel
|
|
191
|
+
=TAKE(tbl_Sales, 10)
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Take Last N Rows
|
|
195
|
+
```excel
|
|
196
|
+
=TAKE(tbl_Sales, -10)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Take First N Columns
|
|
200
|
+
```excel
|
|
201
|
+
=TAKE(tbl_Sales, , 3)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Drop First N Rows
|
|
205
|
+
```excel
|
|
206
|
+
=DROP(tbl_Sales, 1)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Combine for Middle Section
|
|
210
|
+
```excel
|
|
211
|
+
=DROP(TAKE(tbl_Sales, 20), 10)
|
|
212
|
+
```
|
|
213
|
+
Rows 11-20
|
|
214
|
+
|
|
215
|
+
## CHOOSECOLS and CHOOSEROWS
|
|
216
|
+
|
|
217
|
+
### Select Specific Columns
|
|
218
|
+
```excel
|
|
219
|
+
=CHOOSECOLS(tbl_Sales, 1, 3, 5)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Select Specific Rows
|
|
223
|
+
```excel
|
|
224
|
+
=CHOOSEROWS(tbl_Sales, 1, 5, 10)
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Reorder Columns
|
|
228
|
+
```excel
|
|
229
|
+
=CHOOSECOLS(tbl_Sales, 3, 1, 2)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## EXPAND Function
|
|
233
|
+
|
|
234
|
+
### Expand Array with Default
|
|
235
|
+
```excel
|
|
236
|
+
=EXPAND(A1:C3, 5, 5, 0)
|
|
237
|
+
```
|
|
238
|
+
Expands to 5x5, filling with 0
|
|
239
|
+
|
|
240
|
+
### Create Padded Table
|
|
241
|
+
```excel
|
|
242
|
+
=EXPAND(FILTER(tbl_Sales, tbl_Sales[Region]="North"), 10, , "")
|
|
243
|
+
```
|
|
244
|
+
Ensures at least 10 rows
|
|
245
|
+
|
|
246
|
+
## VSTACK and HSTACK
|
|
247
|
+
|
|
248
|
+
### Stack Vertically
|
|
249
|
+
```excel
|
|
250
|
+
=VSTACK(tbl_Sales2023, tbl_Sales2024)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Stack Horizontally
|
|
254
|
+
```excel
|
|
255
|
+
=HSTACK(tbl_Info, tbl_Stats)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Create Header Row
|
|
259
|
+
```excel
|
|
260
|
+
=VSTACK({"Name", "Amount", "Date"}, FILTER(tbl_Sales, tbl_Sales[Amount]>1000))
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## TEXTSPLIT and TEXTJOIN
|
|
264
|
+
|
|
265
|
+
### Split Text to Columns
|
|
266
|
+
```excel
|
|
267
|
+
=TEXTSPLIT(A2, ",")
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Split to Rows and Columns
|
|
271
|
+
```excel
|
|
272
|
+
=TEXTSPLIT(A2, ",", ";")
|
|
273
|
+
```
|
|
274
|
+
- First delimiter: columns
|
|
275
|
+
- Second delimiter: rows
|
|
276
|
+
|
|
277
|
+
### Join Array to Text
|
|
278
|
+
```excel
|
|
279
|
+
=TEXTJOIN(", ", TRUE, FILTER(tbl_Products[Name], tbl_Products[Active]=TRUE))
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Practical Examples
|
|
283
|
+
|
|
284
|
+
### Dynamic Top 10 Report
|
|
285
|
+
```excel
|
|
286
|
+
=LET(
|
|
287
|
+
sorted, SORT(tbl_Sales, 3, -1),
|
|
288
|
+
top10, TAKE(sorted, 10),
|
|
289
|
+
VSTACK({"Product", "Region", "Amount"}, CHOOSECOLS(top10, 1, 2, 3))
|
|
290
|
+
)
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Pivot-like Summary
|
|
294
|
+
```excel
|
|
295
|
+
=LET(
|
|
296
|
+
regions, UNIQUE(tbl_Sales[Region]),
|
|
297
|
+
totals, MAP(regions, LAMBDA(r, SUMIF(tbl_Sales[Region], r, tbl_Sales[Amount]))),
|
|
298
|
+
HSTACK(regions, totals)
|
|
299
|
+
)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Dynamic Validation List
|
|
303
|
+
```excel
|
|
304
|
+
=SORT(UNIQUE(FILTER(tbl_Products[Name], tbl_Products[Category]=A1)))
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Usage Notes
|
|
308
|
+
|
|
309
|
+
- Dynamic arrays spill automatically to adjacent cells
|
|
310
|
+
- Use `@` operator to get single value: `=@SORT(A:A)`
|
|
311
|
+
- Reference spill range with `#`: `=SUM(A1#)`
|
|
312
|
+
- LET improves readability and performance
|
|
313
|
+
- Combine functions for powerful one-formula solutions
|
|
314
|
+
- Test with empty results and large datasets
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Excel Lookup Formulas
|
|
2
|
+
|
|
3
|
+
Reusable patterns for data lookups in Excel.
|
|
4
|
+
|
|
5
|
+
## XLOOKUP (Excel 365+)
|
|
6
|
+
|
|
7
|
+
### Basic XLOOKUP
|
|
8
|
+
```excel
|
|
9
|
+
=XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name])
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### XLOOKUP with Default Value
|
|
13
|
+
```excel
|
|
14
|
+
=XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name], "Not Found")
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### XLOOKUP Return Multiple Columns
|
|
18
|
+
```excel
|
|
19
|
+
=XLOOKUP(A2, tbl_Products[ID], tbl_Products[Name]:tbl_Products[Price])
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### XLOOKUP Approximate Match (Closest)
|
|
23
|
+
```excel
|
|
24
|
+
=XLOOKUP(A2, tbl_Brackets[Min], tbl_Brackets[Rate], , 1)
|
|
25
|
+
```
|
|
26
|
+
- `-1`: Exact match or next smaller
|
|
27
|
+
- `1`: Exact match or next larger
|
|
28
|
+
|
|
29
|
+
### XLOOKUP from Right to Left
|
|
30
|
+
```excel
|
|
31
|
+
=XLOOKUP(A2, tbl_Data[Email], tbl_Data[Name], , 0, -1)
|
|
32
|
+
```
|
|
33
|
+
- Last parameter `-1` searches from last to first
|
|
34
|
+
|
|
35
|
+
### Nested XLOOKUP (Two-Dimensional)
|
|
36
|
+
```excel
|
|
37
|
+
=XLOOKUP(B1, tbl_Matrix[Header], XLOOKUP(A2, tbl_Matrix[RowHeader], tbl_Matrix[Data]))
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## VLOOKUP / HLOOKUP
|
|
41
|
+
|
|
42
|
+
### Basic VLOOKUP
|
|
43
|
+
```excel
|
|
44
|
+
=VLOOKUP(A2, tbl_Products, 3, FALSE)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### VLOOKUP with MATCH for Dynamic Column
|
|
48
|
+
```excel
|
|
49
|
+
=VLOOKUP(A2, tbl_Products, MATCH(B1, tbl_Products[#Headers], 0), FALSE)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### HLOOKUP
|
|
53
|
+
```excel
|
|
54
|
+
=HLOOKUP(A1, tbl_Monthly, 3, FALSE)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## INDEX/MATCH
|
|
58
|
+
|
|
59
|
+
### Basic INDEX/MATCH
|
|
60
|
+
```excel
|
|
61
|
+
=INDEX(tbl_Products[Name], MATCH(A2, tbl_Products[ID], 0))
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### INDEX/MATCH with Multiple Criteria
|
|
65
|
+
```excel
|
|
66
|
+
=INDEX(tbl_Sales[Amount], MATCH(1, (tbl_Sales[Product]=A2)*(tbl_Sales[Region]=B2), 0))
|
|
67
|
+
```
|
|
68
|
+
Note: Enter as array formula (Ctrl+Shift+Enter) in older Excel
|
|
69
|
+
|
|
70
|
+
### Two-Way INDEX/MATCH
|
|
71
|
+
```excel
|
|
72
|
+
=INDEX(tbl_Matrix, MATCH(A2, tbl_Matrix[RowHeader], 0), MATCH(B1, tbl_Matrix[#Headers], 0))
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### INDEX/MATCH Return Multiple Columns
|
|
76
|
+
```excel
|
|
77
|
+
=INDEX(tbl_Products, MATCH(A2, tbl_Products[ID], 0), 0)
|
|
78
|
+
```
|
|
79
|
+
- Column `0` returns entire row
|
|
80
|
+
|
|
81
|
+
## Multiple Criteria Lookups
|
|
82
|
+
|
|
83
|
+
### XLOOKUP with Concatenated Key
|
|
84
|
+
```excel
|
|
85
|
+
=XLOOKUP(A2&B2, tbl_Data[Product]&tbl_Data[Region], tbl_Data[Sales], "Not Found")
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### SUMIFS for Sum with Criteria
|
|
89
|
+
```excel
|
|
90
|
+
=SUMIFS(tbl_Sales[Amount], tbl_Sales[Product], A2, tbl_Sales[Region], B2)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### FILTER for Multiple Results
|
|
94
|
+
```excel
|
|
95
|
+
=FILTER(tbl_Sales, (tbl_Sales[Product]=A2)*(tbl_Sales[Amount]>1000), "No results")
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Approximate Match Lookups
|
|
99
|
+
|
|
100
|
+
### XLOOKUP Approximate (Tax Brackets)
|
|
101
|
+
```excel
|
|
102
|
+
=XLOOKUP(A2, tbl_TaxBrackets[MinIncome], tbl_TaxBrackets[Rate], 0, -1)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### VLOOKUP Approximate
|
|
106
|
+
```excel
|
|
107
|
+
=VLOOKUP(A2, tbl_Grades, 2, TRUE)
|
|
108
|
+
```
|
|
109
|
+
Note: Data must be sorted ascending
|
|
110
|
+
|
|
111
|
+
### Grading with IFS
|
|
112
|
+
```excel
|
|
113
|
+
=IFS(A2>=90, "A", A2>=80, "B", A2>=70, "C", A2>=60, "D", TRUE, "F")
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Error Handling
|
|
117
|
+
|
|
118
|
+
### XLOOKUP with IFERROR (Legacy Compatibility)
|
|
119
|
+
```excel
|
|
120
|
+
=IFERROR(XLOOKUP(A2, Range1, Range2), "Not Found")
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### VLOOKUP with IFERROR
|
|
124
|
+
```excel
|
|
125
|
+
=IFERROR(VLOOKUP(A2, tbl_Products, 3, FALSE), "Not Found")
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Check if Value Exists
|
|
129
|
+
```excel
|
|
130
|
+
=IF(ISNA(MATCH(A2, tbl_Products[ID], 0)), "Not Found", "Found")
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Fuzzy Matching
|
|
134
|
+
|
|
135
|
+
### Partial Match with Wildcards
|
|
136
|
+
```excel
|
|
137
|
+
=XLOOKUP("*"&A2&"*", tbl_Products[Name], tbl_Products[ID], "Not Found", 2)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### First Word Match
|
|
141
|
+
```excel
|
|
142
|
+
=XLOOKUP(LEFT(A2, FIND(" ", A2)-1)&"*", tbl_Products[Name], tbl_Products[ID], "Not Found", 2)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Dynamic Arrays
|
|
146
|
+
|
|
147
|
+
### Return All Matches
|
|
148
|
+
```excel
|
|
149
|
+
=FILTER(tbl_Sales, tbl_Sales[Product]=A2)
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Unique Values from Lookup
|
|
153
|
+
```excel
|
|
154
|
+
=UNIQUE(FILTER(tbl_Sales[Customer], tbl_Sales[Product]=A2))
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Sorted Lookup Results
|
|
158
|
+
```excel
|
|
159
|
+
=SORT(FILTER(tbl_Sales, tbl_Sales[Region]=A2), 1, 1)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Usage Notes
|
|
163
|
+
|
|
164
|
+
- Prefer XLOOKUP over VLOOKUP for new spreadsheets
|
|
165
|
+
- Use structured references (Table[Column]) for clarity
|
|
166
|
+
- XLOOKUP handles #N/A with built-in default value
|
|
167
|
+
- INDEX/MATCH is more flexible than VLOOKUP
|
|
168
|
+
- Consider FILTER for returning multiple matches
|
|
169
|
+
- Test with edge cases: blank cells, duplicates, not found
|