Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32

Переименование листов во время выполнения макроса

28.10.2015, 12:09. Показов 1773. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
имеется макрос, внутри которого есть необходимость изменить название листов
Например Ив.=Иванов, Пет.=Петров, Сид.=Сидоров
Visual Basic
1
2
3
4
5
If oFileSystemObject.FileExists(wb.Path & "" & m & ".xls") Then
            Set srcBook = Workbooks.Open(Filename:=wb.Path & "" & m & ".xls", ReadOnly:=True, UpdateLinks:=0)
If sh.CodeName = "Ив." Then sh.Name = "Иванов": Exit For
ElseIf sh.CodeName = "Пет." Then sh.Name = "Петров": Exit For
ElseIf sh.CodeName = "Сид." Then sh.Name = "Сидоров": Exit For
у меня выбивает ошибку "424"
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2015, 12:09
Ответы с готовыми решениями:

Печать во время выполнения макроса
В макросе отправляются два задания на печать. Необходимо чтобы первое задание начало выполняться уже во время выполнения макроса...

Немодальное окно на экране во время выполнения макроса
Здравствуйте, как прописать, чтобы во время выполнения макроса висела табличка типа Msgbox, но как-бы фоном. Например Sub mac1 ...

Как сделать паузу во времени во время выполнения макроса?
типа Aplication.wait не проходит мне надо чтоб типа VBAProject.wait или pause ??? т.е. надо отслеживать работу макроса и если что то не...

11
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 12:24
1) Нет цикла по листам (или от скрыт от глаз общественности)

2) Кодовое имя не может содержать точку, в отличии от имени листа, которое мы можем лицезреть на ярлычке.

