在背景表上运行Excel vba代码

时间:2015-04-06 13:07:11

标签: excel vba windows-8 office-2013

我已经编写了一个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会导致以下结果(手动转换(错误:编译错误(预期为矩阵/数组)。

1 个答案:

答案 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

请注意,由于第三个参数设置为零,因此在范围(第二个参数)中找不到搜索值(第一个参数)将产生错误。所以你必须抓住那个......