Поиск первой непустой ячейки vba excel

Елена_88

1

Поиск непустой ячейки в столбце

11.02.2009, 07:42. Показов 19696. Ответов 6


Студворк — интернет-сервис помощи студентам

Приветствую !
Понимаю, задачка смешная, но мне, как новичку очень нужна помощь
Нужно написать функцию, которая будет возвращать значение первой непустой ячейки сверху.
т.е., например, стоим на А10, первая заполненная у нас А3, так как вытащить ее значение ?

Добавлено через 20 минут 39 секунд
Можно ли потом найти вторую заполненную ячейку ?

Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

12.02.2009, 01:31

2

Вот из этой простенькой «сабрутины» я и предлагаю сваять нужную Вам функцию. Отзовитесь, ау!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub FindAndCountEmptyCells(): Static k As Long 'если файл не пуст, то +1 при каждом вызове
 
 
If k = 0 Then  'а это так: 1) при первом вызове данной функции; 2) ещё не придумал
 
    Range("a1").Activate                            'проверка ячейки A1
    If Not IsEmpty(ActiveCell) Then k = k + 1       'если в A1 не пусто, то счёт ведётся с неё
    k = k + 1
    Application.FindFormat.NumberFormat = "General" 'аналог нажатия <Ctrl>+<F> (формат "Общий")
    
    'Активация k-й непустой ячейки.
    Cells.Find(What:="*", SearchFormat:=True, SearchOrder:=xlByColumns).Activate
 
Else
 
    Cells.FindNext(After:=ActiveCell).Activate 'при повторных вызовах - поиск следующей непустой
    k = k + 1
    If ActiveCell.Column & ":" & ActiveCell.Row = "1:1" Then k = 1 'это когда прошли всю таблицу
End If
 
 
MsgBox "Это " & k & "-я непустая ячейка (" & ActiveCell.Column & ":" & ActiveCell.Row & ")."
'здесь вместо этого мэссиджа Вы можете присваивать функции значение выделенной (активной) ячейки
 
End Sub

Вот тут действительно функция! Функциональность её та же.
Что делает основная программа (Sub), ясно из её названия.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Function FindAndCountNotEmptyCells()
'функция ищет на листе Excel k-ю (при k-м вызове) непустую ячейку (по столбцам)
  
Static firstfoundRow As Long, firstfoundCol As Long 'координаты первой найденной непустой ячейки
Static k As Long 'если файл не пуст, то при каждом вызове возвращает № очередной непустой ячейки
     
 
If k = 0 Then  'а это так при первом вызове функции и при возврате по GoTo (когда всё обыскано)
        Cells.Find(What:="*", SearchOrder:=xlByColumns).Activate 'Активация 1-й непустой ячейки.
          
        If Not IsEmpty(Cells(1, 1)) Then 'если в A1 не пусто, то при 1-м вызове считаем с неё
            firstfoundRow = 1: firstfoundCol = 1    'Запомнили координаты 1-й ячейки: (1, 1) -
            Cells.FindPrevious(After:=ActiveCell).Activate                  'и вернулись в неё.
        Else
            firstfoundRow = ActiveCell.Row: firstfoundCol = ActiveCell.Column
        End If
Else
    Cells.FindNext(After:=ActiveCell).Activate 'поиск следующей ячейки при повторных вызовах
End If
 
 
If (ActiveCell.Column = firstfoundCol) And (ActiveCell.Row = firstfoundRow) And (k > 1) Then
    k = 0       'сброс k; функция обошла ("просканировала") все ячейки активного листа
    FindAndCountNotEmptyCells = "I HAVE RETIRED)"
    Exit Function                                   'завершение работы функции: она всё обыскала
End If
  
 
FindAndCountNotEmptyCells = ActiveCell 'функция принимает значение очередной непустой ячейки
  
k = k + 1
 
MsgBox k & "-я непустая ячейка листа """ & ActiveSheet.Name & """ содержит: " & ActiveCell _
& vbCr & "(формат этого значения - """ & ActiveCell.NumberFormat & """)"
End Function
  
  
  
Sub I_seek_for_the_2_first_negative_cells_in_ActiveSheet()
  
Dim the1StNegativeCell, the2NdNegativeCell '1-е и 2-е отриц. числа (если есть) или что найдётся
  
Do
    the1StNegativeCell = FindAndCountNotEmptyCells
    If IsNumeric(the1StNegativeCell) And the1StNegativeCell < 0 Then Exit Do
Loop Until the1StNegativeCell = "I HAVE RETIRED)"
'выходим из цикла, как только находим в таблице ПЕРВОЕ отрицательное число, или когда его там нет
  
 
If the1StNegativeCell <> "I HAVE RETIRED)" Then 'то есть 1-е отриц. число всё же найдено
''''''''' продолжаем вызывать функцию поиска ''''''''''''''
    Do
    the2NdNegativeCell = FindAndCountNotEmptyCells
    If IsNumeric(the2NdNegativeCell) And the2NdNegativeCell < 0 Then Exit Do
    Loop Until the2NdNegativeCell = "I HAVE RETIRED)"
    'выходим из цикла, как только находим в таблице ВТОРОЕ отриц. число, или когда его там нет
    
    If the2NdNegativeCell = "I HAVE RETIRED)" Then _
        the2NdNegativeCell = "Второго отрицательного числа у вас в таблице (пока) нет."
Else
    MsgBox "На рабочем листе """ & ActiveSheet.Name & """ вашей таблицы отрицательных чисел нет."
    Exit Sub
End If
  
 
MsgBox "the1StNegativeCell = " & the1StNegativeCell 'сообщение, чему = 1-е отриц. число (в столбце)
MsgBox "the2NdNegativeCell = " & the2NdNegativeCell 'сообщение, чему = 2-е отриц. число (следующее)
End Sub

Это более-менее работоспособный вариант.

Классики Си! Видите, сколько мороки на бэйсике? Где ж ваше веское слово… Ну хотя бы просто в поиске первой ячейки, с содержимым.



0



Супер-модератор

8782 / 2533 / 144

Регистрация: 07.03.2007

Сообщений: 11,873

15.02.2009, 05:11

3

а если перед поиском сделать фильтр. так ты найдешь адрес первой непустой ячейки. потом фильтр можно снять



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

15.02.2009, 15:49

4

Я и без фильтра нашёл: по контрол-F в Excel.

И вообще, это Елена ищет. А форум что-то молчит, хоть и просмотров под полторы сотни.



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

18.02.2009, 20:23

5

Я и без фильтра нашёл: по контрол-F в Excel.

А форум всё молчит, хоть и просмотров за две сотни.



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

05.03.2009, 16:26

6

Вот черновой вариант. Повторяю, поскольку на прежних сломалась кнопка запуска.



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

05.03.2009, 16:51

7

Или, скорее, так: назначенная макросу кнопка, при архивировании, теряет связь с макросом.

Поэтому-то и прошу — поискать непустые ячейки на Си, ассемблере и пр.

Не будешь же (в жизни) каждый раз объяснять пользователю, мол, жми альт-F8, щёлкай по имени, жми кнопку Выполнить, — нудно!



0



Поиск первой пустой ячейки в строке

Re:Я

Дата: Пятница, 24.06.2016, 14:49 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Добрый день.
Второй день не могу найти подходящую тему на форуме. Прошу помощи.
Задача — вставить в действующий макрос (ВПР, так назову) еще один макрос, который ищет на Листе БМП в 3-й строке первую не пустую ячейку.
Смысл такой. Поступил заказ от клиента, кладу его в Лист заказ БМП. ВПРю. Поступает следующий заказ. «ИЩУ ПУСТУЮ ЯЧЕЙКУ в 3-й строке на Листе БМП и вновь вставляю значение заказа.
И если не сложно, то бонусом, подтянуть наименование клиента.
Заранее БЛАГОДАРЮ.

К сообщению приложен файл:

1282540.xlsm
(54.2 Kb)

 

Ответить

китин

Дата: Пятница, 24.06.2016, 14:51 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

Re:Я

Дата: Пятница, 24.06.2016, 15:23 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

китин:
Посмотрел…..и не понял. Мне наверняка вот это подойдет.
[vba]

Код

lLastRow = Cells(Rows.Count,2).End(xlUp).Row

[/vba]
Но как ее интегрировать в «мой» макрос? Что бы нашел первую пустую и начал ВПРить?

 

Ответить

китин

Дата: Пятница, 24.06.2016, 15:45 |
Сообщение № 4

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

а это ждите макрописцев


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

Udik

Дата: Пятница, 24.06.2016, 15:59 |
Сообщение № 5

Группа: Друзья

Ранг: Старожил

Сообщений: 1588


Репутация:

192

±

Замечаний:
0% ±


Excel 2016 х 64

Без привязки к макросу
[vba]

Код

Public Sub test()
Dim rng1 As Range

With ActiveSheet
Set rng1 = .Range(«A3:O3»).Find(«») ‘замените на свой  диапазон
‘Debug.Print rng1.Address
End With
End Sub

[/vba]

К сообщению приложен файл:

0t.xlsm
(19.1 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com

 

Ответить

_Boroda_

Дата: Пятница, 24.06.2016, 18:47 |
Сообщение № 6

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Мне наверняка вот это подойдет.
lLastRow = Cells(Rows.Count,2).End(xlUp).Row

Не, это ищет последнюю заполненную СТРОКУ в столбце 2, а Вам нужно последний заполненный СТОЛБЕЦ в строке 3 (кстати, вопрос — Вам нужно первую пустую или последнюю? — это разные вещи)
Вот так можно найти последнюю
[vba]

Код

c1_ = Cells(3, Columns.Count).End(xlToLeft).Column + 1

[/vba]
а вот так первую
[vba]

Код

Range(«B3»).End(xlToRight).column

[/vba]
А по поводу

как ее интегрировать в «мой» макрос?

— что-то я макроса

действующий макрос (ВПР, так назову)

в Вашем файле не обнаружил.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Re:Я

Дата: Понедельник, 27.06.2016, 10:43 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

_Boroda_ — Вы как всегда меня выручаете. Благодарю.
Теперь по макросу Вашему. Мне надо найти именно ПЕРВУЮ. Вопрос почему ищем с ячейки В3? В третье строке могут быть пустые ячейки в поле сводной таблицы. Мне туду ни чего не надо вставлять. А вот строка два всегда будет в раках сводной таблицы заполнена и за пределами таблицы мне и надо найти ячейку первую пустую и вставить туда значение макровса ВПР.
М.б. мне заново положить файл с примером? Хотя сейчас его скачал и он там есть по номером 7. На всякий случай выложу сам макрос. И суть всего действия такова. Найти первую пустую ячейку в строке 2 и следом запустить макрос ВПР.( так его назвал) И если возможно, бонусом, что бы не создавать новую тему, привязать НАЗВАНИЕ клиента. В данном примере: Нашел первую пустую ячейку К2. Вставил название клиента из ЛИСТА ЗАКАЗ БМП С4 (постоянная, всегда там будет название клиента), и вставить значение из ВПР. Вот. Если это конечно не сильно нарушает ПРАВИЛА.
Сам макрос ВПР, к которому надо все привязать.
[vba]

Код

Sub Макрос7()
    Dim a, b, c, d, e, iLastrow As Long, i As Long, ii As Long

       ‘1. данные в два массива
    With Лист2    ‘используется кодовое имя
        iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row
        a = Range(.[c3], .Range(«C» & iLastrow)).Value
    End With

    With Лист3    ‘используется кодовое имя
        iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row
        b = Range(.[k19], .Range(«C» & iLastrow)).Value
    End With

    ‘2.пустой массив для результата
    ReDim c(1 To UBound(a), 1 To 9)

    With CreateObject(«Scripting.Dictionary»)

            ‘3.в словарь уникальные и номер строки из массива
        For i = 1 To UBound(b)
            .Item(b(i, 1)) = i
        Next

        ‘4.по словарю из массива b в массив c
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                c(i, 1) = b(.Item(a(i, 1)), 9)
            End If
        Next
    End With

    ‘5. выгрузка всего массива
    With Лист2    ‘используется кодовое имя
        .[K3].Resize(UBound(c), 1) = c
        .Activate
    End With
End Sub

[/vba]

 

Ответить

Re:Я

Дата: Понедельник, 27.06.2016, 11:07 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

ай-яй…. сам напортачил. Сам же просид 3-ю. теперь задаю вопрос почему 3-ю… Прошу прощения. Исправляюсь. во 2-й строке.

 

Ответить

Re:Я

Дата: Вторник, 05.07.2016, 09:50 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

С Вашего позволения ап…
Прошу помощи.

 

Ответить

китин

Дата: Вторник, 05.07.2016, 10:03 |
Сообщение № 10

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

Рискну ответить.в качестве предположения,может неправильно. А что если попробовать исправить вот тут
[vba]

Код

iLastrow = .Cells(Rows.Count, 3).End(xlUp).Row
        a = Range(.[c3], .Range(«C» & iLastrow)).Value

[/vba]
3 на 2 (обе тройки)


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

Сообщение отредактировал китинВторник, 05.07.2016, 10:03

 

Ответить

Re:Я

Дата: Вторник, 05.07.2016, 10:20 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

китин — благодарю за ответ.
саму малость понимаю в макросах. 3 на 2 это не проблема для меня. Проблема это как внедрить поиск первой пустой строки в мой макрос? _Boroda_ — написал, что не видит в примере макроса. Это для меня не большое удивление. Почему его не видно в примере. Я его, макрос. выложил отдельно.
Сама процедура. 1. Поиск первой пустой строки в «2» 2. ВПРить и вставлять со К3 значения . (это все работает как положено) Так же с помощью _Boroda_ доделал его. Тема в другой ветке была.
[moder]Тема продублирована во ФРИЛАНСе. Эту закрываю[/moder]

Сообщение отредактировал PelenaВторник, 05.07.2016, 14:02

 

Ответить

Если ваша первая строка является строкой заголовка, вы можете использовать:

Columns("B").SpecialCells(xlCellTypeBlanks)(1).Select

РЕДАКТИРОВАТЬ

Извините, неправильно прочитал вопрос, приведенный выше код абсолютно неверен. Решение:

Примечание: их разница между пустым и пустым.

Для первого непустого (как в заголовке вопроса) попробуйте:

With Columns("B")
    .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).Activate
End With

Для первого непустого (как в теле вопроса) попробуйте:

В отличие от вышеуказанного, здесь также будут найдены непустые ячейки, в которых формула равна пустому, т. Е. =IF(A1=1,A1,»»)

With Columns("B")
    .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlFormulas).Activate
End With

Понравилась статья? Поделить с друзьями:
  • Поиск первой ненулевой ячейки в excel
  • Поиск первой не пустой ячейки в столбце excel
  • Поиск первой заполненной ячейки в строке excel
  • Поиск первого символа в excel
  • Поиск первого непустого значения в столбце excel