Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单元格值更改时自动触发宏| Excel | VBA|_Excel_Vba - Fatal编程技术网

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

单元格值更改时自动触发宏| Excel | VBA|,excel,vba,Excel,Vba,表1作为输入值 表2为我的价值和数据 使用=Sheet1!从Sheet1值引用图纸值!E4 我希望避免onclick Button event=>一旦工作表1中的值更改为10,则工作表2中的我的值更改为10=>然后取工作表2中更改的值。宏应自动检测发生的值更改,然后在第I列中多次打印数据 模块1我的宏: 第2页:代码 Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Range("

表1作为输入值

表2为我的价值和数据

使用
=Sheet1!从Sheet1值引用图纸值!E4

我希望避免onclick Button event=>一旦工作表1中的值更改为10,则工作表2中的我的值更改为10=>然后取工作表2中更改的值。宏应自动检测发生的值更改,然后在第I列中多次打印数据

模块1我的宏:

第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
输出:如下所示 :

很少有事情

  • 您的
    工作表\u更改
    程序应该在
    表1
    代码中,而不是
    表2
    ——至少从您的问题措辞来看是这样的

  • 也要明确使用
    工作表
    声明(例如
    工作表(“Sheet1”)
    ),而不是使用
    ActiveSheet

  • Intersect
    中,
    Range(Target.Address)
    的符号是完全冗余的,因为
    Target
    已经是
    Range
    对象

表1中的代码应为:

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

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
语法”,我认为这是一种糟糕的编程实践,会导致意外错误和更糟糕的代码可读性

作为一个关于原因的好例子,请检查


您已经添加了很多详细信息,但不太清楚您认为什么不起作用…?您可能想使用
工作表中的
更改
事件来代替
工作表1
?并在函数中按名称设置工作表
set ws=ActiveWorkbook.Sheets(“Sheet2”)
如果宏过程有问题,我看不懂你的心思,但我的答案在编程上是正确的,谢谢兄弟工作!!!我对第1页代码做了一些小改动,应该是F5而不是第2页的值“E4”=>我们需要传递第1页的值,很高兴这有帮助。是否可以取两个值并像这样并行打印=>=>这对我来说真的很有帮助创建一个单独的问题
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