首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Office :在多个Excel实例中执行Addin时的问题

Office :在多个Excel实例中执行Addin时的问题
EN

Stack Overflow用户
提问于 2020-04-27 17:42:53
回答 1查看 228关注 0票数 1

在多个Excel实例中执行office有问题。当两者同时执行时,一个停止运行。

我做了两个快速的ScriptLab样本,在那里您可以重现一些问题(我粘贴了它们)。其中一个包含一个UDF函数,只需在ScriptLab中注册它。另一个是一个样本,它产生了我的一个问题。

首先注册UDF,在使用第二部分之前,创建两个工作簿,每个工作簿都有100个包含以下函数的工作表(这取决于Snippent名称,在我的例子中是"Blank snippet (1)",如果您的名称不同,请在这里和函数“findAllOrNullObject”中的加载项-代码中调整公式名)。

=SCRIPTLAB.BLANKSNIPPET1.ADD(1;2)

最快的方法是:使用该函数创建10个工作表,并将这10个工作表复制10次,直到工作簿的末尾。完成此操作后,再次使用不同的名称保存工作簿。然后,打开两个工作簿并单击"Run“(在两个工作表中)。而不是在运行或打开一个应用程序时单击另一个应用程序。在控制台上,您将看到一个计数器,它指示加载项实际工作在哪个工作表上。在这两个实例中,您都应该期望"INDEX: 100“,但是当您单击另一个应用程序或启动一个应用程序时,一个实例将停止,并且不会达到100。如果你没有直接的问题,只要再试一次,它肯定会出现。

UDF:代码:

代码语言:javascript
复制
/**
 * Adds two numbers.
 * @customfunction
 * @param first First number
 * @param second Second number
 * @returns The sum of the two numbers.
 */
/* global clearInterval, console, setInterval */

function add(first: number, second: number): number {
  return first + second;
}

Addin的代码:

代码语言:javascript
复制
$("#run").click(() => tryCatch(run));

async function run() {
  this.refreshWorkbook();
}

async function refreshWorkbook() {
  let sheets: Excel.WorksheetCollection;

  Excel.run(async (context) => {
    sheets = context.workbook.worksheets;
    sheets.load("items/name");
    await sheets.context.sync();
    if (sheets.items.length >= 1) {
      for (let sheetIndex = 0; sheetIndex < sheets.items.length; sheetIndex++) {
        console.log("INDEX : " + sheetIndex);
        const sheet = sheets.items[sheetIndex];
        await this.getInfo(sheet.name).then((information) => {
          // some stuff
        });
      }
    }
  });
}

async function getInfo(worksheetName: string): Promise<string> {
  return new Promise<string>((resolve, reject) => {
    Excel.run(async (context) => {
      const sheet: Excel.Worksheet = context.workbook.worksheets.getItem(worksheetName);
      sheet.load("name");
      await context.sync();
      const usedRange = sheet.getUsedRangeOrNullObject();
      if (usedRange) {
        const functionCells = sheet.findAllOrNullObject("=SCRIPTLAB.SCRIPTLAB.BLANKSNIPPET1.ADD(", {
          matchCase: false,
          completeMatch: false
        });
        functionCells.load("areaCount");
        await context.sync();
        if (functionCells) {
          resolve("A");
        } else {
          reject("X");
        }
      }
    });
  });
}

/** Default helper for invoking an action and handling errors. */
async function tryCatch(callback) {
  try {
    await callback();
  } catch (error) {
    // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
    console.error(error);
  }
}

如果我删除搜索部分,它就能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-28 10:09:27

我们可以复制这个问题,它可以复制没有CF。因此,这是更多与API相关的问题。创建了一个bug 4124929来跟踪此问题。更有可能是findAllOrNullObject API中的一个问题,我们正在对这个问题做一些调查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61465017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档