Как обратиться к открытой книге excel vba
Перейти к содержимому

Как обратиться к открытой книге excel vba

  • автор:

Обратиться к ячейкам текущей книги после открытия другой

Мне необходимо считать значения из другой книги Excel с помощью макроса в текущей и записать в нее значения. После того, как я открываю книгу так:

Set wb = Workbooks.Open(path) 
With Workbooks.Open(path) '. End With 

Все содержимое внутри кода до закрытия файла относится к новооткрытой книге, то есть:

wb.Worksheets(1).Range("A1") With .Worksheets(1) ; .Range("A1") Cells(1, 1) 

Выполняют ровно одну и ту же работу обращаясь к открытой из макроса книге. А нужно, чтобы Cells относились к текущему листу в текущей книге, из которой запущен макрос, а обращение через точку вытягивало данные из открытой книги. Что я делаю не так? P.S. ThisWorkbook , к сожалению, не работает, можно ли решить это как-то по-другому?

Обращение к открытой книге

Author24 — интернет-сервис помощи студентам

Всем доброго времени суток!
С помощью интернета я смог написать небольшой макрос, задача которого состоит в том, чтобы открыть определенную книгу и с ней сравнить активную.
Макрос работает, но никак не могу исправить одну строчку.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Sub Sravni() Dim i As Long Set w2 = Workbooks.Open("Y:\Мин макс детали\Min_max.xlsx") Application.ScreenUpdating = False Workbooks("Spec.xlsx").Sheets(1).Activate With Workbooks("Min_max.xlsx").Sheets(1) Columns("B").Interior.ColorIndex = xlNone: .Columns("A").Interior.ColorIndex = xlNone: For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row If Cells(i, "B") <> "" Then If Cells(i, "B") = .Cells(i, "A") Then Cells(i, "B").Interior.ColorIndex = 6: Cells(i, "C") = 0 .Cells(i, "A").Interior.ColorIndex = 6: .Cells(i, "C") = 0 End If End If Next End With Workbooks("Min_max.xlsx").Close False End Sub
Workbooks("Spec.xlsx").Sheets(1).Activate

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

Файловые функции VBA

    CurDir() — функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:

Dim sCurDir As String sCurDir = CurDir("D")

Dim sCurDir As String sCurDir = CurDir(«D»)

    Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
Dim MyChar Open "C:\Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) 'пока файл не кончился ' Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ' Закрываем файл 'Выводим его содержание в окно Immediate '(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar 'или в MsgBox MsgBox MyChar, vbInformation, "www.excel-vba.ru"

Dim MyChar Open «C:\Text1.txt» For Input As #1 ‘Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) ‘пока файл не кончился ‘ Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ‘ Закрываем файл ‘Выводим его содержание в окно Immediate ‘(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar ‘или в MsgBox MsgBox MyChar, vbInformation, «www.excel-vba.ru»

Sub SelectionToTxt() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Output As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub

Sub SelectionToTxt() Dim s As String, rc As Range Dim ff ‘запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = «» Then ‘если пока ничего не записали — присваиваем только значение ячейки s = rc.Value Else ‘если уже записано — добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile ‘Открываем текстовый файл ‘если файла нет — он будет создан Open «C:\Text1.txt» For Output As #ff ‘записываем значение строки в файл Print #ff, s Close #ff ‘ Закрываем файл End Sub

Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Append As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub

Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff ‘запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = «» Then ‘если пока ничего не записали — присваиваем только значение ячейки s = rc.Value Else ‘если уже записано — добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile ‘Открываем текстовый файл ‘если файла нет — он будет создан Open «C:\Text1.txt» For Append As #ff ‘записываем значение строки в файл Print #ff, s Close #ff ‘ Закрываем файл End Sub

sFileDateTime = FileDateTime("C:\Text1.txt")

sFileDateTime = FileDateTime(«C:\Text1.txt»)

