2016-06-19 93 views
1

我对VBA和一般编码非常缺乏经验。如果所有三个相邻的单元格变为空白,则将单元格变为空白

我正在制作电子表格,其中列A是职位号码。
B是日期。
CDE你必须在E.G文本没有模式标记。

现在我已经制定了代码把日期B列,如果任何标记放在CDE。但是,如果删除C,DE,那么列B中的单元仍填充日期。

只是要清楚CDE可以有文字它们或2或1

现在我知道你可以只删除单元格但如果是在乐趣。

这里是我到目前为止的代码,请随时建议的方式来使它更小或清除它,但主要是提前感谢我的问题。

Private Sub Worksheet_Change(ByVal Target As Range)  
    Call Macro1(Target) 
    Call Macro2(Target) 
    Call Macro3(Target) 
End Sub 

Sub Macro1(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 

    If Not Intersect(Target, Range("c2:c100")) Is Nothing Then 
     With Target(1, 0) 
      .Value = Date 
      .EntireColumn.AutoFit 
     End With 
    End If 
End Sub 

Sub Macro2(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 

    If Not Intersect(Target, Range("d2:d100")) Is Nothing Then 
     With Target(1, -1) 
      .Value = Date 
      .EntireColumn.AutoFit 
     End With 
    End If 
End Sub 

Sub Macro3(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 

    If Not Intersect(Target, Range("e2:e100")) Is Nothing Then 
     With Target(1, -2) 
      .Value = Date 
      .EntireColumn.AutoFit 
     End With 
    End If 
End Sub 

回答

1

该代码在列B中的列C,D或E发生更改并且其中至少有一个非空白时在列B中插入日期。反之,如果三者都是空白列B细胞被清除:

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Cells.Count > 1 Then Exit Sub 
If Not Intersect(Target, Me.Range("c2:E100")) Is Nothing Then 
    With Intersect(Target.EntireRow, Me.Range("B2:B100")) 
     If WorksheetFunction.CountBlank(Intersect(Target.EntireRow, Me.Range("C2:E100"))) <> 3 Then 
      .Value = Date 
      .EntireColumn.AutoFit 
     Else 
      .Value = "" 
     End If 
    End With 
End If 
End Sub 
+0

我有点困惑,因为它看起来像你现有的代码将清除或添加一个日期列C,而你的问题是指清除或从列B删除 –

+0

1)OPs代码实际_acts_列“B”自'Range(“C1”)(1,0).Address'返回“$ B $ 1”,'Range(“D1”)(1,-1).Address'和'Range(“E1”)(1 ,-2)。地址'。 2)此外,我认为只有C到E列中的所有单元格都被清除(即使一个一个),也应该允许进行日期清除。 3)最后,我总是切换'应用程序。EnableEvents'设置为False,然后返回True,以避免不必要的(也可能是危险的)循环4)我也考虑明确引用表单,但是在Worksheet_Change()事件处理程序中确保“Active”工作表是'目标'一个 – user3598756

+0

@ user3598756,你当然是在寻址。 2,谁知道,我认为你可能是对的,但目前还不清楚。 3,虽然这是一个很好的做法,但这是没有必要的,因为代码通过改变B. –

0

你只需要添加一个检查

If Target.Value = "" Then dateCell.ClearContents 

其中dateCell是其中的日期所在的当前行的单元

但你还必须:

  1. 禁用/启用事件

    预防再次Worksheet_Change()火当改变“日期”单元格(此删除单元格的值时

  2. 使用一个子来处理所有的三列

    只是检查,如果目标C列相交于E.也发生像

    If Not Intersect(.Cells, Range("C:E")) Is Nothing Then 
    

看到代码:

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Call Macro1(Target) 
End Sub 

Sub Macro1(ByVal Target As Range) 
    Dim dateCell As Range 
    With Target 
     If .Cells.Count > 1 Then Exit Sub 

     Application.EnableEvents = False '<--| disable events to prevent this one fire when changing "date" cell 
     If Not Intersect(.Cells, Range("C:E")) Is Nothing Then 
      Set dateCell = Cells(.row, "B") '<--| set the cell where "date" resides 
      If Application.WorksheetFunction.CountA(.Parent.Cells(.row, "C").Resize(, 3)) = 0 Then '<--| if there are no values in current row columns C to E ... 
       dateCell.ClearContents '<--|... clear the date 
      Else 
       dateCell.Value = Date '<--|... otherwise put the date in column B and ... 
       dateCell.EntireColumn.AutoFit '<--| ... autofit column B 
      End If 
     End If 
     Application.EnableEvents = True '<--| enable events back on 
    End With 
End Sub 
+0

非常感谢你user3598756,它运作良好,所有我问,再次感谢。 – 23johnw

相关问题