2017-09-02 97 views
-3

我有一个宏,我试图写。我在工作表事件后面有这个宏,如果在单元格D2中没有应用宏,宏应检查范围A2,B2,C2是否不为空。这应该适用于以下行A3,B3,C3,然后将宏应用于D3等。宏是由双击施加在所述单元VBA检查单元格是否为空 - 收件人Lastrow

问题:代码未运行我希望它如上述的方式。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    With Target 
     If .Column = 4 Then 
     Select Case .Row 
       Case 1, 2, 3, 4, 5, 6 
Dim CheckCell As Range 

    For Each CheckCell In Sheets("Dates").Range("A1,B2,C2").Cells 
     If Len(Trim(CheckCell.Value)) = 0 Then 
      CheckCell.Select 
      MsgBox "Cell " & CheckCell.Address(0, 0) & " is empty. Click OK and populate it.", , "Missing Information" 
      Exit Sub 
     End If 
    Next CheckCell 

     .Value2 = "Prepared By" & " " & Environ("Username") 

    End Select 
        End If 
    End With 
End Sub 
+0

您没有设置'cancel = true'来避免'in-cell editing'。 – Jeeped

+0

@Jeeped我需要为此编辑代码以及谢谢 – James

+1

您的代码与您的叙述没有任何关系。 – Jeeped

回答

2

忘记Worksheet_BeforeDoubleClick废话;看起来你想在D列中的每个单元格上运行一个子过程,其中列A,B和C中的单元格不是空白的。

这意味着您应该改用Worksheet_Change。每当某样东西在列A,B或C更改,使用该行对列运行子过程D.

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Range("A:C"), Target.Parent.UsedRange) Is Nothing Then 
     On Error GoTo safe_exit 
     Application.EnableEvents = False 
     Dim trg As Range, trgD As Range 
     For Each trg In Intersect(Target, Range("A:C"), Target.Parent.UsedRange) 
      If CBool(Application.CountA(Cells(trg.Row, "A").Resize(1, 3))) Then 
       Set trgD = Cells(trg.Row, "D") 
       MsgBox trgD.Address(False, False) 
       trgD = Now 
      End If 
     Next trg 
    End If 

safe_exit: 
    Application.EnableEvents = True 
End Sub 

这是一个简单的msgbox和时间戳操作,你应该已经能够在自己的研究在任何一千个地方。

+0

双重被使用,因为用户必须双击单元格.-感谢您的帮助和建议。上面的代码是我的尝试,我不是先进的VBA开发人员,但我仍然开始 – James

相关问题