我正在尝试使用 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"
。