При открытии книги Excel с помощью VBA, как сделать открытую книгу активным окном? Открыть книгу vba


vba - Excel VBA Открыть книгу, выполнить действия, сохранить как, закрыть

Я постараюсь ответить на несколько разных вопросов, однако мой вклад может не охватывать все ваши вопросы. Возможно, некоторые из нас могут взять из этого разные куски. Однако эта информация должна быть полезной для вас. Здесь мы идем..

Открытие отдельного файла:

ChDir "[Path here]" 'get into the right folder here Workbooks.Open Filename:= "[Path here]" 'include the filename in this path 'copy data into current workbook or whatever you want here ActiveWindow.Close 'closes out the file

Открытие файла с указанной датой, если оно существует:

Я не уверен, как искать в вашем каталоге, чтобы увидеть, существует ли файл, но в моем случае я бы не стал его искать, я бы просто попытался открыть его и внести некоторую проверку ошибок, чтобы если он не существует, отобразите это сообщение или выполните xyz.

Некоторые распространенные операторы проверки ошибок:

On Error Resume Next 'if error occurs continues on to the next line (ignores it) ChDir "[Path here]" Workbooks.Open Filename:= "[Path here]" 'try to open file here

Или (лучший вариант):

если этого не существует, тогда выведите либо окно сообщения или диалог чтобы сказать: "Файл не существует, хотите ли вы создать новый один?

вы, скорее всего, захотите использовать GoTo ErrorHandler, показанный ниже, для достижения этого

On Error GoTo ErrorHandler: ChDir "[Path here]" Workbooks.Open Filename:= "[Path here]" 'try to open file here ErrorHandler: 'Display error message or any code you want to run on error here

Намного больше информации об обработке ошибок здесь: http://www.cpearson.com/excel/errorhandling.htm

Кроме того, если вы хотите узнать больше или знать больше в VBA, я бы рекомендовал сайт Siddharth Rout, у него есть много учебников и пример кода здесь: http://www.siddharthrout.com/vb-dot-net-and-excel/

Надеюсь, это поможет!

Пример того, как гарантировать, что код ошибки не запускается КАЖДЫЙ:

если вы отлаживаете код без Exit Sub ПЕРЕД обработчиком ошибок, вы скоро поймете, что обработчик ошибок будет запускаться каждый раз, если возникнет ошибка или нет. Ссылка ниже примера кода показывает предыдущий ответ на этот вопрос.

Sub Macro On Error GoTo ErrorHandler: ChDir "[Path here]" Workbooks.Open Filename:= "[Path here]" 'try to open file here Exit Sub 'Code will exit BEFORE ErrorHandler if everything goes smoothly 'Otherwise, on error, ErrorHandler will be run ErrorHandler: 'Display error message or any code you want to run on error here End Sub

Кроме того, посмотрите на этот другой вопрос, в котором вам нужно больше ссылок на то, как это работает: перейти не работает VBA

qaru.site

При открытии книги Excel с помощью VBA, как сделать открытую книгу активным окном?

Я использую форму файла xlsm, которая вызывает вторую форму, чтобы попросить пользователя выбрать, какую книгу открыть. Затем код VBA откроет этот рабочий файл. Однако я обнаружил, что в Office 2016 файл открывается за исходным файлом xlsm. То есть, это не станет активным окном. Я могу использовать Alt + Tab, чтобы перейти к открытому файлу, но файл не будет взаимодействовать с моими нажатиями клавиш или щелчками мыши, пока я не закрою Alt + Tab, чтобы активировать исходный файл xlsm. Затем, когда я реагирую на открытый файл VBA, я могу взаимодействовать с ним. То есть файл, открытый VBA, не станет активным до тех пор, пока я не коснусь базы с рабочим файлом с кодом VBA. Я пробовал серию активных рабочих команд, приложений.activewindow для активации открытой книги безрезультатно.

Вот код, который я использую:

Private Sub btn_select_Click() ' User clicks on select. If a subcategory is selected open the file and stop program. If not repopulate sub-category If IsNull(lst_subcategories) Or lst_subcategories = "" Then lst_subcategories.Clear Call populate_data Else ' open file and unload form (End) If lst_datacategories <> "Tourism" Then str_filetoopen = "I:\Bureau-Work\Data System\" & lst_datacategories & "\" & lst_subcategories & ".xlsx" ' May need to be F: drive Else str_filetoopen = "I:\Bureau-Work\Data System\" & lst_subcategories & "\" & lst_subcategories & ".xlsx" ' May need to be F: drive End If On Error Resume Next ' drive or file may not be available. If so error and retain from Set wb = Workbooks.Open(str_filetoopen) If wb Is Nothing Then MsgBox "I: Drive or Retrieve File is Not Accessible" GoTo handle ' retains frm_editData End If Workbooks(wb).Activate ActiveWindow.Visible = True End 'exit all macros and forms once successfully loading file End If handle: End Sub

