VBA: запустите макрос для другой книги (не из)

У меня есть книга (A), в которой у меня есть один модуль с одной подпрограммой. Подпрограмма загружает файл excel (рабочая книга (B)) из Интернета и открывает его. Проблема, с которой я столкнулся, – найти способ выполнить подпрограмму в книге (B) из подкаталога в книге (A).

Повторяю, у меня есть моя желаемая подпрограмма только в книге (A) и вы хотите применить ее к книге (B), используя суб в книге (A).

Примечание. В моей книге кода (B) = Nuance Mobility JIRA.xls и требуемой подпрограмме в рабочей книге (B), которая должна быть выполнена, является removeColumns ().

Мой код можно найти ниже:

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), хромированное окно не появляется спереди?

Проблема, с которой вы сталкиваетесь, возникает из-за того, что вы не напрямую обращаетесь к нужному рабочему листу / книге, вы, скорее, всегда используете Selected рабочий лист, который вы не должны. Это неясно и может быть сделано так же просто, если прямо ссылаться.

Чтобы обратиться к worbookB я добавил параметр в sub 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 

Надеюсь, что смогу помочь, и если что-то еще неясно, не стесняйтесь спрашивать .

Interesting Posts

Как я могу установить aspose ячейки, чтобы взять локаль для формата даты из ОС?

Разделить с использованием разделителя, за исключением случаев, когда разделитель экранирован

Предупреждающее сообщение, если имя файла уже существует при создании файла PDF

Автозаполнение при наличии пустых значений

Надстройка VSTO Excel с Visual Studio Express

Какая лучшая структура данных используется для сохранения данных из файла excel, который затем будет использоваться для создания графического интерфейса, в котором данные могут быть отредактированы?

Перекрестная книга Vlookup

Openpyxl, удаляющий ячейки

вернуть созданный файл excel с флягой

Укладка нескольких диапазонов в динамический массив

Как получить данные Excel в Word ContentControl

Несоответствия формулы условного форматирования Excel в цветовом кодировании

Как преобразовать файл ms-Excel в pdf в java

C # Чтение файла Excel по столбцу Индекс

Прикрепите CSV к файлу Excel как лист

Давайте будем гением компьютера.