Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/275: Рейтинг темы: голосов - 275, средняя оценка - 4.67
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521

Поиск ячейки по значению

09.03.2013, 16:07. Показов 58769. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня есть таблица, она находится в левом верхнем углу листа Excel. Я считываю из нее данные, делаю расчеты и вывожу в другой лист результат. Нужно, чтоб программа правильно работала, даже если слева добавить несколько столбцов и/или сверху добавить несколько строк в лист. Можно ли найти левую верхнюю ячейку моей таблицы по значению и как это сделать? Ведь невозможно перебрать все ячейки листа.
Еще хотела спросить. Придется менять все индексы, когда считываю данные или, может, есть способ обращаться к левой верхней ячейки таблицы как к А1, и к остальным ячейкам с таким же смещением?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2013, 16:07
Ответы с готовыми решениями:

Поиск ячейки по значению Excel
Уважаемые форумчане, столкнулся со следующей проблемой. Есть кусок кода, который в столбце В6, оставляет только первые 5 симовлов: ...

Поиск строки по значению ячейки в этой строке
Нужно найти строку по конкретному значению в колонке. А затем удалить ее или изменить.

Откорректировать макрос так, чтобы поиск осуществлялся не с ячейки А1, а с ячейки C21
Как в этом макросе прописать, чтобы поиск осуществлялся в столбике "С", но с 21-ой строки? Sub asd() Dim c As Range Set c =...

40
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
19.03.2013, 20:42
Студворк — интернет-сервис помощи студентам
Igor_Tr, а как добавить к именованному диапазону одну строку допустим, потому что у меня код
Visual Basic
1
2
Range("DateAdd").Resize(Range("DateAdd").Rows.Count, _
                        Range("DateAdd").Columns.Count + 1).Select
не хочет работать.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.03.2013, 21:03
Range("DateAdd").Resize(Range("DateAdd") .Rows.Count, _
Range("DateAdd").Columns.Count + 1).Select
Вот так Вы добавили столбик. Посмотрите на выражение внимательно. И увидите. Будете смеяться.
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
19.03.2013, 22:13
а как тогда добавить столбик?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.03.2013, 22:51
Молодец!!! Развеселил . Ключевое слово Resize. Вот это
.Columns.Count + 1
- на один столбец (плюс). Вот это
.rows.Count + 1
- на один ряд (тоже плюс). Я ведь говорил - посмотрите внимательно. Ну что? Самому наверно весело стало?
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
20.03.2013, 15:03
Сглупил, но при добавлении столбца :
Visual Basic
1
2
3
4
5
Range("DateAdd").Resize(Range("DateAdd").Rows.Count + 1, _
                        Range("DateAdd").Columns.Count).Select                'это работает
    
    Range("SeansCost").Resize(Range("SeansCost").Rows.Count + 1, _
                        Range("SeansCost").Columns.Count).Select              ' от этого никакого эффекта нет
На счет именованных областей:
Visual Basic
1
2
ActiveWorkbook.Names.Add Name:="DateAdd", RefersToR1C1:="=Ëèñò1!R15C2:R26C2"
    ActiveWorkbook.Names.Add Name:="SeansCost", RefersToR1C1:="=Ëèñò1!R15C3:R24C14"
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
20.03.2013, 15:12
To Noit. Закинтьте сюда лист, если есть такая возможность. Иначе, будем ловить "на несчастном животном блоху за блохой" вместо использования лекарства.
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
20.03.2013, 15:16
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Закинтьте сюда лист
Вот ссылка на тему, архив книга7.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
20.03.2013, 15:47
Еще уточните, в каком модуле и в каком месте. Там всего понемного, нет времени все лопатить. Как немного освобожусть- попробую разобраться.
Но и аватар у Вас! Ночью приснится - заикой стану. Надо что-то придумать в ответ. Типа тьфу-тьфу через левое плечо (или правое - не сильный в предразсудках).
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
20.03.2013, 15:57
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Но и аватар у Вас!
Умеете поднимать настроение)
на module7 попробуйте зайти, или btnAddTime_click(Добавить время)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
20.03.2013, 16:16
Нашел уже. Модуль6. Но сейчас занят. Решим, не переживайте. И с аватаром тоже. Начинайте бояться.
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
20.03.2013, 16:21
Цитата Сообщение от Igor_Tr Посмотреть сообщение
И с аватаром тоже
Ну а как без этого?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
20.03.2013, 18:33
Учтите!!! Этот, который аватар, еще пока без макияжа. А с ним - вобще.... Инфаркт на месте! Вот теперь бойтесь по настоящему.
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
Sub Augmentation()
 