В и «= True Activewindow.visible» команда «Workbooks (термометр) .Activate» попытка установить новое окно рабочей книги в качестве активного окно. Насколько мне известно, это не происходит в офисе 2013, но может быть свойственен бюро 2016.

excel excel-vba focus1,182

stackoverrun.com

vba - Как я могу открыть эту книгу VBA быстрее?

В настоящее время я пытаюсь сделать макрос, который перейдет в каталог, откройте рабочую книгу (в настоящее время 38 из них в конечном итоге составляют 52), отфильтруйте два столбца, получите общее количество (повторите это 4 раза) и закройте книгу. В настоящее время приложение занимает около 7 минут, чтобы обработать текущие 38 книг.

Как я могу ускорить это? Я уже отключил обновление экрана, события, и я изменил методы расчета на xlCalculationManual. Я не знаю, была ли это обычной практикой, но я видел, как люди спрашивали о способе доступа к рабочей книге, не открывая ее, но предложение об отключении обновления экрана всегда выполняется, что я и сделал.

Когда я запускаю его в режиме отладки, Workbooks.Open() может занимать до 10 секунд. Каталог файлов на самом деле находится в сети компании, но доступ к файлу, как правило, редко занимает в течение 5 секунд.

Данные в книгах могут содержать одни и те же точки, но с другим статусом. Я не думаю, что объединение всех данных в одну книгу было бы возможно.

Я собираюсь экспериментировать с прямыми ссылками на ячейки. Как только у меня появятся некоторые результаты, я обновлю свой пост.

Private UNAME As String Sub FileOpenTest() Call UserName Dim folderPath As String Dim filename As String Dim tempFile As String Dim wb As Workbook Dim num As Integer Dim values(207) As Variant Dim arryindex Dim numStr As String Dim v As Variant Dim init As Integer init = 0 num = 1 arryindex = 0 numStr = "0" & CStr(num) 'Initialize values(x) to -1 For Each v In values values(init) = -1 init = init + 1 Next With Excel.Application .ScreenUpdating = False .Calculation = Excel.xlCalculationManual .EnableEvents = False .DisplayAlerts = False End With 'File path to save temp file tempFile = "C:\Users\" & UNAME & "\Documents\TEMP.xlsm" 'Directory of weekly reports folderPath = "path here" 'First file to open filename = Dir(folderPath & "file here" & numStr & ".xlsm") Do While filename <> "" Set wb = Workbooks.Open(folderPath & filename) 'Overwrite previous "TEMP.xlsm" workbook without alert Application.DisplayAlerts = False 'Save a temporary file with unshared attribute wb.SaveAs filename:=tempFile, AccessMode:=xlExclusive 'operate on file Filters values, arryindex wb.Close False 'Reset file name filename = Dir 'I use this loop to add the appropriate number to the end ie 01, 02, 03 etc If num >= 9 Then num = num + 1 If num = 33 Then num = num + 1 End If numStr = CStr(num) ElseIf num < 9 Then num = num + 1 numStr = "0" & CStr(num) End If filename = Dir(folderPath & "filename here" & numStr & ".xlsm") Loop output values 'Delete "TEMP.xlsm" file On Error Resume Next Kill tempFile On Error GoTo 0 End Sub Function Filters(ByRef values() As Variant, ByRef arryindex) On Error Resume Next ActiveSheet.ShowAllData On Error GoTo 0 'filter column1 ActiveSheet.Range("B6").End(xlDown).AutoFilter Field:=2, Criteria1:=Array( _ "p1", "p2", "p3", "p4", "p5"), Operator:=xlFilterValues 'filter column2 ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array( _ "s1", "d2", "s3"), Operator:=xlFilterValues 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter column2 for different criteria ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:="s" 'filter colum3 for associated form ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="<>" 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter coum 3 for blank forms ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="=" 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter for column4 if deadline was made ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=52 ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array( _ "s1", "s2", "s3", "s4", "s5", "s6"), Operator:=xlFilterValues ActiveSheet.Range("BC6").End(xlDown).AutoFilter Field:=55, Criteria1:=RGB(146 _ , 208, 80), Operator:=xlFilterCellColor 'get total of points values(arryindex) = TotalCount arryindex = arryindex + 1 End Function Public Function TotalCount() As Integer Dim rTable As Range, r As Range, Kount As Long Set rTable = ActiveSheet.AutoFilter.Range TotalCount = -1 For Each r In Intersect(Range("A:A"), rTable) If r.EntireRow.Hidden = False Then TotalCount = TotalCount + 1 End If Next End Function Function UserName() As String UNAME = Environ("USERNAME") End Function Function output(ByRef values() As Variant) Dim index1 As Integer Dim index2 As Integer Dim t As Range Dim cw As Integer 'Calendar week declariations Dim cwstart As Integer Dim cstart As Integer Dim cstop As Integer Dim data As Integer data = 0 start = 0 cw = 37 cstart = 0 cstop = 3 ThisWorkbook.Sheets("Sheet1").Range("B6").Activate For index1 = start To cw For index2 = cstart To cstop Set t = ActiveCell.Offset(rowOffset:=index1, columnOffset:=index2) t.value = values(data) data = data + 1 Next Next End Function

