Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#VSTO Excel名称更改事件:迭代范围_C#_Excel_Vsto - Fatal编程技术网

C#VSTO Excel名称更改事件:迭代范围

C#VSTO Excel名称更改事件:迭代范围,c#,excel,vsto,C#,Excel,Vsto,我正在为Excel工作表创建一个VSTO解决方案,该工作表的namedRange包含16行和3列(总共48个单元格)。当其中一个单元格被改变时,我需要迭代所有48个单元格来进行一些计算。 我试图向namedRange添加一个更改事件,但问题是这只允许我访问当前更改的单元格。当其中一个单元格发生更改时,是否有可能迭代namedRange的所有单元格 谢谢David,这可以通过SheetChange事件、一些条件逻辑和指定范围内的枚举器来实现 为了清楚起见,我已经加入了一些评论。希望这有帮助 更新:

我正在为Excel工作表创建一个VSTO解决方案,该工作表的namedRange包含16行和3列(总共48个单元格)。当其中一个单元格被改变时,我需要迭代所有48个单元格来进行一些计算。 我试图向namedRange添加一个更改事件,但问题是这只允许我访问当前更改的单元格。当其中一个单元格发生更改时,是否有可能迭代namedRange的所有单元格


谢谢David,这可以通过SheetChange事件、一些条件逻辑和指定范围内的枚举器来实现

为了清楚起见,我已经加入了一些评论。希望这有帮助

更新: 包括检查以确保更改的单元格在指定范围内。这样,如果工作表上的单元格已更改但不在指定范围内(以某些条件逻辑为代价),则可以避免不必要的处理

//必须在作用域中声明
范围myNamedRange;
私有void SetupEventHandlerForRange(工作簿wb,字符串名称Range)
{
//获取namedRange的范围对象
myNamedRange=wb.Worksheets.GetRangeByName(namedRange);
//订阅SheetChange事件
this.SheetChange+=新建
Excel.WorkbookEvents\u SheetChangeEventHandler(
检查名称DrangeonCellChange);
}
void CheckNamedRangeOnCellChange(对象Sh、Excel.Range目标)
{
//获取工作表对象
Excel.Worksheet sheet=(Excel.Worksheet)Sh;
//检查工作表是否为所需的工作表名称(可选)
if(sheet.Name==“要检查的工作表的名称”)
{
//将保持为false,直到找到范围内的单元格
bool cellInRange=false;
//获取更改范围的范围枚举数
IEnumerator altRangeEnum=Target.GetEnumerator();
while(altRangeEnum.MoveNext())
{
//获取单元格对象并检查它是否在namedRange中
Cell Cell=(Cell)altRangeEnum.Current;
cellInRange=IsCellIsInRange(单元格,myNamedRange);
//如果单元格位于namedRange break中
//如果有任何细胞发生改变,我们想继续
//无名龙
如果(cellInRange)中断;
}
//更改的单元格不在namedRange中,返回
如果(!cellInRange)返回;
//获取范围枚举数
IEnumerator rangeEnum=myNamedRange.GetEnumerator();
while(rangeEnum.MoveNext())
{
Cell Cell=(Cell)rangeEnum.Current;
//用手机做点什么
}
}
}
公共布尔IsCellInRange(单元格,范围)
{
if(cell.Rowrange.Column||
cell.Columnrange.Column+range.Columns.Count-1)
{
//单元格超出了我们要检查的范围
返回false;
}
其他的
{
返回true;
}
}

是的,但您尚未显示代码,因此我们正在猜测您的设置。如果将该单元格作为目标对象,则可以检查该单元格是否在命名范围内,并遍历。请出示一些代码
    //must be declared in scope
    Range myNamedRange;

    private void SetupEventHandlerForRange(Workbook wb, String namedRange)
    {
        //get the Range object of the namedRange
        myNamedRange = wb.Worksheets.GetRangeByName(namedRange);
        //subscribe to the SheetChange event
        this.SheetChange += new
            Excel.WorkbookEvents_SheetChangeEventHandler(
            CheckNamedRangeOnCellChange);
    }

    void CheckNamedRangeOnCellChange(object Sh, Excel.Range Target)
    {
        //get the Worksheet object
        Excel.Worksheet sheet = (Excel.Worksheet)Sh;
        //check if worksheet is the desired sheet name (optional)
        if(sheet.Name == "The Name Of The Sheet You Want To Check")
        {
            //will stay false until it finds a cell in range
            bool cellInRange = false;
            //get the range enumerator for the ALTERED range
            IEnumerator altRangeEnum = Target.GetEnumerator();

            while (altRangeEnum.MoveNext())
            {
                //get the cell object and check if it is in the namedRange
                Cell cell = (Cell)altRangeEnum.Current;
                cellInRange = IsCellIsInRange(cell, myNamedRange);
                //if the cell is in the namedRange break
                //we want to continue if any of the cells altered are in
                //the namedRange
                if(cellInRange) break;
            }

            //changed cell is not in namedRange, return
            if(!cellInRange) return;

            //get the range enumerator
            IEnumerator rangeEnum = myNamedRange.GetEnumerator();

            while (rangeEnum.MoveNext())
            {
                Cell cell = (Cell)rangeEnum.Current;
                //do something with cell
            }
        }
    }

    public bool IsCellInRange(Cell cell, Range range)
    {
        if (cell.Row < range.Row ||
            cell.Row > range.Column ||
            cell.Column < range.Row + range.Rows.Count - 1 ||
            cell.Column > range.Column + range.Columns.Count - 1)
        {
              //cell is outside the range we want to check
              return false;
        }
        else
        {
            return true;
        }
    }