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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 11:16   #1
liker125
 
Регистрация: 09.05.2009
Сообщений: 6
По умолчанию нахождение последней строки

добрый день!!у меня такая проблема есть цикл который должен продолжаться до конца таблицы.проблема в том что я не знаю какое условие нужно ставить на конец цикла
Код:
For j = 4 To 7
        vales = ""
        For i = 4 To 14
            vales = vales & " " & Cells(j, i).Value & ","
        Next i
            i = 15
            vales = vales & " " & Cells(j, i).Value
        Next j
вместо 7 должно быть конец таблицы.буду очень благодарен


не надо создавать одинаковые темы и сообщения.
Кросспост запрещён на форуме.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 13.07.2011 в 11:52.
liker125 вне форума Ответить с цитированием
Старый 13.07.2011, 11:57   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вам поможет эта функция: http://excelvba.ru/code/Range2TXT

Код будет выглядеть так:

Код:
Sub test()
    ' диапазон с 4-й строки по последнюю, шириной в 12 столбцов
    Dim ra As Range: Set ra = Range([d4], Range("d" & Rows.Count).End(xlUp)).Resize(, 12)
    vales = Range2TXT(ra, ", ", vbLf)     ' считываем текст в переменную
    
    MsgBox vales, vbInformation, "Текст из диапазона ячеек"
End Sub

Function Range2TXT(ByRef ra As Range, Optional ByVal ColumnsSeparator$ = vbTab, _
                   Optional ByVal RowsSeparator$ = vbNewLine) As String
    If ra.Cells.Count = 1 Then Range2TXT = ra.Value & RowsSeparator$: Exit Function
    If ra.Areas.Count > 1 Then
        Dim ar As Range
        For Each ar In ra.Areas
            Range2TXT = Range2TXT & Range2TXT(ar, ColumnsSeparator$, RowsSeparator$)
        Next ar
        Exit Function
    End If
    arr = ra.Value
    For i = LBound(arr, 1) To UBound(arr, 1)
        txt = "": For j = LBound(arr, 2) To UBound(arr, 2): txt = txt & ColumnsSeparator$ & arr(i, j): Next j
        Range2TXT = Range2TXT & Mid(txt, Len(ColumnsSeparator$) + 1) & RowsSeparator$
    Next i
End Function
Пример в файле: http://excelvba.ru/XL_Files/Sample__...__13-57-32.zip
EducatedFool вне форума Ответить с цитированием
Старый 13.07.2011, 11:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

посмотрите на варианты:
Код:
>----------------------------------------------------------
Row1 = ThisWorkbook.ActiveSheet.UsedRange.Row
Row2 = Row1 + ThisWorkbook.ActiveSheet.UsedRange.Rows.Count
>----------------------------------------------------------
Код:
Cells.SpecialCells(xlCellTypeLastCell).Row , уточняя последюю используемую строку

Код:
Cells(Cells.SpecialCells(xlCellTypeLastCell).Row+1, "A").End(xlUp).Row

Rows.Count так же срабатывает мгновенно. Рекомендовал бы пользоваься им.
Код:
Cells.SpecialCells(xlLastCell).Row
Cells.SpecialCells(xlLastCell).Column


это так, "навскидку"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 12:13   #4
liker125
 
Регистрация: 09.05.2009
Сообщений: 6
По умолчанию

Serge_Bliznykov вот чесно я мало что понимю.если не трудно можете показать на моем коде куда вставить ваш пример
liker125 вне форума Ответить с цитированием
Старый 13.07.2011, 12:51   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Serge_Bliznykov вот чесно я мало что понимю.если не трудно можете показать на моем коде куда вставить ваш пример
Цитата:
вместо 7 должно быть конец таблицы.буду очень благодарен
Так я набросал кучу "мусора" специально, чтобы Вы выбрали подходящий Вам вариант.

Тут всё зависит от того, ЧТО именно Вы называете "концом таблицы".

Допустим, это ПОСЛЕДНЯЯ используемая (заполненная) строчка на листе Excel.

тогда Ваш код можно записать так:
Код:
Dim Row1 As Long, Row2 As Long

Row1 = ThisWorkbook.ActiveSheet.UsedRange.Row
Row2 = Row1 + ThisWorkbook.ActiveSheet.UsedRange.Rows.Count - 1

For j = 4 To Row2
        vales = ""
.....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 13:05   #6
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Можно так - не выделяя последнее значение из цикла:
Код:
Sub bb()
For j = 4 To Cells(Rows.Count, 4).End(xlUp).Row
    vales = ""
    For i = 4 To 15
        vales = vales & ", " & Cells(j, i).Value
    Next i
    vales = Mid(vales, 3)
    MsgBox vales 'для отладки
Next j
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 13.07.2011, 13:12   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Казанский, можно и так.
только поведение данного кода будет ДРУГОЕ!

если, например, все столбцы (за исключением 4-го столбца) заполнены до 100-й строки, а 4-й столбец - до 5-й строки, то
Cells(Rows.Count, 4).End(xlUp).Row - вернёт именно 5 (пять)...

возможно, автору топика так и нужно (это же упирается в то, что понимать под "концом таблицы").
Просто нужно знать, что данные примеры кода не эквивалентны!


а можно ещё и так написать:
Код:
For j = 4 To Cells.SpecialCells(xlLastCell).Row
    vales = ""
....

Последний раз редактировалось Serge_Bliznykov; 13.07.2011 в 13:14.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 15:59   #8
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию

учитывая, что есть столбец, в котором заполнены все строки таблицы (тут это 1й), я пользовалась таким способом:

Код:
'Определение последней строки
    FirstRow = 1   'можно задать Selection.Row   - выдаст номер строки выделенной ячейки
    MaxRow = 0   'на всяк.случай сбрасываем значение
    For MaxRow = FirstRow To 50000
        If Cells(MaxRow + 1, 1) = "" Then
            Exit For
        End If
    Next MaxRow
MsgBox "MaxRow" & MaxRow   'пр-ка кол-во строк

Последний раз редактировалось Bape}l{ka; 13.07.2011 в 16:03.
Bape}l{ka вне форума Ответить с цитированием
Старый 13.07.2011, 16:22   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Bape}l{ka, ну и зря! Вы КАТЕГОРИЧЕСКИ не правы!

Два основных "косяка" Вашего кода.

1) а если в таблице 55000 строк заполнено? А если 100 000 ? 200 000 ? (версия Excel >= 2007) ?!

2) зачем искать перебором, когда можно одной (ОДНОЙ строчкой) найти последнюю заполненую ячейку в ЛЮБОМ столбце!
вот, например, для столбца A
Код:
MaxRow = Cells(ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count, "A").End(xlUp).Row
Вы проверьте, сколько по времени будет работать Ваш перебор (ну хотя бы при 50000 заполненых ячеек) и сколько данный код.
Вы будете ОЧЕНЬ удивлены!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 18:02   #10
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию

Serge_Bliznykov, вы правы, но т.к. у меня таблицы максимум на пару тыщ, то пока вопрос времени работы макроса не вставал =ь
впрочем, возьму на заметку ваш способ, у меня уже были подобные мысли, а представленный мной способ было пробой пера в VBA, зато сразу понятно, что происходит =ь для начинающих, так скать =ь
Bape}l{ka вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос поиск последней незаполненной строки Uralmaster Microsoft Office Excel 21 10.02.2011 02:17
перенести значение последней заполненной строки Jazz1200 Microsoft Office Excel 4 12.12.2010 17:11
Заполнение последней строки StringGrid нулями. Asblue Помощь студентам 2 01.11.2010 15:05
Добавление в TMemo, последней строки из TStringList OPF_Nik Помощь студентам 3 31.01.2010 17:35
Выделение цветом последней строки DBGrig Yura_S Помощь студентам 2 28.10.2009 08:35