Выбор последней ячейки. Конец (xlup) с использованием VBA в списках Excel 2003 - требуется два. Выбрать, чтобы получить правильную ячейку? - PullRequest
0 голосов
/ 17 августа 2010

Я - новообращенный из Experts-Exchange, так как заметил, что они увеличили пороговое значение «бесплатных премиальных услуг».

Похоже, что в Excel 2003 возникли проблемы с командой End (xlup) при использовании ее на листе, содержащем «список» Excel. Если я выберу ячейку за пределами границы списка , и затем попытайтесь выбрать последнюю ячейку на листе с помощью VBA, мне нужно дважды вызвать функцию .Select, чтобы убедиться, что я получаю правильную ячейку. Если исходная ячейка внутри границы списка , тогда мне нужен только один .Выбрать. Мое взломанное решение ниже, с двумя вариантами выбора, так как я никогда не могу быть уверен, какая ячейка может быть выбрана при сохранении. Я включаю проверку версии при открытии, чтобы запустить другой код в Excel 2007 (этот код не работает в 2007 году, где команда .End (xlUp) работает правильно).

Есть ли более красноречивый способ справиться с этим? Спасибо за любую помощь!

.Range("A1").Select
.Cells(.Rows.Count, "A").End(xlUp).Select
.Cells(.Rows.Count, "A").End(xlUp).Select
'two .Selects needed to select correct cell in Excel 2003 list because original selection (A1) was not in list'

.Range("A1").Select
.Cells(.Rows.Count, "T").End(xlUp)(-2, 1).Select
.Cells(.Rows.Count, "T").End(xlUp)(-2, 1).Select
'two .Selects needed to select correct cell in Excel 2003 list because original selection (A1) was not in list'

.Cells(.Rows.Count, "T").End(xlUp)(-3, 1).Select
'only one select needed here because original selection above was within the list'

Ответы [ 3 ]

1 голос
/ 17 августа 2010

Посмотрите, как это происходит:

Sub Example()
    Dim rngLstCell As Excel.Range
    Set rngLstCell = GetLastCell(Excel.Worksheets("Sheet1"))
    MsgBox "The last cell is: " & rngLstCell.Address, vbInformation
End Sub

Public Function GetLastCell(ByVal ws As Excel.Worksheet) As Excel.Range
    Dim rngRtnVal As Excel.Range
    With ws.UsedRange
        Set rngRtnVal = .Find("*", .Cells(1, 1), , , xlByRows, xlPrevious)
        If rngRtnVal Is Nothing Then
            Set rngRtnVal = .Cells(1, 1)
        End If
    End With
    Set GetLastCell = rngRtnVal
End Function

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

Это может быть не идеально, если ваши данные не нормализованы (зубчатые).

0 голосов
/ 05 января 2011

Вы уверены, что диапазоны, с которыми вы работали, были идентичны?Вы не должны получать другие результаты, используя свойство End в Excel 2007 по сравнению с 2003.

Просмотр вашего кода:

.Range("A1").Select
.Cells(.Rows.Count, "A").End(xlUp).Select
.Cells(.Rows.Count, "A").End(xlUp).Select

Каждая из этих строк кода оказывает абсолютно нулевое влияние друг на друга,Невозможно дать честное объяснение тому, почему свойство End дает вам разные результаты в зависимости от предоставленного вами кода.Из того, что написано, вы должны получать одинаковые результаты каждый раз.(Предполагается, что вы работаете с одинаковыми диапазонами.) Я бы с подозрением относился к любому другому исполняемому коду.Я могу предложить несколько общих советов: если вы используете End, начинающийся с пустой ячейки, он остановится на первой непустой ячейке.Если вы начнете с непустой ячейки, верно обратное.Глядя на скриншот ниже:

Range("B13").End(xlUp).Select 'selects B12
Range("B12").End(xlUp).Select 'selects B2
Range("A12").End(xlUp).Select 'selects A6

alt text

Поэтому вопрос о том, является ли ваш список непрерывным, является вопросом.Кроме того, нет необходимости выбирать диапазон, прежде чем что-то с ним делать.Указание Excel выбрать ячейку A1 не влияет на ее выполнение .Cells(.Rows.Count, "A").End(xlUp).Select.Предполагая, что эта строка находится внутри блока With, который ссылается на лист, эта строка кода аналогична переходу к ячейке A65536 (или A1048576 в Excel 2007) и нажатию Ctrl + Up.Предполагая, что ячейка пуста, Excel будет перемещаться вверх, пока не найдет первую непустую ячейку в столбце A. Если ваш блок With ссылается на объект диапазона, то эта строка кода перейдет к первому столбцу, нижней строке этого диапазонаи перемещайтесь вверх, пока не дойдете до первой пустой или непустой ячейки.

0 голосов
/ 04 января 2011

Я обнаружил, что мое использование .End (xlUp). Выберите до того, как действовать в ячейку .End (xlUp), вызывало проблему.Если я просто избегу .End (xlUp) .Select до работы с ячейкой .End (xlUp), проблема будет менее сложной.Это может быть легко решено путем предшествования любой операции .End (xlUp) с помощью .Range ("A1"). Выберите.Смотрите код для объяснения.Это на самом деле не решает проблему с неправильным «выделением» ячейки .End (xlUp) - но я не заинтересован в «выборе» ячеек, просто воздействуя на нихЯ должен упомянуть, что я использую .Range («A1»). Выберите, потому что A1 находится вне «списка», которым я манипулирую через VBA.

'commented out - just need to add a ".Range("A1").Select" prior to any .End(xlUp) usage (besides .End(xlUp).Select) to make it work in Excel 03
'.Range("A1").Select
'.Cells(.Rows.Count, "A").End(xlUp)(0, 1).Select
'.Cells(.Rows.Count, "A").End(xlUp)(0, 1).Select
''two .Selects needed to select correct cell in Excel 2003 'Lists'
'Set EntryDate = Cells(.Rows.Count, "A").End(xlUp)(0, 1) 'no need to select cell first, then operate on it, as in the code above

'fixed code below
.Range("A1").Select 'needed for Excel 03 to select correct cell
Set EntryDate = Cells(.Rows.Count, "A").End(xlUp) 'just operate on the cell instead of selecting it first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...