Здравствуйте нужна помощь. Есть сканер штрих кода, который при сканировании копирует артикул в текущую выделенную ячейку. Как сделать чтобы из таблицы автоматически находилась строка содержащая артикул и менялся его статус с 1 к примеру на 2 ? все в файле примере.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngFind As Range
If Target.CountLarge = 1 Then
If Not Intersect(Target, [I1]) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = 2
Application.EnableEvents = True
End If
End If
End If
End Sub
Сканируйте в I1 или замените в коде на любой другой удобный для Вас адрес.
Формула массива (ФМ) вводится Ctrl+Shift+Enter Memento mori
спасибо , глянул. только нужно чтобы весь столбец работал, не только I1. И есть ли возможность сделать ещё один столбец , при сканировании в который значение менялось бы на другое к примеру 3. Можно ли так сделать ?
upd. со столбцом понятно. Просто поменял на Columns("I") Буду туда сканировать. Хотелось бы сделать ещё пару столбцов с другими статусами. а вносить текст можно ? Возможно такое ?
Все работает. Сделал для другой колонки статус 3. Можно ли чтобы копировало текст или хотя бы вот это: (48/19A) В точности ну можно без скобок. Я работаю на складе. Есть одна большая таблица со всем товаром. Задача состоит в том чтобы сканером делать перемещения.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngFind As Range
For Each cell In Target 'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("B2:B100")) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A100
With cell.Offset(0, 2) 'вводим в соседнюю справа ячейку дату
.Value = Now
.EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
If Target.CountLarge = 1 Then
If Not Intersect(Target, Columns("U")) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = [2]
Application.EnableEvents = True
End If
End If
End If
If Target.CountLarge = 1 Then
If Not Intersect(Target, Columns("V")) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = [1]
Application.EnableEvents = True
End If
End If
End If
Next cell
End Sub
Вопросов 2. Если их решить я буду очень счастлив. 1) Я добавил скрипт, чтобы автоматом ставилось время. Но он почему то работает только когда идёт правка вручную а не вашим скриптом. 2) Как сделать чтобы в столбец "наличие" ставились не только цифры, но и буквы
cliff99, Вы бы нашли время, да заглянули в раздел "Приемы" - там куча "полезняшек". Вот ссылка на одну из них, которая отвечает на Ваш вопрос. Да и поиском можно было найти: вопрос задавался неоднократно.
Так я и взял оттуда этот скрипт. Но время ставится только когда идёт правка вручную. Мне нужно же чтобы при изменении ячеек этим скриптом ставилась дата. там же в теме и задавали вопрос:
Цитата
макрос срабатывает только в том случае если ввод в ячейку происходит в ручную, а не с помощью данной формулы
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngFind As Range
If Target.CountLarge = 1 Then
If Not Intersect(Target, [I1]) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = 2
Application.EnableEvents = True
End If
End If
End If
End Sub
Вы считали сканером ШК, в ячейку заносится значение - и это изменение будет отслежено процедурой Worksheet_Change. Ручной ввод тоже будет отслежен. Изменение, полученное формулой, этим событием не отслеживается. Нужно использовать другое - Worksheet_Calculate.
Только почему разговор про формулу, если Вы интересовались про сканер? Откуда всплыла формула? Про формулу ещё такой момент: формула ведь отслеживает изменение в неких ячейках? Отслеживайте тогда при помощи процедуры Worksheet_Change изменения в них.
Вы видимо не так поняли. Сканер заносит акртикул в столбец Скриптом который мне дали выше изменяется значение определенной ячейки. В данном случае с 1 на 2. Но при этом время не проставляется. гляньте файл примера. оно ставится , только если вручную менять цифру. должно работать так: сканер выгрузил несколько артикулов в столбец который отвечает за продажу товара. Соответственно меняется статус с 1 на 2. И проставляется время.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngFind As Range
If Target.CountLarge = 1 Then
If Not Intersect(Target, [I1]) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = 2
Application.EnableEvents = True
End If
End If
End If
End Sub
События отключаются перед занесением Application.EnableEvents = False а потом включаются. Это сделано для того, чтоб не зациклить ваш код. Собственно в это
Юрий М написал: И Вы ничего не ответили про ФОРМУЛУ: откуда она взялась?
Да смысл такой что насчёт этого кода люди и писали что время не проставляется если изменение вносятся через формулу, любо скрипт. Мне же нужно , чтобы время ставилось именно при изменении статуса с 1 на 2 или наоборот. Но судя по всему никто не знает как это сделать.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngFind As Range
If Target.CountLarge = 1 Then
If Not Intersect(Target, [I1]) Is Nothing Then
Set rngFind = [A:A].Find(Target, , xlValues, xlWhole, , xlNext, False, False, False)
If Not rngFind Is Nothing Then
Application.EnableEvents = False
Intersect([B:B], rngFind.EntireRow).Value = 2
Application.EnableEvents = True
End If
End If
End If
End Sub
Есть код , он меняет статус 1 на 2 . Когда копируешь значение в ячейку I1. Если в столбце A найдётся такое значение как I1 то напротив его в столбце B поставится значение 2. Как сделать чтобы в столбце C ещё ставилось и время ?