在单元格值更改时自动触发宏| Excel | VBA |

时间:2019-05-25 07:24:47

标签: excel vba

第1张表作为ENTER VALUE

enter image description here

第2页作为我的值和数据

enter image description here

使用=Sheet1!E4从Sheet1值引用表值

我要避免onclick Button事件=>一旦工作表1中的值更改为10,然后我的工作表2中的值更改为10 =>然后采用工作表2中更改的值,宏应自动检测到该值更改,然后在第一列中应该多次打印数据

模块1 我的宏

Sub mac()

Dim ws As Worksheet
Dim rDest As Range
Dim lCount As Long
Dim sValue As String

Set ws = ActiveWorkbook.ActiveSheet
Set rDest = ws.Range("I2")

With ws.Range(rDest, ws.Cells(ws.Rows.Count, rDest.Column).End(xlUp))
    If .Row >= rDest.Row Then .ClearContents
End With

lCount = Val(ws.Range("E4").Value)
sValue = ws.Range("E8").Value

If lCount > 0 Then rDest.Resize(lCount) = sValue

End Sub

第二页:代码

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range("E4"), Range(Target.Address)) Is Nothing Then
Call mac
End Sub

输出:应如下所示 Output Imagehttps://i.stack.imgur.com/voz7g.png

1 个答案:

答案 0 :(得分:2)

几件事

  • 您的Worksheet_Change过程应使用Sheet1代码而不是Sheet2-至少是从表达问题的方式出发。

  • 还应使用Worksheet声明(例如Sheets("Sheet1")进行显式表示,而不要使用ActiveSheet

    li>
  • 在您的Intersect中,Range(Target.Address)的符号是完全多余的,因为Target已经是Range对象。

您在Sheet1中的代码应为:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Sheets("Sheet1").Range("E4"), Target) Is Nothing Then
       Call mac
    End If
End Sub

Module

Private Sub mac()

Dim ws As Worksheet
Dim rDest As Range
Dim lCount As Long
Dim sValue As String

Set ws = ThisWorkbook.Sheets("Sheet2") ' note the explicit declaration
Set rDest = ws.Range("I2")

With ws.Range(rDest, ws.Cells(ws.Rows.Count, rDest.Column).End(xlUp))
    If .Row >= rDest.Row Then .ClearContents
End With

lCount = Val(ws.Range("E4").Value)
sValue = ws.Range("E8").Value

If lCount > 0 Then rDest.Resize(lCount) = sValue

End Sub
  

作为个人说明,我认为我会避免使用“单行If语法”,这是一种不好的编程习惯,并且会导致意外错误和更差的代码可读性。

     
    

作为一个很好的例子,请检查this question/answer