qaru.site

Как я могу открыть эту книгу VBA быстрее? MS Excel онлайн

В настоящее время я пытаюсь сделать макрос, который перейдет в каталог, откройте рабочую книгу (в настоящее время 38 из них в конечном итоге составляют 52), отфильтруйте два столбца, получите общее количество (повторите это 4 раза) и закройте книгу , В настоящее время приложение занимает около 7 минут, чтобы обрабатывать текущие 38 книг.

Как я могу ускорить это? Я уже отключил обновление экрана, события, и я изменил методы расчета на xlCalculationManual. Я не знаю, была ли это обычной практикой, но я видел, как люди спрашивали о способе доступа к рабочей книге, не открывая ее, но предложение об отключении обновления экрана всегда выполняется, что я и сделал.

Когда я запускаю его в режиме отладки, Workbooks.Open () может занимать до 10 секунд. Каталог файлов на самом деле находится в сети компании, но доступ к файлу, как правило, занимает не более 5 секунд.

Данные в книгах могут содержать одни и те же точки, но с другим статусом. Я не думаю, что объединение всех данных в одну книгу было бы возможно.

Я собираюсь экспериментировать с прямыми ссылками на ячейки. Как только у меня появятся некоторые результаты, я обновлю свой пост.

Private UNAME As String Sub FileOpenTest() Call UserName Dim folderPath As String Dim filename As String Dim tempFile As String Dim wb As Workbook Dim num As Integer Dim values(207) As Variant Dim arryindex Dim numStr As String Dim v As Variant Dim init As Integer init = 0 num = 1 arryindex = 0 numStr = "0" & CStr(num) 'Initialize values(x) to -1 For Each v In values values(init) = -1 init = init + 1 Next With Excel.Application .ScreenUpdating = False .Calculation = Excel.xlCalculationManual .EnableEvents = False .DisplayAlerts = False End With 'File path to save temp file tempFile = "C:\Users\" & UNAME & "\Documents\TEMP.xlsm" 'Directory of weekly reports folderPath = "path here" 'First file to open filename = Dir(folderPath & "file here" & numStr & ".xlsm") Do While filename <> "" Set wb = Workbooks.Open(folderPath & filename) 'Overwrite previous "TEMP.xlsm" workbook without alert Application.DisplayAlerts = False 'Save a temporary file with unshared attribute wb.SaveAs filename:=tempFile, AccessMode:=xlExclusive 'operate on file Filters values, arryindex wb.Close False 'Reset file name filename = Dir 'I use this loop to add the appropriate number to the end ie 01, 02, 03 etc If num >= 9 Then num = num + 1 If num = 33 Then num = num + 1 End If numStr = CStr(num) ElseIf num < 9 Then num = num + 1 numStr = "0" & CStr(num) End If filename = Dir(folderPath & "filename here" & numStr & ".xlsm") Loop output values 'Delete "TEMP.xlsm" file On Error Resume Next Kill tempFile On Error GoTo 0 End Sub Function Filters(ByRef values() As Variant, ByRef arryindex) On Error Resume Next ActiveSheet.ShowAllData On Error GoTo 0 'filter column1 ActiveSheet.Range("B6").End(xlDown).AutoFilter Field:=2, Criteria1:=Array( _ "p1", "p2", "p3", "p4", "p5"), Operator:=xlFilterValues 'filter column2 ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array( _ "s1", "d2", "s3"), Operator:=xlFilterValues 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter column2 for different criteria ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:="s" 'filter colum3 for associated form ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="<>" 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter coum 3 for blank forms ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="=" 'get the total of points values(arryindex) = TotalCount arryindex = arryindex + 1 'filter for column4 if deadline was made ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=52 ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array( _ "s1", "s2", "s3", "s4", "s5", "s6"), Operator:=xlFilterValues ActiveSheet.Range("BC6").End(xlDown).AutoFilter Field:=55, Criteria1:=RGB(146 _ , 208, 80), Operator:=xlFilterCellColor 'get total of points values(arryindex) = TotalCount arryindex = arryindex + 1 End Function Public Function TotalCount() As Integer Dim rTable As Range, r As Range, Kount As Long Set rTable = ActiveSheet.AutoFilter.Range TotalCount = -1 For Each r In Intersect(Range("A:A"), rTable) If r.EntireRow.Hidden = False Then TotalCount = TotalCount + 1 End If Next End Function Function UserName() As String UNAME = Environ("USERNAME") End Function Function output(ByRef values() As Variant) Dim index1 As Integer Dim index2 As Integer Dim t As Range Dim cw As Integer 'Calendar week declariations Dim cwstart As Integer Dim cstart As Integer Dim cstop As Integer Dim data As Integer data = 0 start = 0 cw = 37 cstart = 0 cstop = 3 ThisWorkbook.Sheets("Sheet1").Range("B6").Activate For index1 = start To cw For index2 = cstart To cstop Set t = ActiveCell.Offset(rowOffset:=index1, columnOffset:=index2) t.value = values(data) data = data + 1 Next Next End Function
Solutions Collecting From Web of "Как я могу открыть эту книгу VBA быстрее?"

