2012-12-11 148 views
0

我需要能夠在用戶嘗試自動填充列時執行某些代碼,或者能夠在執行Worksheet_Change期間檢測到它是自動填充。我有一些代碼可以改變自動填充單元格的值。問題在於,每次我一次編輯多個單元格時,此代碼就會觸發。VBA Excel自動填充事件

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

回答

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 

所以,如果一個以上的小區改變的代碼將無法激活,或者如果它不列發生一個

2

據我所知,我可能是錯的,但有沒有簡單的方法,你可以捕獲自動填充事件。

Target.Rows.count是檢查自動填充是否爲不可靠的方式,因爲在許多情況下Target.Rows.count將大於1。例如

  1. 用戶在多個小區中粘貼
  2. 用戶刪除的多個細胞
  3. 用戶按下CTRL + ž撤消),其改變多個小區等等...

如果你真的想要陷害自動填充,那麼你必須處理所有上述情況,並消除縮小範圍以確定的可能性它確實是一個Autofill事件。

+0

在我的情況下,沒有公式附加,現在的基本情況是用戶拖動頭(這是一些字符串)。我只是檢查是否有一列,多行和所有行都具有相同的值。 – FreeCandies

+0

只有存在公式時,自動填充功能纔有用。試試這個...輸入一些東西,比如說單元格A1到A15。現在在單元格B1中輸入一些內容,並在光標變爲「+」號時雙擊單元格的右下角;) –

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; 
      } 
     } 
    }