第1张表作为ENTER VALUE
第2页作为我的值和数据
使用=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
答案 0 :(得分:2)
几件事
您的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