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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2009, 19:34   #1
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
Восклицание Проблема с используемыми границами листа

Какая-то странная проблема. Я хочу определить, где на листе последние использованные ячейки. Для этого смотрю на Sh.Cells.SpecialCells(xlCellTypeLas tCell).Row и Sh.Cells.SpecialCells(xlCellTypeLas tCell).Column. Допустим, мы написали на пустом листе в ячейке B2 число 1. Переменные стали равными 2,2. Теперь мы удалили верхнюю строку, и B2 переместилось на B1. Но эти переменные так и остались равными 2,2!
Как точно определить последние используемые границы (за которыми все пустое) и чтобы они менялись адекватно, а то здесь какая-то странность?
motorway вне форума Ответить с цитированием
Старый 16.07.2009, 19:48   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Действительно, функции SpecialCells(xlCellTypeLastCell) свойственна некоторая задумчивость - Excel забывает обновить значение этого свойства после удаления диапазона ячеек:

Код:
Sub test()
    Dim sh As Worksheet: Set sh = ActiveSheet
    Debug.Print sh.Cells.SpecialCells(xlCellTypeLastCell).Address ' выдаёт устаревший результат
End Sub
Но, если обратиться к листу перед вызовом этой функции, ссылка на последнюю ячейку обновляется, и функция возвращает корректный результат:
Код:
Sub test2()
    Dim sh As Worksheet: Set sh = ActiveSheet
    x = sh.UsedRange.Address
    Debug.Print sh.Cells.SpecialCells(xlCellTypeLastCell).Address ' а теперь результат соответствует действительности
End Sub
В последнем примере строка x = sh.UsedRange.Address, по сути, бесполезна, но после обращения к UsedRange Excel почему-то вспоминает, что надо обновить значение SpecialCells(xlCellTypeLastCell)
EducatedFool вне форума Ответить с цитированием
Старый 16.07.2009, 19:54   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Спасибо, надеюсь, эта вещь работает во всех случаях
motorway вне форума Ответить с цитированием
Старый 22.07.2009, 18:38   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Опять проблема с границами: я сделал, чтобы при открытии книги обновлялись данные о границах на всех листах, кроме последнего. Почему-то определяется неправильно иногда, как будто там старые значения остаются, или вообще непонятно что.

Код:
Private Sub Workbook_Open()
rowcolstr = ""
 For i = 1 To (Worksheets.Count - 1)
    Set sh = Worksheets(i)
    x = sh.UsedRange.Address
    rowcolstr = rowcolstr + sh.Name + ":" + Trim(Str(sh.Cells.SpecialCells(xlCellTypeLastCell).Row)) + "-" + Trim(Str(sh.Cells.SpecialCells(xlCellTypeLastCell).Column)) + "|"
 Next i
Worksheets("Лист3").Range("C4").Value = rowcolstr
End Sub
motorway вне форума Ответить с цитированием
Старый 22.07.2009, 18:54   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А если попробовать так:
Код:
Private Sub Workbook_Open()
    Dim sh As Worksheet, rowcolstr As String
    For Each sh In ThisWorkbook.Worksheets
        ПоследняяЯчейка = sh.UsedRange.Cells(sh.UsedRange.Cells.Count).Address(, , xlR1C1)
        ПоследняяЯчейка = Replace(Replace(ПоследняяЯчейка, "C", "-"), "R", ":")
        rowcolstr = rowcolstr & sh.Name & ПоследняяЯчейка & "|"
    Next sh
    Worksheets("Лист3").Range("C4").Value = rowcolstr
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 22.07.2009, 18:58   #6
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Если создать пустой файл, то вроде и то, и другое одинаково работает. Может, проблема в том, что когда в каком-то файле были данные, потом это начинает проявляться? Я удалил листы из той книги, где это проверялось, и сделал их пустыми. Пока определяет нормально, но все это довольно странно.
motorway вне форума Ответить с цитированием
Старый 22.07.2009, 19:54   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Да, вот какой-то глюк, при удалении/вставке строк вдруг число исп. колонок становится равным 16384, и ячейки начинают мигать черным!
motorway вне форума Ответить с цитированием
Старый 23.07.2009, 04:50   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А зачем Вы используете метод SpecialCells? Почему не устраивает UsedRange? Ему "фиолетово", были использованы ячейки вне этого диапазона ранее, или нет.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 23.07.2009, 16:04   #9
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Сначала я его использовал, но там вроде тоже в каком-то месте неправильно начало определять, и я перешел на SpecialCells. Но если Вы подскажете, как правильно определять с помощью UsedRange, перейду на него. (мне нужно просто определять последнюю используемую строку и столбец - их номер)

Последний раз редактировалось motorway; 23.07.2009 в 16:26.
motorway вне форума Ответить с цитированием
Старый 23.07.2009, 16:26   #10
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

При помощи UsedRange лучше определять так
Код:
Dim lLastRow As Long
lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
И все будет определяться как надо.
Хотя вообще определение последней ячейки тема такая... Смотря что кто понимает под последней ячейкой. Значение, формула, форматы...
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор листа! Gerek Microsoft Office Excel 1 27.06.2009 12:58
Сборка листа Berrimor Microsoft Office Excel 8 24.12.2008 10:56
Защита листа! Marsik Microsoft Office Excel 2 27.03.2008 18:19
в одной ячейке надписи были в 2-х или 3-х рядках и текст отображался целиком а не прятался за границами KSP Общие вопросы Delphi 7 20.09.2007 20:33