我已经编写了一个vba脚本,用于在Windows 7 / Office 2010上运行良好的工作,只要它在单独的Excel窗口中打开即可。在同一窗口中同时运行其他工作簿会导致错误。有时候这有点麻烦,但人们对它有问题并没那么多,所以我从来没有花时间去看它。
最近我们的系统升级到Windows 8和Office 2013,它会自动打开单独的Excel窗口,但会出现与旧系统在一个窗口中打开多个工作簿时相同的错误。发生此错误是因为我正在处理另一个工作簿,并且活动工作簿不包含VBA工作簿确实包含的多个工作表。
我可以通过每次代码运行时激活VBA工作簿+工作表(每15秒)来解决这个问题,但这会强制将VBA工作簿放在前面。有没有办法让代码在VBA工作簿上运行,而不是一直强制它到前台?此时我无法在与任何其他Excel工作表相同的PC上运行我的VBA工作簿,这非常不方便。任何帮助将不胜感激!
此刻我改变了几件事
的ThisWorkbook
Private Sub Workbook_Open()
Set WB = ActiveWorkbook
Set WS = WB.ActiveSheet
End Sub
模块MyModule
Public WB As Workbook
Public WS As Worksheet
模块OtherModule
Sub ColumnNamer()
Dim titleRow As Integer
Dim titlerng As Range
titleRow = 5
Set titlerng = Workbooks(WB).Sheets(WS).Range(Cells(titleRow, 1), Cells(titleRow, 50))
colFind = WorksheetFunction.Match("SEARCH_TAG", titlerng, 0)
End Sub
调用ColumnNamer Sub会导致以下结果(手动转换(错误:编译错误(预期为矩阵/数组)。
答案 0 :(得分:0)
您指的是ActiveWorkbook吗?使用VBA代码启动工作簿时,我创建一个引用活动工作簿的对象,然后使用此对象。这可以确保我引用一个特定的工作簿而不仅仅是可以随时更改的ActiveWorkbook。
创建一个模块并插入:
Public WB As Workbook
Public WS As Worksheet
现在将此代码添加到ThisWorkbook对象:
Private Sub Workbook_Open()
Set WB = ActiveWorkbook
Set WS = WB.ActiveSheet
End Sub
在另一个模块中
Sub ColumnNamer()
Dim titleRow As Integer
Dim titlerng As Range
Dim colfind
On Error GoTo ErrHandler
titleRow = 3
Set titlerng = WS.Range(Cells(titleRow, 1), Cells(titleRow, 50))
colfind = Application.WorksheetFunction.Match("SEARCH_TAG", titlerng, 0)
Exit Sub
ErrHandler:
colfind = -1 'value is not found in given range
End Sub
请注意,由于第三个参数设置为零,因此在范围(第二个参数)中找不到搜索值(第一个参数)将产生错误。所以你必须抓住那个......