Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152

Сравнение строк по значению одного столбца и перезапись если есть совпадения

02.11.2012, 11:54. Показов 7583. Ответов 81
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я тут уже столько наспрашивала...Но мне это оч тяжело дается..
может знает кто как поступить в след. ситуации: у меня есть 2 файла эксель. С вашей помощью удалось копировать из одного листа в другой по параметру.
Но сейчас условие усложнилось: если мы начинаем копировать, а у нас уже есть эта неделя (44 к примеру), то она должна записываться поверху (обновляться, грубо говоря). дополнительный параметр- фамилия (то есть если фамилия совпадает и неделя совпадает, то перезаписывается)

вот то, что я пыталась сделать, используя предыдущие решения для копирования

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 If flag = False Then
     Set wrkBook = Workbooks.Open(fnam$)
 With wrkBook.Worksheets("Database WEEKUREN")
 
 Set SourceRegion1 = wrkBook.Worksheets("Database WEEKUREN").Range("G:G").Cells.SpecialCells(xlCellTypeFormulas, 0)
 SearchVal1 = SourceRegion.Item(SourceRegion.Rows.Count, 1).Value
        For Each TempCell In SourceRegion
        For Each TempCell1 In SourceRegion1
           If TempCell.Value = SearchVal Then
           If TempCell1.Value = SearchVal1 Then
     TempCell.EntireRow.Copy
    wrkBook.Worksheets("Database WEEKUREN").Cells.SpecialCells(xlCellTypeLastCell) _
        .Offset(-1, -1).EntireRow.PasteSpecial (xlPasteValues)
       End If
       End If
       Next
       Next
           wrkBook.Close True
    End With

Пока мне на SpecialCells выдает unable to get SpecialCells or Range property
И я еще не пыталась вводить к критериям фамилию..
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2012, 11:54
Ответы с готовыми решениями:

В файл вводятся имена, пол и рост человека. Программа считывает данные из файла и выдает совпадения если в нем есть мужчины одного роста. Тема:работа
В файл вводятся имена, пол и рост человека. Программа считывает данные из файла и выдает совпадения если в нем есть мужчины одного роста....

Значение одного столбца = значению другого столбца
SELECT FROM WHERE значение одного столбца = значению другого столбца ; Как построить этот запрос ? SELECT FamilyName, Name,...

Вывести сообщение, если не найдено ни одного совпадения
#include <iostream> #include <math.h> using namespace std; struct student { char fam; int godr, godp, os, progr,...

81
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 12:17  [ТС]
файл с кодом (на всякий)

New folder (3).rar
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 13:20
Вообще-то в коде (в файле, на форуме вообще непонятный out_of_context кусок) много лишнего, т.к. вся разница между кликом и даблкликом - это 1 или -5
Вот и заведите переменную (можно public вместо флага), её меняете кликами, затем выполняете копирование со сдвигом по этой переменной.
Тогда код macro сократится до пяти строк.
Второй вопрос сложнее, но решаем, причём несколькими способами.
Я бы делал так - открыл книгу, куда копируем, циклом перебрал диапазон (через массив) и занёс в словарь сочетание фамилия|неделя c номером строки, где оно есть.
Затем перед копированием поискал в словаре текущее копируемое сочетание, и если есть - то копировал в ту строку.
Если нет - копируем в низ листа.
Это думаю можно применить при любом итоговом коде - что в форуме или в файле.

Но тогда немного непонятно, почему то 1, то -5?
Файл в работе проверить не могу, т.к. сейчас нет 2007 - всё что могу, это посмотреть код
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 13:32  [ТС]
Hugo121, там даблклик уже не актуален...хотя я думаю, приготится еще
вот вы мне текстом написали, и я поняла что далеко мне даже до самого простого
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 13:45
Ну почему далеко - scripting.dictionary совсем не сложная штука, и логически совершенно понятная.
Запомнили в словаре , что "вася|44" сидит в строке 15.
Собрались копировать строку, где есть "вася|44", посмотрели в словаре - ага, копируем в 15.
Нет там такого - копируем под таблицу.
Всё, что Вам нужно - найти пример с scripting.dictionary и разобрать, как работает. Я тут уже кажется тройку написал - но правда последний (вчера) сложноват для понимания будет...
Ну а цикл по строкам (чтоб занести в словарь) Вы уже вероятно сделать сумеете. Можно без массива, но через массив быстрее, если данных тысячи.
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 13:58  [ТС]
Hugo121, а как мне задать имя и неделю?
имен более 200, есть в списке. я только знаю в каком столбце находятся фамилии
неделя , как я понимаю, находится с помощью моего кода
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 14:23
Ну Вы ведь выше писали - "если фамилия совпадает и неделя совпадает". Значит где фамили и неделя - Вы вероятно знаете. Правда я нашёл только неделю
Вот берёте их и склеиваете в одно целое через разделитель (не обязательно, но так лучше/надёжнее в общем случае). кладёте в словарь. Аналогично позже проверяете.