Dim a%, b%, c%, d%, e%, f%, g%, h%, mstr$
ActiveSheet.Cells.Delete
 
    Range(Cells(2, 2), Cells(6, 6)).Name = "RNG_1" ' 5 * 5
        a = Range("RNG_1").Rows.Count
        b = Range("RNG_1").Columns.Count
   Range("RNG_1").Select
   Range("RNG_1").Interior.ColorIndex = 15
   
   Range(Cells(4, 4), Cells(10, 10)).Name = "RNG_2" ' 7 * 7
        c = Range("RNG_2").Rows.Count
        d = Range("RNG_2").Columns.Count
   Range("RNG_2").Select
   Range("RNG_2").Interior.ColorIndex = 34
   
   Union(Range("RNG_1"), Range("RNG_2")).Select
'увеличиваем + переопределяем имя:
Stop
        Range(Range("RNG_1").Resize(Range("RNG_1").Rows.Count, _
                    Range("RNG_1").Columns.Count + 1). _
                            Address).Name = "RNG_1" ' 5 * 6
        Range("RNG_1").Select
        
        e = Range("RNG_1").Rows.Count
        f = Range("RNG_1").Columns.Count
   
        Range(Range("RNG_2").Resize(Range("RNG_2").Rows.Count + 2, _
                    Range("RNG_2").Columns.Count + 2). _
                                Address).Name = "RNG_2" ' 9 * 9
        Range("RNG_2").Select
        g = Range("RNG_2").Rows.Count
        h = Range("RNG_2").Columns.Count
    Union(Range("RNG_1"), Range("RNG_2")).Select
Stop
    MsgBox "RNG_1, было: рядов  -  " & a & _
                         ", столбцов  -  " & b & ";" & Chr(13) & _
                         "стало: рядов  -  " & e & _
                         ", столбцов  -  " & f & ";" & Chr(13) & Chr(13) & _
            "RNG_2, было: рядов  -  " & c & _
                         ", столбцов  -  " & d & ";" & Chr(13) & _
                         "стало: рядов  -  " & g & _
                         ", столбцов  -  " & h & "."
 
End Sub
Не очень есть время, а у Вас там винигрет в книге. Вот это демо поганяйте, поменяйте + на -, только следите, что б не вышли, при уменьшении, за пределы допустимого. У меня все работает Пробуйте и сами сравните со своим. Вам виднее, а мне еще страшно не прошло...

Добавлено через 13 минут
Ох, если успел. Тестируйте на чистом листе. Потом поудаляйте все строки, в которых Select (можете для наглядности оставить одну запись, там где Union перед Msgbox). Результаты в Msgbox не изменятся, а на скорость повлияет.
1
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
21.03.2013, 12:04
Цитата Сообщение от Igor_Tr Посмотреть сообщение
У меня все работает
Благодарю, даже в знак признательности авку сменю)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
21.03.2013, 12:17
Вот до какой степени я Вас запугал. Аж самому как-то неудобно стало.
Я так понял, что Вам нужно было переопределить именной диапазон. А зачем? Запутаетесь. Расширили/уменьшили без переопределения, загнали в массив, обработали, применили результаты. И диапазон тот-же, и Rottwailer накормлен.
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
21.03.2013, 12:25
Цитата Сообщение от Igor_Tr Посмотреть сообщение
нужно было переопределить именной диапазон
Я диапазон не переопределял, я свой поставил в этот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Range(Range("RNG_1").Resize(Range("RNG_1").Rows.Count, _
                    Range("RNG_1").Columns.Count + 1). _
                            Address).Name = "RNG_1" ' 5 * 6
        Range("RNG_1").Select
        
        e = Range("RNG_1").Rows.Count
        f = Range("RNG_1").Columns.Count
   
        Range(Range("RNG_2").Resize(Range("RNG_2").Rows.Count + 2, _
                    Range("RNG_2").Columns.Count + 2). _
                                Address).Name = "RNG_2" ' 9 * 9
        Range("RNG_2").Select
        g = Range("RNG_2").Rows.Count
        h = Range("RNG_2").Columns.Count
    Union(Range("RNG_1"), Range("RNG_2")).Select
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Rottwailer накормлен
А вот это точно)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
21.03.2013, 12:39
Вы меня удивляете. Будьте немного более наблюдательнее. В моем примере Range("RNG_1") имел размер 5*5. Если Select - так и будет. Потом я его расшилил (там он расширенный и выделяется). Но если сразу после этого вызвать
Range("RNG_1").Select, тогда опять будет выделено только 5*5. А вот это - уже переопределение;
Range(Range("RNG_1").Resize(Range("RNG_1 ").Rows.Count, _
Range("RNG_1").Columns.Count + 1). _
Address).Name = "RNG_1" ' 5 * 6
Если после этого выполнить Range("RNG_1").Select, то уже будет отсюда и НАВСЕГДА! выделяться 5*6. Разницу понимаете?
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
21.03.2013, 12:48
Я немного не так делал, я сразу вставил в свою книгу этот отрывок кода
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Range(Range("RG1").Resize(Range("RG1").Rows.Count - 1, _
                    Range("RG1").Columns.Count). _
                            Address).Name = "RG1" '
        Range("RG1").Select
        
        e = Range("RG1").Rows.Count
        f = Range("RG1").Columns.Count
   
        Range(Range("RNG2").Resize(Range("RNG2").Rows.Count - 1, _
                    Range("RNG2").Columns.Count). _
                                Address).Name = "RNG2" 
        Range("RNG2").Select
        g = Range("RNG2").Rows.Count
        h = Range("RNG2").Columns.Count
    Union(Range("RG1"), Range("RNG2")).Select
