Доброго времени суток Есть книга Excel, в ней листы создаются и заполняются путем экспорта из сторонней программы. Названия Листов в Книге фиксированные. к примеру такие МТ_Р, МБ_МТ, МТ_МБ, МТ_С, С_МТ и т.д. ( всего около 20 возможных названий) Каждый раз в зависимости от содержания заказа, в Книге могут содержаться разного набора и количества листы. К примеру в заказе №1: МБ_МТ, МБ_С В заказе №2: МТ_Р, МТ_МБ, МТ_С
То есть порядок и названия могут меняться. Прикрепление к самому листу тоже. Допустим, в первом заказе Лист 1 = МБ_МТ , то во втором уже Лист 1 = МТ_Р. Мне нужно, чтобы всегда было первый лист в вкладке ( если он соответствует названиям из списка) был = Подзаказ1 , второй лист в вкладке = Подзаказ2 и т.д. Прикрепил примеры исходного и то что должно получится в результате. Как это можно сделать? Пытался сделать перебором названий, но запутался и как-то коряво все это выглядит. Может есть более простой способ.
Доброго времени суток Есть книга Excel, в ней листы создаются и заполняются путем экспорта из сторонней программы. Названия Листов в Книге фиксированные. к примеру такие МТ_Р, МБ_МТ, МТ_МБ, МТ_С, С_МТ и т.д. ( всего около 20 возможных названий) Каждый раз в зависимости от содержания заказа, в Книге могут содержаться разного набора и количества листы. К примеру в заказе №1: МБ_МТ, МБ_С В заказе №2: МТ_Р, МТ_МБ, МТ_С
То есть порядок и названия могут меняться. Прикрепление к самому листу тоже. Допустим, в первом заказе Лист 1 = МБ_МТ , то во втором уже Лист 1 = МТ_Р. Мне нужно, чтобы всегда было первый лист в вкладке ( если он соответствует названиям из списка) был = Подзаказ1 , второй лист в вкладке = Подзаказ2 и т.д. Прикрепил примеры исходного и то что должно получится в результате. Как это можно сделать? Пытался сделать перебором названий, но запутался и как-то коряво все это выглядит. Может есть более простой способ.Stormy
Макрос предложит выбрать папку, в которой обработает все Excel файлы. Если в названии листа есть "_" - то лист будет переименован.
[vba]
Код
Sub Rio_SheetName_Reformer()
'Author: Roman Rioran Voronov 'Date: the 11-th of September, 2014 'Feedback: voronov_rv@mail.ru
' This subroutine allows user to pick a folder, where in every Excel file 'all worksheets with symbol "_" in their names will be renamed
Dim X As Integer 'To roll list names Dim Y As Integer 'To roll file names on page Dim Z As Integer 'As "Podzakaz" number Dim shtX As Worksheet 'To roll lists Dim sFiles As String 'To roll files Dim sFolder As String 'To select a folder Dim FileNumber As Integer 'To roll files
With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With
Do 'Gathering file names FileNumber = FileNumber + 1 With ThisWorkbook.Worksheets("Data") .Cells(FileNumber, 1).Value = sFolder & sFiles sFiles = Dir End With Loop While sFiles <> "" 'Observing files one by one
For Y = 1 To FileNumber 'Reforming books Workbooks.Open ThisWorkbook.Worksheets("Data").Cells(Y, 1).Value: Z = 0 For Each shtX In ActiveWorkbook.Worksheets If shtX.Name Like "*_*" Then Z = Z + 1: shtX.Name = "Подзаказ" & Z End If Next shtX ActiveWorkbook.Close SaveChanges:=True Next Y
Макрос предложит выбрать папку, в которой обработает все Excel файлы. Если в названии листа есть "_" - то лист будет переименован.
[vba]
Код
Sub Rio_SheetName_Reformer()
'Author: Roman Rioran Voronov 'Date: the 11-th of September, 2014 'Feedback: voronov_rv@mail.ru
' This subroutine allows user to pick a folder, where in every Excel file 'all worksheets with symbol "_" in their names will be renamed
Dim X As Integer 'To roll list names Dim Y As Integer 'To roll file names on page Dim Z As Integer 'As "Podzakaz" number Dim shtX As Worksheet 'To roll lists Dim sFiles As String 'To roll files Dim sFolder As String 'To select a folder Dim FileNumber As Integer 'To roll files
With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With
Do 'Gathering file names FileNumber = FileNumber + 1 With ThisWorkbook.Worksheets("Data") .Cells(FileNumber, 1).Value = sFolder & sFiles sFiles = Dir End With Loop While sFiles <> "" 'Observing files one by one
For Y = 1 To FileNumber 'Reforming books Workbooks.Open ThisWorkbook.Worksheets("Data").Cells(Y, 1).Value: Z = 0 For Each shtX In ActiveWorkbook.Worksheets If shtX.Name Like "*_*" Then Z = Z + 1: shtX.Name = "Подзаказ" & Z End If Next shtX ActiveWorkbook.Close SaveChanges:=True Next Y
Rioran, Выбор папки не подойдет, так как макрос будет висеть на Открытие книги, которая в свою очередь с ОЛЕ объекта запускается. Все должно происходить без участия пользователя.
Rioran, Выбор папки не подойдет, так как макрос будет висеть на Открытие книги, которая в свою очередь с ОЛЕ объекта запускается. Все должно происходить без участия пользователя.Stormy
Stormy, можете использовать для оптового переименования, если скопилось энное количество необработанных файлов =) С переделкой под NonUser формат сами справитесь или помочь?
Stormy, можете использовать для оптового переименования, если скопилось энное количество необработанных файлов =) С переделкой под NonUser формат сами справитесь или помочь?Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Rioran, Роман, спасибо за участие в вопросе. Не совсем все так. Вот вкратце, что происходит и почему нужно менять названия листов, возможно у кого-то возникнет принципиально иное решение.
Есть чертеж в Автокаде, на нем расположены ОЛЕ объекты Экзеля( Назовем А_ОЛЕ). Есть Книга Экзеля полученный путем экспорта из сторонней программы ( назовем ее Книга_База ). 1) Макрос в Автокаде открывает ОЛЕ объекты. 2) При открытие А_ОЛЕ срабатывает макрос открытия Книга_База 3) Открывшийся лист А_ОЛЕ уже содержит привязку к Книга_База . То бишь по структуре таблиц они одинаковы. А_ОЛЕ ссылается на Книга_База. Ячейка А1 в А_ОЛЕ содержит такую запись =
Код
=[Книга_База.xls]DS_MT!A1
. 4) Если в Книга_База присутствует Лист с названием DS_MT , то все нормально, но вот если он отсутствует , то естественное будет
Код
=[Книга_База.xls]#ССЫЛКА!A1
Чтобы не плодить в Автокаде всех возможных вариантов для листов, хотел переименовывать их Стандартные названия, тогда связка не будет выдавать ошибки и можно обойтись 4-мя шаблонами.
Как-то так все.
Rioran, Роман, спасибо за участие в вопросе. Не совсем все так. Вот вкратце, что происходит и почему нужно менять названия листов, возможно у кого-то возникнет принципиально иное решение.
Есть чертеж в Автокаде, на нем расположены ОЛЕ объекты Экзеля( Назовем А_ОЛЕ). Есть Книга Экзеля полученный путем экспорта из сторонней программы ( назовем ее Книга_База ). 1) Макрос в Автокаде открывает ОЛЕ объекты. 2) При открытие А_ОЛЕ срабатывает макрос открытия Книга_База 3) Открывшийся лист А_ОЛЕ уже содержит привязку к Книга_База . То бишь по структуре таблиц они одинаковы. А_ОЛЕ ссылается на Книга_База. Ячейка А1 в А_ОЛЕ содержит такую запись =
Код
=[Книга_База.xls]DS_MT!A1
. 4) Если в Книга_База присутствует Лист с названием DS_MT , то все нормально, но вот если он отсутствует , то естественное будет
Код
=[Книга_База.xls]#ССЫЛКА!A1
Чтобы не плодить в Автокаде всех возможных вариантов для листов, хотел переименовывать их Стандартные названия, тогда связка не будет выдавать ошибки и можно обойтись 4-мя шаблонами.
Одна мысль крутится в голове, но ухватиться за нее не могу. 1) Создать список названий , которые нужно переименовать. (МТ1, МТ2, МПБ3, ПМР, КМН) 2) Сделать проверку по названиям листов. 3) Если встречается название из списка, то присвоить этому листу название ПодЗак1 , дальше проверяем. Если встречается еще какое-то название из списка, то присвоить название ПодЗак2 и так до конца листов ( не больше 20 листов всего может быть)
Только вот как это сделать пока недодумкаю
Одна мысль крутится в голове, но ухватиться за нее не могу. 1) Создать список названий , которые нужно переименовать. (МТ1, МТ2, МПБ3, ПМР, КМН) 2) Сделать проверку по названиям листов. 3) Если встречается название из списка, то присвоить этому листу название ПодЗак1 , дальше проверяем. Если встречается еще какое-то название из списка, то присвоить название ПодЗак2 и так до конца листов ( не больше 20 листов всего может быть)