Вырезать всю ячейку на основе определенного текста в ячейке и вставить в новую ячейку

У меня есть таблица с шестью столбцами в Excel, которую я использую со сканером штрих-кода. Мы сканируем пользовательские QR-коды, которые отображают текст в каждой ячейке. Сканирование начинается со сканирования QR-кода сотрудника на его бейдже, за которым следует конкретный(е) товар(ы), которые выдаются или возвращаются. Диапазон таблицы B2:G2. Столбец B помечен номером сотрудника, столбцы C-F помечены ITEM #1-4 и 6-й столбец и последний столбец помечен IN/OUT. Сканер мы используем вкладки через каждую ячейку после того, как пользовательский текст сканируется и вводится в каждую ячейку.

Я хотел бы вырезать всю ячейку на основе определенного текста IN или OUTи вставьте его в новую ячейку. Например, если в столбцах D-F сканер штрих-кода входит IN или OUTя хочу вырезать IN или OUT значение из ячейки и вставьте его в столбец Gа также автоматически перейти к следующей строке таблицы и ячейке в столбце B после пасты происходит. Столбец B и колонка C никогда не должен содержать текст, содержащий IN или OUT.

Это возможно? Я нашел аналогичный вопрос, связанный с несколькими книгами и вырезанием целых строк вместо ячеек, поэтому я решил, что это также может быть достижимо.

Я экспериментировал с различными методами VBA, макросами и формулами в Excel, но ни один из них не дал нам того, что мы хотели. Наша цель — ограничить количество необходимых сканирований. Если человек зайдет и отсканирует все 4 пункта, то не надо будет вырезать и вставлять IN или OUT. После сканирования 4 предметов сканер сканирует QR-код с текстом IN или OUT в столбец G и автоматически переходить в столбец B. Тем не менее, большинство наших людей проверяют только 1, 2 или 3 элемента, и мы хотим исключить любые дополнительные «пустые» сканирования или необходимость переходить к компьютеру, чтобы нажать вкладку или щелкнуть в новой ячейке. Столбцы, в которых это произойдет, всегда будут B-G но нужно будет продолжать для каждой строки (B2:G2, B3:G3, B4:G4) Мы будем использовать не менее 600 строк для приблизительно 300 человек, которые у нас есть.

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

2 ответа
2

Вы можете написать макрос, который запускает «OnEnter» или «OnTab» (используя Application.OnKey "{ENTER}" (or "{TAB}", whichever), "ThisMacro") — который затем будет запускаться КАЖДЫЙ раз Enter нажимается по любой причине — он будет проверять столбец, в котором находится текущая выбранная ячейка, и, если это не ячейка столбца DF, он будет завершен. Когда ячейка столбца DF является текущей выбранной ячейкой, она будет оценивать содержимое указанной ячейки. Если бы не «In» или «Out», это было бы End. Но если это «Вход» или «Выход», значение будет вырезано и перемещено в ячейку столбца G строки, а затем вставлено значение вырезания. Чтобы закончить, он выберет ячейку столбца B в следующей строке, оставив вас готовыми к сканированию следующего идентификатора сотрудника.

Сам я эти макросы не пишу, никогда не было необходимости. Таким образом, могут возникнуть различные неочевидные проблемы, которые необходимо решить. Например, в приведенном выше я беспечно говорю «конец» пару раз. Возможно, он прерывается ДО выполнения операции Enter нормально бы сделал. Возможно нет. Если нет, то беспечное «конец» — это конец. Но если так, то Enterнормальный эффект не произойдет, и вам придется вставить строку в макрос, чтобы выполнить обычную операцию, т. е. переместиться по ячейке или переместиться вниз по строке и обратно в столбец B. (Неясно, как вы выполняете ТО, перемещаясь вниз по строке и возвращаясь к столбцу B… одна мысль, что эти данные находятся в формальной таблице Excel, и поэтому, достигнув правого края, столбец G, TAB перемещается вниз по строке и и к левому краю, или, возможно, это старая школа, и макрос выбирает (и поддерживает этот выбор) диапазон, чтобы TAB (или Enter) будет действовать так же, как это предусмотрено в Таблице.) Так что есть и такой уровень рассмотрения, как это будет взаимодействовать с указанным макросом. И другие вещи могут возникнуть также. Тем не менее, все должно быть довольно тривиально, чтобы иметь дело с. Утомительная, конечно, и детальная работа, но все же тривиальная, тем более, что вы уже знакомы с макросами.

Поскольку рассматриваемая работа не требует интенсивного использования, тот факт, что макрос будет запускаться каждый раз, когда выбранная клавиша нажимается или «нажимается», не должен вызывать ни малейшего беспокойства. Немного отличается от использования такого захвата событий в электронной таблице, в которой вы будете нажимать Enter 2000 раз в день.

(Но, возможно, даже не тогда. Это было бы коротким, и VBA ослепляюще быстр, когда просто запускает код, не выполняя несколько сотен, тысяч или десятков тысяч операций «прочитать эту ячейку, сделать эти вещи, записать в эту ячейку» в петля.)

(Если бы я писал их время от времени, я бы предоставил пример кода для изменения. Я этого не делаю, поэтому, скорее всего, только введу вас в заблуждение. Если я еще этого не сделал (!), Хотя я видел примеры с течением времени делать все, что я упомянул выше. Но видеть их и делать их (успешно) — это две довольно разные вещи. Написание и сборка кусочков должны быть простыми, а примеры каждого бита легко найти в Интернете. если вы еще не знаете каждую деталь, поэтому я не чувствую, что дразню вас идеей, не предлагая ничего по существу.)

Джордж

Вот код, который мне прислали, и он работает именно так, как мне нужно. Вставка его как ответ для всех, кто ищет что-то подобное.

Private Sub Worksheet_Change(ByVal Target As Range)
'check if only one cell is changed
If Target.CountLarge > 1 Then Exit Sub
'check if target is in columns D, E, or F
If Intersect(Target, Range("D:F")) Is Nothing Then Exit Sub
'check if target value is capital "IN" or "OUT"
If Target.Value <> "IN" And Target.Value <> "OUT" Then Exit Sub

Application.EnableEvents = False             'prevent triggering another change event
Target.Cut Destination:=Cells(Target.Row, 7) 'cut and paste in column G
Cells(Target.Row + 1, 2).Activate            'move active cell to next row, column B
Application.EnableEvents = True              'reenable events
End Sub

бтвольф

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *