Excel 我在第1页上输入了VBA代码。我想让代码在第2页上运行。我是否只是将代码从第1页复制到第2页?

Excel 我在第1页上输入了VBA代码。我想让代码在第2页上运行。我是否只是将代码从第1页复制到第2页?,excel,vba,Excel,Vba,我在这里发现这个VBA代码非常有效。我希望代码在工作簿中的其他工作表上工作。代码在第1页非常有效,但我希望代码也能在第2页、第3页等工作。我尝试从Sheet 1模块复制代码,并将其粘贴到Sheet 2、Sheet 3等中,以查看代码是否有效。代码并不像我预期的那样工作。我想我需要对标准模块代码做些什么,这样代码才能正常工作 表1模块 Private Sub Worksheet_Calculate() Dim rng As Range, c As Range Dim rngToCo

我在这里发现这个VBA代码非常有效。我希望代码在工作簿中的其他工作表上工作。代码在第1页非常有效,但我希望代码也能在第2页、第3页等工作。我尝试从Sheet 1模块复制代码,并将其粘贴到Sheet 2、Sheet 3等中,以查看代码是否有效。代码并不像我预期的那样工作。我想我需要对标准模块代码做些什么,这样代码才能正常工作

表1模块

Private Sub Worksheet_Calculate()
    Dim rng As Range, c As Range
    Dim rngToColor As Range

    On Error GoTo ErrorHandler

    Application.EnableEvents = False
    'get only used part of the sheet
    Set rng = Intersect(Me.UsedRange, Me.Range("A:Z"))
    If rng Is Nothing Then GoTo ExitHere 

    For Each c In rng
        'check if previous value of this cell not equal to current value
        If cVals(c.Address) <> c.Text Then
            'if so (they're not equal), remember this cell
            c.ClearComments
            c.AddComment Text:="Changed value from '" & cVals(c.Address) & "' to '" & c.Text & "'" & " on " & Format(Date, "mm-dd-yyyy") & " by " & Environ("UserName")
            c.Interior.ColorIndex = 36
        End If

        'store current value of cell in dictionary (with key=cell address)
        cVals(c.Address) = c.Text
    Next c

ExitHere:
    Application.EnableEvents = True
    Exit Sub
ErrorHandler:
    Resume ExitHere
End Sub
标准模块

Public cVals As New Dictionary

Sub populateDict()
    Dim rng As Range, c As Range

    With ThisWorkbook.Worksheets("Sheet1")
        Set rng = Intersect(.UsedRange, .Range("A:Z"))
        For Each c In rng
            cVals(c.Address) = c.Text
        Next c
        .Calculate
    End With

End Sub
编辑:我采用了标准模块,并将其修改为:

Sub populateDict()
    Dim rng As Range, c As Range

    With ThisWorkbook.Worksheets("Sheet1")
        Set rng = Intersect(.UsedRange, .Range("A:Z"))
        For Each c In rng
            cVals(c.Address) = c.Text
        Next c
        .Calculate
    End With

    With ThisWorkbook.Worksheets("Sheet2")
        Set rng = Intersect(.UsedRange, .Range("A:Z"))
        For Each c In rng
            cVals(c.Address) = c.Text
        Next c
        .Calculate
    End With

End Sub

这种编辑几乎可以做到这一点,但不确定代码为什么不能正常工作。一种方法是将代码放在单独的模块中,然后将活动工作表设置为如下所示的变量:

Sub myScript()
    Dim wks As Worksheet

    Set wks = ActiveSheet

    MsgBox (wks.Range("A1"))
End Sub
Private Sub CommandButton1_Click()
    Call myScriptPass(ActiveSheet)

    'Or you can qualify it like this
    Call myScriptPass(Sheets(1))
End Sub
如果在Sheet1处于活动状态时调用此函数,它将从Sheet1返回值



另一种方法是将工作表作为变量传递给sub。向希望从中运行宏的每个工作表添加一个按钮。双击“设计模式”中的每个按钮,以便在编辑器中打开VBA单击事件。向您的sub添加呼叫,如下所示:

Sub myScript()
    Dim wks As Worksheet

    Set wks = ActiveSheet

    MsgBox (wks.Range("A1"))
End Sub
Private Sub CommandButton1_Click()
    Call myScriptPass(ActiveSheet)

    'Or you can qualify it like this
    Call myScriptPass(Sheets(1))
End Sub
现在将宏更改为:(仍位于单独的模块中)


编辑

使用添加到帖子中的代码,可以将其更改为以下内容:

Public cVals As New Dictionary

Sub record()
    Dim wks As Worksheet
    Set wks = ActiveSheet

    Dim rng As Range, c As Range

    With wks
        Set rng = Intersect(.UsedRange, .Range("A:Z"))
        For Each c In rng
            cVals(c.Address) = c.Text
        Next c
        .Calculate
    End With
End Sub
现在,它将在任何工作表处于活动状态时运行。因此,如果您通过Sheet1上的按钮调用宏,则代码将在Sheet1上运行


主程序的循环

Public cVals As New Dictionary

Sub myMainProgram()
    Dim wks As Worksheet

    'Loop thru each sheet in workbook example
    For Each wks In Worksheets
        Call record(wks)
    Next wks

    'Call subroutine for specific sheet example
    Call record(sheets("sheet1"))
End Sub

Sub record(wks As Worksheet)
    Dim rng As Range, c As Range

    With wks
        Set rng = Intersect(.UsedRange, .Range("A:Z"))
        For Each c In rng
            cVals(c.Address) = c.Text
        Next c
        .Calculate
    End With

    MsgBox ("Record macro was run on " & wks.Name & " worksheet.")
End Sub

是的,那是一种方法。您可能需要修复所有单元格引用。单元格引用是相同的。我在想,我是否可以编辑代码,这样我就只需将代码添加到“thisworkbook”代码中,而不必为每个工作表复制和粘贴代码?我忘了提到我有一个工作表计算事件,这样一旦单元格中的内容更改值,代码就会运行。我在第一篇文章中包含了我的代码。请看你是否能解决这个问题。好的,看我的编辑。顺便问一下,你是如何运行宏的,它是工作表上的一个按钮还是其他代码?我认为你的思路是正确的。宏是从我拥有的另一个代码运行的。我会试试你修改过的代码。我又做了一次编辑。现在有一个从另一个代码块调用例程的示例。它显示了如何循环浏览所有工作表以及如何发送特定工作表。当我单击每个工作表时,您以前的代码引发了“我的工作表计算”事件。我现在将尝试您的增强代码。