Определить последний лист excel

 

Доброе утро! :)  

  Требуется определить последний лист и записать его видом     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

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Тут еще вопрос, что считать последним листом. Крайний левый, последний созданный, содержащий в названии бОльшую цифру и т.д.

Я сам — дурнее всякого примера! …

 

Вот смотрите. В принципе теоретически как я понял должен подходить следующий код:  
   n = Sheets.Count  
   Sheets(«Лист» & n).Select  

  Но.  

  Листа всего ТРИ. но новый «последний» имеет название Лист23. А мы выбираем как я понимаю Sheets(«Лист3»).Select.    

  Поэтому и спрашиваю последний Лист, а не посчитать их. :)  

  Может правильнее будет выразиться самое большое значение из всех «Лист»‘ов.

 

KukLP, правильно выразился. Содержащий бОльшую цифру.

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Не морочьте людям голову: зайдите в VBA проект и в Project Explorer’е посмотрите какой лист у вас последний на самом деле. Это msgbox Sheets(sheets.Count).name и есть он (если в книге нет листов-диаграмм)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

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, нифига себе. Сильно.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Но это все равно не выход. При следующем запуске и создании листа номерация не продолжится, если был удален не последний лист. Пронумерует первым свободным номером.

Я сам — дурнее всякого примера! …

 

Кстати, если последний лист скрыт, метод 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

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

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

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=Hugo}{date=17.10.2011 01:01}{thema=}{post}Так если эти листы генерятся макросом, так может просто писать их имена в публичную переменную. Так там всегда будет имя последнего листа — и доступно в любой момент.{/post}{/quote}См. мой пост от 17.10.2011, 12:20. Можно в свойствах книги сохранять имя последнего.

Я сам — дурнее всякого примера! …

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

{quote}{login=cbr}{date=17.10.2011 12:19}{thema=}{post}nerv, последний я и так вижу. мне не надо их считать.{/post}{/quote}  

  >>Название темы: Оперирование с «последним листом». Как его найти?  
>>В первом посте: Требуется определить последний лист  

  Стоят три кубика на столе, как определить какой из них первый, а какой последний? Тот, кот. по середине, явно «второй». Если считать справа-налево то одно, а если слева-на право, то другое.  

  >>Дело в том, что по результату работы макроса, может получиться последний лист12 или лист100500.  
Тем более, если создаете макросом, то и сами знаете, кот. последним будет.  

  22644

 

Так я говорю, что макрос обрабатывает файл. на основании этого файла он создает листы, листов может создать 1, может 101. Предлагаете анализировать этот файл, сколько он листов создаст и уже исходя из этого уже работать с высчитанным последним листом? не очень просто это.  

  Модифицировал макрос, теперь у нас есть один единственный лист с названием «Лист%какое-то число», других листов больше нет.    
Можно сделать Sheets(«Лист»&»%»).Select ?  

  так не работает :(

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Один единственный лист?  
Sheets(1).Select  
Только зачем именно Select?  
Почему бы не написать так:  
Sheets(1).[A1]=»test string»
или  
переменная=Sheets(1).[A1].value

 

Видимо моё изъяснение понятно только мне :D  

  имеем три листа с названиями:  
1) финальный  
2) основной  
3) Лист##  

  больше листов нет. в данном наборе меняется только ## почти в рандоме.  

  Надо сделать Sheets(«Лист##»).Select/Activate/Delete не важно. вот как описать ## я не знаю :(

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Если Вы точно не знаете, каким по счёту кладёт свой лист макрос (хотя это можно в макросе прописать  — класть в конец, или в начало, или перед последним листом), то например перебираем все листы книги, и в названии которого есть «Лист» — тот и нужен.  
А листы тут уже пару раз перебирали…

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

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#

 

спасибо, коллега!  

  Можно его с запасом на трехзнак переделать?  

  Когда мы удаляем найденный лист, макрос запрашивает разрешение на удаление, как можно принудительно разрешить удаление? :)

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

