if (Target.Column == 5){Thread.Sleep(5000);Target.Interior.ColorIndex = 55;//触发另外一个插件Target.Application.Calculation = XlCalculation.xlCalculationAutomatic;Thread.Sleep(5000);//这行执行完之后,才会触发另外一个Target.Interior.ColorIndex = 54;}
正常人的思维是设为自动就触发另一个插件,但实际恰恰相反最后一行代码才执行另外一个插件。
如果你希望在调用 `Target.Application.Calculation = XlCalculation.xlCalculationAutomatic;` 时触发另一个插件执行,你可以尝试通过 VSTO 插件之间的通信机制来实现。一种常见的方法是使用自定义事件。你可以在一个插件中定义一个事件,在另一个插件中订阅该事件,并在触发 `Target.Application.Calculation = XlCalculation.xlCalculationAutomatic;` 时引发该事件。下面是一个简单的示例代码:在触发插件中定义事件:```csharp
public class TriggerPlugin
{// 定义事件public event EventHandler CalculationAutomatic;// 触发事件的方法protected virtual void OnCalculationAutomatic(EventArgs e){CalculationAutomatic?.Invoke(this, e);}public void PerformCalculation(){// 执行自动计算Target.Application.Calculation = XlCalculation.xlCalculationAutomatic;// 触发事件OnCalculationAutomatic(EventArgs.Empty);}
}
```在接收插件中订阅事件:```csharp
public class ReceiverPlugin
{public ReceiverPlugin(TriggerPlugin triggerPlugin){// 订阅事件triggerPlugin.CalculationAutomatic += TriggerPlugin_CalculationAutomatic;}// 事件处理程序private void TriggerPlugin_CalculationAutomatic(object sender, EventArgs e){// 在这里执行触发时需要执行的操作}
}
```这样,在触发插件中调用 `PerformCalculation` 方法时,就会触发接收插件中的事件处理程序,从而执行相应的操作。
如果另一个插件没有代码,并且无法通过上述方式进行通信,那么在目前的情况下,似乎没有直接的方法可以在 `Target.Application.Calculation = XlCalculation.xlCalculationAutomatic;` 这一行代码触发另一个插件的功能。
但是,你可以考虑以下两种替代方案:
1. **间接触发:** 如果另一个插件与 Excel 相关联,你可以尝试触发 Excel 中的某个事件,然后让另一个插件监听该事件并执行相应的功能。例如,你可以在设置 `Target.Application.Calculation` 属性后,手动触发 Excel 的事件,比如 `Workbook_SheetCalculate` 或 `Workbook_AfterCalculate` 等,另一个插件可以监听这些事件并执行相应的操作。
2. **定时执行:** 如果无法通过事件触发另一个插件的功能,你可以考虑定时执行另一个插件的功能。在目标插件中设置一个定时器,定期检查条件是否满足,如果满足则执行相应的功能。在你的代码中,你可以在设置 `Target.Application.Calculation` 属性后,等待一段时间,然后再执行相应的操作,这样可以模拟定时执行的效果。
这两种方法都是间接的方式,没有直接触发另一个插件的功能,但是可以在不修改另一个插件代码的情况下实现你的需求。
终极方法是开启自动计算放到前一个插件的最后代码执行。