Excel VBA-一旦我从另一个工作表复制值,VBA脚本就无法在目标工作表上运行

时间:2018-11-11 09:58:32

标签: excel vba

我使用以下VBA脚本:

    Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xCount As Long
    Dim valueCell As Range
    Dim timeStampCell As Range
    Dim targetCell As Range
    Dim xVal As Long

    Application.EnableEvents = False

    '''''EDIT''''''

    Set targetCell = Range("G15")
    Set timeStampCell = Range("R2")
    Set valueCell = timeStampCell.Offset(0, 1)

    '''''''''''''''

    xCount = Cells(ActiveSheet.Rows.Count, valueCell.Column).End(xlUp).Row - 1

    If Target.Address = targetCell.Address Then
        valueCell.Offset(xCount, 0).Value = targetCell.Value
        timeStampCell.Offset(xCount, 0).Value = Date
    Else
        If valueCell.Offset(Cells(ActiveSheet.Rows.Count, valueCell.Column).End(xlUp).Row - 2, 0).Value <> targetCell.Value Then
        valueCell.Offset(xCount, 0).Value = targetCell.Value
        timeStampCell.Offset(xCount, 0).Value = Date
        End If
    End If

    Application.EnableEvents = True

End Sub

当我在活动表(数据)中使用它时,它可以正常工作。 实际上,脚本会检查目标值是否发生了更改(使用其他单元格中的公式更新了该值)以及目标值(G15)是否已更改,然后将新值复制到表的第一行中

问题是我需要将表格移动到另一张纸上。 我使用了一个公式,将值从初始工作表的G15复制到新工作表的单元格E1(MonthlyData)中,并将VBA脚本从“数据”移动到“ MonthlyData”。我修改了脚本,如下所示:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xCount As Long
    Dim valueCell As Range
    Dim timeStampCell As Range
    Dim targetCell As Range
    Dim xVal As Long

    Application.EnableEvents = False

    '''''EDIT''''''

    Set targetCell = Sheets("MonthlyData").Range("E1")
    Set timeStampCell = Sheets("MonthlyData").Range("A2")
    Set valueCell = timeStampCell.Offset(0, 1)

    '''''''''''''''

    xCount = Cells(Sheets("MonthlyData").Rows.Count, valueCell.Column).End(xlUp).Row - 1

    If Target.Address = targetCell.Address Then
        valueCell.Offset(xCount, 0).Value = targetCell.Value
        timeStampCell.Offset(xCount, 0).Value = Date
    Else
        If valueCell.Offset(Cells(Sheets("MonthlyData").Rows.Count, valueCell.Column).End(xlUp).Row - 2, 0).Value <> targetCell.Value Then
        valueCell.Offset(xCount, 0).Value = targetCell.Value
        timeStampCell.Offset(xCount, 0).Value = Date
        End If
    End If
    Application.EnableEvents = True

End Sub

现在有问题...如果我手动将E1单元格更新为另一个值,则可以正常工作,如果值E1更改为自动更改工作表(数据)中的值,则将更新MonthlyData中的值E1,但VBA脚本不会更新工作,表中的值未更新...

有人可以帮忙吗?

谢谢

2 个答案:

答案 0 :(得分:0)

每月数据表中的

Worksheet_Change事件应该不会触发,因为该表中没有变化。只有单元格的值被更改。

最好将“ MonthlyData”的Worksheet_Change的代码包装在子过程中,并从找到G10的Worksheet_Change分支中的数据表的if事件中调用它改变了。

在数据表的Worksheet_Change事件中,只需添加一行即可直接更改MonthlyDatasheet的E1单元格

Sheets("MonthlyData").Range("E1").Value= targetCell.Value

编辑:我尝试使用以下代码放置在Sheet(“ DATA”)Worksheet_Change事件中触发Sheet(“ MonthlyData”)Worksheet_Change事件。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Sheets("DATA").Range("G10") Then
Sheets("MonthlyData").Range("E1").Value = Sheets("DATA").Range("G10").Value
End If
End Sub

它已成功将G10 (我使用G10代替G15)值添加到E1,并触发了Sheet(“ MonthlyData”)Worksheet_Change事件。再次使用您的MonthlyData Worksheet_Change事件的完整代码进行检查,并发现它可以正常工作。

ScreenShot

答案 1 :(得分:0)

我认为您还需要在数据表上添加代码Worksheet_Change事件。如果Sheets(“ MonthlyData”)。Range(“ E1”)是来自Sheets(“ Data”)。Range(“ A1”)的公式,我以此为例 请将此代码添加到数据表中:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Range("A1") Then
        Sheets("MonthlyData").Range("E1").Formula = Sheets("MonthlyData").Range("E1").Formula
    End If

End Sub

希望获得帮助。

谢谢。