Recent Discussions
The Diagonal Suite: Gentle thunking goes a long way!
I've become a big advocate for gentle thunking - using thunks to delay eager evaluation wherever possible in generalized Lambda development. The timings are quicker and the logic is cleaner. On the other hand, thunking the results of MAP, BYROW, or BYCOL - especially when it leads to rows of thunks - tends to introduce recombination overhead and complexity. I think thunking is often dismissed as “too complex,” and that’s understandable if someone’s first exposure involves unwrapping a row of thunks. When used gently thunking becomes indispensable. Typically, I introduce the thunks after the initial benchmarking to see the difference in the calculation times and the after is always quicker. To illustrate, I’ll share The Diagonal Suite - a collection of functions where thunking is used at every opportunity. Simple, clean, deferred logic. What are your thoughts on gentle thunking? Where have you found it helpful/harmful in your own Lambda development? //The Diagonal Suite - Version 1.0 - 10/27/2025 //Author: Patrick H. //Description: Directional traversal and diagonal logic for 2D arrays. // Functions: // • Traverseλ - Directional traversal engine // • ByDiagλ - Diagonal-based aggregation // • DiagMapλ - Wrapper for diagonal matrix extraction // • DiagIndexλ - Targeted diagonal extraction // • Staircaseλ - Construct diagonal staircases from a vector or 2D array //──────────────────────────────────────────────────────────── //------------------------------------------------------------------------------------------- //Traverseλ - Directional Axis Remapper //------------------------------------------------------------------------------------------- //The selected axis is remapped to the top-left traversal order. //Accepted directions: // "NE" or 1 → Northeast (↗) // "SE" or 2 → Southeast (↘) // "SW" or 3 → Southwest (↙) //Parameters: //array → 2D input array (scalars not accepted) //new_axis → Axis direction ("NE", "SE", "SW" or 1–3) Traverseλ = LAMBDA( array, new_axis, //Input validation IF(OR(ROWS(array)=1,COLUMNS(array)=1), "#2D-ARRAY!", IF(AND(ISNUMBER(new_axis),OR(new_axis<=0,new_axis>3)),"#AXIS!", LET( //Dimensions i, ROWS(array), j, COLUMNS(array), //Axis traversal indices (deferred) x_NE, LAMBDA(SEQUENCE(j,,1,0)*SEQUENCE(,i)), y_NE, LAMBDA(SEQUENCE(j,,j,-1)*SEQUENCE(,i,1,0)), x_SE, LAMBDA(SEQUENCE(i,,i,-1)*SEQUENCE(,j,1,0)), y_SE, LAMBDA(SEQUENCE(i,,j,0)+SEQUENCE(,j,0,-1)), x_SW, LAMBDA(SEQUENCE(j,,i,0)+SEQUENCE(,i,0,-1)), y_SW, LAMBDA(SEQUENCE(j,,1)*SEQUENCE(,i,1,0)), //Axis mode selection mode, IF(ISNUMBER(new_axis),new_axis, SWITCH(new_axis,"NE",1,"SE",2,"SW",3,1)), //Index selection x, CHOOSE(mode,x_NE,x_SE,x_SW), y, CHOOSE(mode,y_NE,y_SE,y_SW), //Unwrap indices and get results result, INDEX(array,x(),y()), result ) ))); //------------------------------------------------------------------------------------------- //ByDiagλ - Diagonal-based aggregation //------------------------------------------------------------------------------------------- //Apply an ETA function or Lambda to diagonals //Parameters: //array → 2D input array (scalars not accepted) //[function] → ETA function or Lambda applied to diagonals //[row_wise_stack?] → Optional: Display results as a vertical stack ByDiagλ = LAMBDA( array, [function], [row_wise_stack?], //Check array input ValidateDiagλ(array,,function,row_wise_stack?, LET( //Optional parameters No_Function, ISOMITTED(function), No_row_wise_stack,ISOMITTED(row_wise_stack?), //Dimensions i, ROWS(array), j, COLUMNS(array), //Diagonal count k, MIN(i,j), //Indices - deferred r, LAMBDA(SEQUENCE(k)*SEQUENCE(,j,1,0)), y, LAMBDA(SEQUENCE(k)+SEQUENCE(,j,0,1)), c, LAMBDA(IF(y()>j,NA(),y())), //Unwrap indices, shape, and aggregate result, IFNA(INDEX(array,r(),c()),""), shaped, IF(No_row_wise_stack,result,TRANSPOSE(result)), final, IF(No_Function,shaped, IF(No_row_wise_stack,BYCOL(shaped,function), BYROW(shaped,function))), final ))); //------------------------------------------------------------------------------------------- //DiagMapλ - Wrapper (Calls ByDiagλ) to extract diagonals as 2D matrix //------------------------------------------------------------------------------------------- //Calls ByDiagλ to extract the diagonals from a 2D array. //Parameters: *Please see ByDiagλ for descriptions.** DiagMapλ = LAMBDA( array, [row_wise_stack?], ByDiagλ(array,,row_wise_stack?) ); //------------------------------------------------------------------------------------------- //DiagIndexλ - Targeted diagonal extraction //------------------------------------------------------------------------------------------- //Extract a diagonal or anti-diagonal vector from a 2D array. //Parameters: //array → 2D input array (scalars not accepted) //col_index → Column number to start from. Negative = anti-diagonal DiagIndexλ = LAMBDA( array, col_index, //Input checks ValidateDiagλ(array,col_index,,, LET( //Dimensions i, ROWS(array), j, COLUMNS(array), //Diagonal direction: +1 = SE, –1 = SW s, SIGN(col_index), //Determine diagonal length based on bounds k, IF(s>0, MIN(i, j + 1 - col_index), MIN(i, ABS(col_index))), start, IF(s<0,ABS(col_index),col_index), //Indices - deferred x, LAMBDA(SEQUENCE(k)), y, LAMBDA(SEQUENCE(k,,start,s)), //Unwrap indices and extract vector deliver, INDEX(array,x(),y()), deliver ))); //------------------------------------------------------------------------------------------- //Staircaseλ — Construct diagonal staircases from a vector or 2D array //------------------------------------------------------------------------------------------- //Parameters: //array → Input array (flattened to vector row-wise) //block_size → Number of rows/columns per staircase block //[block_offset] → Optional padding between staircases //[IsHorizontal?] → Optional toggle for column-wise orientation //[IsAntiDiag?] → Optional toggle to display staircase anti-diagonal. Staircaseλ = LAMBDA( array, block_size, [block_offset], [IsHorizontal?], [IsAntiDiag?], //Check inputs ValidateStaircaseλ(array,block_size,block_offset, LET( //Check optional parameters no_Block_Offset, ISOMITTED(block_offset), zero_Offset, block_offset=0, col_offset, IF(No_Block_Offset,0,block_offset), IsVertical?, ISOMITTED(IsHorizontal?), Not_Anti_Diag, ISOMITTED(IsAntiDiag?), //Convert to vector and get dimensions flat, TOCOL(array), k, COUNTA(flat), seq, LAMBDA(SEQUENCE(k)), V, TOROW(EXPAND(WRAPROWS(seq(),block_size),, block_size+block_offset,0)), width, COLUMNS(V), //Anchors and indices - deferred i, LAMBDA(SEQUENCE(block_size)*SEQUENCE(,width,1,0)), col_arr, LAMBDA(IF(Not_Anti_Diag,SEQUENCE(,width), SEQUENCE(,width,width,-1))), j, LAMBDA(MOD(col_arr(),block_size+block_offset)), j_, LAMBDA(IF((no_Block_Offset)+(zero_Offset), IF(j()=0,block_size,j()),j())), idx, LAMBDA(IF(i()=j_(),V,NA())), //Obtain results, shape, and calculate result, DROP(IFNA(INDEX(flat,idx()),""),,-col_offset), final, IF(IsVertical?,TRANSPOSE(result),result), final ))); //---------------------Error Handling & Validation--------------------------- //Validates inputs for Staircaseλ. Please see Staircaseλ for parameter //descriptions. ValidateStaircaseλ = LAMBDA( array, block_size, [block_offset], [on_valid], LET( //Checks NotArray,TYPE(array)<>64, Invalid_block_size, OR(ISTEXT(block_size),block_size<=0,block_size>COUNTA(array)), Invalid_block_offset, OR(ISTEXT(block_offset),block_offset<0), //Logic gate IF(NotArray, "#NOT-ARRAY!", IF(Invalid_block_size, "#BLOCK-SIZE!", IF(Invalid_block_offset,"#BLOCK-OFFSET", on_valid)))) ); //---------------------Error Handling & Validation--------------------------- //Validate inputs for ByDiagλ, DiagMapλ, and DiagIndexλ. //*Please see those functions for parameter descriptions.* ValidateDiagλ= LAMBDA( array, [col_index], [function], [row_wise_stack?], [on_valid], LET( //---Checks--- //Array input IsArray?, TYPE(array)=64, Not_Array, NOT(IsArray?), //Col_index No_Col_Index, ISOMITTED(col_index), Col_Index_Included, NOT(No_Col_Index), Not_Valid_Col_Index?, NOT(AND(col_index<>0, ABS(col_index)<=COLUMNS(array))), //Function No_Function, ISOMITTED(function), Function_Included, NOT(No_Function), Invalid_Function?, AND(ISERROR(BYROW({1,1},function))), //Shaping input RowWiseStack?, NOT(ISOMITTED(row_wise_stack?)), //Deterine which function is being validated DiagIndex, Col_Index_Included, ByDiag, AND(No_Col_Index, Function_Included), DiagMap, AND(No_Col_Index, No_Function), //Logic gates //DiagIndexλ a, IF(Not_Array, "#NOT-ARRAY!", IF(Not_Valid_Col_Index?,"#COLUMN-INDEX!", on_valid)), //ByDiagλ b, IF(Not_Array, "#NOT-ARRAY!", IF(Invalid_Function?, "#FUNCTION!", on_valid)), //DiagMapλ c, IF(Not_Array, "#NOT-ARRAY!", on_valid), //Logic gate selection decide, IF(DiagIndex,a, IF(DiagMap,c, IF(ByDiag,b, "#UNROUTED!"))), decide )); //End of The Diagonal Suite - Version 1.0 //Author: Patrick H.8Views0likes0CommentsModernizing Sensitivity Label Grouping for App Display
Microsoft announced the modernization of grouping for sensitivity labels to a new “dynamic architecture.” It doesn’t take much to be more dynamic than the previous parent-child arrangement. Even if the announcement is a tad overhyped, it’s still goodness because administrators can now move labels between label groups in a way that wasn’t possible before. The new way of displaying labels should be everywhere in December 2025. https://office365itpros.com/2025/10/29/sensitivity-labels-groups/16Views1like0CommentsFormula in Excel Spreadsheet not work
Hi Sir, Picture 1 shows the desired condition, where the row of the spreadsheet turns orange when the SPT (N) is more than 50. However, it will not work where the SPT (N) at row 47 become 0. All rows below row 48 become orange colour as picture 2. https://mega.nz/folder/g5dizZqR#7Pk7eyU0hXZTL6sj3qVJ-g. We attach the file in follows link for your further action. Thanks.42Views0likes1Comment- 16Views0likes1Comment
Unified Company Calendar for Mixed Microsoft 365 and Non-365 Users – 2025
Seeking a Shared Calendar Solution for Mixed Microsoft 365 and Non-365 Users I’m working on a solution to create a shared company calendar that everyone in our organization can view, while keeping editing permissions limited to a few selected individuals. The challenge: Some of our team members do not use Microsoft 365, and I’d like them to still be able to subscribe to or view the calendar and receive updates. Ideally, this should work without requiring full Microsoft accounts. I initially considered using an ICS-based calendar, but it seems Microsoft 365 Group calendars don’t support sharing via ICS links. I also explored creating a Group calendar as suggested in other threads, but ran into issues making it accessible to external users or those without 365 accounts. For context, I’m a Global Admin, so I have full access to configure settings in the Microsoft 365 Admin Center and Exchange if needed. We’re a small business, and our main goal is to have a centralized calendar for vacation schedules and company-wide events. It should be simple to access and maintain, with a focus on collaboration and accessibility across the board. What I’m looking for: A calendar that’s viewable by all, including non-M365 users Editable only by a few delegated team members Compatible with Microsoft 365, but not dependent on it for basic access Any tools, workarounds, or best practices that have worked for others in similar hybrid environments4Views0likes0CommentsMS Forms branching option is not visible to individual answers in multiselect question
HELLO, I am working on a form. Question type is choice where user can select "Multiple Answers" and based on selected answer, subsequent question should be visible. To achieve this, i want to add branching to main question but i do not see the option to do so. How to achieve this ? NO branching option :31Views0likes1CommentSolver in Excel - Variable Limitation
Hi All, I built a model in Excel to solve 1d Cutlist optimization, model works great and gives optimal results But when there is complex cutting patterns that results in more than 250 cutting combinations model totally fails fails due to the limitation of solver to handle more than 250 variables with integer constraints. using simplex LP, I created model years ago but unable to use it Hoping Microsoft has this in the list to fix this limitation in coming versions ?9Views0likes0CommentsWhy Outlook Locks You Out After Deleting Thousands of Emails — And How to Fix It Fast
We’ve all been there — your Outlook or Hotmail inbox is overflowing with thousands of old messages, and you decide to clean house. You select all, hit delete, and feel relieved… until you try to open your mailbox again and get hit with a dreaded message: “We’ve temporarily limited your account.” Welcome to the world of Outlook throttling — Microsoft’s way of protecting its servers (and your account) from overload or suspicious activity. But don’t worry, it’s usually temporary and easy to fix. https://dellenny.com/why-outlook-locks-you-out-after-deleting-thousands-of-emails-and-how-to-fix-it-fast/21Views0likes0CommentsData Residency and Compliance in the Microsoft Cloud with Microsoft 365
In today’s globally connected world, organisations face growing pressure to ensure data is stored, managed, and protected in accordance with national borders and data-sovereignty laws. For users of Microsoft 365 and the wider Microsoft Cloud, understanding data residency and compliance is essential to maintaining trust and meeting legal obligations. https://dellenny.com/data-residency-and-compliance-in-the-microsoft-cloud-microsoft-365-governance-guide/14Views0likes0CommentsHow Cloud Computing Improves Business Agility and the Role of Microsoft 365
In today’s fast-moving business world, agility isn’t just a nice-to-have—it’s essential. The ability to respond quickly to market changes, launch new offerings, support remote or hybrid work, and scale resources up or down can define success. One of the foundational enablers of that agility is cloud computing. Further, productivity and collaboration platforms such as Microsoft 365 (M365) help turn those capabilities into everyday business reality. Here’s how cloud computing boosts agility, and how Microsoft 365 fits into the picture. https://dellenny.com/how-cloud-computing-improves-business-agility-and-the-role-of-microsoft-365/8Views0likes0CommentsPartner Intune reporting questions
I need some help for my global partner- SHI International. We have a monthly services modernization briefing with the SHI M365 practice team. They have a need around 1-2 Q&A deep-dive sessions where their team of M365 experts want to ask some in=depth technical and pre-sales related questions related to Intune Reporting Challenges and Customer Pain Points, Current Intune Reporting Limitations, Technical Barriers to Reporting, Permissions and Consent Model Confusion, Feedback on Documentation and User Experience. Appreciate any guidance on a PSA SME on this topic or a global black belt, that would be great. Appreciate if you can point me to the latest updated documentation on this topic. I reached out to several folks in the PSA team with no luck yet. Thanks!10Views0likes0CommentsHelp Needed: Add Interactive Dashboard to Landowner Engagement Tracker (Same Sheet)
Hi all, I’ve built a basic Excel tracker to monitor engagement with landowners for a large infrastructure project. The purpose of the tracker is to: Show progress tracking of each case of for the project director to monitor progress help the Project Director Identify which cases may require statutory powers to secure access (if voluntary agreement isn’t possible) This helps our leadership team make informed decisions quickly. What I’ve got: A sheet called "LANDS RIGHT TRACKER" Columns include: Reference Number Agreement Status Case Status Risk Level (High/Medium/Low) Willingness to enter agreement Reason for refusal Flag for whether statutory powers may be needed 🛡️ All data is fictitious — names and details are placeholders, so no privacy concerns. What I need help with: my level of excel knowledge is very basic and I was hoping for some assistance to: Add an interactive dashboard and key metrics directly on the same sheet (not a separate worksheet). The below is just my suggestions as you are the expert your guidance expertise is much welcomed, happy for you to put it straight on to the tracker as I have left a section on the tracker for you to insert your items Ideally using a Pivot Table and Slicers to filter by: Case Status Risk Level Agreement Status Willingness to enter agreement https://docs.google.com/spreadsheets/d/1c2IJ-YLsTN-DZE9ltw0JR-nGVuuGzTKE/edit?usp=drivesdk&ouid=104511246399228274463&rtpof=true&sd=true26Views0likes1CommentRequest: Please Professionally Enhance My Gantt Chart Template
Hi everyone, I’ve created a basic Excel Gantt chart template for suppliers to use when discussing project timelines with landowners. The chart lists tasks on the left and shows the duration of works by month from October 2025 to April 2026. My Excel skills are quite basic, so I’d really appreciate if someone could directly improve the template for me. Specifically, I’m looking for: A more professional and visually appealing layout Clearer formatting for tasks and timelines Automatic highlighting of active months for each task Conditional formatting to make the chart easier to read Any other practical enhancements that would make it more effective for supplier discussionshttps://docs.google.com/spreadsheets/d/1SdPU8HEsHDjOHljwYsPnRmRHHNrJ5Whq/edit?usp=drivesdk&ouid=104511246399228274463&rtpof=true&sd=true This is only a template and contains no sensitive data. I’ve attached the file—please feel free to make changes directly to the chart. Thank you very much for your help!9Views0likes0CommentsExcel/VBA Worksheet_Change function running old version
I wrote a Worksheet_Change function initially. It worked. If I entered an incorrect value I got an error message, let's say the msgbox said "Error: A". Then I changed the error message to read "Error B". No matter what I have tried to do, rename the sheet, Debug>Compile VBA Project, etc, nothing can remove the old error message from appearing. I have tried every suggestion Copilot has made without success. I rebooted my machine. I am using Microsoft Office for Home and Student 2021 running on Windows 11 Pro. Does anyone know what might be the matter? Microsoft chat was totally useless and I am pretty sure Copilot is masquerading as a human in chat support because the wording and suggestions mirrored exactly what I encountered with Copilot, so that was a giant waste of my time. If there's anyone who can help, I would welcome hearing from you with suggestions.25Views0likes1Comment
Events
Recent Blogs
- Your favorite Microsoft 365 apps now feature Liquid Glass styling and a new search experience for templates.Oct 29, 2025105Views0likes0Comments
- 3 MIN READThis month, we explore why metadata unlocks smarter responses from Copilot and agents, and how Knowledge Agent in SharePoint can streamline the process of adding metadata to files.Oct 29, 202594Views0likes0Comments