我的目的是在第一张工作表上制作一个可点击的 "目录".因此,工作表的变化可以通过以下方式安排
Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.get_Item(1).select();
但是,我怎样才能在特定范围内的单元格处进行点击操作呢,而不至于给过程带来太大的压力。
最后我想检查一个单元格的文本是否包含一个工作表名称。如果是,则跳转到该表。像这样。
string cellText = activeCell.Value2;
foreach (Excel.Worksheet sheet in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
if (sheet.Name.Equals(cellText)
{
Globals.ThisAddIn.Application.ActiveWorkbook.Sheets[sheetName].select();
break;
}
}
也许这不是最好的解决方案,但目前对我来说是可行的。
因为它是一个VSTO Excel AddIn,我有一个ribbon。所以,在ribbon_load()注册一个事件。
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
Globals.ThisAddIn.Application.SheetSelectionChange += new Excel.AppEvents_SheetSelectionChangeEventHandler(myApplication_SheetSelectionChange);
}
在事件发生时,我检查哪个单元格触发了事件,以及单元格内有什么内容。
private void myApplication_SheetSelectionChange(object Sh, Excel.Range Target)
{
if (((Excel.Worksheet)GetInstance().ActiveSheet).Name.Equals(Statics.NAME_OVERVIEW)) // if sheet overview
{
if (Target.Row > 6 && Target.Column == 9)
{
try
{
string tmp = Target.Value2;
tmp = tmp.Replace("'", "");
if (tmp.StartsWith("="))
{
foreach (Excel.Worksheet sheet in GetInstance().Worksheets)
{
if (sheet.Name.Equals(tmp))
{
sheet.Select(); // jump to sheet
break;
}
}
}
}
catch (Exception)
{ }
}
}
else // all other sheets - jump back to overview
{
if (Target.Row == 42 && Target.Column == 1)
{
((Excel.Worksheet)GetInstance().Sheets[Statics.NAME_OVERVIEW]).Select();
}
}
}
也许这能帮助到别人。