Visual Basic
1
2
3
4
5
6
7
8
9
10
If Dir(wb.Path & "\" & m & ".xls") <> "" Then
   Set srcBook = Workbooks.Open(Filename:=wb.Path & "\" & m & ".xls", UpdateLinks:=0)
   For Each sh In srcBook.Worksheets '.Sheets
       Select Case LCase(sh.Name)
           Case "ив.": sh.Name = "Иванов"
           Case "пет.": sh.Name = "Петров"
           Case "сид.": sh.Name = "Сидоров"
       End Select
   Next
End If
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32
28.10.2015, 12:34  [ТС]
Цитата Сообщение от pashulka Посмотреть сообщение
1) Нет цикла по листам (или от скрыт от глаз общественности)
вот полностью код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub IMPORT()
    Dim srcBook As Workbook
    Dim ws As Worksheet
    
    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Главная")
    Set wf = WorksheetFunction
    Dim oFileSystemObject As Object
    Set oFileSystemObject = CreateObject("Scripting.FileSystemObject")
    Mon = [{"Январь","Февраль","Март"}]
       
    Application.ScreenUpdating = False
    For Each m In Mon
        If oFileSystemObject.FileExists(wb.Path & "" & m & ".xls") Then
            Set srcBook = Workbooks.Open(Filename:=wb.Path & "" & m & ".xls", ReadOnly:=True, UpdateLinks:=0)
If sh.CodeName = "Ив" Then sh.Name = "Иванов": Exit For
ElseIf sh.CodeName = "Пет" Then sh.Name = "Петров": Exit For
ElseIf sh.CodeName = "Сид" Then sh.Name = "Сидоров": Exit For
 
            For Each sh In srcBook.Sheets
                Set wc = ws.Range("A:A").Find(sh.Name)
                If TypeName(wc) = "Range" Then
                    wc.Offset(0, 1).Value = wf.Sum(sh.Range("A3,A7,A9,A11"))
                    wc.Offset(0, 1).Font.Color = vbRed
                End If
            Next sh
            srcBook.Close SaveChanges:=False
        End If
    Next m
    Application.ScreenUpdating = True
End Sub
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 13:03
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Option Explicit
 
Private Sub Test()
    Dim wbSource As Workbook, rngTarget As Range
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim strPath As String, strFind As String, varMonth As Variant
    
    strPath = ThisWorkbook.Path & "\"
    Set wsTarget = ThisWorkbook.Worksheets("Главная")
       
    Application.ScreenUpdating = False
    For Each varMonth In Array("Январь", "Февраль", "Март")
        If Len(Dir(strPath & varMonth & ".xls")) Then
           Set wbSource = Workbooks.Open(FileName:=strPath & varMonth & ".xls", UpdateLinks:=0)
            For Each wsSource In wbSource.Worksheets
                strFind = LCase(wsSource.Name)
                Select Case strFind
                    Case "ив.": strFind = "Иванов"
                    Case "пет.": strFind = "Петров"
                    Case "сид.": strFind = "Сидоров"
                End Select
            
                Set rngTarget = wsTarget.Range("A:A").Find(strFind)
                If TypeName(rngTarget) = "Range" Then
                   rngTarget.Offset(0, 1) = Application.Sum(wsSource.Range("A3,A7,A9,A11"))
                   rngTarget.Offset(0, 1).Font.Color = vbRed
                End If
            Next
            wbSource.Close saveChanges:=False
        End If
    Next
    Application.ScreenUpdating = True
End Sub
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32
28.10.2015, 13:48  [ТС]
Цитата Сообщение от pashulka Посмотреть сообщение
2) Кодовое имя не может содержать точку, в отличии от имени листа, которое мы можем лицезреть на ярлычке.
это я допустил ошибку в коде, на самом деле точки нет, а используется кодовое имя из за того что названия листа может состоять из текущей даты (как в файле Апрель.xls), но запуск макроса не обязательно в тот день. Поэтому надо переименование не по названию листа, а по кодовому имени
чтоб было понятнее, я добавил архив...там еще много нюансов
Вложения
Тип файла: zip 3.zip (34.4 Кб, 4 просмотров)
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 13:57
В рабочей книге "Апрель.xls" у единственного листа кодовое имя - Лист1 , а имя 2810
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32
28.10.2015, 14:03  [ТС]
Цитата Сообщение от pashulka Посмотреть сообщение
В рабочей книге "Апрель.xls" у единственного листа кодовое имя - Лист1 , а имя 2810
да, вот это и надо прописывать в коде, не
Visual Basic
1
Case "2810": strFind = "akaDemik"
а
Visual Basic
1
CodeName = "Лист1" : strFind = "akaDemik"
...если я правильно написал
но нюанс в том, что структура этого листа отличается от остальных...наверно его надо выделять в другой код, но пока не знаю как
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 14:19
Можете не переживать по поводу апреля, его всё равно нет в Вашем списке {"Январь","Февраль","Март"}

А если серьёзно, то бессмысленное кодовое имя "Лист1" присутствует во всех книгах, так что, если Вы действительно хотите найти "Фед" среди "Федоров", то либо оставьте первоначальный вариант с таблицей "замен", либо просто ищите wsSource.Name & "*"
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32
28.10.2015, 14:52  [ТС]
Цитата Сообщение от pashulka Посмотреть сообщение
Можете не переживать по поводу апреля, его всё равно нет в Вашем списке {"Январь","Февраль","Март"}
это только как пример первых файлов, в полной версии немного по другому, там 15 файлов, где в 12 одинаковая структура (где каждый лист отдельно), в 2 другая структура(все листы расположены на одном поочередно горизонтально), в 1 третья структура (все листы расположены на одном поочередно вертикально)

p/s/ Ваш код не отрабатывает на 3 месяце из примера
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 15:48
Цитата Сообщение от akaDemik_ua Посмотреть сообщение
Цитата Сообщение от pashulka Посмотреть сообщение
Можете не переживать по поводу апреля, его всё равно нет в Вашем списке {"Январь","Февраль","Март"}

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

А если серьёзно, то возьмите свой макрос Import и Вы увидите, что расширение указано как .xls в то время, как имя файла Март.xlsx

Если же ТС изменилось и теперь нужно работать в т.ч. и с книгами .xlsx , то :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
 
Private Sub Test()
    Dim wbSource As Workbook, rngTarget As Range
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim strPath As String, strFileName As String, varMonth As Variant
    
    strPath = ThisWorkbook.Path & "\"
    Set wsTarget = ThisWorkbook.Worksheets("Главная")
       
    Application.ScreenUpdating = False
    For Each varMonth In Array("Январь", "Февраль", "Март") 'In Application.GetCustomListContents(4)
        strFileName = Dir(strPath & varMonth & ".xls*")
        If Len(strFileName) > 0 Then
           Set wbSource = Workbooks.Open(Filename:=strPath & strFileName, UpdateLinks:=0)
            For Each wsSource In wbSource.Worksheets
                Set rngTarget = wsTarget.Range("A:A").Find(wsSource.Name & "*")
                If TypeName(rngTarget) = "Range" Then
                   rngTarget.Offset(0, 1) = Application.Sum(wsSource.Range("A3,A7,A9,A11"))
                   rngTarget.Offset(0, 1).Font.Color = vbRed
                End If
            Next
            wbSource.Close saveChanges:=False
        End If
    Next
    Application.ScreenUpdating = True
End Sub
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 32
28.10.2015, 17:08  [ТС]
Цитата Сообщение от pashulka Посмотреть сообщение
Впервые слышу о 15 месяцах
название файлов как пример
можно их было назвать Минск.xls, Таллин.xls, Одесса.xlsx, Владивосток.xls и т.д.
Цитата Сообщение от pashulka Посмотреть сообщение
Visual Basic
1
Set rngTarget = wsTarget.Range("A:A").Find(wsSource.Name & "*")
я так понимаю что это сокращено для поиска, но название листа может не всегда корректно называться, например Ivan0v=Иванов или Иванова https://www.cyberforum.ru/cgi-bin/latex.cgi?\neq Иванов, тоесть надо жесткая привязка как в предыдущем варианте
Visual Basic
1
2
3
4
5
                Select Case strFind
                    Case "Ivan0v": strFind = "Иванов"
                    Case "петр0в": strFind = "Петров"
                    Case "сид": strFind = "Сидоров"
                End Select
0
 Аватар для pashulka
4138 / 2242 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
28.10.2015, 20:36
akaDemik, так ведь никто не ограничивает Вас в выборе конкретного варианта, и если реальные данные действительно отличаются от тех, что были опубликованы ранее, используйте свою таблицу замен.

P.S. Если таких подмен будет много, то можно расположить эти данные непосредственно в ячейках листа (возможно скрытого), а затем, вместо Select Case и т.д. мучить стандартную функцию рабочего листа ВПР() вызываемую программно, т.е. что-то вроде r = Application.Vlookup(wsSource.Name, ТаблицаЗамен, 2, 0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2015, 20:36
Помогаю со студенческими работами здесь

Отследить нажатие CommandButton1 на Userform во время выполнения макроса
Добрий день! Подскажите пожалуйста, возможно ли во время выполнения макроса, вызвав форму и тыкнув на ней CommandButton1, продолжить...

Блокировать Excel на время выполнения макроса
Есть очень долгоиграющий макрос. Пользователи забывают про расчет и пытаются нажать на лист, что иногда приводит к сбоям, как избежать?

Нужно на время выполнения одного макроса выключить другой (точнее функцию)
Здрасти. Проблемка, нужно на время выполнения ожного макроса выключить другой (точнее функцию). Просто функция всё время пересчитывается,...

Переименование листов
Грамотные товарищи, помогите :) задача состоит в следующем: В книге 22 листа (по количеству рабочих дней в месяце), нужно чтобы...

Последовательное переименование листов
Приветствую! Имеется макрос: Sub Переименовать () Dim б Windows(&quot;НаименованиеКниги1.xls&quot;).Activate б =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru