Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2020, 16:56   #1
Sofya63
Пользователь
 
Регистрация: 10.04.2019
Сообщений: 22
По умолчанию VBA. Обращение к ячейкам определённой страницы

Умные люди, подскажите, пожалуйста.

Как мне обратиться к ячейкам ОПРЕДЕЛЁННОЙ страницы документа Excel ?
Мне нужно с последней страницы документа Excel считывать значение каждой из ячеек.

Интересует как "добраться" до ячеек именно последней страницы, не зная их кода(А1, B2 и т.д.)
Не могу найти в интернете, справка по VBA тоже не помогает.
Sofya63 вне форума Ответить с цитированием
Старый 21.02.2020, 17:16   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Код:
dim cel as Range
dim sheetName as string
sheetName = "ИмяОПРЕДЕЛЕННОЙСтраницы"
for each cel in Sheets(sheetName)
' TODO
next cel
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 21.02.2020, 18:28   #3
Sofya63
Пользователь
 
Регистрация: 10.04.2019
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Код:
dim cel as Range
dim sheetName as string
sheetName = "ИмяОПРЕДЕЛЕННОЙСтраницы"
for each cel in Sheets(sheetName)
' TODO
next cel
Может я, конечно, ошибаюсь, но Sheets в Excel это листы, а мне нужны страницы, т.е. Pages (в листе может быть несколько страниц).
Sofya63 вне форума Ответить с цитированием
Старый 22.02.2020, 16:06   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
set LastSheetCells = Worksheets(Worksheets.Count).UsedRange
теперь в LastSheetCells у вас диапазон используемых ячеек с последнего листа
LastSheetCells.Cells(1) - обращение к первой ячейке этого диапазона
LastSheetCells.Cells(12,3) - обращение к ячейке, находящейся в 12 строке, 3 колонке диапазона LastSheetCells
LastSheetCells.Cells(LastSheetCells .Rows.Count,1) - обращение к первой ячейке последней строки этого диапазона
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 22.02.2020 в 16:10.
IgorGO вне форума Ответить с цитированием
Старый 22.02.2020, 16:40   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нашёл в закромах, как применить - это нужно видеть задачу и файл. Но предполагаю что количество страниц у каждого будет своё...
Код:
Nosorog
 написано 17.12.2008 13:13
