Страницы: 1
RSS
Оперирование с "последним листом". Как его найти?
 
Доброе утро! :)  
 
Требуется определить последний лист и записать его видом     Sheets("Лист#последний").Select.  
 
Дело в том, что по результату работы макроса, может получиться последний лист12 или лист100500.  
 
Если со строчками все понятно как определить, то как с листами?  
 
Спасибо :)
 
{quote}{login=cbr}{date=17.10.2011 11:35}{thema=Оперирование с "последним листом". Как его найти?}{post}Доброе утро! :)  
 
Требуется определить последний лист и записать его видом     Sheets("Лист#последний").Select.  
 
Дело в том, что по результату работы макроса, может получиться последний лист12 или лист100500.  
 
Если со строчками все понятно как определить, то как с листами?  
 
Спасибо :){/post}{/quote}ъ  
Sheets(Sheets.Count).Select
 
Таким образом он берет лист с названием "Финальный", а не Лист"100500".
 
{quote}{login=cbr}{date=17.10.2011 11:47}{thema=}{post}Таким образом он берет лист с названием "Финальный", а не Лист"100500".{/post}{/quote}  
Вопрос был последний лист, если после всех листов, которые обрабатываются еще есть финальный то :  
Sheets(Sheets.Count-1).Select
 
Тут еще вопрос, что считать последним листом. Крайний левый, последний созданный, содержащий в названии бОльшую цифру и т.д.
Я сам - дурнее всякого примера! ...
 
Вот смотрите. В принципе теоретически как я понял должен подходить следующий код:  
   n = Sheets.Count  
   Sheets("Лист" & n).Select  
 
Но.  
 
Листа всего ТРИ. но новый "последний" имеет название Лист23. А мы выбираем как я понимаю Sheets("Лист3").Select.    
 
Поэтому и спрашиваю последний Лист, а не посчитать их. :)  
 
Может правильнее будет выразиться самое большое значение из всех "Лист"'ов.
 
KukLP, правильно выразился. Содержащий бОльшую цифру.
 
Не морочьте людям голову: зайдите в VBA проект и в Project Explorer'е посмотрите какой лист у вас последний на самом деле. Это msgbox Sheets(sheets.Count).name и есть он (если в книге нет листов-диаграмм)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Public Function ExtractNumber#(s As String)  
   Dim i%, str$, d$  
   d = Mid(1 / 2, 2, 1)  
   For i = 1 To Len(s)  
       If InStr(1, "1234567890,.", Mid(s, i, 1)) <> 0 Then str = str & Mid(s, i, 1)  
   Next  
   str = IIf(d = ".", Replace(str, ",", "."), Replace(str, ".", ","))  
   If Not IsNumeric(str) Then ExtractNumber = 0: Exit Function  
   ExtractNumber = CDbl(str)  
End Function  
 
Public Sub DelLastsheet()  
   Dim sh As Worksheet, i&, s$  
   For Each sh In Worksheets  
       If ExtractNumber(sh.CodeName) > i Then  
           i = ExtractNumber(sh.CodeName)  
           s = sh.Name  
       End If  
   Next  
   Application.DisplayAlerts = 0  
   Sheets(s).Delete  
   Application.DisplayAlerts = -1  
End Sub
Я сам - дурнее всякого примера! ...
 
nerv, последний я и так вижу. мне не надо их считать.  
 
KukLP, нифига себе. Сильно.
 
Но это все равно не выход. При следующем запуске и создании листа номерация не продолжится, если был удален не последний лист. Пронумерует первым свободным номером.
Я сам - дурнее всякого примера! ...
 
Кстати, если последний лист скрыт, метод Sheets(Sheets.Count).Select вызовет ошибку. Найти последний нескрытый лист можно так:  
 
Sub LastVisibleSheet()  
Dim i&  
For i = Sheets.Count To 1 Step -1  
   If Sheets(i).Visible = xlSheetVisible Then Sheets(i).Select: Exit For  
Next  
End Sub
 
Может просто..  
Sub q()  
ИмяЛиста = "Лист100500" 'ваше имя по макросу  
ThisWorkbook.Sheets(Sheets.Count).Name = ИмяЛиста & " последний"  
End Sub
 
Так если эти листы генерятся макросом, так может просто писать их имена в публичную переменную. Так там всегда будет имя последнего листа - и доступно в любой момент.
 
{quote}{login=Hugo}{date=17.10.2011 01:01}{thema=}{post}Так если эти листы генерятся макросом, так может просто писать их имена в публичную переменную. Так там всегда будет имя последнего листа - и доступно в любой момент.{/post}{/quote}См. мой пост от 17.10.2011, 12:20. Можно в свойствах книги сохранять имя последнего.
Я сам - дурнее всякого примера! ...
 