Добавлено через 20 минут
Я думаю, что возможно Вам нужно это:
1. циклом по "получателю" запоминаем в словаре всех кто какие где.
2. циклом по "источнику" в другом словаре (!) собираем аналогичные данные. Причём в словаре запоминается последний номер строк вася|41, вася|42, вася|44.
Если нужна только последняя неделя - тогда другие в словарь не заносим.
3. циклом по этому словарю перебираем все ключи (тут будут только номера строк с последними данными), ищем аналогичные в другом словаре и копируем (номера всех строк есть в словарях, если нет куда - копируем в конец).
Так можно легко обновить все данные по всем фамилиям за все недели (если конечно в новом файле все свежие данные).
0
 Аватар для SlavaRus
1124 / 237 / 37
Регистрация: 15.03.2010
Сообщений: 728
02.11.2012, 14:51
Но сейчас условие усложнилось: если мы начинаем копировать, а у нас уже есть эта неделя (44 к примеру), то она должна записываться поверху (обновляться, грубо говоря). дополнительный параметр- фамилия (то есть если фамилия совпадает и неделя совпадает, то перезаписывается)
Надо оставить только уникальные записи отфильтрованные по неделе и фамилии?
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 14:59  [ТС]
SlavaRus, не совсем
найти в одной таблице имя+неделя
найти во второй имя+неделя
если совпали - с первой копируем во вторую поверху найденных записей
то есть этакое обновление
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 15:15
Я тоже предполагаю, что в получателе будут только уникальные, а в источнике могут быть разные записи, из которых нужна только последняя по каждой фамилии-неделе.
Хотя конечно кто его знает...
Но в получателе не вижу смысла в десяти вася-44
А в источнике могут быть например накопительный итог собирается, или просто нужно последнее значение.

Каролинка, так проясните - как там в самом деле?
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 15:34  [ТС]
там есть 200 человек(васей), каждый из них за неделю заполняет, что он делал (Activiteit) по часам (сколько на каждую активность) - в итоге получается таблица, в которой для одного васи в одну неделю пару столбцов одинаковые, а остальные (к примеру, количество часов, активность итд) отличаются, то есть по идее 2х одинаковых строк не должно быть

Добавлено через 1 минуту
хотя я думаю на уникальность их отфильтровать не помешало бы

Добавлено через 1 минуту
потом это все копируется в другой файл, в таблицу
скопировалось
затем какой-то из этих вась изменил какое-то количество часов, хочет обновить копированный диапазон

Добавлено через 58 секунд
а вот как обновить - я собственно и не знаю
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 15:37  [ТС]

насчет фильтра: по идее должно быть приблизительно столько строк, а выходит 600
я просто боюсь подумать, что будет если 200 челк по 600 строк отправят)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 15:51
Всё равно не понятно... В получателе сколько строк, где в одной строке "вася" и "конкретная_неделя"?
Сколько в источнике?
Данные "вася" обновляет всегда все, или например обновит только в третьем столбце, а остальные отставит пустыми? (хотя раз ранее копировали строки целиком - значит обновляем сразу все данные - но мало ли...)
И обновление - это всегда последняя строка вася-неделя, или вдруг может поменяться где-то выше, если таких строк много, но в каждой данные в разных столбцах?

Может быть можете составить простой пример на 2 листа конкретно по этой задаче - без кучи неотносящегося к делу мусора/кодов?
И обьясните - что из чего как должно получится.
Тогда На выходных смогу заняться кодом - а пока некогда и неначём.

Добавлено через 5 минут
Так, судя по скрину - возможно нужно в словарь класть вася/неделя/активейт - номер_строки
Тогда в этот номер и записывать изменившиеся часы.

