Страницы: 1 2 След.
RSS
Выпадающий список с названиями листов книги
 
Доброго времени суток.
Подскажите, как сделать выпадающий список с названиями листов книги.
На каком нибудь запасном листе запускаю макрос:
Sub List()
Dim i As Integer
For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveSheet.Cells(i, 1).Value = ActiveWorkbook.Worksheets(i).Name
Next i
End Sub

Всё прекрасно работает.
Нужно что бы на рабочем листе в определённой ячейке был выпадающий список в котором отображаются названия листов начинающихся с цифры, может это можно сделать прямо в макросе. И при дополнении новых листов, чтобы они тоже были в этом списке. Я предполагаю что на основе списка созданного макросом сделать выпадающий список в ячейке. Любому совету буду рад.
 
Макрос добавит в в ячейку А1 активного листа выпадающий список с именами всех листов со второго по последний.
Код
Sub SheetsToValidation()
Dim i As Long, Arr()
Dim shp As Worksheet
    ReDim Arr(1 To Sheets.Count)
    For i = 2 To Sheets.Count
        Arr(i) = Sheets(i).Name
    Next
    [A1].Validation.Delete
    [A1].Validation.Add Type:=xlValidateList, Formula1:=Join(Arr, ",")
End Sub
 
Спасибо. Работает.
Только макрос добавил 20 листов. Как вывести все листы?
Я ещё хотел бы чтобы в список входили только названия листов начинающихся с цифры.
Если я правильно понял, Arr(i) = Sheets(i).Name - в массив добавляем название i-го листа.
В Delphi я бы объявил переменную s: string;
Далее:
s := Sheets(i).Name;
if s[1] in [0..9] then Arr(i) = s; //если первый символ цыфра
Не знаю как воплотить это в VBA.
Изменено: Фрезератор - 30.08.2013 08:32:04 (Дополнение)
 
Не подскажите, где можно почитать про VBA для начинающих? Для чайников.
 
Код
if instr("0123456789", left(Sheets(i).Name,1)) > 0 then Arr(i) = Sheets(i).Name

http://www.planetaexcel.ru/links/
Учимся сами и помогаем другим...
 
спасибо за вопрос и ответ. Мне тоже пригодилось.
 
Супер. Спасибо.
А можно сделать чтобы макрос срабатывал автоматически, например когда ячейка с выпадающим меню становится активной или при добавлении нового листа. Потому что листы часто добавляются. Что бы список обновлялся.
Вообще таблица для выписывания нарядов. По шаблону создаётся новый лист. Чтобы мастерам не  заморачиватся с запуском макроса. Да и некоторые мастера слабо представляют, как это сделать.
 
этот макрос повесьте на событие WorkSheet_Activate первого листа.
Учимся сами и помогаем другим...
 
Цитата
Только макрос добавил 20 листов.
Не верю)) Макрос добавит ВСЕ листы, кроме первого.
Вот с выводом только тех листов, имена которых начинаются с цифры. Скопируйте в модуль первого листа:
Код
Private Sub Worksheet_Activate()
Dim i As Long, Arr()
    ReDim Arr(1 To Sheets.Count)
    For i = 2 To Sheets.Count
        If IsNumeric(Left(Sheets(i).Name, 1)) Then Arr(i) = Sheets(i).Name
    Next
    [A1].Validation.Delete
    [A1].Validation.Add Type:=xlValidateList, Formula1:=Join(Arr, ",")
End Sub
 
Точнее, лучше, что бы макрос срабатывал при создании нового листа по шаблону.
А нельзя ли процедуру встроить в функцию? В ячейку вставляем функцию и она в ней создаёт выпадающий список.
 
Когда Вы создадите новый лист, он автоматически становится активным. Чтобы посмотреть - добавился ли он в выпадающий список,- Вам в любом случае придётся перейти на первый лист. Тут и сработает макрос. Что теперь не так?
 
функция не умеет создавать списки
Учимся сами и помогаем другим...
 
у меня этот макрос создает выпадающий список, но мне бы хотелось, чтобы при выборе из списка осуществлялся переход на соответствующий выбранный лист. как это сделать?
 
Для OdriH: добавьте в модуль листа этот код
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Sheets(Target.Value).Activate
    End If
End Sub
 
Юрий М, добавила. Но видимо нужен оператор вызова этого модуля? или он один раз вызывается перед выполнением предыдущего модуля?
 
/Скопируйте в модуль первого листа:/
У меня получается вставить макрос только в отдельный модуль. Как вставить в конкретный лист не знаю.

/этот макрос повесьте на событие WorkSheet_Activate первого листа./
Подскажите как это сделать. В менеджере не нашел такого события.
С чайниками бывает тяжело  :(.
 
Фрезератор, мои два кода ПРОСТО скопируйте в модуль первого листа. Для этого: правый клик по ярлычку первого листа - исходный текст. События искать не нужно - уже всё написано.
 
заходите на нужный лист и жмете Alt+F11 - вы оказываетесь в модуле листа туда и вставляете код.
 
Цитата
С чайниками бывает тяжело
Чтобы побыстрее выйти из этой категории - нужно что-то читать. Для начала почитайте эту статью. И купите/скачайте какую-нибудь книгу по VBA.
 
Цитата
Но видимо нужен оператор вызова этого модуля?
OdriH, о чём Вы?)
 
Юрий М, спасибо. буду разбираться.
Но к сожалению я теперь не могу открыть эту книгу - EXCEL пишет, что обнаружено содержимое, которое он не может прочитать и на ответ "да" пытается загрузить книгу и намертво зависает. Буду с предыдущей версии восстанавливать.
 
Да я и рад бы купить/ скачать, только пока ничего путного не нашёл. За "эту" ссылку спасибо.
 
Цитата
Подскажите как это сделать. В менеджере не нашел такого события.
на будущее  ;)
Изменено: V - 30.08.2013 11:48:12
 
OdriH, создайте новую книгу и в неё попробуйте вставить эти две процедуры.
 
OdriH, вот работающий пример.
 
Всё всё всё, ребята спасибо. Юрий, вам отдельное, огромное спасибо. Разобрался, всё работает.
 
Юрий М
перешла на Лист2. зашла в VBA и попыталась запустить макрос, чтобы поставить этот список на втором листе (для проверки). Получила сообщение Compile error  Expected expression
 
Не нужно ничего "запускать" - при переходе на первый лист всё сработает автоматически. Я ведь уже писал об этом...
 
но у меня в списке получается ",,2p.2,3p.3,4p.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,," и я не могу выбрать страницу.
 
У Фрезератора всё получилось, у меня тоже работает. Что там у Вас - только Вам и известно. В МОЁМ файле всё нормально?
Страницы: 1 2 След.
Читают тему
Наверх