MsgBox FileLen("C:\Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"

VBA Excel. Рабочая книга (открыть, создать новую, закрыть)

Существующая книга открывается из кода VBA Excel с помощью метода Open:

Workbooks . Open Filename : = «D:\test1.xls»
Workbooks . Open ( «D:\test1.xls» )

В кавычках указывается полный путь к открываемому файлу Excel. Если такой файл не существует, произойдет ошибка.

Проверка существования файла

If Dir ( «D:\test1.xls» ) = «» Then
MsgBox «Файл не существует»
MsgBox «Файл существует»
If Dir ( «D:\test1.xls» ) = «» Then
MsgBox «Файл не существует»
Workbooks . Open Filename : = «D:\test1.xls»

Создание новой книги

Workbooks . Add
Workbooks . Add
ActiveWorkbook . SaveAs Filename : = «D:\test2.xls»

В кавычках указывается полный путь сохраняемого файла Excel, включая присваиваемое имя, в примере — это «test2.xls».

Обращение к открытой книге

ActiveWorkbook
ThisWorkbook
Workbooks ( «test1.xls» )
Workbooks ( «test2.xls» )

Обратиться по имени можно только к уже открытой книге, а чтобы из кода VBA Excel книгу открыть, необходимо указать полный путь к файлу.

Как закрыть книгу Excel из кода VBA

Workbooks ( «test1.xlsx» ) . Close
Workbooks ( «test1.xlsx» ) . Close SaveChanges : = False
Workbooks ( «test1.xlsx» ) . Close ( False )
Workbooks ( «test1.xlsx» ) . Close SaveChanges : = True
Workbooks ( «test1.xlsx» ) . Close ( True )

Фразы для контекстного поиска: открыть книгу, открытие книги, создать книгу, создание книги, закрыть книгу, закрытие книги, открыть файл Excel, открытие файла Excel, существование книги, обратиться к открытой книге.

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

40 комментариев для “VBA Excel. Рабочая книга (открыть, создать новую, закрыть)”

Application . DisplayAlerts = 0
Application . DisplayAlerts = False
— не помогает
Application . AskToUpdateLinks = False
Сбитый Лётчик Небосводов 13.02.2022 в 23:26
Workbooks . Open ( «D:\test1.xls» , 0 )
т.к. в других местах обновление, возможно, нужно.
Application . ActiveWindow . Caption = «моё название»

Здравствуйте.
А как поступить, если имя книги заранее неизвестно. Есть-ли в VBA что-нибудь вроде диалогового окна «Открыть книгу».
Или, допустим, поиск всех книг в определённой папке.

Здравствуйте, Вячеслав!
Для выбора книги в определённой папке используйте Стандартный диалог выбора файлов Application.GetOpenFilename.

ActiveWorkbook . Close SaveChanges : = False
Application . Quit
не допустима.
Что делать?
Option Explicit
Public myExcel As Object , myWorkbook As Object
Sub OpenExcelWorkbook ( )
Set myExcel = CreateObject ( «Excel.Application» )
Set myWorkbook = myExcel . Workbooks . Open ( «C:\Users\. xlsx» )
myExcel . Visible = True
Sub CloseExcelWorkbook ( )
myWorkbook . Close SaveChanges : = False
myExcel . Quit
Set myWorkbook = Nothing
Set myExcel = Nothing

А как открывать книгу, если имя файла совпадает с названием из массива.
То есть есть массив переменных которые записаны в столбец начиная с столбца А строки 2. Названия всегда разные.но совпадают с названием файла. Можно ли поочередно открыть их для редактирования через VBA

Dim n As Long
Private Sub CommandButton1_Click ( )
Workbooks . Open ( » C : \ Users \ Public \ » & Cells ( n + 2 , 1 ) )
If n + 2 > 15 Then n = 0

Объявление глобальной переменной n размещено в разделе Declarations программного модуля. Число 15 соответствует номеру строки последней ячейки диапазона с именами рабочих книг.

имеется 2 книги (обе открытые) Книга 1 Лист1 ячейка D4 формула ссылается на вторую книгу
='[Книга 2.xls]Лист1′!$F$5 Используя ссылку (без ручного ввода) надо обратиться Книга 2, скопировать 5 строк ниже ссылки (строка6:строка10) и вставить в рабочую книгу(Книга 1)

0mega, а ‘[Книга 2.xls]Лист1’!$F$5 — это постоянное значение? И в какое место какого листа Книги 1 строки должны быть вставлены?

«… а ‘[Книга 2.xls]Лист1’!$F$5 – это постоянное значение? …»
Нет !
Сценарий такой.
В бухгалтерии есть такой термин «Инвентаризация»
В связи с пандемией — движение по складу было минимальное. Большинство позиций остались нетронутыми.
Значит нет необходимости «набивать мозоли» на повторном вводе.
Я вижу такое решение
Есть Книга1.
Юзер открывает прошлогодний файл и (напр. в ячейке F5) визуально сравнивает итоговые значения с настоящими.
если показания совпадают — тогда проверяется Лист2, Лист3…потом будет другая книга
Если значение F5 (это тоже не постоянный адрес ) не совпадает с реальным, тогда в Книга1 юзер ставит «=» и кликает на F5 другой книги
В Книге1 автоматически формируется адрес неправильного значения.
Теперь топчем кнопочку макроса.
макрос берет адрес из ссылки и обращается ко второй Книге, копирует нужный мне массив и загружает в Первую книгу.
Юзер лечит (меняет, добавляет, редактирует ) больной массив и отправляет обратно.
Возможно есть какой-то более простой способ, но «самая короткая дорога — это та которую ты знаешь»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *