【问题标题】:Trigger macro automatically on cell value change |Excel|VBA|单元格值变化时自动触发宏|Excel|VBA|
【发布时间】:2019-05-25 07:24:47
【问题描述】:

表格 1 作为输入值

表 2 作为我的价值和数据

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

我想避免 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

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

【问题讨论】:

  • 你添加了很多细节,但不太清楚你认为什么不起作用......?
  • 您可能想在Sheet1 中使用Worksheet_Change 事件?并在您的函数Set ws = ActiveWorkbook.Sheets("Sheet2") 中按名称设置您的工作表

标签: excel vba


【解决方案1】:

几件事

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

作为一个很好的例子说明为什么,检查this question/answer

【讨论】:

  • 那你的宏程序有问题,我看不懂你的想法,但我的回答在程序上是正确的
  • 感谢兄弟工作!!!我做了一点点更改表 1 代码应该是 F5 而不是表 2 值“E4”=>我们需要传递表 1 的值
  • 很高兴它有帮助。
  • 是否可以像这样取两个值并并行打印 => paste.pics/3eb581ed87184d251d910328537f2973 => 这对我真的很有帮助
  • 为此创建一个单独的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多