VBA:运行macros另一个工作簿(而不是)

我有一个工作簿(A),其中我有一个子程序模块。 该子程序从互联网上下载一个excel文件(工作簿(B))并打开它。 我遇到的问题是find一种方法来从工作簿(A)中的子工作簿(B)中执行子例程。

重申一下,我在工作簿(A)中有我想要的子程序,并希望通过使用工作簿(A)中的子程序将它应用于工作簿(B)。

注意:在我的代码工作簿(B)= Nuance移动JIRA.xls和工作簿(B)中需要执行的所需的子例程是removeColumns()。

我的代码可以在下面find:

Public Sub DL() Dim WebUrl As String Dim x As Workbook Dim z As Workbook Dim nmjexcel As String Dim xlApp As Excel.Application ' I check to see if the file exists and delete it if it does nmjexcel = "C:\Users\" & [A2] & "\Downloads\Nuance Mobility JIRA.xls" If Len(Dir(nmjexcel)) <> 0 Then SetAttr nmjexcel, vbNormal Kill nmjexcel End If 'I open chrome and download the file from an URL WebUrl = [J1] Shell ("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe -url " & WebUrl) Application.Wait (Now + TimeValue("0:00:3")) 'I create a new 'hidden' excel app and open workbook (B) Set xlApp = New Excel.Application xlApp.Visible = False Set x = Workbooks.Open("C:\Users\" & [A2] & "\Downloads\Nuance Mobility JIRA.xls") ' I delete some rows, a picture and some columns. ' It's here that i would like my other subroutine, removeColumns(), to take place ! With x.Sheets("general_report") .Rows("1:3").Delete .Shapes.Range(Array("Picture 1")).Delete .Cells.UnMerge .Range("A:A,D:D,E:E,F:F,H:H,I:I,J:J,K:K,L:L,M:M,N:N,O:O,P:P").Delete Shift:=xlToLeft End With 'Then I copy whats left and paste it into workbook (A) Set z = ThisWorkbook Application.ScreenUpdating = False x.Sheets("general_report").Range("A1").CurrentRegion.Copy z.Sheets(1).Range("A13").PasteSpecial xlValues x.Save x.Application.CutCopyMode = False x.Close End Sub 

我想要的子被执行如下

 Sub removeColumns() Dim rng As Range 'store the range you want to delete Dim c 'total count of columns Dim I 'an index Dim j 'another index Dim headName As String 'The text on the header Dim Status As String 'This vars is just to get the code cleaner Dim Name As String Dim Age As String Dim sht As Worksheet Rows("1:3").Delete Key = "Key" Summary = "Summary" Status = "Status" Set sht = Sheets("general_report") sht.Activate 'all the work in the sheet "Incidents" c = Range("A1").End(xlToRight).Column 'From A1 to the left at the end, and then store the number 'of the column, that is, the last column j = 0 'initialize the var For I = 1 To c 'all the numbers (heres is the columns) from 1 to c headName = Cells(1, I).Value If (headName <> Key) And (headName <> Summary) And (headName <> Status) Then 'if the header of the column is differente of any of the options j = j + 1 ' ini the counter If j = 1 Then 'if is the first then Set rng = Columns(I) Else Set rng = Union(rng, Columns(I)) End If End If Next I rng.Delete 'then brutally erased from leaf End Sub 

提前非常感谢!

进一步的问题 :

1)有没有办法保持下载的Excel隐藏?

我有 :

 Set xlApp = New Excel.Application xlApp.Visible = False Set x = Workbooks.Open("C:\Users\" & [A2] & "\Downloads\Nuance Mobility JIRA.xls") 

但是,如果我使用x = xlApp .Workbooks.Open它会给我一个错误“下标超出范围”,并强调:

 Set sht = Sheets("general_report") 

我试过了

 Dim xlApp as Excel.Application) ... Set sht = xlApp.Sheets("general_report") 

但它会得到更多的错误

2)更一般地说,是他们把注意力集中在我的工作簿(A)上的一种方式,所以当铬下载工作簿(B)时,铬窗口不会在前面popup?

您遇到的问题是因为您不直接处理所需的工作表/工作簿而发生的,因此您总是使用“ Selected工作表”,而不应该这样做。 不清楚,直接提及就可以做到这一点。

要引用worbookB我向子removeColumns添加了一个参数,以便您可以传递所需的工作簿。

然后,在你使用工作表的地方,你只需要使用引用。

所以,而不是只写:

 somVariable = Cells(1,1).Value 'This always refers to the 'Selected' worksheet 

你必须写:

 someVariable = myWorkbook.myWorksheet.Cells(1,1).Value 'or to use the parameter wb like i did in your code: someVariable = wb.Sheets(1).Cells(1,1).Value 'Here the first sheet of this workbook will be used 'You also can use the 'With' statment here: With wb.Sheets(1) someVariable = .Cells(1,1).Value 'Note the dot in font of the 'Cells' End With 

所以为了在你的例子中使用这些知识,你应该尝试改变如下的代码:

 ///////////////////////////////////////////////////////////////////////// Set xlApp = New Excel.Application xlApp.Visible = False xlApp.Workbooks.Open("C:\Users\" & [A2] & "\Downloads\Nuance Mobility JIRA.xls") Set x = xlApp.Workbooks(1) Call removeColumns(x) ///////////////////////////////////////////////////////////////////////// 

 Sub removeColumns(ByVal wb As Workbok) ... 'Always when you are referring to the workbook, you have to use the reference passed as parameter wb.Sheets("general_report").Rows("1:3").Delete 'In you code the first three rows will always be deleted from the 'Selected' sheet and not the one you are working on later, the 'general_report' ... Set sht = wb.Sheets("general_report") 'Also don´t activate() sheet here, youst directly refer to it later 'sht.Activate 'all the work in the sheet "Incidents" 'You can directly refer t it over the variable you created, like this: c = sht.Range("A1").End(xlToRight).Column 'From A1 to the left at the end, and then store the number 'of the column, that is, the last column j = 0 'initialize the var For I = 1 To c 'all the numbers (heres is the columns) from 1 to c headName = sht.Cells(1, I).Value If (headName <> Key) And (headName <> Summary) And (headName <> Status) Then 'if the header of the column is differente of any of the options j = j + 1 ' ini the counter If j = 1 Then 'if is the first then Set rng = sht.Columns(I) Else Set rng = Union(rng, sht.Columns(I)) End If End If Next I rng.Delete 'then brutally erased from leaf End Sub 

希望我可以帮忙,如果有什么东西还不清楚, 随时问