单元格值更改时自动触发宏| Excel | VBA|
表1作为输入值 表2为我的价值和数据 使用单元格值更改时自动触发宏| 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("
=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