我需要能够在用户尝试自动填充列时执行一些代码,或者能够在 Worksheet_Change 执行期间检测到它是自动填充。我有一些代码可以更改自动填充单元格的值。问题是每次我一次编辑多个单元格时都会触发此代码。
Private Sub Worksheet_Change(ByVal Target As range)
If Target.Rows.count > 1 Then
AFAIK 和我可能是错的,但没有简单的方法可以捕获自动填充事件。
这Target.Rows.count
是检查它是否是自动填充的一种不可靠的方法,因为Target.Rows.count
在许多情况下它会大于 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 列中
在更改事件期间您有 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;
}
}
}