Troubleshooting Excel add-ins

This article discusses troubleshooting issues that are unique to Excel. Please use the feedback tool at the bottom of the page to suggest other issues that can be added to the article.

API limitations when the active workbook switches

Add-ins for Excel are intended to operate on a single workbook at a time. Errors can arise when a workbook that is separate from the one running the add-in gains focus. This only happens when particular methods are in the process of being called when the focus changes.

The following APIs are affected by this workbook switch.

Excel JavaScript API Error thrown
Chart.activate GeneralException
Range.select GeneralException
Table.clearFilters GeneralException
Workbook.getActiveCell InvalidSelection
Workbook.getSelectedRange InvalidSelection
Workbook.getSelectedRanges InvalidSelection
Worksheet.activate GeneralException
Worksheet.delete InvalidSelection
Worksheet.gridlines GeneralException
Worksheet.showHeadings GeneralException
WorksheetCollection.add GeneralException
WorksheetFreezePanes.freezeAt GeneralException
WorksheetFreezePanes.freezeColumns GeneralException
WorksheetFreezePanes.freezeRows GeneralException
WorksheetFreezePanes.getLocationOrNullObject GeneralException
WorksheetFreezePanes.unfreeze GeneralException

Note

This only applies to multiple Excel workbooks open on Windows or Mac.

Coauthoring

See Coauthoring in Excel add-ins for patterns to use with events in a coauthoring environment. The article also discusses potential merge conflicts when using certain APIs, such as TableRowCollection.add.

Known Issues

Binding events return temporary Binding objects

Both BindingDataChangedEventArgs.binding and BindingSelectionChangedEventArgs.binding return a temporary Binding object that contains the ID of the Binding object that raised the event. Use this ID with BindingCollection.getItem(id) to retrieve the Binding object that raised the event.

The following code sample shows how to use this temporary binding ID to retrieve the related Binding object. In the sample, an event listener is assigned to a binding. The listener calls the getBindingId method when the onDataChanged event is triggered. The getBindingId method uses the ID of the temporary Binding object to retrieve the Binding object that raised the event.

async function run() {
    await Excel.run(async (context) => {
        // Retrieve your binding.
        let binding = context.workbook.bindings.getItemAt(0);
    
        await context.sync();
    
        // Register an event listener to detect changes to your binding
        // and then trigger the `getBindingId` method when the data changes. 
        binding.onDataChanged.add(getBindingId);
        await context.sync();
    });
}

async function getBindingId(eventArgs) {
    await Excel.run(async (context) => {
        // Get the temporary binding object and load its ID. 
        let tempBindingObject = eventArgs.binding;
        tempBindingObject.load("id");

        // Use the temporary binding object's ID to retrieve the original binding object. 
        let originalBindingObject = context.workbook.bindings.getItem(tempBindingObject.id);

        // You now have the binding object that raised the event: `originalBindingObject`. 
    });
}

Cell format useStandardHeight and useStandardWidth issues

The useStandardHeight property of CellPropertiesFormat doesn't work properly in Excel on the web. Due to an issue in the Excel on the web UI, setting the useStandardHeight property to true calculates height imprecisely on this platform. For example, a standard height of 14 is modified to 14.25 in Excel on the web.

On all platforms, the useStandardHeight and useStandardWidth properties of CellPropertiesFormat are only intended to be set to true. Setting these properties to false has no effect.

Range getImage method unsupported on Excel for Mac

The Range getImage method isn't currently supported in Excel for Mac. See OfficeDev/office-js Issue #235 for the current status.

Range return character limit

The Worksheet.getRange(address) and Worksheet.getRanges(address) methods have an address string limit of 8192 characters. When this limit is exceeded, the address string is truncated to 8192 characters.

See also