@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.
Files changed (193) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/.mcp.json +25 -0
  3. package/AGENTS.md +244 -0
  4. package/CHANGELOG.md +265 -0
  5. package/LICENSE +21 -0
  6. package/README.md +211 -0
  7. package/bin/build-plugin.js +30 -0
  8. package/bin/cli.js +1064 -0
  9. package/bin/commands/add.js +533 -0
  10. package/bin/commands/add.test.js +77 -0
  11. package/bin/commands/build-desktop.js +166 -0
  12. package/bin/commands/changelog.js +443 -0
  13. package/bin/commands/diff.js +325 -0
  14. package/bin/commands/lint.js +419 -0
  15. package/bin/commands/lint.test.js +103 -0
  16. package/bin/commands/mcp-setup.js +246 -0
  17. package/bin/commands/pull.js +287 -0
  18. package/bin/commands/pull.test.js +36 -0
  19. package/bin/commands/push.js +231 -0
  20. package/bin/commands/push.test.js +14 -0
  21. package/bin/commands/search.js +344 -0
  22. package/bin/commands/search.test.js +115 -0
  23. package/bin/commands/setup.js +545 -0
  24. package/bin/commands/setup.test.js +46 -0
  25. package/bin/commands/sync-profile.js +405 -0
  26. package/bin/commands/sync-profile.test.js +14 -0
  27. package/bin/commands/sync-source.js +418 -0
  28. package/bin/commands/sync-source.test.js +14 -0
  29. package/bin/commands/watch.js +206 -0
  30. package/bin/lib/generators/claude-plugin.js +266 -0
  31. package/bin/lib/generators/claude-plugin.test.js +110 -0
  32. package/bin/lib/generators/index.js +116 -0
  33. package/bin/lib/generators/shared.js +282 -0
  34. package/bin/lib/licensing/index.js +35 -0
  35. package/bin/lib/licensing/storage.js +364 -0
  36. package/bin/lib/licensing/storage.test.js +55 -0
  37. package/bin/lib/licensing/validator.js +213 -0
  38. package/bin/lib/licensing/validator.test.js +137 -0
  39. package/bin/lib/microsoft-mcp.js +176 -0
  40. package/bin/lib/microsoft-mcp.test.js +106 -0
  41. package/bin/lib/skills.js +84 -0
  42. package/bin/mcp/powerbi-modeling-launcher.js +38 -0
  43. package/bin/postinstall.js +44 -0
  44. package/bin/utils/errors.js +159 -0
  45. package/bin/utils/git.js +298 -0
  46. package/bin/utils/logger.js +142 -0
  47. package/bin/utils/mcp-detect.js +274 -0
  48. package/bin/utils/mcp-detect.test.js +105 -0
  49. package/bin/utils/pbix.js +305 -0
  50. package/bin/utils/pbix.test.js +37 -0
  51. package/bin/utils/profiles.js +312 -0
  52. package/bin/utils/projects.js +168 -0
  53. package/bin/utils/readline.js +206 -0
  54. package/bin/utils/readline.test.js +47 -0
  55. package/bin/utils/tui.js +314 -0
  56. package/bin/utils/tui.test.js +127 -0
  57. package/commands/contributions.md +265 -0
  58. package/commands/data-model-design.md +468 -0
  59. package/commands/dax-doctor.md +248 -0
  60. package/commands/fabric-scripts.md +452 -0
  61. package/commands/migration-assistant.md +290 -0
  62. package/commands/model-documenter.md +242 -0
  63. package/commands/pbi-connect.md +239 -0
  64. package/commands/project-kickoff.md +905 -0
  65. package/commands/report-layout.md +296 -0
  66. package/commands/rls-design.md +533 -0
  67. package/commands/theme-tweaker.md +624 -0
  68. package/config.example.json +23 -0
  69. package/config.json +23 -0
  70. package/desktop-extension/manifest.json +37 -0
  71. package/desktop-extension/package.json +10 -0
  72. package/desktop-extension/server.js +95 -0
  73. package/docs/openrouter-free-models.md +92 -0
  74. package/library/examples/README.md +151 -0
  75. package/library/examples/finance-reporting/README.md +351 -0
  76. package/library/examples/finance-reporting/data-model.md +267 -0
  77. package/library/examples/finance-reporting/measures.dax +557 -0
  78. package/library/examples/hr-analytics/README.md +371 -0
  79. package/library/examples/hr-analytics/data-model.md +315 -0
  80. package/library/examples/hr-analytics/measures.dax +460 -0
  81. package/library/examples/marketing-analytics/README.md +37 -0
  82. package/library/examples/marketing-analytics/data-model.md +62 -0
  83. package/library/examples/marketing-analytics/measures.dax +110 -0
  84. package/library/examples/retail-analytics/README.md +439 -0
  85. package/library/examples/retail-analytics/data-model.md +288 -0
  86. package/library/examples/retail-analytics/measures.dax +481 -0
  87. package/library/examples/supply-chain/README.md +37 -0
  88. package/library/examples/supply-chain/data-model.md +69 -0
  89. package/library/examples/supply-chain/measures.dax +77 -0
  90. package/library/examples/udf-library/README.md +228 -0
  91. package/library/examples/udf-library/functions.dax +571 -0
  92. package/library/snippets/dax/README.md +292 -0
  93. package/library/snippets/dax/business-domains.md +576 -0
  94. package/library/snippets/dax/calculate-patterns.md +276 -0
  95. package/library/snippets/dax/calculation-groups.md +489 -0
  96. package/library/snippets/dax/error-handling.md +495 -0
  97. package/library/snippets/dax/iterators-and-aggregations.md +474 -0
  98. package/library/snippets/dax/kpis-and-metrics.md +293 -0
  99. package/library/snippets/dax/rankings-and-topn.md +235 -0
  100. package/library/snippets/dax/security-patterns.md +413 -0
  101. package/library/snippets/dax/text-and-formatting.md +316 -0
  102. package/library/snippets/dax/time-intelligence.md +196 -0
  103. package/library/snippets/dax/user-defined-functions.md +477 -0
  104. package/library/snippets/dax/virtual-tables.md +546 -0
  105. package/library/snippets/excel-formulas/README.md +84 -0
  106. package/library/snippets/excel-formulas/aggregations.md +330 -0
  107. package/library/snippets/excel-formulas/dates-and-times.md +361 -0
  108. package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
  109. package/library/snippets/excel-formulas/lookups.md +169 -0
  110. package/library/snippets/excel-formulas/text-functions.md +363 -0
  111. package/library/snippets/governance/naming-conventions.md +97 -0
  112. package/library/snippets/governance/review-checklists.md +107 -0
  113. package/library/snippets/power-query/README.md +389 -0
  114. package/library/snippets/power-query/api-integration.md +707 -0
  115. package/library/snippets/power-query/connections.md +434 -0
  116. package/library/snippets/power-query/data-cleaning.md +298 -0
  117. package/library/snippets/power-query/error-handling.md +526 -0
  118. package/library/snippets/power-query/parameters.md +350 -0
  119. package/library/snippets/power-query/performance.md +506 -0
  120. package/library/snippets/power-query/transformations.md +330 -0
  121. package/library/snippets/report-design/accessibility.md +78 -0
  122. package/library/snippets/report-design/chart-selection.md +54 -0
  123. package/library/snippets/report-design/layout-patterns.md +87 -0
  124. package/library/templates/data-models/README.md +93 -0
  125. package/library/templates/data-models/finance-model.md +627 -0
  126. package/library/templates/data-models/retail-star-schema.md +473 -0
  127. package/library/templates/excel/README.md +83 -0
  128. package/library/templates/excel/budget-tracker.md +432 -0
  129. package/library/templates/excel/data-entry-form.md +533 -0
  130. package/library/templates/power-bi/README.md +72 -0
  131. package/library/templates/power-bi/finance-report.md +449 -0
  132. package/library/templates/power-bi/kpi-scorecard.md +461 -0
  133. package/library/templates/power-bi/sales-dashboard.md +281 -0
  134. package/library/themes/excel/README.md +436 -0
  135. package/library/themes/power-bi/README.md +271 -0
  136. package/library/themes/power-bi/accessible.json +307 -0
  137. package/library/themes/power-bi/bi-superpowers-default.json +858 -0
  138. package/library/themes/power-bi/corporate-blue.json +291 -0
  139. package/library/themes/power-bi/dark-mode.json +291 -0
  140. package/library/themes/power-bi/minimal.json +292 -0
  141. package/library/themes/power-bi/print-friendly.json +309 -0
  142. package/package.json +93 -0
  143. package/skills/contributions/SKILL.md +267 -0
  144. package/skills/data-model-design/SKILL.md +470 -0
  145. package/skills/data-modeling/SKILL.md +254 -0
  146. package/skills/data-quality/SKILL.md +664 -0
  147. package/skills/dax/SKILL.md +708 -0
  148. package/skills/dax-doctor/SKILL.md +250 -0
  149. package/skills/dax-udf/SKILL.md +489 -0
  150. package/skills/deployment/SKILL.md +320 -0
  151. package/skills/excel-formulas/SKILL.md +463 -0
  152. package/skills/fabric-scripts/SKILL.md +454 -0
  153. package/skills/fast-standard/SKILL.md +509 -0
  154. package/skills/governance/SKILL.md +205 -0
  155. package/skills/migration-assistant/SKILL.md +292 -0
  156. package/skills/model-documenter/SKILL.md +244 -0
  157. package/skills/pbi-connect/SKILL.md +241 -0
  158. package/skills/power-query/SKILL.md +406 -0
  159. package/skills/project-kickoff/SKILL.md +907 -0
  160. package/skills/query-performance/SKILL.md +480 -0
  161. package/skills/report-design/SKILL.md +207 -0
  162. package/skills/report-layout/SKILL.md +298 -0
  163. package/skills/rls-design/SKILL.md +535 -0
  164. package/skills/semantic-model/SKILL.md +237 -0
  165. package/skills/testing-validation/SKILL.md +643 -0
  166. package/skills/theme-tweaker/SKILL.md +626 -0
  167. package/src/content/base.md +237 -0
  168. package/src/content/mcp-requirements.json +69 -0
  169. package/src/content/routing.md +203 -0
  170. package/src/content/skills/contributions.md +259 -0
  171. package/src/content/skills/data-model-design.md +462 -0
  172. package/src/content/skills/data-modeling.md +246 -0
  173. package/src/content/skills/data-quality.md +656 -0
  174. package/src/content/skills/dax-doctor.md +242 -0
  175. package/src/content/skills/dax-udf.md +481 -0
  176. package/src/content/skills/dax.md +700 -0
  177. package/src/content/skills/deployment.md +312 -0
  178. package/src/content/skills/excel-formulas.md +455 -0
  179. package/src/content/skills/fabric-scripts.md +446 -0
  180. package/src/content/skills/fast-standard.md +501 -0
  181. package/src/content/skills/governance.md +197 -0
  182. package/src/content/skills/migration-assistant.md +284 -0
  183. package/src/content/skills/model-documenter.md +236 -0
  184. package/src/content/skills/pbi-connect.md +233 -0
  185. package/src/content/skills/power-query.md +398 -0
  186. package/src/content/skills/project-kickoff.md +899 -0
  187. package/src/content/skills/query-performance.md +472 -0
  188. package/src/content/skills/report-design.md +199 -0
  189. package/src/content/skills/report-layout.md +290 -0
  190. package/src/content/skills/rls-design.md +527 -0
  191. package/src/content/skills/semantic-model.md +229 -0
  192. package/src/content/skills/testing-validation.md +635 -0
  193. 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