Необходимо ввести переменные в Книгу - названия листов, которые будут использоваться в формах и тд. (массивами). Листы при запуске будут названы значениями массива.
Прописал вот такой код, для примера беру массив из четырех названий
Номера листов идут подряд, с 63 по 66
[vba]
Код
Private Sub Массив_названий_проектов()
Dim i As Integer
Dim NameShale(4) As String NameShale(1) = "Шале-176" NameShale(2) = "Шале-207" NameShale(3) = "Шале-248" NameShale(4) = "Шале-304"
For i = 1 To 4
With ThisWorkbook With .Worksheets With .Item(i + 62) With .Activate ActiveSheet.Name = NameShale(i) End With End With End With End With
Next i
[/vba]
Возможно, ошибка в синтаксисе (не силен в этом, учусь), перерыл весь интернет уже, ничего толкового не нашел.
Также интересно, можно ли заморозить названия листов, чтобы они не могли меняться вручную.
Файл большой очень, не прикрепляется (да и нельзя мне его сюда прикреплять, надеюсь, можно без него). Постарался вложить скриншоты, по которым понятно что и где я прописал
Заранее спасибо!
Добрый день! Необходима помощь
Необходимо ввести переменные в Книгу - названия листов, которые будут использоваться в формах и тд. (массивами). Листы при запуске будут названы значениями массива.
Прописал вот такой код, для примера беру массив из четырех названий
Номера листов идут подряд, с 63 по 66
[vba]
Код
Private Sub Массив_названий_проектов()
Dim i As Integer
Dim NameShale(4) As String NameShale(1) = "Шале-176" NameShale(2) = "Шале-207" NameShale(3) = "Шале-248" NameShale(4) = "Шале-304"
For i = 1 To 4
With ThisWorkbook With .Worksheets With .Item(i + 62) With .Activate ActiveSheet.Name = NameShale(i) End With End With End With End With
Next i
[/vba]
Возможно, ошибка в синтаксисе (не силен в этом, учусь), перерыл весь интернет уже, ничего толкового не нашел.
Также интересно, можно ли заморозить названия листов, чтобы они не могли меняться вручную.
Файл большой очень, не прикрепляется (да и нельзя мне его сюда прикреплять, надеюсь, можно без него). Постарался вложить скриншоты, по которым понятно что и где я прописал
Решил заполнить комбобокс по вкладкам, но названия вкладок все еще нужно связать с массивом, который будет статичным по всех модулях и листах проектаmower07
mower07, 1) Зачем громоздить With? 2) Зачем тратить время на Activate (а оно тратится, и если листов тысячи, то это ОЧЕНЬ заметно)
[vba]
Код
Private Sub Массив_названий_проектов()
Dim i As Integer
Dim NameShale(63 to 66) As String NameShale(63) = "Шале-176" NameShale(64) = "Шале-207" NameShale(65) = "Шале-248" NameShale(66) = "Шале-304"
For i = 63 To 66 On Error Resume Next ThisWorkbook.Worksheets(i).Name=NameShale(i) ;Проверяем, не кончились ли листы и если да, добавляем If Err.Number<>0 Then ThisWorkbook.Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ThisWorkbook.Worksheets(i).Name=NameShale(i) End If Next i
End Sub
[/vba]
И да, держать данные в ThisWorkbook — Плохая идея. очень плохая.
mower07, 1) Зачем громоздить With? 2) Зачем тратить время на Activate (а оно тратится, и если листов тысячи, то это ОЧЕНЬ заметно)
[vba]
Код
Private Sub Массив_названий_проектов()
Dim i As Integer
Dim NameShale(63 to 66) As String NameShale(63) = "Шале-176" NameShale(64) = "Шале-207" NameShale(65) = "Шале-248" NameShale(66) = "Шале-304"
For i = 63 To 66 On Error Resume Next ThisWorkbook.Worksheets(i).Name=NameShale(i) ;Проверяем, не кончились ли листы и если да, добавляем If Err.Number<>0 Then ThisWorkbook.Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ThisWorkbook.Worksheets(i).Name=NameShale(i) End If Next i
End Sub
[/vba]
И да, держать данные в ThisWorkbook — Плохая идея. очень плохая.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Сообщение отредактировал StoTisteg - Воскресенье, 07.02.2016, 21:52
StoTisteg, зачем в цикле многократно ставить On Error Resume Next? Проще и быстрее после обработки ошибки (если она изредка будет) её скинуть Err.Clear
StoTisteg, зачем в цикле многократно ставить On Error Resume Next? Проще и быстрее после обработки ошибки (если она изредка будет) её скинуть Err.ClearHugo
Затем, что у Вас в ThisWorkbook может быть: 1. 1—62 листа, и листов 63—66, разумеется, просто нет и попытка их переименовать номер ошибки генерирует, но макроса не останавливает 2. 63 листа, и тогда при попытке переименовать лист 64... ... и так далее до нормальной отработки. И предсказать Вы это заранее не можете. Если, конечно, не пишете макрос для одной книги :)
А ставить On Error Resume Next непосредственно перед возможной ошибкой у меня уже рефлекс. После того, как я один раз написал цикл
For i=1 to ActiveSheet.rows.Count
поставил On Error Resume Next до него и долго мучил голову. почему виснет "элементарный" макрос
Затем, что у Вас в ThisWorkbook может быть: 1. 1—62 листа, и листов 63—66, разумеется, просто нет и попытка их переименовать номер ошибки генерирует, но макроса не останавливает 2. 63 листа, и тогда при попытке переименовать лист 64... ... и так далее до нормальной отработки. И предсказать Вы это заранее не можете. Если, конечно, не пишете макрос для одной книги :)
А ставить On Error Resume Next непосредственно перед возможной ошибкой у меня уже рефлекс. После того, как я один раз написал цикл
For i=1 to ActiveSheet.rows.Count
поставил On Error Resume Next до него и долго мучил голову. почему виснет "элементарный" макрос StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
У меня быть не может... :) А я советую вот что: [vba]
Код
On Error Resume Next For i = 63 To 66 ThisWorkbook.Worksheets(i).Name = NameShale(i) If Err.Number <> 0 Then ThisWorkbook.Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ThisWorkbook.Worksheets(i).Name = NameShale(i) Err.Clear End If Next i On Error GoTo 0
У меня быть не может... :) А я советую вот что: [vba]
Код
On Error Resume Next For i = 63 To 66 ThisWorkbook.Worksheets(i).Name = NameShale(i) If Err.Number <> 0 Then ThisWorkbook.Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ThisWorkbook.Worksheets(i).Name = NameShale(i) Err.Clear End If Next i On Error GoTo 0
из модуля эти макросы будут запускаться при запуске файла
Ну так повесьте на открытие книги макросы инициализации [vba]
Код
Private Sub Workbook_Open() Call mas1 End Sub
[/vba] В файле можете после запуска открыть окно Immediate и выполнить test, а вообще в основном макросе желательно проверку выполнить инициализирован ли массив.
из модуля эти макросы будут запускаться при запуске файла
Ну так повесьте на открытие книги макросы инициализации [vba]
Код
Private Sub Workbook_Open() Call mas1 End Sub
[/vba] В файле можете после запуска открыть окно Immediate и выполнить test, а вообще в основном макросе желательно проверку выполнить инициализирован ли массив.Udik