>>не очень просто это.  
Проще не куда. Даже если их номера создаться рандомом.  

  >>Может правильнее будет выразиться самое большое значение из всех «Лист»‘ов.  
При их создании запомнить и потом сразу к нему обратиться

 

{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

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

э — не получилось правильно оформить сообщение :(

 

Юрий М

Модератор

Сообщений: 60585
Регистрация: 14.09.2012

Контакты см. в профиле

#26

17.10.2011 18:16:18

{quote}{login=cbr}{date=17.10.2011 01:59}{thema=}{post}имеем три листа с названиями:  
1) финальный  
2) основной  
3) Лист##  
больше листов нет. в данном наборе меняется только ## почти в рандоме.({/post}{/quote}Если действительно всегда ТРИ листа, а «финальный» и «основной» всегда остаются после удаления других листов, то у последнего (третьего) всегда будет индекс =3. Тогда:  
Sheets(3).Activate

у меня есть лист под названием «Конец», который нужно переместить, чтобы быть последним из всех доступных листов. Мне нужно сделать это с помощью VBA.

у меня есть процедура сортировки, которая работает, мне просто нужен синтаксис для перемещения. Вот что у меня есть:

Private Sub CommandButton263_Click()
Dim i As Integer
Dim j As Integer
For i = 1 To Sheets.Count
  For j = 1 To Sheets.Count - 1
        If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
           Sheets(j).Move After:=Sheets(j + 1)
        End If
  Next j
Next i
Sheets("Navigation").Select
Sheets("Navigation").Move Before:=Sheets(1)
Sheets("Navigation (2)").Select
Sheets("Navigation (2)").Move Before:=Sheets(2)
Sheets("EstimateTemplate").Select
Sheets("EstimateTemplate").Move Before:=Sheets(3)
Sheets("Formulas").Select
Sheets("Formulas").Move Before:=Sheets(4)
Sheets("End").Move After:=Sheets(EOF)  'what can i use instead of EOF?
Sheets("Navigation (2)").Select
End Sub

в частности, глядя на строку Sheets("End").Move After:=Sheets(EOF)что я могу использовать, чтобы получить последний лист?

источник

I currently have 2 worksheets in my excel file.

The first sheet is known as the Summary page, which displays an summary result of the second sheet.

The second sheet is known as the raw data. An example would be a column named Fruits.

Apple
Apple
Apple
Banana
Banana
Pear

In the first sheet, I would have a formula that counts the number of time the respective fruits appear and the result will be displayed in different cells.

=COUNTIF(Fruits!A2:A7,"Apple")
=COUNTIF(Fruits!A2:A7,"Banana")

What I wanna do is, is it possible for me to program the formula such that everytime I add a new sheet of raw data (3rd sheet), the statistics on the first sheet is able to reference to the latest sheet to get the information.

(Assuming that the positioning of the data and all are the same as the second sheet.)

What I have done so far is to come out with a function GETLASTWSNAME() which is able to always retrieve the name of the last worksheet. but it seems kinda impossible for me to nest the function within the countif formula itself.

