developer
8008 TopicsHow to unlink cells in Format Control
I am developing a survey in excel (because the questions are complicated and long and do not format well in e.g. MS Forms) and using option buttons to choose responses. Each question has 6 potential responses. In developer I have inserted a group box, into which I placed 6 option buttons. After formatting the buttons so that they snap to the excel grid I then linked them to a cell to make calculating responses easier. On-line advice then suggested that I could copy and paste these to each new question. However, by doing this, I am only able to choose 1 option as they are ALL linked to the same cell. How do I unlink each group box of 6 option buttons so that I can link each group individually to a different cell for each question? Or - do I have to create a group box and option boxes from scratch for each question set? I have removed the questions for simplicity of view (note that there are 6 in Q1 and Q2 not visible) and highlighted the linked cell from Q1. As you can see - for Q5 this has given an answer of 26 (the 26th option button) rather than 2 (the 2nd button in Q5)35Views0likes1CommentWrapRows2Dλ / WrapCols2Dλ: Fast, efficient 2D wrapping without flattening
Background One of Excel's biggest weaknesses is in working with 2D arrays as objects that can be re-shaped. WRAPROWS/WRAPCOLS do not accept 2D arrays (#VALUE!) and are strictly for shaping 1D arrays. The usual workarounds involve flattening with TOROW/TOCOL then re-shaping with WRAPROWS/WRAPCOLS, REDUCE used as an iterator to stack (do-able but slow), and even MAKEARRAY (do-able, but not instinctive and slow). The Goal Fast, efficient 2D wrapping without flattening. The Approach Pure deferred i/j indexing with modular math and sequencing. The function and sample workbook is provided below. I welcome any and all feedback: suggestions for improvement, your approach to 2D shaping, etc. // Fast, efficient 2D wrapping without flattening //----------------------------------------------------------------------------------- //---WrapCols2Dλ--- //----------------------------------------------------------------------------------- //Author: Patrick H. //Date: 1/28/2026 //Version: 1.0 // //Description: //Wrap a 2D array into column blocks of a specified width while preserving row height. //The wrapped blocks are stacked vertically in the output. //Jagged or uneven final blocks are padded with NA() by default, unless a fill value //is supplied via the optional pad_with parameter. // //----------------------------------------------------------------------------------- //Parameter Description //array - 2D array to be wrapped (1D arrays not supported) //new_width - Number of columns in each wrapped block // //Optional Description //pad_with - Fill value used to pad incomplete blocks. If omitted, NA() is used. // //Lambda called: Echoλ WrapCols2Dλ= LAMBDA( array, new_width, [pad_with], //Check inputs LET( //Shape h, ROWS(array), w, COLUMNS(array), blocks, CEILING(w/new_width,1), //Optional pad_with, IF(ISOMITTED(pad_with),NA(),pad_with), //Total rows when wrapped r, blocks * h, //Scenarios Is1D?, OR(h = 1,w = 1), IsScalar?, AND(h = 1, w = 1), InvalidDim?,new_width >= w, SpillRisk?, r > 1048576, //Logic gate IF(IsScalar?,#VALUE!, IF(Is1D?,#VALUE!, IF(InvalidDim?,"#WIDTH!", IF(SpillRisk?,#NUM!, //Proceed LET( //Indices - deferred modulo, LAMBDA(MOD(SEQUENCE(r),h)), i, LAMBDA(IF(modulo() = 0, h, modulo()) * SEQUENCE(,new_width,1,0)), j, LAMBDA(Echoλ(SEQUENCE(r / h,,1,new_width),h) + SEQUENCE(,new_width,0,1)), //Wrapped array result, IFERROR(INDEX(array,i(),j()),pad_with), result ))))))); //----------------------------------------------------------------------------------- //---WrapRows2Dλ--- //----------------------------------------------------------------------------------- //Author: Patrick H. //Date: 1/28/2026 //Version: 1.0 // //Description: //Wrap a 2D array into row blocks of a specified height while preserving column width. //The wrapped blocks are stacked horizontally in the output. //Jagged or uneven final blocks are padded with NA() by default, unless a fill value //is supplied via the optional pad_with parameter. // //----------------------------------------------------------------------------------- //Parameter Description //array - 2D array to be wrapped (1D arrays not supported) //new_height - Number of rows in each wrapped block // //Optional Description //pad_with - Fill value used to pad incomplete blocks. If omitted, NA() is used. // //Lambda called: Echoλ WrapRows2Dλ= LAMBDA( array, new_height, [pad_with], //Check inputs LET( //Shape h, ROWS(array), w, COLUMNS(array), blocks, CEILING(h/new_height,1), //Optional pad_with, IF(ISOMITTED(pad_with),NA(),pad_with), //Total columns when unwrapped c, blocks * w, //Scenarios Is1D?, OR(h = 1,w = 1), IsScalar?, AND(h = 1, w = 1), InvalidDim?,new_height >= h, SpillRisk?, c > 16384, //Logic gate IF(IsScalar?,#VALUE!, IF(Is1D?,#VALUE!, IF(InvalidDim?,"#HEIGHT!", IF(SpillRisk?,#NUM!, //Proceed LET( //Indices - deferred i, LAMBDA(TOROW(Echoλ(SEQUENCE(,blocks,1,new_height),w)) + SEQUENCE(new_height,,0,1)), modulo, LAMBDA(MOD(SEQUENCE(,w * blocks),w)), j, LAMBDA(IF(modulo()=0,w,modulo()) * SEQUENCE(new_height,,1,0)), //Wrapped array result, IFERROR(INDEX(array,i(),j()),pad_with), result ))))))); //----------------------------------------------------------------------------------- //Echoλ //----------------------------------------------------------------------------------- //Author: Patrick H. //Date: 11/7/2025 //Version: 1.0 //Description: //Repeat each element in a supplied 1D array by specifying the repeat counts. //Arrays and scalars are supported. //----------------------------------------------------------------------------------- //vector - 1D array or scalar to be echoed //repeat - 1D array of repeat counts (must be numeric and ≥1) Echoλ = LAMBDA( vector, repeat, //Check inputs IF(OR(ISTEXT(repeat),repeat<=0),#VALUE!, LET( //Flatten inputs vector, TOCOL(vector), repeat, TOCOL(repeat), //Dimensions and row indexing V↕, ROWS(vector), R↕,ROWS(repeat), r, IF(V↕<>R↕,EXPAND(repeat,V↕,,@TAKE(repeat,-1)), repeat), i, SEQUENCE(ROWS(r)), m, MAX(r), idx, LAMBDA(TOCOL(IF(SIGN(r-SEQUENCE(,m,0,))=1,i,NA()),2)), //Unwrap idx but defer delivery until function invocation deliver, LAMBDA(INDEX(vector,idx())), deliver ))()); Workbook attached and linked in case this forum gobbles it up! Patrick2788/Excel-Lambda: Excel Lambda modules Excel-Lambda/Wrap2D Demo.xlsx at main · Patrick2788/Excel-Lambda Excel Lambda modules. Contribute to Patrick2788/Excel-Lambda development by creating an account on GitHub. github.com96Views4likes3CommentsMicrosoft Project Service Core Jan 2026 Update locked Plans table
We recently noted the Microsoft Project Service Core was updated to 1.0.161.1772: This update has locked our Plans table, no changes are allowed to the forms and creating new columns is greyed out: We cannot make use of Planner in our model driven app (Planner Premium, non-default environment). After a new Plan is created, the user receives this message when opening the Plan: Two days ago we were in this version 1.0.160.2874): and everything was working as expected. Any guidance would be much appreciated as we are not sure if this is a permanent lock or once the update cycle is completed we will be able to go back to edit Plan forms and columns. Thank you in advance694Views8likes8CommentsBuilding engaging forms with SharePoint - Plumsail - SharePoint Partner Showcase
We are excited to share a new episode on our partner showcase series focused on SharePoint in Microsoft 365. In this post, we focus on Plumsail which is providing a set of additional features can capabilities directly on top of SharePoint.307Views0likes0CommentsWhy build your AI apps and agents with Microsoft
Customer demand for AI solutions is accelerating rapidly, Microsoft has seen 2x growth in customers purchasing AI products. Organizations are looking for trusted, enterprise-ready platforms to support their innovation. Microsoft's AI-native ecosystem, backed by industry leading security, Responsible AI principles, and rapidly growing catalog of AI apps and agents, provides a strong foundation for building scalable, compliant, and high-impact AI solutions. Explore how developers and software companies can take advantage of Microsoft's integrated tools, streamlined publishing experience, and expansive Marketplace reach to deliver AI solution that meet customers where they are. Learn more and read the full article: Discover why to build AI apps and agents with Microsoft and sell through Marketplace | Microsoft Community HubSharePoint List Web Part - major caching issues
Hi All, I've spent a lot of time building a List based company calendar in our SharePoint Intranet Portal, and the calendar itself is working great, however I'm having no end of headaches with the List Web Part. (not just for this calendar, but all list web parts for that matter) The calendar has a Start and End field - both are Date and Time fields. A custom view is created for use with the List Web Part to embed an "upcoming week" view, this is based on a filter which checks both Start and End dates to see whether an event exists within or spans the date range from today to 7 days in the future, so it is a rolling 7 day window. This is based on a number of filter criteria which include [Today] and [Today]+6. The view also has a sort criteria to sort based on the Start (Date/Time) field. This all works fine when previewing the view within the list itself - at midnight the results update to include events from the day that is now 7 days in the future which were previously excluded. So the view itself is working fine. However the same view in a List Web part on another page suffers from a ridiculous amount of browser side (?) caching, to the point that it is basically broken and unusable. When I open the page the next day in a browser (even if the browser was closed) one of three things happens, somewhat at random: The events 7 days in the future (which just came into filter scope today) just don't appear until a forced page reload is done. The events 7 days in the future do appear but they are sorted incorrectly, appearing at the TOP when the date sort order should show them at the BOTTOM. Sometimes 2 happens but the event is shown with the Start and End Date/Time fields empty - so not only is it at the wrong end of the list it doesn't even show a date at all until the page is refreshed. Here is a picture showing the sort order being incorrect as in case 2: When these various problems happen a full CTRL-F5 browser refresh always updates the list to be complete, up to date and sorted correctly, however, if after that you click away from the page and follow a link to return to it OR press a regular F5 refresh it goes back to being incorrect! It takes many page reloads or a lot of time to pass (hours) before it finally settles down and gives the correct results every time. Then the next day the same caching problems happen again. If you go to a new browser or PC the same problems happen again, suggesting this is browser side caching not something at the servers. While the actual content of the list items update in real-time if you edit the list content in another page (which is pretty cool) the "result set" of list items (which items should or should not be seen) is heavily cached, and the sorting is unreliable. Has anyone else found a solution to this ? I have already done things like disabling offline mode for the list, (this only seems to affect caching of the actual data in the list items, not caching of filter results) etc and I cannot find a solution. The only thing I know which would probably work, as I have had to use this approach on another list is to extend the date range of the filter criteria for the view further into the future, then filter out the extra days using json code in "format view - however AFAIK you can only selectively hide rows like this if you use a custom rowFormatter, which means you have to fully re-implement the standard view including hard coding all the columns you want and it still won't look quite the same. This is a lot of work and maintenance overhead in the future to work around a caching problem that shouldn't exist in the first place. Any thoughts appreciated as a lot of time and effort has gone into building an entire calendar system around a SharePoint List, only to find that the list web part just doesn't work properly.38Views0likes0CommentsA Visual Introduction To Azure Fundamentals
Are you a visual learner? Do you like to see "the big picture" before you dive into details? Does seeing visual notes or metaphors help you understand new concepts better, and retain or recall them more effectively? Then this is for you. A Visual Introduction To Azure Fundamentals - the first in a series of visualized modules that I hope will be helpful for anyone exploring Azure Fundamentals, or preparing for the AZ-900 exam! Want to learn more? Check out this accompanying article at A Cloud Guru! Have questions, or want to see other modules visualized similarly? Leave me a comment on this post!12KViews7likes4CommentsClassic SharePoint features appearing on a Modern Site
I have a modern SharePoint site, with a modern list that has never been associated with classic SharePoint features. But today, two users have experienced intermittent instances of the list appearing in the classic interface. They have not accessed this site before now so I do not believe there should be a cache issue. Does anyone know why this is happening and how it's possible when this site has no association with Classic features? They are using the same browser, same permissions across the site but sometimes the list opens in Classic mode, sometimes it opens in Modern. It also is happening in incognito mode. They are unable to use the site while in Classic Interface at all - the people pickers deny them access ("Error: Sorry, you do not have permission to query for users" and they cannot edit anything because of this error.29Views0likes0CommentsVisual Studio Enterprise Monthly Azure Credits
Please confirm that all developers of MS partners are losing the individual Azure credits (150$ monthly) in the new MAICPP benefits. We just realized that our team will lose the ability to test Marketplace solutions, and now, in the time that we are trying to enforce the usage and explore the AI technology possibilities, it will set us back a lot. Also, the increased bulk credits do not add up, since we have 35 developers who are using these credits, totaling 63k$ per year, opposed to the 16k$ increase of bulk credits (we have 4 areas) is a significant loss. How come Microsoft decided to stop supporting the development? Is there any way to change these new benefits? Or is there a way to keep these Azure credits, maybe with an Enterprise agreement?Rethinking Documentation Translation: Treating Translations as Versioned Software Assets
Rethinking Documentation Translation: Treating Translations as Versioned Software Assets This article is written from the perspective of maintaining large, open-source documentation repositories in the Microsoft ecosystem. I am the maintainer of Co-op Translator, an open-source tool for automating multilingual documentation translation, used across multiple large documentation repositories, including Microsoft’s For Beginners series. In large documentation repositories, translation problems rarely fail loudly. They fail quietly, and they accumulate over time. Recently, we made a fundamental design decision in how Co-op Translator handles translations. Translations are treated as versioned software assets, not static outputs. This article explains why we reached that conclusion, and what this perspective enables for teams maintaining large, fast-moving documentation repositories. When translations quietly become a liability In most documentation projects, translations are treated as finished outputs. Once a file is translated, it is assumed to remain valid until someone explicitly notices a problem. But documentation rarely stands still. Text changes. Code examples evolve. Screenshots are replaced. Notebooks are updated to reflect new behavior. The problem is that these changes are often invisible in translated content. A translation may still read fluently, while the information it contains is already out of date. At that point, the issue is no longer about translation quality. It becomes a maintenance problem. Reframing the question Most translation workflows implicitly ask: Is this translation correct? In practice, maintainers struggle with a different question: Is this translation still synchronized with the current source? This distinction matters. A translation can be correct and still be out of sync. Once we acknowledged this, it became clear that treating translations as static content was no longer sufficient. The design decision: translations as versioned assets Starting with Co-op Translator 0.16.2, we made a deliberate design decision: Translations are treated as versioned software assets. This applies not only to Markdown files, but also to images, notebooks, and any other translated artifacts. Translated content is not just text. It is an artifact generated from a specific version of a source. To make this abstraction operational rather than theoretical, we did not invent a new mechanism. Instead, we looked to systems that already solve a similar problem: pip, poetry, and npm. These tools are designed to track artifacts as their sources evolve. We applied the same thinking to translated content. Closer to dependency management than translation jobs The closest analogy is software dependency management. When a dependency becomes outdated: it is not suddenly “wrong,” it is simply no longer aligned with the current version. Translations behave the same way. When the source document changes: the translated file does not immediately become incorrect, it becomes out of sync with its source version. This framing shifts the problem away from translation output and toward state and synchronization. Why file-level versioning matters Many translation systems operate at the string or segment level. That model works well for UI text and relatively stable resources. Documentation is different. A Markdown file is an artifact. A screenshot is an artifact. A notebook is an artifact. They are consumed as units, not as isolated strings. Managing translation state at the file level allows maintainers to reason about translations using the same mental model they already apply to other repository assets. What changed in practice From embedded markers to explicit state Previously, translation metadata lived inside translated files as embedded comments or markers. This approach had clear limitations: translation state was fragmented, difficult to inspect globally, and easy to miss as repositories grew. We moved to language-scoped JSON state files that explicitly track: the source version, the translated artifact, and its synchronization status. Translation state is no longer hidden inside content. It is a first-class, inspectable part of the repository. Extending the model to images and notebooks The same model now applies consistently to: translated images, localized notebooks, and other non-text artifacts. If an image changes in the source language, the translated image becomes out of sync. If a notebook is updated, its translated versions are evaluated against the new source version. The format does not matter. The lifecycle does. Once translations are treated as versioned assets, the system remains consistent across all content types. What this enables This design enables: Explicit drift detection See which translations are out of sync without guessing. Consistent maintenance signals Text, images, and notebooks follow the same rules. Clear responsibility boundaries The system reports state. Humans decide action. Scalability for fast-moving repositories Translation maintenance becomes observable, not reactive. In large documentation sets, this difference determines whether translation maintenance is sustainable at all. What this is not This system does not: judge translation quality, determine semantic correctness, or auto-approve content. It answers one question only: Is this translated artifact synchronized with its source version? Who this is for This approach is designed for teams that: maintain multilingual documentation, update content frequently, and need confidence in what is actually up to date. When documentation evolves faster than translations, treating translations as versioned assets becomes a necessity, not an optimization. Closing thought Once translations are modeled as software assets, long-standing ambiguities disappear. State becomes visible. Maintenance becomes manageable. And translations fit naturally into existing software workflows. At that point, the question is no longer whether translation drift exists, but: Can you see it? Reference Co-op Translator repository https://github.com/Azure/co-op-translator