在 Excel 2013 中使用此 VB 代码需要哪些步骤?

在 Excel 2013 中使用此 VB 代码需要哪些步骤?

我正在尝试使用 VB 代码Excel 2013 中的问题,无法正常工作。我不熟悉 VB,很可能错过了一个简单的步骤。

Private Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range) 
If UCase(Sh.Name) = "sheet1" Or UCase(Sh.Name) = "sheet2" Then 
    If Not Application.Intersect(Target, Range("A1")) Is Nothing Then 
        Application.EnableEvents = False 
        If UCase(Target.Parent.Name) = "SHEET1" Then 
            Sheets("Sheet2").Range("A1") = Target 
        Else 
            Sheets("Sheet1").Range("A1") = Target 
        End If 
        Application.EnableEvents = True 
    End If 
 End If
End Sub

使用包含工作表名为 Sheet1 和 Sheet2 的新工作簿我在 Visual Basic 中尝试了以下操作:

  • 将代码粘贴到对象中:ThisWorkbook
  • 将代码粘贴到对象中:Sheet1(Sheet1)和Sheet2(Sheet2)
  • 将代码粘贴到所有 3 个对象中
  • 确保工作簿已保存为启用宏
  • 确保工作簿安全设置已设置为信任对 VBA 对象模型的访问,并且已启用宏

为了运行该代码我需要做什么?

回应 Mat's Mug 的建议:

我按照您的建议将代码放入标准模块中,将过程更改为公共并修改范围。但是,我仍然无法让它将值从一张纸上的范围复制到另一张纸上。代码现在如下所示:

Public Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range)
If UCase(Sh.Name) = "SHEET1" Or UCase(Sh.Name) = "SHEET2" Then
    If Not Application.Intersect(Target, Range("A1:J23")) Is Nothing Then
        Application.EnableEvents = False
        If UCase(Target.Parent.Name) = "SHEET1" Then
            Sheets("Sheet2").Range("A1:J23") = Target
        Else
            Sheets("Sheet1").Range("A1:J23") = Target
        End If
        Application.EnableEvents = True
    End If
 End If
End Sub

答案1

ThisWorkbook并且SheetX对象是特殊的“文档”班级模块;宏更容易暴露标准模块,所以不要把它粘贴到任何地方,而是添加一个新的代码模块(.bas)并将其粘贴到那里。

添加新代码模块的最简单方法是右键单击项目浏览器(Ctrl+R)并选择插入>模块

下一个问题是,该过程是Private。“私有”意味着任何必须查看和调用此过程的代码都必须位于同一个范围- 即在同一个模块中。完成Public之后你就可以从任何地方调用它了。

下一个问题是参数。从实现来看,它似乎Sh应该是一个Worksheet对象,并且Target是一个Range对象:要运行该过程,您必须提供参数。

有很多方法可以做到这一点。

其中之一就是提出立即窗格(Ctrl+G)并直接调用它:

Module1.Workbook_TwoWayMatch Sheet42, Sheet42.Range("Z123")

当然,您传递的实际参数将根据您想要实现的目标而有所不同,但我希望您能明白我的意思。

答案2

问题可能是UCase(Sh.Name) = "sheet1"第 2 行永远不会发生。

尝试将它们更改为"SHEET1""SHEET2"

相关内容