=COUNTIF((GETLASTWSNAME())!A2:A7,"Apple)

The above formula is how i want my formula to work, but sadly excel does not allow me to do that.

Any comments would be appreciated. Thanks!

Я бы сначала переименовал ваше свойство VBA CodeName, чтобы оно имело смысл. Вместо «Sheet1» или чего бы то ни было, сделайте их значимыми модификаторами

Прямо сейчас, если кто-то изменит имя листа, ваш VBA сломается.

Если ваш лист вместо этого имеет CodeName, вы можете сделать очень хорошие вещи, такие как:

EndSheet.Move after:=Worksheets(Worksheets.Count)

Это означает, что даже если кто-то переименует этот лист, скажем «сломать ваш макрос!»это не … сломает твой макрос.

Кроме того, что касается выбора, вы можете сделать это, чтобы сделать ваш код более надежным, быстрым и надежным:

NavigationSheet.Move Before:=Sheets(1)
NavigationTwoSheet.Move Before:=Sheets(2)
EstimateTemplateSheet.Move Before:=Sheets(3)
FormulasSheet.Move Before:=Sheets(4)
EndSheet.Move After:=Sheets(EOF)  
NavigationTwoSheet.Select

(это предполагает, что вы переименовали все ваши коды CodeName в VBE)

0 / 0 / 1

Регистрация: 11.10.2010

Сообщений: 363

1

28.05.2012, 13:49. Показов 10541. Ответов 10


Студворк — интернет-сервис помощи студентам

Как определить последнию строку в первой страницы листа



0



22 / 5 / 1

Регистрация: 05.09.2010

Сообщений: 370

28.05.2012, 14:05

2



0



1 / 1 / 1

Регистрация: 10.04.2011

Сообщений: 415

28.05.2012, 14:34

3

Цитата
Сообщение от Masalov

он, кажется, спрашивает про колец страницы, а не конец данных.
Ищи по ключевому слову [bold]VPageBreak[/bold]



0



VladConn

5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

28.05.2012, 16:34

4

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()
 
    Dim objHPageBreak As HPageBreak
    
    For Each objHPageBreak In ActiveSheet.HPageBreaks
        MsgBox objHPageBreak.Location.Address
    Next objHPageBreak
 
End Sub

vladconn



0



Штурмaн

0 / 0 / 0

Регистрация: 27.04.2009

Сообщений: 265

28.05.2012, 18:51

5

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

Visual Basic
1
2
3
   For i = 2 To 65000
      If Cells(i, 1) = "" Then Exit For
      Next

i-1 это и есть последняя строка
При этом надо учитывать, что грамотно построенная таблица должна иметь хоть один столбец, не терпящий пробелов. Вот его и проверяем. Даже при огромных таблицах ( у меня есть на 30 000 строк) все проверяется мнгновенно.



0



VladConn

5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

28.05.2012, 19:42

6

Штурмaн,

Tak delat’ ne nado. Eto naprimer lucshe:

Visual Basic
1
2
3
4
5
Dim lngRowsCount As Long
Dim lngLastRow As Long
 
 lngRowsCount = Excel.Application.Rows.Count
 lngLastRow = Range("A" & CStr(lngRowsCount)).End(xlUp).Row

:0))



0



5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

28.05.2012, 22:01

7

A vprochem…



0



0 / 0 / 0

Регистрация: 27.04.2009

Сообщений: 265

28.05.2012, 22:47

8

[bold] VladConn[/bold]
вот именно такой пример и приводил иногда к совершенно необоснованным сбоям… с тех пор не рискую. Причем, года два назад, на Релибе рассматривался этот вопрос(задавался не мной). Так ни к чему и не пришли. Посоветовали обойти этот глюк другими методами. Мой пример надежнее, ни разу не подвел.



0



5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

29.05.2012, 03:14

9

Штурман,

Принимается. Но то наверно не глюк, так у них задумано.
Я вас очень хорошо понимаю. А ведь с другой стороны, это как бы форум по VBA, а не по Fortran-4.

vladconn



0



Johny Walker

1 / 1 / 1

Регистрация: 10.04.2011

Сообщений: 415

29.05.2012, 10:41

10

Для Штурмана: имхо так еще надежнее:

Visual Basic
1
2
3
For i = 2 To 65000
If len(Cells(i, 1).value) = 0 Then Exit For
Next

потому что значение «» отличается от Empty (это разные значения)
проверка длины это обходит легко.



0



Сумрак

30.05.2012, 19:51

11

хех.. я к стати, тоже давно остановился на варианте Штурмана… и быстро и надежно… Правда проверяю на Empty. Но пока проблем не было.

Like this post? Please share to your friends:
  • Определить позицию символа excel
  • Определить позицию в массиве в excel
  • Определить первую строку таблицы excel
  • Определить параметры линейной регрессии excel
  • Определить оптимальный выпуск в excel