Доброго времени уток. Хочу Попросить о помощи. Если вас конечно не затруднит по доброте душевной. У меня есть код ВБА. Он выгружает странички в отдельные файлы. Я хотел было сам попробовать разобраться. Но ВБА еще хуже понимаю чем формулы. А для вас скорее всего это пару пустяков. Сейчас файл создает два файла один для бухгалтерии где итоги по суммам "бухПриход" и файл "Экспорт"
вот теперь потребовалось изменить часть которая относится к файлу с экспортом и вместо этого файла теперь надо создавать 4 разных файла из одноименных страниц. Список страничек одноименных ЭкспортБМ ЭкспортЛимак ЭкспортАртис ЭкспортБЗУ
[vba]
Код
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook Set wbE = Workbooks.Add wbE.Sheets(1).Name = "Экспорт" wbC.Sheets("Экспорт").Cells.Copy wbE.Sheets("Экспорт").[a1].PasteSpecial xlPasteValues Application.DisplayAlerts = False wbE.SaveAs cName wbE.Close False Application.DisplayAlerts = True Application.ScreenUpdating = True
Доброго времени уток. Хочу Попросить о помощи. Если вас конечно не затруднит по доброте душевной. У меня есть код ВБА. Он выгружает странички в отдельные файлы. Я хотел было сам попробовать разобраться. Но ВБА еще хуже понимаю чем формулы. А для вас скорее всего это пару пустяков. Сейчас файл создает два файла один для бухгалтерии где итоги по суммам "бухПриход" и файл "Экспорт"
вот теперь потребовалось изменить часть которая относится к файлу с экспортом и вместо этого файла теперь надо создавать 4 разных файла из одноименных страниц. Список страничек одноименных ЭкспортБМ ЭкспортЛимак ЭкспортАртис ЭкспортБЗУ
[vba]
Код
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook Set wbE = Workbooks.Add wbE.Sheets(1).Name = "Экспорт" wbC.Sheets("Экспорт").Cells.Copy wbE.Sheets("Экспорт").[a1].PasteSpecial xlPasteValues Application.DisplayAlerts = False wbE.SaveAs cName wbE.Close False Application.DisplayAlerts = True Application.ScreenUpdating = True
Dim a(1 to 4) as string a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
For i =1 to Ubound(a) Set wbE = Workbooks.Add with wbE.sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues end with wbE.SaveAs cName wbE.Close False next i Application.DisplayAlerts = False
[/vba] [p.s.]проверить пока не могу[/p.s.]
и скорее всего строки: [vba]
Код
wbE.SaveAs cName wbE.Close False
[/vba] можно заменить на одну: [vba]
Код
wbE.Close true
[/vba]
koyaanisqatsi, Вот этот кусок можно попробовать заменить: [vba]
Dim a(1 to 4) as string a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
For i =1 to Ubound(a) Set wbE = Workbooks.Add with wbE.sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues end with wbE.SaveAs cName wbE.Close False next i Application.DisplayAlerts = False
[/vba], а можно поразгильдяйничать (как я обычно делаю) и не писать[vba]
Код
Dim i
[/vba]тогда тип данных по умолчанию будет Variant (он занимает больше места и есть еще несколько минусов
Если же совсем облениться (вот это как раз мой случай), то можно стереть обычно появляющуюся автоматически строку Option Explicit и тогда переменные не нужно вообще никак объявлять (и они по умолчанию будут типа Variant). Вернее нужно объявлять все равно, но это становится уже необязательным. А можно вообще один раз снять галку в VBA Tools - Options - Require... и тогда в новых модулях запись Option Explicit автоматически появляться не будет. Но здесь нужно быть очень внимательным - если в первом случае (с записью Dim i) мы просто занимаем больше места, то во втором мы можем попасть на неверное написание переменных (обычно случайное, типа nm и mn), которое иногда не так-то просто обнаружить в коде. Ну и вообще это непофеншуйная запись
[/vba], а можно поразгильдяйничать (как я обычно делаю) и не писать[vba]
Код
Dim i
[/vba]тогда тип данных по умолчанию будет Variant (он занимает больше места и есть еще несколько минусов
Если же совсем облениться (вот это как раз мой случай), то можно стереть обычно появляющуюся автоматически строку Option Explicit и тогда переменные не нужно вообще никак объявлять (и они по умолчанию будут типа Variant). Вернее нужно объявлять все равно, но это становится уже необязательным. А можно вообще один раз снять галку в VBA Tools - Options - Require... и тогда в новых модулях запись Option Explicit автоматически появляться не будет. Но здесь нужно быть очень внимательным - если в первом случае (с записью Dim i) мы просто занимаем больше места, то во втором мы можем попасть на неверное написание переменных (обычно случайное, типа nm и mn), которое иногда не так-то просто обнаружить в коде. Ну и вообще это непофеншуйная запись_Boroda_
Вот-вот... поэтому плохому учить можно, но не в этом случае Пример: буква с в качестве переменной, записанная случайно кириллицей. Намучитесь, пока поймете, где ошибка. При наличии Option Explicit ошибка выявляется сразу.
Рекомендую ВСЕГДА использовать Option Explicit и объявлять переменные. А перед запуском написанного или измененного кода откомпилировать его (меню Debug-Compile VBAProject) Option Explicit здорово помогает при написании кода, Compile VBAProject сохранит время и нервы, которые были бы убиты при многократном запуске кода и удалении ошибок компиляции.
Вот-вот... поэтому плохому учить можно, но не в этом случае Пример: буква с в качестве переменной, записанная случайно кириллицей. Намучитесь, пока поймете, где ошибка. При наличии Option Explicit ошибка выявляется сразу.
Рекомендую ВСЕГДА использовать Option Explicit и объявлять переменные. А перед запуском написанного или измененного кода откомпилировать его (меню Debug-Compile VBAProject) Option Explicit здорово помогает при написании кода, Compile VBAProject сохранит время и нервы, которые были бы убиты при многократном запуске кода и удалении ошибок компиляции.vikttur
[/vba] Результат один и тот же. Код начинает работаеть, Но! он почему-то предлагает название - Книга1-4.xml (четыре раза, ели первые номера уже заняты предлагает следующие 5-9) А я хотел чтобы названия файлов содержали название текущего файла с допиской названия страницы. Иначе те кто будут использовать запутаются ((((
_Boroda_, при добавлении [vba]
Код
Dim i as Byte
[/vba] или удалении [vba]
Код
Option Explicit
[/vba] Результат один и тот же. Код начинает работаеть, Но! он почему-то предлагает название - Книга1-4.xml (четыре раза, ели первые номера уже заняты предлагает следующие 5-9) А я хотел чтобы названия файлов содержали название текущего файла с допиской названия страницы. Иначе те кто будут использовать запутаются ((((koyaanisqatsi
Вполне может быть. Я код вообще не смотрел, я ответил только на вопрос про ругань Для остального нужен файл с кодом И не нужно было убирать строку сохранения файла [vba]
[/vba] И в коде на скрине внутри цикла почему у Вас а(1) вместо а(i)?
С учетом всего вышеизложенного попробуйте дальше самостоятельно разобраться
Вполне может быть. Я код вообще не смотрел, я ответил только на вопрос про ругань Для остального нужен файл с кодом И не нужно было убирать строку сохранения файла [vba]
Я не удалял этот кусок просто он в скрин не влез. Когда строку заменил на Примерно такую все равно по прописному правилу предлагал сохранять с названием 1-4. И в конце на этой строчке еще дебаг вылез.
[vba]
Код
Option Explicit
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook
Dim a(1 To 4) As String a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
Dim i As Byte For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With wbE.Close True Next i Application.DisplayAlerts = False
Я не удалял этот кусок просто он в скрин не влез. Когда строку заменил на Примерно такую все равно по прописному правилу предлагал сохранять с названием 1-4. И в конце на этой строчке еще дебаг вылез.
[vba]
Код
Option Explicit
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook
Dim a(1 To 4) As String a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
Dim i As Byte For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With wbE.Close True Next i Application.DisplayAlerts = False
For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With bName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & " " & a(i) & ".xlsx" wbE.SaveAs Filename:=bName wbE.Close False Next i
[/vba]
* И почему бы не сразу копировать нужный лист? Вместо того, чтобы создавать новый и копировать туда всё из нужного листа, как у Вас. Ну да ладно, С тем еще возиться нужно, а это у Вас уже написано
Все это нужно вставить ВМЕСТО [vba]
Код
wbE.Close True
[/vba]
Вот так должно получиться [vba]
Код
For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With bName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & " " & a(i) & ".xlsx" wbE.SaveAs Filename:=bName wbE.Close False Next i
[/vba]
* И почему бы не сразу копировать нужный лист? Вместо того, чтобы создавать новый и копировать туда всё из нужного листа, как у Вас. Ну да ладно, С тем еще возиться нужно, а это у Вас уже написано_Boroda_
Я понимаю что я сделал не правильно. Но я не сильно понимаю что вырезать надо из разных кусков кода. По этому опять ошибка ( [vba]
Код
Option Explicit
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook
Dim a(1 To 4) As String a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
Dim i As Byte ' For i = 1 To UBound(a) ' Set wbE = Workbooks.Add ' With wbE.Sheets(1) ' .Name = a(i) ' wbC.Sheets(a(i)).Cells.Copy ' .[a1].PasteSpecial xlPasteValues ' End With ' wbE.Close True 'Next i
For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With bName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & " " & a(i) & ".xlsx" wbE.SaveAs Filename:=bName wbE.Close False Next i
Я понимаю что я сделал не правильно. Но я не сильно понимаю что вырезать надо из разных кусков кода. По этому опять ошибка ( [vba]
Код
Option Explicit
Sub Лист_экспорт() Dim cPath As String, cPrefix As String, cName As String cPath = ThisWorkbook.Path & "\экспорт\" cPrefix = "Экспорт " cName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & ".xlsx"
Dim wbC As Workbook, wbE As Workbook Application.ScreenUpdating = False Set wbC = ThisWorkbook
Dim a(1 To 4) As String a(1) = "ЭкспортБМ" a(2) = "ЭкспортЛимак" a(3) = "ЭкспортАртис" a(4) = "ЭкспортБЗУ"
Dim i As Byte ' For i = 1 To UBound(a) ' Set wbE = Workbooks.Add ' With wbE.Sheets(1) ' .Name = a(i) ' wbC.Sheets(a(i)).Cells.Copy ' .[a1].PasteSpecial xlPasteValues ' End With ' wbE.Close True 'Next i
For i = 1 To UBound(a) Set wbE = Workbooks.Add With wbE.Sheets(1) .Name = a(i) wbC.Sheets(a(i)).Cells.Copy .[a1].PasteSpecial xlPasteValues End With bName = cPath & cPrefix & Replace(ThisWorkbook.Name, ".xlsm", "") & " " & a(i) & ".xlsx" wbE.SaveAs Filename:=bName wbE.Close False Next i
_Boroda_, у меня беда. этот макрос перестал работать. Расскажу по подробнее. 1. Часто слетает автоподсчет формул и перекидывается на ручной режим. Видать превышает какие-то тайменги. 2. Два файла этим макросом делает правильно все копирует и сортирует и удаляет как и запланировано. А два файла Артис и Лимак не сортирует причем самое что печальное нижная строка где команда END для последующей обработки попадает на самый верх . И чтобы воспользоваться последующими выгрузками надо залезать в файл и переставлять строку в самый низ. уже всю голову сломал. не знаю что и делать. Есть файл за 28.08.2019 четверг. Там все работает. Беру его снова добавляю два контрагента и опять все тоже самое.
Самое интересное что эти два контрагента не из тех файлов которые не сортируются ((((
Может есть какие предположения? Куда поглядеть ? И почему постоянно слетает автоподсчет ? Нельзя увеличить таймауты ?
_Boroda_, у меня беда. этот макрос перестал работать. Расскажу по подробнее. 1. Часто слетает автоподсчет формул и перекидывается на ручной режим. Видать превышает какие-то тайменги. 2. Два файла этим макросом делает правильно все копирует и сортирует и удаляет как и запланировано. А два файла Артис и Лимак не сортирует причем самое что печальное нижная строка где команда END для последующей обработки попадает на самый верх . И чтобы воспользоваться последующими выгрузками надо залезать в файл и переставлять строку в самый низ. уже всю голову сломал. не знаю что и делать. Есть файл за 28.08.2019 четверг. Там все работает. Беру его снова добавляю два контрагента и опять все тоже самое.
Самое интересное что эти два контрагента не из тех файлов которые не сортируются ((((
Может есть какие предположения? Куда поглядеть ? И почему постоянно слетает автоподсчет ? Нельзя увеличить таймауты ?koyaanisqatsi