{quote}{login=cbr}{date=17.10.2011 12:19}{thema=}{post}nerv, последний я и так вижу. мне не надо их считать.{/post}{/quote}  
 
>>Название темы: Оперирование с "последним листом". Как его найти?  
>>В первом посте: Требуется определить последний лист  
 
Стоят три кубика на столе, как определить какой из них первый, а какой последний? Тот, кот. по середине, явно "второй". Если считать справа-налево то одно, а если слева-на право, то другое.  
 
>>Дело в том, что по результату работы макроса, может получиться последний лист12 или лист100500.  
Тем более, если создаете макросом, то и сами знаете, кот. последним будет.  
 
22644
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Так я говорю, что макрос обрабатывает файл. на основании этого файла он создает листы, листов может создать 1, может 101. Предлагаете анализировать этот файл, сколько он листов создаст и уже исходя из этого уже работать с высчитанным последним листом? не очень просто это.  
 
Модифицировал макрос, теперь у нас есть один единственный лист с названием "Лист%какое-то число", других листов больше нет.    
Можно сделать Sheets("Лист"&"%").Select ?  
 
так не работает :(
 
Один единственный лист?  
Sheets(1).Select  
Только зачем именно Select?  
Почему бы не написать так:  
Sheets(1).[A1]="test string"
или  
переменная=Sheets(1).[A1].value
 
Видимо моё изъяснение понятно только мне :D  
 
имеем три листа с названиями:  
1) финальный  
2) основной  
3) Лист##  
 
больше листов нет. в данном наборе меняется только ## почти в рандоме.  
 
Надо сделать Sheets("Лист##").Select/Activate/Delete не важно. вот как описать ## я не знаю :(
 
Если Вы точно не знаете, каким по счёту кладёт свой лист макрос (хотя это можно в макросе прописать  - класть в конец, или в начало, или перед последним листом), то например перебираем все листы книги, и в названии которого есть "Лист" - тот и нужен.  
А листы тут уже пару раз перебирали...
 
Public Sub www()  
Dim c As String  
y = 0  
For i = 1 To Sheets.Count  
   c = Sheets(i).Name  
   For t = 1 To Len© 'перебираем имя листа по символам, например Лист12  
      If Mid(c, t, 1) Like "[0-9 ]" Then '- находим первый числовой символ - 1
           xx = Right(c, Len© - (t - 1)) * 1 'получаем номер листа 12  
           If xx > y Then y = xx 'если этот номер листа больше предыдущего  
           Exit For  
      End If  
   Next t  
Next i  
Sheets("Лист" & y & "").Select  
End Sub  
 
 
#35383#
 
спасибо, коллега!  
 
Можно его с запасом на трехзнак переделать?  
 
Когда мы удаляем найденный лист, макрос запрашивает разрешение на удаление, как можно принудительно разрешить удаление? :)
 
>>не очень просто это.  
Проще не куда. Даже если их номера создаться рандомом.  
 
>>Может правильнее будет выразиться самое большое значение из всех "Лист"'ов.  
При их создании запомнить и потом сразу к нему обратиться
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{post}  
1)Можно его с запасом на трехзнак переделать?  
{/post}{/quote}  
12 чисто пример - если будет лист543 - сначала найдет 5 и возьмет все число до конца имени файла    
перевожу    
с - имя листа  
xx = Right(c, Len© - (t - 1)) * 1  
t - номер первого символа числа  
Len© - (t - 1) = длина строки минус (номер первого числа -1) =  
= длина числа (как раз определяется трех оно или двух или двенадцатизначное)  
xx = правсимв(имялиста, длина числа)*1  
умножаем на 1 чтоб эта величина числом была, а не строкой.  
 
{quote}{post}  
2)Когда мы удаляем найденный лист, макрос запрашивает разрешение на удаление, как можно принудительно разрешить удаление? :){/post}{/quote}  
 
перед строкой удаления  
application.displayalerts = false  
в конце макроса надо вернуть значение обратно  
application.displayalerts = true
 
э - не получилось правильно оформить сообщение :(
 
{quote}{login=cbr}{date=17.10.2011 01:59}{thema=}{post}имеем три листа с названиями:  
1) финальный  
2) основной  
3) Лист##  
больше листов нет. в данном наборе меняется только ## почти в рандоме.({/post}{/quote}Если действительно всегда ТРИ листа, а "финальный" и "основной" всегда остаются после удаления других листов, то у последнего (третьего) всегда будет индекс =3. Тогда:  
Sheets(3).Activate
Страницы: 1
Читают тему
Наверх