【问题标题】:Excel autofill event in C#C#中的Excel自动填充事件
【发布时间】:2010-11-28 19:57:33
【问题描述】:

我正在使用 C# 编写一个 Excel 加载项,并且需要能够判断用户何时自动填充单元格。

如何捕捉自动填充事件?

【问题讨论】:

    标签: c# excel events add-in autofill


    【解决方案1】:

    这是我如何通过粘贴一系列单元格或拖动值来确定单个单元格是否已更改或倍数

    //Get the currentCell/s changed
            object missing = System.T 
            string currentCell = Target.get_Address(
            missing, missing, Microsoft.Office.Interop.Excel.XlReferenceStyle.xlA1,  missing, missing);
    
    
    //Split the currentCell variable this aids the logic in getting cell letter and number
             char[] delimiter = new char[] {'$'};
             string[] CellSplit = currentCell.Split(delimiter);
    
    
     //try parse the value in position 1 if this is true then a whole sheet has been pasted and needs to be checked
            //usually will be false if 1 cell is changed or multiple by dragging
            Int32 int32Val;
            bool result;
            result = Int32.TryParse(CellSplit.GetValue(1).ToString).Replace":", ""),System.Globalization.NumberStyles.Integer, null, out int32Val);
    
      //check the length of the array as this will help in determining how the cells have been changed
            int numCellSplit = CellSplit.Length;
    
      //the result is false if a single cell was changed and the length is 3
            if (CellSplit.Length == 3 && result == false)
            {
              \\your code here
            }
      //the result is true if the whole sheet has been pasted
            if (CellSplit.Length == 3 && result == true)
            {
              \\your code here
            }
    
      //if the user dragged the data from one cell across others
            if (CellSplit.Length == 5 && result == false)
            {
                //create char arrays to get the Alphabetical letters to use to loop
                char[] FirstLetter = CellSplit.GetValue(1).ToString().ToCharArray();
                char[] SecondLetter = CellSplit.GetValue(3).ToString().ToCharArray();
    
                int Alphaletter = (char)FirstLetter.GetValue(0);
                int Betaletter = (char)SecondLetter.GetValue(0);
                //Alphabetical letters have an int value so they can be used to loop through the cells
                for (int CellCheck = Alphaletter; CellCheck <= Betaletter; CellCheck++)
                {
                    int LoopStart = int.Parse(CellSplit.GetValue(2).ToString().Replace(":", ""));
                    int LoopEnd = int.Parse(CellSplit.GetValue(4).ToString());
    
                    for (; LoopStart <= LoopEnd; LoopStart++)
                    {
    
                        //your code here                        
                    }   
                }
    
            }
    

    我希望这有助于确定单元格是如何变化的。

    迪佐斯

    【讨论】:

      【解决方案2】:

      经过多次尝试,我自己找到了解决方案。该解决方案并不理想,但它似乎可以工作。

      确保处理工作表更改事件:

      displayWorksheet.Change += new Excel.DocEvents_ChangeEventHandler(CellsChange);
      

      处理它的方法应该如下所示:

      private void CellsChange(Excel.Range Target) 
      {
          if ((this.Application.Selection as Excel.Range) != null)
          {
              Excel.Range selectedRange = thisAddIn.Application.Selection as Excel.Range;
              if (selectedRange.Rows.Count > 1)
              {
                  //put your code to handle autofill here
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        相关资源
        最近更新 更多