В общем, есть пять правил для быстрого создания макросов Excel-VBA:

  1. Не используйте. .Select методы,

  2. Не используйте объекты Active* более одного раза,

  3. Отключить обновление экрана и автоматические вычисления,

  4. Не используйте визуальные методы Excel (например, Search, Autofilter и т. Д.),

  5. И больше всего, всегда используйте копирование массива, а не просмотр отдельных ячеек в диапазоне.

Из них вы только реализовали # 3. Кроме того, вы усугубляете ситуацию, повторно сохраняя свои рабочие листы, просто чтобы вы могли выполнять методы визуальной модификации (AutoFilter в вашем случае). То, что вам нужно сделать, чтобы сделать это быстро, – это сначала реализовать остальные правила, а во-вторых, прекратить изменять ваши исходные таблицы, чтобы вы могли открывать их только для чтения.

Ядром того, что вызывает ваши проблемы и вызывая все эти другие нежелательные решения, является то, как вы реализовали функцию Filters . Вместо того, чтобы пытаться делать все с помощью визуальных функций Excel, которые медленны по сравнению с (хорошо написанными) VBA (и которые изменяют рабочие листы, заставляя ваши избыточные Saves), просто массивы массивов копируют все данные, которые вам нужны из листа и используйте прямой код VBA, чтобы сделать ваш счет.

Вот пример вашей функции Filters которую я преобразовал в эти принципы:

Function Filters(ByRef values() As Variant, ByRef arryindex) On Error GoTo 0 Dim ws As Worksheet Set ws = ActiveSheet 'find the last cell that we might care about Dim LastCell As Range Set LastCell = ws.Range("B6:AZ6").End(xlDown) 'capture all of the data at once with a range-array copy Dim data() As Variant, colors() As Variant data = ws.Range("A6", LastCell).Value colors = ws.Range("BC6", "BC" & LastCell.Row).Interior.Color ' now scan through every row, skipping those that do not 'match the filter criteria Dim r As Long, c As Long, v As Variant Dim TotCnt1 As Long, TotCnt2 As Long, TotCnt3 As Long, TotCnt4 As Long TotCnt1 = -1: TotCnt2 = -1: TotCnt3 = -1: TotCnt4 = -1 For r = 1 To UBound(data, 1) 'filter column1 (B6[2]) v = data(r, 2) If v = "p1" Or v = "p2" Or v = "p3" Or v = "p4" Or v = "p5" Then 'filter column2 (J6[10]) v = data(r, 10) If v = "s1" Or v = "d2" Or d = "s3" Then 'get the total of points TotCnt1 = TotCnt1 + 1 End If 'filter column2 for different criteria If data(r, 10) = "s" Then 'filter colum3 for associated form If CStr(data(r, 52)) <> "" Then 'get the total of points TotCnt2 = TotCnt2 + 1 Else ' filter coum 3 for blank forms 'get the total of points TotCnt3 = TotCnt3 + 1 End If End If 'filter for column4 if deadline was made v = data(r, 10) If v = "s1" Or v = "s2" Or v = "s3" Or v = "s4" Or v = "s5" Then If colors(r, 1) = RGB(146, 208, 80) Then TotCnt4 = TotCnt4 + 1 End If End If End If Next r values(arryindex) = TotCnt1 values(arryindex + 1) = TotCnt2 values(arryindex + 2) = TotCnt3 values(arryindex + 3) = TotCnt4 arryindex = arryindex + 4 End Function