Добавлено через 1 минуту
А сколько будет человек - по-барабану, хоть мильён.
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 18:03  [ТС]
я не знаю сколько строк, в том-то и еще одна проблема. вообще где-то 25-50, в зависимости от того, как заполнит пользователь
лучше пусть всегда все обновляются, чтобы потом не возникало лишних вопросов


я попробую составить пример без всех лишних подсчетов, расчетов и тп
будет пример, допишу тогда что откуда куда копировать\обновлять

Добавлено через 2 минуты
Hugo121, я попробую со словарями поэкспериментировать..

Добавлено через 2 часа 6 минут
а можно ли как-то в качестве ключа и данных задавать название стобца (A к примеру)?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 18:07
Можно, но не понимаю - зачем? Как это использовать?
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 18:15  [ТС]
Hugo121, я просто думаю как задать ключ-данные
скорее всего (но я еще уточняю) в первом файле фамилия и неделя они все одинаковые
я просто не знаю как обратиться к этой паре "вася|44" ((
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 18:17
смысл словаря в чём - когда он заполнен данными, Вы всегда сразу по ключевым данным получаете номер строки, где эти данные лежат.
Не нужно их долго и мучительно искать по листу, особенно если нужно найти по трём ячейкам строки.
В словаре записано - вася/44/упаковка - 5, вася/44/перевозка - 15.
Теперь когда циклом по источнику дошли до строки, где
вася|qwert|10|44|trewq|упаковка|256
сразу копируете эту строку в №5 (из словаря по склейке нужных ячеек извлекаете номер 5, куда и копируете).
Если ключ не найдётся - значит строка новая, пишем в конец.
И как применить тут название столбца как ключ - да никак...
0
 Аватар для каролинка
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 152
02.11.2012, 18:20  [ТС]
так я просто не знаю как Ваш совет применить, если я имя и номер недели не смогу явно задать
как мне их извлечь?

может подойдет
Visual Basic
1
ActiveSheet.Range("a1").End(xlDown).Select
?
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.11.2012, 18:28
Как не сможете задать имя/номер? Они ведь не бегают по строке - всегда в ведь одном столбце лежат!

Как обратиться - есть строка с ячейками - делаем условно
t= [a1] & "|" & [c1] & "|" & [f1]
получаем в t строку "вася|44|упаковка", кладём в словарь, в item словаря к этому значению номер анализированной строки.
Затем при цикле по другому листу аналогично этот номер получаем из словаря.
Это стандартный ход, во всех кодах на словаре есть такое (только вместо номера может быть объект, другой словарь например, как я вчера делал).

Добавлено через 5 минут
В общем, давайте небольшой пример данных - вечером напишу пример кода на словаре.
А то может я вообще не правильно задачу понял, парю тут мозги девушке
0
 Аватар для SlavaRus
1124 / 237 / 37
Регистрация: 15.03.2010
Сообщений: 728
02.11.2012, 19:22
Цитата Сообщение от каролинка Посмотреть сообщение
Hugo121я просто не знаю как обратиться к этой паре "вася|44" ((
Написал поиск. Посмотрите может поможет. Код ищет 2 и ФИО петров, в случае совпадения красит строки желтым и выводит адрес.
Вложения
Тип файла: xls Find.xls (43.0 Кб, 15 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2012, 19:22
Помогаю со студенческими работами здесь

Как сделать выбор данных одного столбца из нескольких таблиц, если имя этого столбца везде совпадает?
Подскажите, как сделать выбор данных одного столбца из нескольких таблиц, если имя этого столбца везде совпадает. Например, у меня есть 3...

У меня есть таблица в ней 3 столбца и 2 колонки, есть border после 1,2-й строк
Как убрать 3 border? <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Task-1</title> ...

Выяснить, есть ли в матрице ненулевые элементы и если есть, то указать индексы одного из ненулевых элементов
Дана целая квадратная матрица порядка n. Выяснить, есть ли в матрице ненулевые элементы и если есть, то указать индексы одного из...

Есть ли в данном массиве элемент, равный заданному числу? Если есть, то вывести номер одного из них.
Есть ли в данном массиве элемент, равный заданному числу? Если есть, то вывести номер одного из них. Напишите программу пожалуйста,очень...

Отбор строк по значению одного из полей и суммирование выбранных данных в ленточной форме
Здравствуйте! Подскажите пожалуйста. В ленточной форме имеется свободное поле, отображающее сумму времени по определенному полю ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru