Страницы: 1
RSS
Правильное обращение к нужной книге/листу при нескольких открытых файлах
 
Добрый день. Не получается решить следующую проблему. Подскажите пожалуйста решение...
Есть определенный файл, в который необходимо занести данные из разных файлов и потом преобразовать формулы в значения.
Проблема в том, что при открытии различных файлов, он делает активными их и следовательно не видит листы, на которые я ссылаюсь в основном файле, т.е. он либо считает кол-во строк в другой книге, либо выдает ошибку

Код
Set wb = GetObject(sFolder & zFiles)
    'открываем книгу "Бухгалтерский баланс"
    Workbooks.Open sFolder & sFiles
'    Workbooks("Информация для акционеров.xlsm").Sheets(1).Activate
    With wb.Worksheets("1110")
    'Для страницы 1110 в файле Информация для акционеров
    .Range("A2").Formula = "=""Расшифровка статьи баланса""&"" """"""&""Нематериальные активы""&""""""""&"" ""&'Информация для справки'!R[-1]C[1]&"" на ""&TEXT('Информация для справки'!RC[1],""ДД.ММ.ГГГГ"")"
    .Range("B5") = a
    .Range("B6") = a
    .Range("B7") = a
    .Range("B8") = a
    .Range("B9") = a
    .Range("B10") = a
    .Range("B11") = a
    Sheets("1110").Select
    'преобразовываем формулы в таблице на листе 1110 в значение
    For i = Cells(Rows.count, 1).End(xlUp).Row To 1 Step -1
    If Cells(i, 1) <> "Итого" Then Cells(i, 2).Value = Cells(i, 2).Value
    Next
    End With

И такая же ситуация с открытием другой книги

Код
Workbooks.Open sFolder & bFiles
'    Workbooks("Информация для акционеров.xlsm").Select
    With wb.Worksheets("1230")
    'Для страницы 1230 в файле Информация для акционеров
    Worksheets("1230").Range("A3").Formula = "=""Расшифровка статьи баланса""&"" """"""&""Дебиторская задолженность""&""""""""&"" ""&'Информация для справки'!R[-2]C[1]&"" на ""&TEXT('Информация для справки'!R[-1]C[1],""ДД.ММ.ГГГГ"")"
    .Range("B6") = j
    .Range("B7") = j
    .Range("B8") = j
    .Range("B9") = j
    .Range("B10") = j
    .Range("B11") = j
    .Range("B12") = j
    'преобразовываем формулы в таблице на листе 1230 в значение
    Sheets("1230").Select
    For i = Cells(Rows.count, 1).End(xlUp).Row To 1 Step -1
    If Cells(i, 1) <> "Итого" Then Cells(i, 2).Value = Cells(i, 2).Value
    Next
    End With
Изменено: Klavka1993 - 14.04.2020 08:00:47
 
Цитата
Klavka1993 написал:
При открытии других книг макросом, оставлять активной только одну
вот задача оставить активными 2 и больше книг не решается в Еxcele никак, потому что  Excel  по умолчанию устроен так, что активная книга ВСЕГДА активна и она ВСЕГДА только одна
ВСЕГДА активной является одна книга и от вас не требуется никаких дополнительных усилий чтобы сохранить этот порядок, более того как бы вы не старались этот порядок вы не сломаете
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Прошу прощения, может я не правильно описала суть проблемы, но мне то и нужно оставить активной только одну книгу
А именно переменную wb
Не смотря на то, что я использую конструкцию With и я предполагала, что это и есть отсылка на ту книгу, где происходит работа, код все-равно переключается на книгу, которую я потом открыла

Т.е. wb - это как раз основная книга
А работать он продолжает (а именно преобразовывает формулы в значения) в книге sFolder & bFiles
 
Цитата
Klavka1993: при открытии различных файлов, он делает активными их и следовательно не видит листы, на которые я ссылаюсь в основном файле
при открытии файла, он действительно становится активным, однако, если прописывать путь полностью, то "активность" никакой роли не играет. Так, в частности, у вас есть конструкция With wb.Worksheets("1110") … End With. Всё, что внутри неё будет работать с указанной книгой (переменная wb) и листом в ней вне зависимости от того, какая книга/лист активны.

Назначить переменную можно так:
Код
Sub t()
Dim wb As WorkBook

Set wb = ActiveWorkbook ' запомнить в переменную активную книгу
Set wb = Workbooks.Open ("C:\Program Files\Пример.xlsx") ' открыть книгу и запомнить её в переменную
End Sub
Название темы: Правильное обращение к нужной книге/листу при нескольких открытых файлах
Изменено: Jack Famous - 14.04.2020 09:42:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Set wb = Workbooks.Open Filename:="C:\Program Files\Пример.xlsx"
без скобок не сработает однако...
Код
Set wb = Workbooks.Open ( Filename:="C:\Program Files\Пример.xlsx" )
 
Апострофф, спасибо - поправил. Удивлён))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Название темы: Правильное обращение к нужной книге/листу при нескольких открытых файлах
Спасибо, что поправили тему.
А по поводу объявления переменной, мне не нужно открывать книгу wb
Она уже открыта и из нее я последовательно открываю остальные книги и забираю данные
Я уже выдерживаю паузу и только потом активирую нужную мне книгу (думала что эксель не успевает делать последовательно шаги, но все безуспешно...)
Первую часть с with он проходит хорошо
А вот на второй сбивается и уходит в тот файл, который я открыла (sFiles)

Код
    Workbooks.Open sFolder & sFiles
    
    Sleep 10000
    
    
    Workbooks("Информация для акционеров.xlsm").Sheets(1).Activate
    
    With ThisWorkbook.Worksheets("1150")
    
    
    .Range("A2").Formula = "=""Расшифровка статьи баланса""&"" """"""&""Дебиторская задолженность""&""""""""&"" ""&'Информация для справки'!R[-2]C[1]&"" на ""&TEXT('Информация для справки'!R[-1]C[1],""ДД.ММ.ГГГГ"")"
    .Range("B5") = a
    .Range("B6") = a
    .Range("B7") = a
    .Range("B8") = a
    .Range("B9") = a
    .Range("B10") = a
    .Range("B11") = a

      With ThisWorkbook.Worksheets("1110")
      
      
      For i = Cells(Rows.count, 1).End(xlUp).Row To 1 Step -1
      If Cells(i, 1) <> "Итого" Then Cells(i, 2).Value = Cells(i, 2).Value
      Next
      
      End With
      
    End With
Изменено: Klavka1993 - 14.04.2020 10:57:31
 
Klavka1993, активировать книгу, из которой запущен макрос, можно и такой строкой:
Код
ThisWorkbook.Activate
ThisWorkbook - это и есть та самая "основная"  книга. )
 
Klavka1993, вы не поняли…
Создайте новую тему с примером того, что нужно делать, а не вот это вот всё
И не нужно цитировать ВСЁ. Цитата - для акцента на чём-то

Klavka1993,
Цитата
Юрий М: ThisWorkbook - это и есть та самая "основная"  книга. )
книга, из которой запущен макрос
Изменено: Jack Famous - 14.04.2020 10:07:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Klavka1993, вернитесь в свой #9 и удалите то, что Вы ошибочно считаете цитатой.
И запомните: кнопка цитирования не для ответа!
 
Цитата
Klavka1993 написал:
Есть определенный файл, в который необходимо занести данные из разных файлов
На один лист все данные будут записаны или на несколько?
"Все гениальное просто, а все простое гениально!!!"
 
может это поможет

Код
Sub main()
    Dim sht As Worksheet
    Dim sFolder$, sFiles$
    '....что то тут
    'Ллист на который будут записываться данные
    Set sht = ThisWorkbook.Worksheets("какой то лист")
    Workbooks.Open sFolder & sFiles
    With sht
        .[b5].Value = [b5].Value
        .[b6].Value = [b5].Value
        .[b7].Value = [b5].Value
        .[b8].Value = [b5].Value
        .[b9].Value = [b5].Value
        .[b10].Value = [b5].Value
        ' это чтобы наверняка
        .UsedRange.Value = .UsedRange.Value
    End With
    ActiveWorkbook.Close False
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Klavka1993 написал:
Первую часть с with он проходит хорошо
А вот на второй сбивается
Обратите внимание, что в первом случае Вы используете .Range - с точкой, а во втором Cells - без точки.  
 
Цитата
Alec Perle написал:
Обратите внимание, что в первом случае Вы используете .Range - с точкой, а во втором Cells - без точки.
Там вроде перед Cells без точки лист активируется, только не понятно для чего.
"Все гениальное просто, а все простое гениально!!!"
 
Всем большое спасибо!
Да, у меня действительно очень мало знаний по макросам, поэтому многое не понимаю)
И конечно много лишнего в самом коде, постепенно я чищу его)

Да, листов несколько, я их задала через переменные, по совету Nordheim,
И так же использовала конструкцию ниже. Теперь работает так как надо )
Код
.UsedRange.Value = .UsedRange.Value
 
Цитата
Nordheim написал:
перед Cells без точки лист активируется
Это не всегда помогает. Если код в модуле листа - Cells (без точки) берется с данного листа, а не с активного.
 
Цитата
Апострофф написал:
Если код в модуле листа
Если так то да, но я сомневаюсь, что в данном случае код написан в модуле листа, поэтому и создал сообщение №14,
да и присвоения переменной листа, в модуле которого пишется код, никакого смысла нет.
Изменено: Nordheim - 14.04.2020 13:32:12
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1
Наверх