首页 > 解决方案 > 单元格值变化时自动触发宏|Excel|VBA|

问题描述

表 1 作为输入值

在此处输入图像描述

表 2 作为我的价值和数据

在此处输入图像描述

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

我想避免 onclick 按钮事件 => 一旦工作表 1 中的值更改为 10,然后工作表 2 中的值更改为 10 => 然后获取工作表 2 中更改的值,宏应自动检测发生的值更改那么数据的打印应该在 I 列中发生多次

模块 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

表 2:代码

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

输出:应该像下面这样 输出图像https ://i.stack.imgur.com/voz7g.png

标签: excelvba

解决方案


一些事情

  • 您的Worksheet_Change程序应该是Sheet1代码而不是Sheet2- 至少从您表达问题的方式来看。

  • 还要明确你的Worksheet声明(例如Sheets("Sheet1"),而不是使用类似的东西ActiveSheet

  • 在你的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语法”,这是一种糟糕的编程习惯,会导致意外错误和更差的代码可读性。

作为一个很好的例子说明为什么,检查这个问题/答案


推荐阅读