An add-in keeps disabling itself, or will not stay enabled
An add-in is re-enabled, works for a session, and is off again the next morning. Office has a resiliency mechanism that disables anything it believes caused a crash or a slow start, and it keeps its own list that ticking the box does not clear.
What you see
"A problem was detected with the X add-in. It has been disabled." Re-enabling it through the Add-ins dialog works until the next restart. In some cases the add-in is simply absent from the ribbon with no message at all.
What is actually wrong
Office maintains a hard-disabled list and a crashing-add-in list per application under Resiliency. An add-in that crashed once, or that took too long to load, is added to one of them and disabled on every subsequent start regardless of the LoadBehavior setting. Slow loading is measured against a threshold, so a machine that is under load or on a slow disk can disable a perfectly healthy add-in.
Codes and articles
Start here — find out which fix applies
A script that runs the 4 inspection commands from the write-up below and prints what each one returned. It reads the machine and changes nothing — every command that could write, delete, start or stop is excluded from it by construction. Run this first, then pick the fix its output points at.
Fixes (3)
Clear the resiliency lists
The add-in reports that it was disabled because of a problem, or re-enabling it does not survive a restart.
Close every Office application first. These keys are read at startup and rewritten at shutdown, so editing them with Office open achieves nothing.
Get-Process WINWORD,EXCEL,OUTLOOK,POWERPNT -ErrorAction SilentlyContinue | Stop-Process -ForceLook at what is on the lists, for every application at once.
Get-ChildItem 'HKCU:\Software\Microsoft\Office\16.0' -ErrorAction SilentlyContinue | ForEach-Object { $p = Join-Path $_.PSPath 'Resiliency'; if (Test-Path $p) { Get-ChildItem $p | Select-Object @{n='App';e={$_.PSParentPath.Split('\')[-2]}}, PSChildName } }DisabledItems holds hard-disabled entries and CrashingAddinList holds ones Office suspects. The values are binary blobs rather than names, so you cannot usefully read which add-in is which — clearing the key is the practical move.
Clear the lists for the affected application. Change Outlook to Excel or Word as needed.
Remove-Item 'HKCU:\Software\Microsoft\Office\16.0\Outlook\Resiliency\DisabledItems' -Recurse -Force -ErrorAction SilentlyContinueRemove-Item 'HKCU:\Software\Microsoft\Office\16.0\Outlook\Resiliency\CrashingAddinList' -Recurse -Force -ErrorAction SilentlyContinue
Start the application and confirm the add-in loads.
If it disables itself again within a few starts, it is genuinely crashing. Update it, and treat the resiliency list as Office correctly protecting the user rather than as the fault.
Test-Path 'HKCU:\Software\Microsoft\Office\16.0\Outlook\Resiliency\DisabledItems'Check what the add-in is registered to do
The add-in is missing entirely with no message.
List every registered add-in and its LoadBehavior, from both hives.
foreach ($h in 'HKCU:\Software\Microsoft\Office\Excel\Addins','HKLM:\SOFTWARE\Microsoft\Office\Excel\Addins','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\Excel\Addins') { Get-ChildItem $h -ErrorAction SilentlyContinue | ForEach-Object { [pscustomobject]@{ Hive=$h; Addin=$_.PSChildName; LoadBehavior=(Get-ItemProperty $_.PSPath).LoadBehavior } } }3 means load at startup, which is what you want. 2 means it failed and was turned off. 0 means disabled. 8 or 9 relate to load-on-demand. The WOW6432Node hive matters because a 32-bit add-in on 64-bit Office registers there and is invisible if you only look at the main key.
Set it back to load at startup.
Set-ItemProperty 'HKCU:\Software\Microsoft\Office\Excel\Addins\Vendor.AddinName' -Name LoadBehavior -Type DWord -Value 3Confirm the add-in's architecture matches Office. A 32-bit COM add-in will not load into 64-bit Office at all, and this produces exactly the silent absence being reported.
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' | Select-Object PlatformIf the architectures do not match, the add-in has to be replaced with the matching build — there is no client-side setting that bridges this.
Stop Office disabling a known-good add-in across the estate
A business-critical add-in is being disabled on many machines and you have satisfied yourself it is healthy.
Confirm it really is healthy first. This fix tells Office to stop protecting the user from it, so a genuinely crashing add-in will now take the application down every time instead of being disabled.
The resiliency mechanism exists for a reason. Overriding it for something that actually crashes converts a manageable annoyance into repeated data loss for the user.
Get the add-in's ProgID exactly as registered.
Get-ChildItem 'HKCU:\Software\Microsoft\Office\Excel\Addins' | Select-Object PSChildNameAdd it to the do-not-disable list for the application.
$k='HKCU:\Software\Policies\Microsoft\Office\16.0\Excel\Resiliency\DoNotDisableAddinList'New-Item $k -Force | Out-NullSet-ItemProperty $k -Name 'Vendor.AddinName' -Type DWord -Value 1
A value of 1 keeps the add-in enabled even if it crashes or loads slowly. 0 and 2 are narrower — 1 is the setting people actually want here.
Deploy it through the Office administrative templates for a fleet rather than per machine, so it survives rebuilds.
Also raise the load-time threshold if the add-in is being disabled for being slow rather than for crashing — that is a separate policy under the same Resiliency branch.
Related faults
Where this stops. This write-up was written and checked by hand. It says what each step changes, how to confirm it worked and how to reverse it, and anything destructive is flagged before you reach it. If it does not match what your machine is doing, search the Support Centre for the exact code or message — and when something needs a person, get in touch.