1

我需要能够在用户尝试自动填充列时执行一些代码,或者能够在 Worksheet_Change 执行期间检测到它是自动填充。我有一些代码可以更改自动填充单元格的值。问题是每次我一次编辑多个单元格时都会触发此代码。

Private Sub Worksheet_Change(ByVal Target As range)
    If Target.Rows.count > 1 Then
4

3 回答 3

2

AFAIK 和我可能是错的,但没有简单的方法可以捕获自动填充事件。

Target.Rows.count是检查它是否是自动填充的一种不可靠的方法,因为Target.Rows.count在许多情况下它会大于 1。例如

  1. 用户粘贴在多个单元格中
  2. 用户删除了多个单元格
  3. 用户按下CTRL+ Z( Undo ) 更改了多个单元格等...

如果您真的想捕获自动填充,那么您必须处理所有上述情况并消除缩小范围以确定它确实是自动填充事件的可能性。

于 2012-12-11T05:41:38.377 回答
1
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or Target.Column <> 1 Then Exit Sub
    MsgBox Target.Address ' your code goes here
End Sub

因此,如果更改了多个单元格,则代码将不会激活,或者如果它没有发生在 A 列中

于 2012-12-11T01:26:04.803 回答
0

在更改事件期间您有 2 个区域,并且在大多数情况下,所选区域的大小与正在更改的区域的大小相匹配。在 DragFill 操作期间,选择区域完全包含正在更改的区域,但也包含作为拖动填充源的区域。源还填充选定区域的一个边缘。

    Application.SheetChange += Sheet_Change;

    private void Sheet_Change(object Sh, Range Target)
    {
        //See if the size of the target matches the size of the current selection.
        //Selection size must be greater that one cell
        //Changed cells must be in the same dimension as the unchanged cells. e.g. unchanged area must fill one edge of the rectangle

        var selection = (Application.Selection as Range);

        Rect selectionArea = new Rect(selection.Column, selection.Row, selection.Columns.Count, selection.Rows.Count);
        Rect changedArea = new Rect(Target.Column, Target.Row, Target.Columns.Count, Target.Rows.Count);

        var isDragFill = false;
        if (selectionArea.Contains(changedArea)
            && (selectionArea.Width > 1 || selectionArea.Height > 1)
            && (selectionArea.Width == changedArea.Width || selectionArea.Height == changedArea.Height)
            && selectionArea != changedArea)
            isDragFill = true;

        if (!blockNextChange)
        {
            if (isDragFill)
            {
                //Re-entrancy check in the case the value changes in this block
                blockChanges = true;
                bool isHorizontal = selectionArea.Height == changedArea.Height;
                {                       
                    if (isHorizontal)
                    {
                        DragFillHorizontal(Target, selection, selectionArea, changedArea);
                    }
                    else
                    {
                        DragFillVertical(Target, selection, selectionArea, changedArea);
                    }
                }
                blockChanges = false;
            }
        }
    }
于 2017-11-02T12:24:39.960 回答