Страницы: 1
RSS
Не работает копирование Таблицы в новую книгу
 
Доброго дня...
Создается новая книга (Book) и в нее по условию необходимо скопировать умную таблицу из текущей книги (wb1) . Книга создается, лист вставляется и переименовывается. Ошибка появляется на строке копирования умной таблицы. Не вижу что тут нужно подправить, вроде бы все честно.
Спасибо.
Код
Sub aaa()
Dim app As Excel.Application
Dim Book As Excel.Workbook
Dim wb1 As Workbook, sh1 As Worksheet

Set app = CreateObject("Excel.Application")
Set Book = app.Workbooks.Add
Set wb1 = Workbooks(ThisWorkbook.Name)

FF = "111"
For Each sh1 In wb1.Worksheets
    if .... Then
        if ... Then
            Book.Worksheets.Add after:=Book.Worksheets(Book.Worksheets.Count)
            Book.Worksheets(Book.Worksheets.Count).Name = sh1.Name
            sh1.ListObjects(1).Range.Copy _
            Book.Worksheets(Book.Worksheets.Count).Range("A1")
        End If
    End If
Next sh1

Book.SaveAs Filename:=FF, FileFormat:=xlExcel8
Book.Close

End Sub
 
Может потому, что новая книга в новом (другом) эксземпляре Excel?
 
Цитата
Юрий М написал:
в новом (другом) эксземпляре Excel?
И как с этим бороться? Может так?
Код
sh1.ListObjects(1).Range.Copy
Book.Worksheets(Book.Worksheets.Count).Range("A1").Paste
Изменено: govorun - 22.04.2018 13:15:38
 
А попробовать рекордером записать создание новой книги?
 
Так книга создается..., не копируются данные...
 
У меня всё копируется. Запишите рекордером создание новой книги, копирование умной таблицы и вставку её в новую книгу. Затем удалите "лишнее".  
 
Цитата
Юрий М написал:
и вставку её в новую книгу.
Нужно внести ясность... Вновь создаваемая книга не видная на экране монитора. Как можно сюда записи макрорекодера прикрутить?
 
Цитата
govorun написал:
Вновь создаваемая книга не видная на экране монитора
Новая (созданная) книга становится активной - что значит "не видна"? И зачем в НЕЁ "записи макрорекордера" прикручивать? Макрос ведь находится в той книге, из которой копируется таблица.
 
Привет!
А если скопировать нужный лист в новую книгу и ничего не удалять?:
Сравнение прайсов, таблиц - без настроек
 
Вот как-то так получилось...
Код
Sub aaa()
Dim app As Excel.Application
Dim Book As Excel.Workbook
Dim wb1 As Workbook, sh1 As Worksheet

Set app = CreateObject("Excel.Application")
Set Book = app.Workbooks.Add
Set wb1 = Workbooks(ThisWorkbook.Name)

FF = "ффф"

For Each sh1 In wb1.Worksheets
            Book.Worksheets.Add after:=Book.Worksheets(Book.Worksheets.Count)
            Book.Worksheets(Book.Worksheets.Count).Name = sh1.Name
            sh1.ListObjects(1).Range.Copy
            Book.Worksheets(Book.Worksheets.Count).Range("A1").PasteSpecial _
            xlPasteValues, xlPasteFormats, xlPasteFormulasAndNumberFormats
            Book.Worksheets(Book.Worksheets.Count).Range("A1").AutoFilter
Next sh1

Book.SaveAs Filename:=FF, FileFormat:=xlExcel8
Book.Close

End Sub
Цитата
Юрий М написал:
Новая (созданная) книга становится активной - что значит "не видна"?
Так и не понял, в каком месте кода книга становится Активной. Расставил метки в коде (типа Range ("H1") = 10), что бы понять когда новая книга станет активной. И ничего не получилось. Может Вы поясните, где я заблуждаюсь. Прилагаю код с метками. Обратите внимание на 9-ю строку.
Изменено: govorun - 22.04.2018 17:08:13
 

Код
sh1.ListObjects(1).Range.Copy Book.Worksheets(Book.Worksheets.Count).Range("A1")

Вышеприведенное только в одной инстанции excel, а у вас есть два разных экземпляра.

Попробуйте этот путь:

Код
Option Explicit

Sub aaa()
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim wb1 As Workbook, sh1 As Worksheet

Const dostup As String = "C:\Temp\" 'Naprimer
Const FF As String = "111"

    Set wb1 = ThisWorkbook
    'xlApp.Visible = True 'Yesli novyy ekzemplyar dolzhen byt' vidimym
    Set xlBook = xlApp.Workbooks.Add
    
    For Each sh1 In wb1.Worksheets
        '...
                xlBook.Worksheets.Add(After:=xlBook.Worksheets(xlBook.Worksheets.Count)).Name = sh1.Name
                sh1.ListObjects(1).Range.Copy
                With xlBook.Worksheets(sh1.Name)
                    .Paste Destination:=.Range("A1")
                End With
                Application.CutCopyMode = False
        '...
    Next sh1
    
    With xlBook
        If Val(Application.Version) < 12 Then
            'Excel 97-2003
            .SaveAs Filename:=dostup & FF & ".xls", FileFormat:=xlNormal
        Else
            'Excel > 2003
            .SaveAs Filename:=dostup & FF & ".xls", FileFormat:=56 'tut ne proveryal
        End If
        .Close SaveChanges:=False
    End With
    
    Set xlBook = Nothing
    
    xlApp.Quit
    Set xlApp = Nothing
    
    Set wb1 = Nothing
End Sub

Это относится к первому посту.
Изменено: ocet p - 22.04.2018 18:12:21
 
govorun,  Вы так и не удосужились проверить, что пишет рекордер при создании новой книги... Я выделил диапазон и включил рекордер. Вот какой получился код:
Код
Sub Макрос1()
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
End Sub
И всё копируется.
И я ведь говорил Вам, что у Вас создаётся второй экземпляр Excel, но Вы продолжаете.
 
Цитата
Юрий М написал:
И я ведь говорил Вам, что у Вас создаётся второй экземпляр Excel, но Вы продолжаете.
И продолжаю.
Код
Sub ccc()
    Worksheets(1).Range("A1").Select
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
End Sub
Написал вот такой код (аналогичный Вашему). Выполнил его. В результате создался второй экземпляр Excel. Все скопировалось нормально. Но вот беда. В панели задач появился второй экземпляр Excel (исходный файл и новый с именем Книга1).  Если Вы посмотрите на мой код в посте #1 или #10, а еще лучше попробуете, то увидите, что в панели задач второй экземпляр Excel не показывается. Опять же про это говорилось в посте #7.
Теперь у меня новая беда... Пытаюсь тот же код приспособить для копирования Листа из книги wb1 в книгу book. Опять же НЕ ПОКАЗЫВАЯ второй экземпляр Excel. Ничего не получается.... , уже мозги закипели... Выручайте....
Код
Sub bbb()
Dim app As Excel.Application
Dim Book As Excel.Workbook
Dim wb1 As Workbook, sh1 As Worksheet

Set wb1 = Workbooks(ThisWorkbook.Name)
Set app = CreateObject("Excel.Application")
Set Book = app.Workbooks.Add

FF = "G:\333222.xls"

wb1.Worksheets(1).Copy After:=Book.Worksheets(1)

Book.SaveAs Filename:=FF, FileFormat:=xlExcel8

Book.Close

End Sub
Спасибо
Изменено: govorun - 22.04.2018 21:13:02
 
ocet p, Спасибо. С 37 по 42 строку в Вашем коде - это для чего?
 
У меня вот так работает:
Код
Sub bbb()
'Dim app As Excel.Application
'Dim Book As Excel.Workbook
Dim Book As Workbook
Dim wb1 As Workbook, sh1 As Worksheet
    Set wb1 = Workbooks(ThisWorkbook.Name)
'    Set app = CreateObject("Excel.Application")
    Set Book = Workbooks.Add
    FF = "G:\333222.xls"
    wb1.Worksheets(1).Copy After:=Book.Worksheets(1)
    Book.SaveAs Filename:=FF, FileFormat:=xlExcel8
    Book.Close
End Sub
 
Цитата
govorun написал:
Написал вот такой код (аналогичный Вашему)
да где же аналогичный? Вы хоть чуточку азы начните изучать. Зачем у Вас создается принудительно новый экземпляр Excel? Вам приводят нормальные коды, а Вы все равно продолжаете даже в них добавлять создание нового экземпляра. Это зачем Вы делаете?
Код
Set app = CreateObject("Excel.Application")
Set Book = app.Workbooks.Add
Давайте я внесу ясность в Ваши попытки сотворить чудо.
Ваш код находится уже в книге Excel, из которой надо копировать. Вы её запоминаете в переменную:
Код
Set wb1 = Workbooks(ThisWorkbook.Name)
Workbooks здесь относится к тому экземпляру Excel, в котором сейчас код.
Хотя можно намного проще:
Код
Set wb1 = ThisWorkbook
Но затем Вы сами создаете новый экземпляр Excel, который уже не связан с тем, в котором код и буфер обмена у них тоже разный:
Код
Set app = CreateObject("Excel.Application")
после чего создаете новую книгу именно в нем:
Код
Set Book = app.Workbooks.Add
Вопрос: нафига?
Вам надо просто выкинуть эту строку и работать дальше:
Код
Sub aaa()
Dim Book As Excel.Workbook
Dim wb1 As Workbook, sh1 As Worksheet
 
Set Book = Workbooks.Add
Set wb1 = Workbooks(ThisWorkbook.Name)
 
FF = "111"
For Each sh1 In wb1.Worksheets
    if .... Then
        if ... Then
            Book.Worksheets.Add after:=Book.Worksheets(Book.Worksheets.Count)
            Book.Worksheets(Book.Worksheets.Count).Name = sh1.Name
            sh1.ListObjects(1).Range.Copy _
            Book.Worksheets(Book.Worksheets.Count).Range("A1")
        End If
    End If
Next sh1
 
Book.SaveAs Filename:=FF, FileFormat:=xlExcel8
Book.Close
 
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
govorun написал: С 37 по 42 строку в Вашем коде - это для чего?

Ну чтож,  :) ,  "Двери есть для этого, чтобы их и закрывать, как их открыли"

Если Вы открыли вторую инстанцию (экземпляр) "excel", то Вам нужно закрыть её правильно, чтобы она не "висела" на заднем плане.

Открытие новой версии (ранняя привязка, на этапе компиляции кода):
Код
Dim xlApp As New Excel.Application

Это то же самое, что и:
Код
Dim xlApp As Excel.Application

Set xlApp = New Excel.Application

Закрытие новой версии (и удаление соединений):
Код
xlApp.Quit
Set xlApp = Nothing

и то же (то есть, Set xxx = Nothing) с другими объектами.

Изменено: ocet p - 23.04.2018 12:40:27
 
ocet p, Понял.
Юрий М, С подачи Inexsu воспользовался Вашим кодом. Просто надоело мозги кочегарить..
Цитата
Дмитрий Щербаков написал:
да где же аналогичный? Вы хоть чуточку азы начните изучать.
Это было написано в посте #13. Пост #13 - это ответ на пост #12 (судя по цитате). Если в посте #13 код, не аналогичный коду в посте #12, ну тогда я не знаю....
Цитата
Дмитрий Щербаков написал:
Вам приводят нормальные коды, а Вы все равно продолжаете даже в них добавлять...
Вопрос: нафига?
Об этом тоже написано в посте #13.
Цитата
Дмитрий Щербаков написал:
Хотя можно намного проще:
Возможно проще - это лучше, спорить не буду. Наверное у Вас и образование соответствующее (программист или что-то рядом) и опыта в подобных штуках достаточно (судя по количеству сообщений). Для Вас проще - это лучше. Для меня же проще - не всегда хорошо. Для меня на сегодняшний день гораздо удобнее видеть код и понимать что в нем происходит, По-этому пишу так, как удобно мне. =ThisWorkbook я тоже применяю. Я не программист по образованию и даже рядом не стоял. Когда меня в техникуме учили работе с компьютером (в школе еще не было компов), нам говорили, что перед выключением компьютера нужно запарковать головку винчестера. Если Вам это о чем-то говорит - тогда Вы сможете представить какой багаж знаний по работе с Excel я мог тогда получить. И то, что я сейчас занимаюсь Excel+VBA - это исключительно на добровольных началах, как говорится для себя. Вот и пишу как мне понятно, а не как проще. И ни разу не воспользовался предложенным на форуме кодом, если я не понимаю что в нем происходит, даже если получается нужный результат.
Дмитрий Щербаков, Все остальное в посте #16 достаточно информативно и, что немало важно, полезно, по крайней мере для меня.

Всем спасибо за помощь.
 
govorun,  мне кажется Вы так и не поняли разницу между книгой и приложением... И зачем второе приложение - только для того, чтоб его не видеть? А чем это мешает? И кстати можно вообще на время скрыть приложение, или отдельную книгу, но зачем?
 
Цитата
Hugo написал:
И кстати можно вообще на время скрыть приложение, или отдельную книгу, но зачем?
Зачем? Наверное нужно, а может бзик у меня такой. Почему то все пытаются сделать как можно проще и как можно стандартнее. А мне нравится нестандартный подход. Это интересно,  вот только знаний не хватает. Предложите способ скрыть вновь создаваемую книгу, что в панели задач она не была видна. Буду благодарен.
 
Цитата
govorun написал:
Предложите способ скрыть вновь создаваемую книгу, что в панели задач она не была видна.
Код
    Workbooks.Add
    ActiveWorkbook.IsAddin = True

Подход как Вам нравится, нестандартный :)
P.S. Кстати в Вашем первом коде Вы забыли прибраться - нужно закрывать ненужное приложение, иначе наплодите так, что комп глючить начнёт.
Изменено: Hugo - 23.04.2018 20:35:50
 
Цитата
govorun написал:
нестандартный подход
Это когда задачу решаемую определенным образом решают иначе. Другой алгоритм, за счет которого будет выигрыш по времени, или меньше тратиться памяти и пр.. А у вас этот нестандартный подход начинается "Я что-то натворил, и оно не работает", причем без деталей "нестандартного подхода". Ну и выливается все это в очередную переписку на пару форумных страниц, большая часть которой - попытки узнать что именно вы натворили.
 
Цитата
Hugo написал:
Вы забыли прибраться
Уже видел... Спасибо, завтра попробую
Цитата
Anchoret написал:
попытки узнать что именно вы натворили.
Вообще то обычно говорят, что бы показывали свой вариант кода, если с кодом проблемы. Я показал код. Написал где проблема. Какие еще нужны детали? Где и что форумчанам не понятно? Или мне нужно было написать, что у меня новая книга создается в отдельном экземпляре Excel? Так это же написано в самом начале кода. Вы скажите, что еще нужно было написать. Я учту на будущее.
Цитата
Anchoret написал:
А у вас этот нестандартный подход начинается "Я что-то натворил
Это Вы перегнули...
Цитата
Anchoret написал:
Другой алгоритм, за счет которого будет выигрыш...
Выигрыш - понятие не только количественное, но и качественное.
Цитата
Anchoret написал:
попытки узнать что именно вы натворили
Это вообще не понятно к чему...
 
Цитата
govorun написал:
Или мне нужно было написать, что у меня новая книга создается в отдельном экземпляре Excel? Так это же написано в самом начале кода
govorun, не нужно лукавить: ведь Вы этого не знали ))
 
Цитата
Юрий М написал:
Вы этого не знали ))
Про второй экземпляр Excel  - не знал..., но я знал что новая книга при создании не видна благодаря CreateObject("Excel.Application").  
 
А я Вам еще в #2 сказал, почему не копируется )) И уже тогда тему можно было закрывать: ответ был получен. Причём здесь видна/не видна книга?
 
Цитата
Юрий М написал:
Причём здесь видна/не видна книга?
Это был ключевой момент
 
Hugo, Попробовал, работает чудесно. Жаль применить наверное так и не получится..., скопировать лист в новую книгу не получилось... Спасибо.
 
Цитата
govorun написал:
Это был ключевой момент
govorun, перечитайте своё стартовое сообщение, потом название темы: проблема была с КОПИРОВАНИЕМ.  
Страницы: 1
Наверх