Добрый день. Есть Лист База и Лист Результат. На листе База первая строка содержит данные: ПерваяA1, ВтораяB1 и ТретьяC1. Строка ниже содержит данные: ПерваяA2, ВтораяB2 и ТретьяC2. A1 B1 C1 A2 B2 C2 Открыт лист База. Если в буфере обмена находятся данные полностью совпадающие с данными ячейки A1, т.е. "ПерваяA1", то нужно данные из соседних ячеек этой же строки скопировать на соседний Лист Результат таким образом, чтобы данные ячейки B1 скопировались в ячейку M5 (лист Результат), а из ячейки C1 в ячейку R7 (лист Результат). И в случае, если в буфере обмена будут данные ячейки A2, то B2 в M5 (лист Результат), а C2 в R7. Надеюсь я не перепутал имена ячеек, давно не трогал клавиатуру. Если можно без функций и формул решить данную задачу. Искал по поискам, но лишь схожие примеры находил.
Добрый день. Есть Лист База и Лист Результат. На листе База первая строка содержит данные: ПерваяA1, ВтораяB1 и ТретьяC1. Строка ниже содержит данные: ПерваяA2, ВтораяB2 и ТретьяC2. A1 B1 C1 A2 B2 C2 Открыт лист База. Если в буфере обмена находятся данные полностью совпадающие с данными ячейки A1, т.е. "ПерваяA1", то нужно данные из соседних ячеек этой же строки скопировать на соседний Лист Результат таким образом, чтобы данные ячейки B1 скопировались в ячейку M5 (лист Результат), а из ячейки C1 в ячейку R7 (лист Результат). И в случае, если в буфере обмена будут данные ячейки A2, то B2 в M5 (лист Результат), а C2 в R7. Надеюсь я не перепутал имена ячеек, давно не трогал клавиатуру. Если можно без функций и формул решить данную задачу. Искал по поискам, но лишь схожие примеры находил.timo64uk
Добрый день. Можно макросом прочитать буфер обмена, поискать данные по Базе, скопировать что-то куда-то... Но вот пока мысленно запускать макросы никто на практике не умеет, нужно что-то где-то нажать или активировать.
Добрый день. Можно макросом прочитать буфер обмена, поискать данные по Базе, скопировать что-то куда-то... Но вот пока мысленно запускать макросы никто на практике не умеет, нужно что-то где-то нажать или активировать.Hugo
Макросы храню в отдельной книге эксель на рабочем столе в файле Макрос.xlsm Ссылки на макросы вынес в верхнюю панель быстрого доступа в эксель. Запускаю каждый макрос нажатием иконок на панель быстрого доступа любого рабочего файла эксель. Я понимаю как важен пример в виде эксель файла. Сегодня приложу его. Я надеюсь верно понял по запуску макросов. _____________ Файл приложил к первому сообщению темы
Макросы храню в отдельной книге эксель на рабочем столе в файле Макрос.xlsm Ссылки на макросы вынес в верхнюю панель быстрого доступа в эксель. Запускаю каждый макрос нажатием иконок на панель быстрого доступа любого рабочего файла эксель. Я понимаю как важен пример в виде эксель файла. Сегодня приложу его. Я надеюсь верно понял по запуску макросов. _____________ Файл приложил к первому сообщению темыtimo64uk
Сообщение отредактировал timo64uk - Суббота, 28.09.2024, 02:24
Sub CopyFromClip() Dim x$, c As Range With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .GetFromClipboard x = Replace$(.GetText(1), """", """""") End With Set c = Sheets("База").Columns(1).Find(x, , xlValues, xlWhole) If Not c Is Nothing Then With Sheets("Результат") .Range("M5").Value = c.Offset(, 1).Value .Range("R7").Value = c.Offset(, 2).Value End With End If End Sub
[/vba] Код не сложный, основной вопрос по запуску/процессу - можно код выполнять по переходу на этот лист, но ведь не при каждом переходе он нужен, да и это сложно организовать если этот файл xlsx. Если будете запускать из персональной книги кнопкой на панели или зададите горячие клавиши - тогда ОК, рабочий вариант. P.S. кстати нужно бы как-то обохначить нашлось или нет - если есть динамики/звук то я бы наверное два разных звучка поставил чтоб знать о результате. Или можно активировать найденную ячейку и например помечать цветом. Смотря по задаче.
timo64uk, например такой код [vba]
Код
Option Explicit
Sub CopyFromClip() Dim x$, c As Range With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .GetFromClipboard x = Replace$(.GetText(1), """", """""") End With Set c = Sheets("База").Columns(1).Find(x, , xlValues, xlWhole) If Not c Is Nothing Then With Sheets("Результат") .Range("M5").Value = c.Offset(, 1).Value .Range("R7").Value = c.Offset(, 2).Value End With End If End Sub
[/vba] Код не сложный, основной вопрос по запуску/процессу - можно код выполнять по переходу на этот лист, но ведь не при каждом переходе он нужен, да и это сложно организовать если этот файл xlsx. Если будете запускать из персональной книги кнопкой на панели или зададите горячие клавиши - тогда ОК, рабочий вариант. P.S. кстати нужно бы как-то обохначить нашлось или нет - если есть динамики/звук то я бы наверное два разных звучка поставил чтоб знать о результате. Или можно активировать найденную ячейку и например помечать цветом. Смотря по задаче.Hugo
Спасибо. Буду пробовать. Самое главное, хотелось понять как происходит процесс копирования на другой лист. В сети много примеров по переносу строки уеликом и минимум по ячейкам. Да, я думал про оповещения сообщениями, но на данном этапе визуально буду проверять.
Спасибо. Буду пробовать. Самое главное, хотелось понять как происходит процесс копирования на другой лист. В сети много примеров по переносу строки уеликом и минимум по ячейкам. Да, я думал про оповещения сообщениями, но на данном этапе визуально буду проверять.timo64uk
Здесь копируется не ячейка, а её значение. Т.е. всякие шрифты/заливки/форматы не копируются. Но если нужно - то можно и копировать ячейку целиком, но Вы просили копировать данные.
Здесь копируется не ячейка, а её значение. Т.е. всякие шрифты/заливки/форматы не копируются. Но если нужно - то можно и копировать ячейку целиком, но Вы просили копировать данные.Hugo
понял, данных достаточно. формат данных из ячейки не важен. Хорошо, что в вашем коде не используется ThisBook/Sheet как привязка к активному листу. По оповещению подумал, и представил, что найденных данных (в буфере которые) в ячейках столбца может быть несколько, как на практике обычно и бывает. Допустим в данном примере А1 и В1 содержат "Иванов", и в буфере обмена после Ctrl+C находится "Иванов", запускаю макрос... В итоге в М5 и R7 скопируются данные одного из Ивановых. Возможен ли в данном случае сценарий с заполнением нижестоящих ячеек М6, М7,.. И соответственно R8, R9, ... ?
понял, данных достаточно. формат данных из ячейки не важен. Хорошо, что в вашем коде не используется ThisBook/Sheet как привязка к активному листу. По оповещению подумал, и представил, что найденных данных (в буфере которые) в ячейках столбца может быть несколько, как на практике обычно и бывает. Допустим в данном примере А1 и В1 содержат "Иванов", и в буфере обмена после Ctrl+C находится "Иванов", запускаю макрос... В итоге в М5 и R7 скопируются данные одного из Ивановых. Возможен ли в данном случае сценарий с заполнением нижестоящих ячеек М6, М7,.. И соответственно R8, R9, ... ?timo64uk
Сообщение отредактировал timo64uk - Воскресенье, 29.09.2024, 03:04
В этом коде: 1. ищет ячейку целиком, если только содержит среди прочего, то не найдёт. Но можно изменить xlWhole на xlPart и будет искать частично. 2. ищет только до первого найденного, но можете дописать поиск всех, в хелпе по Find этот пример подробно описан.
Но если искать всех и заполнять столько строк сколько найдено - я бы наверное через массив циклом проверял, если данных до 100к строк и совпадений может быть много. Или (если нужен точный поиск по значению ячеек) вообще глобально в начале техпроцесса загнать координаты всех данных в словарь, и затем уже без всяких поисков брать сразу всё что нужно из памяти пока не перезагрузишь Эксель.
В этом коде: 1. ищет ячейку целиком, если только содержит среди прочего, то не найдёт. Но можно изменить xlWhole на xlPart и будет искать частично. 2. ищет только до первого найденного, но можете дописать поиск всех, в хелпе по Find этот пример подробно описан.
Но если искать всех и заполнять столько строк сколько найдено - я бы наверное через массив циклом проверял, если данных до 100к строк и совпадений может быть много. Или (если нужен точный поиск по значению ячеек) вообще глобально в начале техпроцесса загнать координаты всех данных в словарь, и затем уже без всяких поисков брать сразу всё что нужно из памяти пока не перезагрузишь Эксель.Hugo
- да, это от примера осталось где с адресами ячеек было дело, тут наверное лишнее. Основное - GetText(1), если там получаете то значение что нужно искать, то всякие кавычки/замены лишнее.
- да, это от примера осталось где с адресами ячеек было дело, тут наверное лишнее. Основное - GetText(1), если там получаете то значение что нужно искать, то всякие кавычки/замены лишнее.Hugo
Hugo, Обнаружил одну особенность, при копировании в буфер значений ячеек в конце добавляются два символа - 10 и 13, перенос строки и возврат каретки. Может быть есть смысл удалять эти непечатаемые символы методом WorksheetFunction.Clean.
Hugo, Обнаружил одну особенность, при копировании в буфер значений ячеек в конце добавляются два символа - 10 и 13, перенос строки и возврат каретки. Может быть есть смысл удалять эти непечатаемые символы методом WorksheetFunction.Clean.i691198
i691198, ну тут ведь не было сказано откуда что копировали, может из содержимого ячеек, может из текста со стороны... А так можно просто на всякий заменять в содержимом эти символы на ничего. Если конечно не нужно чтоб они были внутри искомого - т.е. нужно видеть задачу целиком - что, откуда, куда, зачем вообще.
i691198, ну тут ведь не было сказано откуда что копировали, может из содержимого ячеек, может из текста со стороны... А так можно просто на всякий заменять в содержимом эти символы на ничего. Если конечно не нужно чтоб они были внутри искомого - т.е. нужно видеть задачу целиком - что, откуда, куда, зачем вообще.Hugo