Обратите внимание, что, поскольку я не могу проверить это для вас, а также потому, что в исходном коде много признаков косвенности / диапазона, я не могу сказать, правильно ли это. Вам придется это сделать.

Примечание. Если вы решили реализовать это, сообщите нам, какое влияние оно оказало, если оно есть. (Я стараюсь следить за тем, что работает и сколько)

excel.bilee.com

Запуск кода vba при открытии книги

Я пишу vba, который управляет данными на листе, но я пытаюсь запустить его всякий раз, когда открывается рабочая книга.

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

Sub Auto_Open() Dim bookname As String Dim checkbook As String Dim Workbook As Workbook For Each Workbook In Application.Workbooks bookname = Workbook.Name checkbook = Left(bookname, 3) If checkbook = "EDN" Then Data_generator Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True Application.Quit Else End If Next Workbook End Sub

Когда этот код выполняется он проверяет все открытые книги и видит, если первые 3 буквы этого являются «СЦС», если после этого запустить Public Sub под названием «Data_generator», сохранить его и бросить курить. Если он не проверяет следующую открытую книгу и т. Д.

Когда файл открывается из проводника Windows, excel запускает (как с требуемой книгой, так и с личной рабочей книгой), однако, поскольку Excel сначала открывает персональную макрокоманду и запускает код перед тем, как открыть желаемую книгу, он не найдет книгу под названием «EDN».

Если приведенный выше код запускается после открытия обеих книг, код работает по назначению и циклически проходит через каждую открытую книгу, чтобы увидеть, есть ли один из них под названием «EDN» (это было доказано путем помещения сообщения после «затем» и запуск кода), если так запустить sub.

Я доказал это, поставив сообщение через «else», когда это будет сделано, он отобразит сообщение с рабочей книгой, которую я хочу, а не открыть. После того, как окно сообщения будет очищено, откроется рабочая книга.

Есть ли способ сделать нужную рабочую книгу открытой или любой другой работой для этого?

stackoverrun.com

Ожидание другого приложения для завершения действия OLE, когда макрос пытается открыть другую книгу

Немного фона для заголовка: Я написал макрос, который вызывается в рабочей книге. Он открывает рабочую книгу [shared] в общем каталоге и извлекает некоторую информацию в книгу, которую использует пользователь.

Любой пользователь, работающий с этим листом, уже имеет общий каталог, сопоставленный с их компьютером (и макрос находит правильную букву диска).

Я проверил этот рабочий лист несколько раз с пользователями в моем офисе. Я также тестировал его, и два человека открывали книги одновременно, чтобы подтвердить, что макросы для обоих пользователей могут одновременно извлекать данные из общей рабочей книги.

До сих пор у меня не было проблем.

Этот лист затем выдается нескольким другим пользователям в моей компании. В общем, около 40 человек должны использовать этот лист (не обязательно в то же время .. всего в целом).

Один из пользователей находится в Польше (я нахожусь в Лондоне).

Когда он открывает книгу, он получает сообщение «Microsoft Excel ожидает, что другое приложение выполнит уведомление OLE-действия». Уведомление поставляется с кнопкой «ОК». Нажатие этой кнопки кажется неэффективным, и рабочая книга эффективно зависает в этом уведомлении.

У меня возникли проблемы с решением этой проблемы, поскольку я не смог ее воспроизвести. У кого-нибудь есть идея, почему это возникло? Код ниже:

