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

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

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

Восстановить пароль

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.07.2015, 05:52   #31
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если применять пользовательскую функцию для получения значения первой непустой ячейки в столбце, то можно существенно проще:
Код:
Function FirstNotEmpty(rng As Range)
    Application.Volatile
    FirstNotEmpty = rng.Find("*", rng.Cells(1, 1).Offset(rng.Count - 1)).Value
End Function
где rng - диапазон в столбце.
Хотя, в вопросе автора есть конфликт между строками и столбцами:
Цитата:
Найти первую непустую ячейку в строке Excel... есть массив A3:A20...
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 06.07.2015 в 06:43.
SAS888 вне форума
Старый 06.07.2015, 08:17   #32
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

для тех же условий
Код:
Function FirstNotEmpty(rng As Range)
  FirstNotEmpty = IIf(rng.Cells(1) = "", rng.End(xlDown), rng.Cells(1))
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 07.07.2015, 06:04   #33
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Следует признать, что в случае, если в указанном диапазоне нет заполненных ячеек, то моя функция выдаст ошибку, а функция от IgorGO выдаст ошибочный результат.
Отчасти, это из-за того, что автор не указал, что делать в подобном случае.
Пусть, например, при отсутствии значений, в качестве результата требуется получить "No".
Тогда функция примет вид:
Код:
Function FirstNotEmpty(rng As Range)
    Dim x As Range: Set x = rng.Find("*", rng.Cells(1).Offset(rng.Count - 1))
    If x Is Nothing Then FirstNotEmpty = "No" Else FirstNotEmpty = x.Value
End Function
А в функции от IgorGO потребуется контролировать, входит ли полученное значение в указанный аргументом диапазон.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 07.07.2015, 08:14   #34
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

Доброе утро! Текст вашего макроса уточняю до:

Function FirstNonEmpty(rng As Range)
FirstNonEmpty = rng.Find("*").Value
End Function

Последний раз редактировалось svsh2016; 07.07.2015 в 08:19.
svsh2016 вне форума
Старый 07.07.2015, 08:59   #35
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

svsh2016
Вы не правы по 2-ум причинам.
1. Пусть, например, весь диапазон rng заполнен. В этом случае, метод Find определит не 1-ую, а 2-ую ячейку из этого диапазона (такова уж специфика этого метода). Поэтому, начинать нужно не с 1-ой, а с последней ячейки диапазона. И не снизу вверх, а вперед. Только в этом случае результат будет корректным. Именно это и делает предложенная мной функция.
2. Если, наоборот, весь диапазон пуст, то Ваша функция выдаст ошибку.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 07.07.2015, 10:35   #36
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

SAS888,Если рассмотреть только простой пример :в диапазоне A3:A20 находится в ячейке A3, например, значение 2,а остальной столбец пустой,то макрос First5 выдает 2
вариант вашего макроса ,который я выслал в 9:14, а назвал сейчас как FirstNotEmpty1 выдает 2
вариант вашего макроса FirstNotEmpty выдает 0

Код:
 Function First5(r As Range)
Dim i&, s$
Application.Volatile
If IsEmpty(r.Range("A1")) Then
   s = Left(r.Range("A1").Address, InStrRev(r.Range("A1").Address, "$") - 1)
   i = r.Range("A1").End(xlDown).Row
  If i = Cells.Rows.Count Then
    First5 = CVErr(xlErrNA)
  Else
    First5 = Range(s & i)
  End If
ElseIf Not IsEmpty(r.Range("A1")) Then
   First5 = r.Range("A1").Value
End If
End Function
Код:
Function FirstNonEmpty1(rng As Range)
Application.Volatile
FirstNonEmpty1 = rng.Find("*").Value
End Functio
n

Код:
Function FirstNonEmpty(rng As Range)
Application.Volatile
    FirstNotEmpty = rng.Find("*", rng.Cells(1, 1).Offset(rng.Count - 1)).Value
End Function
svsh2016 вне форума
Старый 07.07.2015, 11:34   #37
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Вариант Вашей функции (из поста №34) во-первых, выдаст ошибку в случае, когда весь диапазон пуст, во-вторых, выдаст ошибочный результат, когда заполнены, например, первых две ячейки из диапазона rng (я уже говорил про специфику работы метода Find).
2. Ваша функция First5 также выдаст ошибку при полностью пустом диапазоне rng.
3. Мой последний вариант функции не тот, который Вы приводите, а из поста №33, который работает корректно при любых условиях.

Для наглядности, я все предлагаемые функции продемонстрировал в приложенном файле.
Также, с позволения уважаемого IgorGO, в файл вставлена и его функция с небольшой доработкой.
Вложения
Тип файла: rar Книга1.rar (8.7 Кб, 6 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 07.07.2015 в 12:10. Причина: Добавлено
SAS888 вне форума
Старый 07.07.2015, 12:32   #38
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

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

написание устойчивого к ошибкам кода - это следующая задача и о ней ничего в теме не сказано. но это не значит, что нельзя развить тему в этом направлении)
потому что, если честно, не подглядывая сейчас, то я не помню кто автор и когда последний раз он заглядывал сюда
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 07.07.2015, 12:56   #39
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

Мой макрос только First5,который работает аналогично обсужденной формуле массива Индекс.
Остальные варианты макросов-это разновидности вашего макроса с конструкцией Find.
Я привел простой пример ,в котором ваш вариант из поста 34 ,я назвал ваш макрос как FirstNonEmpty34,выдает ноль вместо 2,а вы тестируете совсем другой пример заполнения ячеек,давайте рассмотрим все-таки мой пример заполнения ячеек ,а потом ваш,-то есть все по порядку.И давайте сравним все макросы с рассмотренной функцией массива Индекс

Код:
Function FirstNonEmpty34(rng As Range)
Dim x As Range: Set x = rng.Find("*", rng.Cells(1).Offset(rng.Count - 1))
    If x Is Nothing Then FirstNotEmpty = "No" Else FirstNotEmpty = x.Value
End Function
svsh2016 вне форума
Старый 07.07.2015, 13:09   #40
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Мой макрос только First5,который работает аналогично обсужденной формуле массива Индекс.
Остальные варианты макросов-это разновидности вашего макроса с конструкцией Find.
Во-первых, если Ваша функция работает аналогично формуле массива Индекс (не проверял), значит и формула не корректна. Примеры неправильной работы я привел в предыдущем вложении.
Во-вторых, не нужно мне приписывать урезанную Вами в посте №34 функцию, использующую метод Find. Моя функция - это из поста №33 (и в файле).
В третьих,
Цитата:
давайте рассмотрим все-таки мой пример заполнения ячеек
Давайте. Приложите файл с примером, в котором моя функция работает неправильно. Я, как ни стараюсь, не могу смоделировать такую ситуацию.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать ссылку на последнюю непустую ячейку в обновляемом столбце SVGuss Microsoft Office Excel 34 19.02.2013 16:12
в строке удалить первую и последнюю буквы,только записать в виде программы и тестового примера в паскаль!!! rfnthbyf Паскаль, Turbo Pascal, PascalABC.NET 9 14.02.2012 21:16
Найти и выделить по выделенной строке диапазон с такой строкой на другом листе (Excel 2003) vfv Microsoft Office Excel 8 10.03.2010 09:30
Копирование данных на первую пустую ячейку kzld Microsoft Office Excel 8 15.07.2009 14:06
как найти первую заполненную ячейку в диапазоне Bezdar Microsoft Office Excel 3 19.02.2009 11:59