Excel宏不';t在被修改时更新

Excel宏不';t在被修改时更新,excel,vba,if-statement,Excel,Vba,If Statement,请参阅附件: 我有一张桌子在床单1上。在每一行的末尾,我希望有一个按钮,其中指定了一个宏,如果该行的第一个单元格等于“Sheet2”,它将该行的数据填充到Sheet2中的一些单元格中。 如果第一行显示“Sheet3”,它将该行中的数据填入Sheet3中的某些单元格。 所以我首先记录了一个宏,如下所示: Sub fill() ' ' fill Macro ' Sheets("Sheet2").Select Range("B2").Select ActiveCell.Form

请参阅附件: 我有一张桌子在床单1上。在每一行的末尾,我希望有一个按钮,其中指定了一个宏,如果该行的第一个单元格等于“Sheet2”,它将该行的数据填充到Sheet2中的一些单元格中。 如果第一行显示“Sheet3”,它将该行中的数据填入Sheet3中的某些单元格。 所以我首先记录了一个宏,如下所示:

Sub fill()
'
' fill Macro
'
    Sheets("Sheet2").Select
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("D3").Select
    Sheets("Sheet1").Select

End Sub
然后我尝试将其设置为有条件的:

Sub fill()
'
' fill Macro
'
If Sheet1.Range("A1").Value = "Sheet2" Then
    Sheets("Sheet2").Select
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "=Sheet1!R[-1]C"
    Range("D3").Select
    Sheets("Sheet1").Select
    End If
End Sub

但问题是if子句没有执行!不管A1的值是多少,它都会像没有条件一样不断地填充表2!我也保存和运行。请告诉我哪里错了。谢谢

使用
ActiveSheet.Buttons(Application.Caller).TopLeftCell
将告诉您刚才单击的按钮的范围。 从那里你可以得到A列中的工作表名称,并将信息发送到那里

代码 将表单工具箱中的按钮添加到第一个单元格中,并将宏指定给该按钮。可以对第一个单元格执行此操作,然后向下拖动单元格以复制按钮

单击按钮,代码将把数据发送到正确的工作表。
该代码有两个MSGBox,您可以删除它们,只是为了向您展示正在发生的事情

您可以尝试设置断点并确保它被命中。您可能有两个版本的宏,但您没有运行您认为是的版本。当我们的代码似乎在做一些不可能的事情时,这几乎总是意味着某些假设——比如实际执行的代码——是错误的。谢谢Scott。即使我删除了fill函数的中间行,它仍然执行原始函数中的操作。我认为它把它保存在缓存或其他地方,然后执行它。我甚至右键单击按钮,确保它被分配了更新的宏,但在执行时,仍然会执行原始的旧宏!!!如果将Sheet2写入Sheet1的单元格A1中,则工作正常。不是你想要的,但是它把公式写在表2中,如果A1中还有其他内容,它什么也不做。就像你写的那样。创建按钮有不同的方法。如何创建一个(简而言之)?你会创造多少呢?谢谢。无论我在A1中写了什么,它都会执行原始的fill函数,而不使用if子句。即使我删除了一半的函数,它仍然执行原来的!我从“开发人员”选项卡->插入->按钮创建了底部,然后右键单击它并将宏分配给它,在分配之前,我检查编辑以确保它是我的宏,但不管怎样,它执行原始功能!!!正如@ScottHannen所建议的(在阅读他的评论时,您似乎错过了),设置一个断点并逐步遍历代码,断点是否会在您期望的时候停止?执行的代码是否符合您的预期?如果没有,您就有两份代码副本。如果它进入正确的代码,您可以看到是什么使它无法运行您期望的代码。我们无法在调试程序中为您运行代码,因为我们没有包含该内容的电子表格。
Sub Rng_Butn_Clicked()
    Dim BtRng As Range, sh As Worksheet, rw As Long

    Set BtRng = ActiveSheet.Buttons(Application.Caller).TopLeftCell

    MsgBox BtRng.Address    'remove later
    MsgBox Cells(BtRng.Row, 1).Value    'remove later

    Set sh = Sheets(Cells(BtRng.Row, 1).Value)

    With sh
        rw = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
        .Cells(rw, 2).Value = Cells(BtRng.Row, 2).Value
        .Cells(rw, 3).Value = Cells(BtRng.Row, 3).Value
        .Cells(rw, 4).Value = Cells(BtRng.Row, 4).Value
    End With

End Sub