Sub PreliminaryDataImport() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim x As Variant Dim usename As String usename = Environ("USERNAME") Dim xlo As New Excel.Application Dim xlw As New Excel.Workbook, wkbk As New Excel.Workbook Dim xlz As String, regions As String Dim LRow As Long, LCell As Long, LRow2 As Long Dim RegionList As String RegionList = "" xlz = Sheet1.Range("o1").Value & "\Region Planning\TestDB.xlsx" Set xlw = xlo.Workbooks.Open(xlz) If Not Sheet11.Range("S1").Value = xlw.Worksheets("validation") _ .Range("N1").Value Then MsgBox "YOU ARE USING AN OUT OF DATE VERSION" & vbLf & _ "Please check your inbox or contact xxxx for the current version." xlw.Close False Set xlo = Nothing Set xlw = Nothing Call Module7.ProtectSheets End End If x = CheckValidation(usename, xlw) '~~ Check to see if User has access to view/modify. '~~ If they have access, return regions On Error Resume Next For i = LBound(x) To UBound(x) regions = regions + " --- " & x(i) RegionList = RegionList + x(i) & ", " Sheet1.Cells(i + 2, 33).Value = x(i) Next If Err.Number <> 0 Then MsgBox "You do not have access to view or modify any regions." xlw.Close False Set xlo = Nothing Set xlw = Nothing End Else MsgBox "You have access to view and modify the following regions:" & vbLf _ & vbLf & regions & "---"

Я считаю, что проблема возникает где-то в этой части кода, как MsgBox на последней строке не отображается до уведомления. Я не смог запустить отладку с его машины, поскольку он расположен удаленно, и это было бы большим усилием (это должно быть сделано только в случае крайней необходимости).

У кого-нибудь есть идеи, почему этот пользователь получает эту ошибку? Я особенно смущен, потому что у него только проблема.

stackoverrun.com

VBA – Активировать открытую книгу MS Excel онлайн

Я хочу прочитать книгу и скопировать некоторые ячейки в другую книгу. Цель кода – скопировать ячейки из разных листов из одного файла в другой.

Для этого я создал этот код:

Sub processCopy(file) 'Abrir documento Workbooks.Open Filename:=file, UpdateLinks:=0 cantn = ThisWorkbook.Sheets.Count cantv = Sheets.Count - 5 cantn = cantn - 4 'Recorrer los libros del documento abierto For i = 1 To (Sheets.Count - 5) 'Obtener nombre del libro seleccionado nombre = Sheets(i + 2).Name 'Filtrar los libros no necesarios If nombre <> "Instructions" And nombre <> "Executive Summary" And nombre <> "Process Update" And nombre <> "Template" And nombre <> "Notes" Then If cantv >= cantn Then ThisWorkbook.Sheets(3).copy after:=ThisWorkbook.Sheets(cantn + 2) cantn = cantn + 1 ThisWorkbook.Sheets(cantn + 2).Name = nombre ElseIf nombre <> ThisWorkbook.Sheets(cantn + 2).Name Then ThisWorkbook.Sheets(cantn + 2).Name = nombre End If Workbooks.Open Filename:=file, UpdateLinks:=0 ActiveWorkbook.Worksheets(nombre).Activate ActiveWorkbook.Sheets(nombre).Range("C4:O23").Select Selection.copy ThisWorkbook.Sheets(nombre).Range("C4:O23").PasteSpecial

После завершения процесса в первом листе я сравниваю, если в новом файле есть какой-либо другой лист для начала процесса. Если нет (всегда), я создаю новый лист, чтобы начать с процесса копирования и вставки, но функции ThisWorkbook и ActiveWorkbook работают на одном листе (копирование и вставка из той же книги), а не из одного файла в другой.

Вот почему я открываю первую книгу, но когда процесс копирования и вставки заканчивается, появляется это сообщение:

Изображение ошибки

Что я могу сделать, чтобы решить эту проблему?

Спасибо за все

Solutions Collecting From Web of "VBA – Активировать открытую книгу"

Создайте объект рабочей книги и назначьте книгу, которую вы открываете для нее:

Dim wb as Workbook Set wb = Workbooks.Open(Filename:=file, UpdateLinks:=0)

Затем вы можете ссылаться на эту переменную вместо ActiveWorkbook

Итак, чтобы изменить вещи в рабочей книге, код находится, используйте ThisWorkbook

И чтобы изменить ситуацию в другой книге, используйте wb

excel.bilee.com