Поиск последней ячейки в Excel

Программирование на Visual Basic for Applications
uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 27.04.2006 (Чт) 15:44

Это мысль, если есть гарантии, что в последней строчке с данными нет пустых ячеек.
Быть... или не быть. Вот. В чём вопрос?

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 27.04.2006 (Чт) 15:52

Спасибо. Кажется, то, что надо. Сейчас попробую

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 27.04.2006 (Чт) 16:34

Только тогда прийдется это вычислять по всем колонкам, где есть данные и брать мах.
Например,
Код: Выделить всё
    Max = 1
    For  lCol = 1 To 17 ' количество колонок
        Cells(65536, lCol).End(xlUp).Select
        If Max < ActiveCell.Row Then Max = ActiveCell.Row
    Next  lCol
    MsgBox (Max)

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 27.04.2006 (Чт) 18:02

Код: Выделить всё
Max = 1
For lCol = 1 To 17 
    a = Cells(65536, lCol).End(xlUp).Row
    If Max < a Then Max = a
Next lCol
MsgBox (Max)

ибо, Select это плохо :)

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 28.04.2006 (Пт) 6:32

Set ws = ThisWorkbook.Worksheets(1)
arr = ws.Application.WorksheetFunction.Transpose(ws.UsedRange)
Я конечно далек от мысли...(с)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.04.2006 (Пт) 7:46

smaharbA, ты и правда очень, очень далёк от мысли.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 28.04.2006 (Пт) 9:04

GSerg - внимательно погляди, это какраз самое быстрое решение вопроса...
...
ОФФ: И лучче взгляни тут http://bbs.vbstreets.ru/viewtopic.php?t=24979 (вот тут твоя помощь может и поможет)
Я конечно далек от мысли...(с)

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 28.04.2006 (Пт) 10:04

И еще если уж ненравится массив
Код: Выделить всё
    Set ws = ThisWorkbook.Worksheets(1)
    For i = ws.UsedRange.Rows.Count To 1 Step -1
        s = ""
        For Each cc In ws.Range(ws.Rows(i).Address)
            s = s & cc
        Next
        MsgBox s
    Next
Я конечно далек от мысли...(с)

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 28.04.2006 (Пт) 11:08

Чем вот это
smaharbA писал(а):Set ws = ThisWorkbook.Worksheets(1)
arr = ws.Application.WorksheetFunction.Transpose(ws.UsedRange)

лучше, чем
Код: Выделить всё
ActiveSheet.UsedRange.Rows.Count

в данном случае?

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 28.04.2006 (Пт) 11:17

smaharbA писал(а):И еще если уж ненравится массив
Код: Выделить всё
    Set ws = ThisWorkbook.Worksheets(1)
    For i = ws.UsedRange.Rows.Count To 1 Step -1
        s = ""
        For Each cc In ws.Range(ws.Rows(i).Address)
            s = s & cc
        Next
        MsgBox s
    Next


Тогда уж
Код: Выделить всё
    Set ws = ThisWorkbook.Worksheets(1)
    For i = ws.UsedRange.Rows.Count To 1 Step -1
        s = ""
        For Each cc In ws.Range(ws.Rows(i).Address)
            s = s & cc
        Next
        If Len(s) > 0 Then Exit For
    Next
    MsgBox ("Последняя заполненная строка=" & i)


Только работает намноооооооооого дольше, чем поиск мах по колонкам

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 28.04.2006 (Пт) 11:32

Ты не путаешь ? Ты макс то с чем будешь с равнивать с текстом и датой тогда и тут просче

Код: Выделить всё
Set ws = ThisWorkbook.Worksheets(1)
For i = ws.UsedRange.Rows.Count To 1 Step -1
  MsgBox ws.Application.WorksheetFunction.Min(ws.Rows(i))
Next

если даст не ноль значит заполненна, но текст и даты побоку
Я конечно далек от мысли...(с)

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 28.04.2006 (Пт) 11:37

Если читать обсуждение внимательно, то можно вообще то понять, что речь идет вот об этом максимуме:
Код: Выделить всё
Max = 1
For lCol = 1 To 17
    a = Cells(65536, lCol).End(xlUp).Row
    If Max < a Then Max = a
Next lCol
MsgBox (Max)

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 28.04.2006 (Пт) 11:38

А ну да, приношу извенения, вы кнопочки "симитировали",
Я конечно далек от мысли...(с)

Annushka
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 17.05.2005 (Вт) 12:44
Откуда: Украина

Сообщение Annushka » 28.04.2006 (Пт) 11:49

Да это не я , а Nicky :) [/code]

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 28.04.2006 (Пт) 11:58

Хм, таки я начал? :scratch:
Я, так сказать, развил!
uhm писал(а):Если в таблице нет пустых ячеек, то может помочь что-то вроде

Код: Выделить всё
Range("A1").End(xlDown).End(xlToRight).Select


А так - наверное, макросом только.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 28.04.2006 (Пт) 13:34

Код: Выделить всё
Function GetLastRow(sh As Worksheet) As Long
  On Error Resume Next
  GetLastRow = WorksheetFunction.Max(sh.Cells.SpecialCells(xlCellTypeConstants).Areas( _
    sh.Cells.SpecialCells(xlCellTypeConstants).Areas.Count).Row, sh.Cells.SpecialCells( _
    xlCellTypeFormulas).Areas(sh.Cells.SpecialCells(xlCellTypeFormulas).Areas.Count).Row)
End Function

sergeyvg
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 16.08.2005 (Вт) 9:27

Сообщение sergeyvg » 28.04.2006 (Пт) 15:26


kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 28.04.2006 (Пт) 20:41

Спасибо!
Константин

pshik
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 23.07.2005 (Сб) 18:57

Сообщение pshik » 01.05.2006 (Пн) 17:21

Public Function LastCellsWithData(SheetName As String)
Dim xlApp As Object, xlBook As Variant
Dim sFileCopy As String

sFileCopy = frmSetup.txtPath.Text & "\" & frmSetup.txtLabour.Text
Set xlApp = CreateObject("Excel.application")
Set xlBook = xlApp.Workbooks.Open(sFileCopy)
'xlApp.Visible = False

' ExcelLastCell is what Excel thinks is the last cell
Set ExcelLastCell = xlBook.Worksheets(SheetName).Cells.SpecialCells(xlLastCell)

' Determine the last row with data in it (must also copy above para for this to work)
LastRowWithData = ExcelLastCell.ROW
ROW = ExcelLastCell.ROW
Do While Application.CountA(xlBook.Worksheets(SheetName).Rows(ROW)) = 0 And ROW <> 1
ROW = ROW - 1
Loop
LastRowWithData = ROW ' Row number

LastColWithData = ExcelLastCell.Column
col = ExcelLastCell.Column
Do While Application.CountA(xlBook.Worksheets(SheetName).Columns(col)) = 0 And col <> 1
col = col - 1
Loop
LastColWithData = col ' Column number

Set ExcelLastCell = Nothing
xlBook.Close
xlApp.Application.Quit
Set xlApp = Nothing

End Function

Пред.

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

    TopList