Для которого а листе сделал два тестовых именованных диапазона.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
21.03.2013, 13:04
Еще раз. Прочитайте пост #34. У Вас есть основной именованный диапазон. По какой-то причине его надо расширить/уменьшить.
Range("RG1").Resize(Range("RG1").Rows.Co unt - 1, _
Range("RG1").Columns.Count)
Здесь - уменьшили на один ряд. Но размеры фактически Range("RG1") не изменились. Если Вы запишите
Visual Basic
1
2
3
dim mArr()
mArr=Range("RG1").Resize(Range("RG1").Rows.Count - 1, _
                    Range("RG1").Columns.Count).Value
тогда в массив будет загнан не просто Range("RG1"), а расширенный. Если после этого записать
mArr=Range("RG1").value, тогда загоним только изначальный диапазон. Другими словами, мы не меняем первоначальный диапазон, и всегда от него отталкиваемся. А если переопределять - можно, но нужно точно знать для чего и стоит это делать, или нет. Теперь понятно?
0
 Аватар для Noit
26 / 26 / 10
Регистрация: 11.04.2012
Сообщений: 870
21.03.2013, 13:12
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Теперь понятно?
Теперь да.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
21.03.2013, 13:22
Добавлю только.
А вот так, как у Вас
Range(Range("RG1").Resize(Range("RG1").R ows.Count - 1, _
Range("RG1").Columns.Count). _
Address).Name = "RG1"
означает, что мы уменьшили Range("RG1") на строку, и измененному диапазону присвоили уже существующее имя "RG1", что в свою очередь означает: на месте предыдущего именованного диапазона появился совсем новый диапазон, но с тем же именем!!! Все, по другому обяснить не смогу. Моего знания русского не хватит. Надо будет подключать дважды не судимого проффэсора.

Добавлено через 4 минуты
Не переживайте. Так туго - это наверно от испуга. Моя вина. Извиняюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2013, 13:22

Макрос: Поиск совпадений, перенос совпавшей ячейки и рядом с ней стоящей ячейки
Доброго времени суток ! Прошу помощи с написанием макроса, очень очень очень выручите! Задача такова 1 - есть книга из 3х листов ( 1...

Создать фильтр по значению ячейки
Всем привет! Как в MS Office Excel реализовать фильтр по значению ячейки. покажу на картинках что я имею ввиду. Имеется программа со...

Макрос: выделить строку по значению ячейки А1
Добрый день. Подскажите, как решить задачу: В ячейке А1 введено значение 10 Как через макрос выделить строку по значению ячейки...

Заливка определенного диапазона по значению ячейки
Всем доброго времени суток! Задачка вроде простая, но ввела меня в ступор, что хочу получить: При вводе значения в ячейку изменяет цвет...

Сравнить файлы по имени и переименовать по значению из ячейки
Добрый вечер! Прошу помощи чайнику в написании скрипта. Сам не справлюсь. В фиксированной директории есть два типа документов c...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru