С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60

Правильная организация поиска на листе Excel

15.11.2011, 13:08. Показов 3607. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Бьюсь с проблемой второй день. Суть в чем:
Макрос сканирует лист входящей книги (inputbook) построчно, находит необходимую строку и переносит данные в исходящую книгу (repobook). Когда найдена искомая строка необходимо по уникальному значению ячейки найти ещё одну строку во входящей книге с этим значением и забрать оттуда недостающие данные. Однако начальную строку нахожу, копирую уникальное значение в буфер, но найти вторую часть не получается, почему не пойму. Вот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
'копируем уникальное значение по которому будем производить дальнейший поиск недостающих данных
bufr = inputbook.Worksheets(1).Range("C" & ns).Value
' присваиваем номер строки начала поиска (текущая строка ns + 1)
nsr = ns + 1
'Задаем цикл перебора строк от строки nsr до конца (до ячейки со значением "дата составления отчета")
   Do While inputbook.Worksheets(1).Range("B" & nsr).Value <> "дата составления отчета"
   ' проверяем ячейку на значение bufr. Если да, то обрабатываем, если нет то смотрим следующую строку
      If inputbook.Worksheets(1).Range("C" & nsr).Value = bufr Then
         ' обработка
      Else
      End If
      ' увеличиваем номер строки на 1
      nsr = nsr + 1
   Loop
Так вот значение переменной bufr присваевается, проверял, однако найти потом на листе его не может.
Кто чем может помогите пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2011, 13:08
Ответы с готовыми решениями:

Организация быстрого поиска данных на листе Excel
Привет, ребята! У меня возникло затруднение при решении следующей задачи. Для быстрой обработки данных мне необходимо в макросе...

Правильная организация поиска в SortedDictionary (метод ContainsValue())
Здравствуйте, уважаемые Форумчане! В созданной коллекции SortedDictionary необходимо найти элемент удовлетворяющий запросу и вернуть...

правильная организация проэкта
подскажите пожалуйста. При создании проэкта и компиляции index.ts происходит создание js файлов рядом с каждым используемым ts файлом что...

18
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
15.11.2011, 13:47
nt_dmn,
а как объявлена переменная bufr и какие данные помещаются в неё?
1
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 13:49  [ТС]
Visual Basic
1
bufr As String
, а помещаются данные из ячейки с форматом "общий", короче смесь букв и цифр, вот например: 297G7SK00001
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
15.11.2011, 13:53
Цитата Сообщение от nt_dmn Посмотреть сообщение
Так вот значение переменной bufr присваевается, проверял
а как проверяли?
0
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 13:58  [ТС]
Месседж боксы вставлял для контроля после первой строки и после условного оператора. Тот что после первой строки вываливался всегда с верным значением, а условный оператор не срабатывал

Добавлено через 1 минуту
Цитата Сообщение от nt_dmn Посмотреть сообщение
Месседж боксы вставлял для контроля после первой строки и после условного оператора. Тот что после первой строки вываливался всегда с верным значением, а условный оператор не срабатывал
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'копируем уникальное значение по которому будем производить дальнейший поиск недостающих данных
bufr = inputbook.Worksheets(1).Range("C" & ns).Value
' присваиваем номер строки начала поиска (текущая строка ns + 1)
 
MsgBox bufr
 
nsr = ns + 1
'Задаем цикл перебора строк от строки nsr до конца (до ячейки со значением "дата составления отчета")
   Do While inputbook.Worksheets(1).Range("B" & nsr).Value <> "дата составления отчета"
   ' проверяем ячейку на значение bufr. Если да, то обрабатываем, если нет то смотрим следующую строку
      If inputbook.Worksheets(1).Range("C" & nsr).Value = bufr Then
         ' обработка
         MsgBox bufr
      Else
      End If
      ' увеличиваем номер строки на 1
      nsr = nsr + 1
   Loop
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
15.11.2011, 14:02
nt_dmn,
нет в ячейках столбца C таких же данных, как в переменной bufr. А если и есть, то в ячейке есть ещё и др. данные.
0
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 15:07  [ТС]
Данные есть и точно такие же, единственное там объединение ячеек может присутствовать.
Прикрепляю пример реального отчета.
алгоритм работает след образом:
перебирает строки, в строке 31 находятся необходимые нам данные, переносим их в другую книгу, копируем значение ячейки С31 в буфер (297G7SK00001) и начиная со строки 32 ищем данное значение в столбце С.
В ячейке С46 находятся необходимое значение, а значит и нужная нам строка, с которой далее будем работать. Но что то не идет...
Вложения
Тип файла: xls отчет.xls (39.5 Кб, 25 просмотров)
0
1301 / 403 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
15.11.2011, 15:16
nt_dmn,
в ячейке C46 пробелы в конце есть.
1
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
15.11.2011, 15:18
nt_dmn, [C46] = "297G7SK00001 ", т.е. куча пробелов в конце. Для корректного поиска используй Trim$ или InStr или Find с соответствующими параметрами.
1
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 15:23  [ТС]
Спасибо большое, а пробелы то я и не заметил
0
406 / 75 / 6
Регистрация: 31.01.2011
Сообщений: 111
Записей в блоге: 1
15.11.2011, 15:27
если пробелы есть еще и в середине тогда вот вам моя функция, оптимизированная по скорости, оставляет только один пробел между словами

Visual Basic
1
2
3
4
5
6
7
8
9
Public Function TrimAll(StrText)
Dim s$, ss$
For i = 1 To Len(StrText)
s = Mid(StrText, i, 1)
ss = Mid(StrText, i + 1, 1)
If s = " " And ss = " " Then Else TrimAll = TrimAll & s
Next
TrimAll = Trim(TrimAll)
End Function
0
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
15.11.2011, 15:40
Цитата Сообщение от R Dmitry Посмотреть сообщение
оптимизированная по скорости
?
А давай сравним
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function TrimAlln(StrText)
TrimAlln = Trim$(StrText)
While InStr(1, TrimAlln, "  ")
  TrimAlln = Replace(TrimAlln, "  ", " ")
Wend
End Function
 
Sub qqq()
Dim t As Single: t = Timer
For i = 0 To 99999
'  TrimAll "qwer    wetrw   ertye   ruyrty   "
  TrimAlln "qwer    wetrw   ertye   ruyrty   "
Next i
Debug.Print Timer - t
End Sub
1
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 15:48  [ТС]
Парни, я не очень силен в VBA , просто приходится разбираться, что бы себе рутину облегчить... Подскажите мне ещё с синтаксисом:
Visual Basic
1
2
Do While inputbook.Worksheets(1).Range("B" & nsr).Value <> "Дата составления отчета:"
                                If inputbook.Worksheets(1).Range("C" & nsr).Find(bufr) Then
как правильно написать условный оператор применительно к моей ситуации?
0
406 / 75 / 6
Регистрация: 31.01.2011
Сообщений: 111
Записей в блоге: 1
15.11.2011, 15:54
Цитата Сообщение от Апострофф Посмотреть сообщение
?
А давай сравним
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function TrimAlln(StrText)
TrimAlln = Trim$(StrText)
While InStr(1, TrimAlln, "  ")
  TrimAlln = Replace(TrimAlln, "  ", " ")
Wend
End Function
 
Sub qqq()
Dim t As Single: t = Timer
For i = 0 To 99999
'  TrimAll "qwer    wetrw   ertye   ruyrty   "
  TrimAlln "qwer    wetrw   ertye   ruyrty   "
Next i
Debug.Print Timer - t
End Sub
Убедил
0
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
15.11.2011, 17:40
nt_dmn, а "Дата составления отчета:" в столбце [B] всегда одиножды или может периодически повторяться (т.е. несколько отчетов на одном листе)?
И может ли на листе быть ещё что-то после "Дата составления отчета:"?
0
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 17:54  [ТС]
после слов "Дата составления отчета:" ничего не бывает, это конец отчета. А по поводу "Find" сейчас разбираюсь, не работал никогда с ним, но на этом форуме нарыл много полезного, сейчас что нить слеплю надеюсь.
0
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
15.11.2011, 18:17
При таких условиях и объемах проще подредактировать имеющийся код (имхо)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'копируем уникальное значение по которому будем производить дальнейший поиск недостающих данных
bufr =TRIM$(inputbook.Worksheets(1).Range("C" & ns).Value)
' присваиваем номер строки начала поиска (текущая строка ns + 1)
 
MsgBox bufr
 
nsr = ns + 1
'Задаем цикл перебора строк от строки nsr до конца (до ячейки со значением "дата составления отчета")
   Do While inputbook.Worksheets(1).Range("B" & nsr).Value <> "дата составления отчета"
   ' проверяем ячейку на значение bufr. Если да, то обрабатываем, если нет то смотрим следующую строку
      If TRIM$(inputbook.Worksheets(1).Range("C" & nsr).Value) = bufr Then
         ' обработка
         MsgBox bufr
      Else
      End If
      ' увеличиваем номер строки на 1
      nsr = nsr + 1
   Loop
1
0 / 0 / 0
Регистрация: 28.04.2011
Сообщений: 60
15.11.2011, 18:26  [ТС]
Спасибо! Не знаю просто всех операторов, поэтому и тяжко.
0
 Аватар для Апострофф
9908 / 3923 / 742
Регистрация: 11.10.2011
Сообщений: 5,904
15.11.2011, 20:54

Не по теме:

Цитата Сообщение от nt_dmn Посмотреть сообщение
Парни, я не очень силен в VBA , просто приходится разбираться, что бы себе рутину облегчить... Подскажите мне ещё
Цитата Сообщение от nt_dmn Посмотреть сообщение
на этом форуме нарыл много полезного, сейчас что нить слеплю надеюсь.

Не поверит кто, землю рою, чтоб помочь!!!
вместо того, чтобы отвечать на подобное

вот картинка
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2011, 20:54
Помогаю со студенческими работами здесь

Правильная организация класса
Здравствуйте. Есть задача создания базового класса для парсинга сайтов с объявлением о работе. public abstract class ParseMain { ...

правильная организация соединений с БД
Доброе время суток ! Н-да, ламерский вопрос, но тем не менее : Есть приложение ASP.NET, база MSQL 2005, пользователей до 40 человек....

Правильная организация интерфейса
Доброй ночи. Хочу спроектировать не кривой, а нормальный пользовательский(с точки зрения хорошего программиста) интерфейс в своей...

Правильная организация таблиц
Всем доброго времени суток. Столкнулся с проблемкой при организации таблиц. Ситуация такая: Есть некоторые Изделия (Стенды), которые...

Правильная организация проекта?
Здравствуйте, расскажите пожалуйста как, как правильно организовать свой проект(Qt - C++): 1. Все функции нужно оформлять в отдельные...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru