Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2013, 19:07   #1
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию Переименование массива, отформатированного как таблица

Добрый вечер.
Я разработал файл, в котором хранятся скрытые листы.
Для того, чтобы можно вносить изменения в данные шаблоны, листы копируются в эту же книгу и делаются видимыми.

На скрытом листе содержатся массивы данных, форматированные как таблицы, с именем, например, TypeOfList_TypeOfTable_Table.

При копировании листа таблица на новом листе принимает имя TypeOfList_TypeOfTable_Table1.

Данный лист в последствии переносится в другую книгу и тут начинаются проблемы.

Все линки в новой книге заявзаны на первоначальное имя и соответственно перестают работать.

Как я понимаю, нужно составить макрос, который бы находил таблицу, содержащую в названии TypeOfList_TypeOfTable_Table (например TypeOfList_TypeOfTable_Table1) и переименовывал ее в TypeOfList_TypeOfTable_Table

Но вот как это сделать не представляю.
Пожалуйста, помогите!

С уважением,
ILF_ollie вне форума Ответить с цитированием
Старый 05.04.2013, 22:20   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Может копировать в новую книгу? Так проще будет...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 08.04.2013, 09:16   #3
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию

К сожалению, вариант с копированием в новую книгу не подходит, поскольку в одной книге может быть несколько скопированных листов одного типа и, соответственно, снова начнется нумерация таблиц.

Вопрос именно в переименовании таблицы при переносе конкпретного листа в другую книгу.

Очень буду признателен за помощ!
ILF_ollie вне форума Ответить с цитированием
Старый 08.04.2013, 13:44   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Так если Вы в один файл хотите скопировать несколько одноимённых диапазонов - так не получится.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.04.2013, 09:42   #5
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию

Логика следующая.
Допустим, в книге находится лист с таблицей Ефиду.
Данный лист копируется в эту же книгу в нескольких экземплярах.
Соответственно таблице присваиваются имена: Table1, Table2 и тд.

После этого лист перемещается в книгу, где Table1 (или Table2, в зависимости от того, какой лист копировался) необходимо переименовать обратно в Table.
ILF_ollie вне форума Ответить с цитированием
Старый 09.04.2013, 10:31   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Я предлагаю Ефиду сразу копировать куда нужно без всяких переименований
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.04.2013, 16:17   #7
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я предлагаю Ефиду сразу копировать куда нужно без всяких переименований
Сорри, опечатался, должно было быть Table.

Есть вот такой вариант, но он не подходит по следующим причинам:
1) работает для диапазона, а не для таблицы
2) он ищет не диапазон с похожим именем, а точно заданный диапазон с именем Table1
3) он уменьшает имя диапазона на 1 символ, при этом присвоенный номер может быть двузначным и более.

Помогите, пожалуйста, доработать, с учетом этих особенностей

Код:
Sub Macro1()
    
      Const myName As String = "Table1"
 
    Dim nameMy As Excel.Name
    
       For Each nameMy In ActiveWorkbook.Names
    
               If nameMy.Name = myName Then
 
                       nameMy.Name = Left(nameMy.Name, Len(nameMy.Name) - 1)
        
                     Exit For
        
        End If
        
    Next nameMy
    
 End Sub

Последний раз редактировалось ILF_ollie; 09.04.2013 в 16:46.
ILF_ollie вне форума Ответить с цитированием
Старый 09.04.2013, 16:41   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

У меня в 2003 этот код работает - но вероятно с таблицами в 2007/10 нужен другой подход.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 11.04.2013, 10:29   #9
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию

Вот код, который мне подходит.
Подскажите пожалуйста, как можно его доработать, чтобы поиск осуществлялся по всей книге и можно было переименовать несколько таблиц с разным корнем одним макросом (TableABC123 в TableABC, TableXYZ123 в TableXYZ)

Код:
Sub Макрос1()
    
    '1. В константе "myName" нужно указать корень имени таблицы,
        'которое нужно найти и изменить.
    'Я для примера указал имя "Таблица".
    'Макрос будет обрабатывать имена таблиц, которые начинаются
        'словом "Таблица".
    Const myName As String = "Таблица"
    
    'Таблица в "Excel 2007" в VBA - это объект "ListObject".
    Dim myTable As Excel.ListObject
    
    'Про объект "ListObjects" я узнал при помощи макрорекордера
        'при создании таблицы.
    
    'Просматриваем все таблицы, какие есть на активном листе.
    For Each myTable In ActiveSheet.ListObjects
    
        'Если имя то, которое нам нужно.
        '"InStr" ищет в имени таблицы искомое слово.
            'Искомое слово должно находиться в начале слова.
            'Если искомое слово будет в начале слова, то будет результат "1".
        If InStr(myTable.Name, myName) = 1 Then
 
            '2. Изменяем это имя.
            myTable.Name = myName
            
            '3. Выходим из кода, т.к. на одном Excel-листе
                'не может быть несколько таблиц с одинаковым именем.
            Exit For
        
        End If
        
    Next myTable
    
End Sub

Последний раз редактировалось ILF_ollie; 11.04.2013 в 10:51.
ILF_ollie вне форума Ответить с цитированием
Старый 11.04.2013, 17:19   #10
ILF_ollie
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 21
По умолчанию

Итоговый вариант:
Код:
Sub Macro1()
 
 Dim myName()
Dim x
myName = Array("MCS_CalculationType_Table", "MCS_Prices_Table")

 Dim myTable As Excel.ListObject
 Dim sh As Worksheet
For Each sh In ThisWorkbook.Sheets

 For Each myTable In sh.ListObjects
For Each x In myName
 
 If InStr(myTable.Name, x) = 1 Then
 
 myTable.Name = x
 
 
 End If
 Next x
 Next myTable
Next sh
 
End Sub
Всем огромное спасибо за помощь!

Последний раз редактировалось ILF_ollie; 11.04.2013 в 18:52.
ILF_ollie вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восстановить данные с отформатированного HDD\NTFS Ёжик в тумане Операционные системы общие вопросы 5 10.02.2013 11:20
Как обнулить элементы строки двумерного массива, содержащей наибольшее количество элементов одномерного массива griignat Помощь студентам 1 22.11.2011 20:04
восстановление отформатированного диска Елена дуд Помощь студентам 5 11.08.2011 23:43
Переименование слайдов в PP lkbb Microsoft Office Excel 3 23.08.2010 09:18
Переименование файла ZET78 PHP 1 09.08.2010 10:22