Ух Ты!
Конечно, можно отключить автоматический пересчет. Но большое оглавление и вручную будет долго считаться.
Я решил доработать функцию так, чтобы данные о разрывах страниц хранились в статических массивах, вместе с временем их создания и именем листа. При очередном вызове функции определяется время, которое прошло с момента обновления массивов, и если данные "свежие", то используются они, в противном случае массивы обновляются.
код (во всю высоту: 45 строк 
 
Option Explicit
Const timeDelta = #12:00:03 AM#         'время актуальности сохраненных данных - 3 секунды
Dim strSheetName As String, timeStamp As Date, arHorBr() As Long, arVerBr() As Long, nHorBr As Long, nVerBr As Long
 
Function page(x As Range) As Long
Dim iHor As Long, iVer As Long
'Stop
Application.Volatile
With x.Parent   'лист
    If .Name <> strSheetName Or Date + Time > timeStamp + timeDelta Then 'пересчитать разрывы страниц!
        nHorBr = .HPageBreaks.Count     'число гориз. разрывов, число страниц по вертикали nHorBr+1
        nVerBr = .VPageBreaks.Count     'число верт. разрывов, число страниц по горизонтали nVerBr+1
        
        '************************ ! Внимание ! **********************************************
        'В Excel-2000 обнаружен глюк: если число вертикальных разрывов >3,
        'то свойство .VPageBreaks.Count возвращает число на 1 больше, чем должно быть.
        'Проверьте, требуется ли на вашей системе коррекция числа вертикальных разрывов.
        'Для отключения коррекции закомментируйте следующую строку.
        If nVerBr > 3 Then nVerBr = nVerBr - 1
        
        ReDim arHorBr(nHorBr)
        ReDim arVerBr(nVerBr)
        For iHor = 1 To nHorBr
            arHorBr(iHor) = .HPageBreaks(iHor).Location.Row
        Next
        For iHor = 1 To nVerBr
            arVerBr(iHor) = .VPageBreaks(iHor).Location.Column
        Next
        strSheetName = .Name
        timeStamp = Date + Time
        'Debug.Print timeStamp
    End If
                                'расчет по сохраненным данным
    For iHor = 1 To nHorBr
        If x.Row < arHorBr(iHor) Then Exit For
    Next
    For iVer = 1 To nVerBr
        If x.Column < arVerBr(iVer) Then Exit For
    Next
    If .PageSetup.Order = xlOverThenDown Then
        page = (iHor - 1) * (nVerBr + 1) + iVer
    Else
        page = (iVer - 1) * (nHorBr + 1) + iHor
    End If
End With
End Function
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.02.2020, 17:59   #6
Sofya63
Пользователь
 
Регистрация: 10.04.2019
Сообщений: 22
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
set LastSheetCells = Worksheets(Worksheets.Count).UsedRange
теперь в LastSheetCells у вас диапазон используемых ячеек с последнего листа
LastSheetCells.Cells(1) - обращение к первой ячейке этого диапазона
LastSheetCells.Cells(12,3) - обращение к ячейке, находящейся в 12 строке, 3 колонке диапазона LastSheetCells
LastSheetCells.Cells(LastSheetCells .Rows.Count,1) - обращение к первой ячейке последней строки этого диапазона
Опять же, Sheet в Excel - это листы, а мне нужны страницы(Pages). Если ошибаюсь, поправьте.
Sofya63 вне форума Ответить с цитированием
Старый 22.02.2020, 18:12   #7
Sofya63
Пользователь
 
Регистрация: 10.04.2019
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Нашёл в закромах, как применить - это нужно видеть задачу и файл. Но предполагаю что количество страниц у каждого будет своё...
Код:
Nosorog
 написано 17.12.2008 13:13
Ух Ты!
Конечно, можно отключить автоматический пересчет. Но большое оглавление и вручную будет долго считаться.
Я решил доработать функцию так, чтобы данные о разрывах страниц хранились в статических массивах, вместе с временем их создания и именем листа. При очередном вызове функции определяется время, которое прошло с момента обновления массивов, и если данные "свежие", то используются они, в противном случае массивы обновляются.
код (во всю высоту: 45 строк 
 
Option Explicit
Const timeDelta = #12:00:03 AM#         'время актуальности сохраненных данных - 3 секунды
Dim strSheetName As String, timeStamp As Date, arHorBr() As Long, arVerBr() As Long, nHorBr As Long, nVerBr As Long
 
Function page(x As Range) As Long
Dim iHor As Long, iVer As Long
'Stop
Application.Volatile
With x.Parent   'лист
    If .Name <> strSheetName Or Date + Time > timeStamp + timeDelta Then 'пересчитать разрывы страниц!
        nHorBr = .HPageBreaks.Count     'число гориз. разрывов, число страниц по вертикали nHorBr+1
        nVerBr = .VPageBreaks.Count     'число верт. разрывов, число страниц по горизонтали nVerBr+1
        
        '************************ ! Внимание ! **********************************************
        'В Excel-2000 обнаружен глюк: если число вертикальных разрывов >3,
        'то свойство .VPageBreaks.Count возвращает число на 1 больше, чем должно быть.
        'Проверьте, требуется ли на вашей системе коррекция числа вертикальных разрывов.
        'Для отключения коррекции закомментируйте следующую строку.
        If nVerBr > 3 Then nVerBr = nVerBr - 1
        
        ReDim arHorBr(nHorBr)
        ReDim arVerBr(nVerBr)
        For iHor = 1 To nHorBr
            arHorBr(iHor) = .HPageBreaks(iHor).Location.Row
        Next
        For iHor = 1 To nVerBr
            arVerBr(iHor) = .VPageBreaks(iHor).Location.Column
        Next
        strSheetName = .Name
        timeStamp = Date + Time
        'Debug.Print timeStamp
    End If
                                'расчет по сохраненным данным
    For iHor = 1 To nHorBr
        If x.Row < arHorBr(iHor) Then Exit For
    Next
    For iVer = 1 To nVerBr
        If x.Column < arVerBr(iVer) Then Exit For
    Next
    If .PageSetup.Order = xlOverThenDown Then
        page = (iHor - 1) * (nVerBr + 1) + iVer
    Else
        page = (iVer - 1) * (nHorBr + 1) + iHor
    End If
End With
End Function
Задача такая: нужно обратиться к ячейкам определённой страницы листа (в моём случае последней, но не суть).
К примеру, проверить значение каждой ячейки страницы на условие,
или скопировать значение каждой ячейки страницы куда-либо
или найти что-то на определённой странице в ячейках и т.д.,
вобщем - обратиться к ячейкам определённой страницы(не листа).
Sofya63 вне форума Ответить с цитированием
Старый 22.02.2020, 18:56   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

1. считываете из свойств листа
1.1. количество страниц
1.2. количество горизонтальных разрывов страниц
1.3. количество вертикальных разрывов страниц
1.4. порядок печати страниц
2. на основании этих значений вычисляете верхнюю-левую ячейку последней страницы
3. нижнюю правую - тоже еще нужно посчитать. на основании выше перечисленного и вычисленного и размеров используемого диапазона ячеек

если нужно напишу за пару часов за $20
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 22.02.2020, 19:21   #9
Sofya63
Пользователь
 
Регистрация: 10.04.2019
Сообщений: 22
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
1. считываете из свойств листа
1.1. количество страниц
1.2. количество горизонтальных разрывов страниц
1.3. количество вертикальных разрывов страниц
1.4. порядок печати страниц
2. на основании этих значений вычисляете верхнюю-левую ячейку последней страницы
3. нижнюю правую - тоже еще нужно посчитать. на основании выше перечисленного и вычисленного и размеров используемого диапазона ячеек

если нужно напишу за пару часов за $20
Это, конечно, вариант, спасибо, но неужели в VBA никак нельзя обратиться "напрямую" к странице. Есть объект Page, но пока не понимаю как через него обратиться к ячейкам.
Sofya63 вне форума Ответить с цитированием
Старый 22.02.2020, 19:41   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Цитата:
Сообщение от Sofya63 Посмотреть сообщение
Есть объект Page
- нет такого объекта. И это к тому же вещь непостоянная, как я уже выше говорил.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к процедуре с другой страницы GuSoft2007 ASP.NET 0 04.04.2014 14:37
Как обратиться к определённой страницы doc-файла? DronLee Общие вопросы .NET 1 07.06.2013 15:28
Обращение к DOM с начала страницы WennY JavaScript, Ajax 4 17.05.2011 11:28
Обращение к ячейкам памяти HDD, чтение и запись Silver-nic Win Api 8 08.09.2009 16:51
программа, которая сохраняет веб страницы раз в час на сайте в определённой папке SeregaKo Общие вопросы Delphi 7 24.07.2008 16:10