Страницы: 1 2 След.
RSS
В чем разница между Select и Activate
 
Я пробую и так и так а работают у меня одинаково. Тогда зачем их две?
 
Select-ом можно выделить диапазон ячеек, а активной в этом диапазоне можно сделать одну или несколько ячеек.  
Пример:  
Sub SelectVsActivate()  
 [A1:D4].Select
 [B2].Activate
End Sub
 
Активной - не несколько, а одну
 
Sub SelectVsActivate()  
 [A1:D4].Select
 [B2].Activate
End Sub  
Странно. Зачем выделять A1:D4 если активируем для работы В2?
 
И еще. Если мне нужно работать с одной ячейкой то какая разница будет тогда?
 
Лучше вообще отказаться от этих методов при обработке ячеек, т.к. эти методы (Activate, Select) замедляют работу макроса.    
 
Зачем писать так?  
 
Sub Макрос1()  
   Range("A1").Select  
   ActiveCell = "5"  
End Sub  
 
если можно написать так  
 
Sub Макрос2()  
   Range("A1") = "5"  
End Sub
 
Или зачем писать так  
 
Sub Макрос1()  
   Sheets("Лист3").Select  
   Range("A1").Select  
   ActiveCell = "5"  
End Sub  
 
если можно так  
 
Sub Макрос2()  
   Sheets("Лист3").Range("A1") = "5"  
End Sub
 
А если я циклом делаю? Перемещаюсь вниз по столбцу то как мне показать переход на следующую ячейку?
 
А просто не надо выделять ячейку. Надо писать с такой логикой, как пример:  
 
"ячейка(номер_строки, номер столбца) = 5"  
 
См. пример кода. Сперва определяем последнюю заполненную строку в встолбе А, а затем в цикле от второй стороки до последней обрабатываем ячейки (не выделяя их)  
 
Sub Макрос1()  
Dim iLastRow As Long  
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в столбца А  
   For i = 2 To iLastRow  
       cells(i,1) = 'тут что-то делаете с ячейкой  
   Next  
End Sub
 
Мне ведь нужно указать начальную позицию. Я делаю  
Range(“A8”).Select  
Do While ActiveCell > 0  
…  
Как я без Select обойдусь? И переход на строку вниз мне нужно сделать потом
 
1) Я не знаю, что вам нужно (вы ещё в этой теме не сказали)  
2) Не надо выделять никаких ячеек  
 
Sub Макрос1()  
Dim iLastRow As Long  
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в столбца А  
   For i = 8 To iLastRow  
       If IsEmpty(Cells(i, 1)) Then Exit For 'если ячейка пустая, то выход из цикла  
       Cells(i,1) = 'вот ваша начальная ячейка при первом цикле  
   Next  
End Sub
 
С этим понятно. А если мне нужно такойже цикл по строке? то как быть?  
P.S. Я на одном из формуов видел тоже Pavel55, это клон или все вы?
 
Для столбцов так  
 
Sub Макрос1()  
Dim iLastColumn As Long  
Dim i As Long  
   iLastColumn = Cells(1, Columns.Count).End(xlToLeft).Column 'последний заполненный столбец в 1 ряду  
   For i = 1 To iLastColumn  
       cells(1,i) 'тут что то делаете  
   Next  
End Sub  
 
P.S. Если форумы был посвящён Excel и VBA, то значит был я
 
Pavel, все понятно объяснили. Одного не пойму. Если мне в столбце А (это предпоследний пример) нужно найти например ячейку содержащую NNN то зачем мне узнавать сначала про последнюю строку? Мне ведь неважно на какой строке она будет найдена и сколько еще осталось после нее. В ваших примерах вы всегда сначала пересчитываете строки/столбцы. Это обязательно? Заче у вас такое "вступление"?
 
Если можно обойтись без Activate тогда зачем она нужна? В каком случае без нее не обойтись?
 
Моими примерами выше я показал вам, как можно обрабатывать ячейки без использования методов Activate и Select. Для этого я использовал цикл. Цикл в примерах работал от 2 строки до последней заполнений - это был лишь пример работы цикла.  
 
Для поиска NNN в столбце А можно использовать такой код  
 
Sub Макрос1()  
Dim iRange As Range  
   Set iRange = Columns(1).Find(what:="NNN", LookIn:=xlFormulas, lookAt:=xlWhole)  
   If Not iRange Is Nothing Then  
       MsgBox "NNN найдено в ячейке " & iRange.Address(0, 0), 64, "Поиск"  
   Else  
       MsgBox "NNN не найдено в столбце А", 48, "Поиск"  
   End If  
End Sub  
 
P.S. Честно, я вообще не понимаю, что вы хотите сделать, то вы про Select спрашиваете, то про поиск, то ещё что-то, может вы выложите пример в файле и скажите, что надо сделать? А то мы так долго вокруг да около можем ходить.
 
Pavel, спасибо за исчерпывающий ответ. Примера нет никакого. я просто хочу понять как грамотно строить циклы. Меня сбили с толку эти Select и Activate. Если с Select понятно, что можно выделить диапазон то с Activate так до конца и не понял в чем будет отличие применительно к одной ячейке.
 
Еще. Я спрашивал не про поиск. А если циклом перебираю строки до тех пор пока не найду NNN. И вы не ответили о необходимости каждый раз вначале считать к-во строк.
 
Ну, вы же не хотите полностью все строки обрабатывать на листе Excel. Вам надо как-то определить границы вашей таблицы. Начальные строки обычно известны (1 или 2 строка), а вот конечная строка таблицы может меняться, если в таблицу была добавлена новая информация. Я вам показал пример, как можно найти нижнюю границу таблицы (последнюю заполненную строку в столбца А). И тогда вы можете запускать цикл по обработке не всех строк на листе Excel, а например, со 2-ой до последней заполненной строки, т.е.  
 
For i = 2 To LastRow  
....  
Next  
 
P.S. Это всего лишь примеры, если вы сейчас это не понимаете или это сейчас вам не нужно (циклы например) - не обращайте на эти примеры особого внимания. Когда будет нужно, спросите, вам ответят и всё встанет на свои места.
 
Нет. Все понятно! Спасибо. Последнее. Фрагмент вашего кода:  
For i = 2 To iLastRow  
cells(i,1) = 'тут что-то делаем с ячейкой  
Вот эту найденную строку мне нужно удалить. Я ведь должен ячейку активировать или необязательно?
 
Мы же, вроде, с вами договорились, что ничего не обязательно выделять (Select), для того чтобы обработать ячейки.    
 
Если вы всё про поиск NNN и удаление этой строки, то  
 
Sub Макрос1()  
Dim iRange As Range  
   Set iRange = Columns(1).Find(what:="NNN", LookIn:=xlFormulas, lookAt:=xlWhole)  
   If Not iRange Is Nothing Then  
       iRange.EntireRow.Delete  
   Else  
       MsgBox "NNN не найдено в столбце А", 48, "Поиск"  
   End If  
End Sub  
 
P.S. Метод Find (поиск) работает быстрее, чем перебор ячеек в цикле.
 
Pavel, огромное вам спасибо. Многое для меня прояснилось.
 
Не за что. Надеюсь эта тема поможет и другим на начальных этапах изучения VBA
 
{quote}{login=Kot}{date=29.06.2008 11:49}{thema=}{post}И еще. Если мне нужно работать с одной ячейкой то какая разница будет тогда?{/post}{/quote}  
С одной ячейкой все равно, что select, что activate.  
Разницу между ними - см в 1-м ответе
 
Как пример Select vs Activate  
 
Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long)  
Sub Макрос1()  
Dim iCell As Range  
   Range("A1:H10").Select 'выделяем диапазон  
   For Each iCell In Selection  
       iCell.Activate 'активируем каждую ячейку  
       Sleep 200  
   Next  
End Sub
 
Pavel, а как в вашем примере не удалить текущую строку а остаться на найденной ячейке?  
Sub Макрос1()  
Dim iRange As Range  
Set iRange = Columns(1).Find(what:="NNN", LookIn:=xlFormulas, lookAt:=xlWhole)  
If Not iRange Is Nothing Then  
'iRange.EntireRow.Delete  
Else  
MsgBox "NNN не найдено в столбце А", 48, "Поиск"  
End If  
End Sub
 
Попробуйте понять этот пример  
 
Sub Макрос1()  
Dim iRange As Range  
   Set iRange = Columns(1).Find(what:="NNN", LookIn:=xlFormulas, lookAt:=xlWhole)  
   If iRange Is Nothing Then  
       MsgBox "NNN не найдено в столбце А", 48, "Поиск"  
       Exit Sub  
   End If  
   MsgBox "NNN найдено в:    " & Chr(13) & _  
       "Строка: " & iRange.Row & Chr(13) & _  
       "Столбец: " & iRange.Column & Chr(13) & _  
       "Адрес: " & iRange.Address(0, 0), , "Поиск"  
End Sub
 
См. Но если очень-очень хочется именно выделить найденную ячейку, то    
 
iRange.Select
 
Спасибо.
 
только не паникуйте..  
 
но есть еще и метод application.goto    
 
:)
Страницы: 1 2 След.
Читают тему
Loading...