Страницы: 1
RSS
При вводе значения в ячейку, нужно автоматическое появление значение в соседней ячейке
 
Всем доброго дня! Нужен ваш совет и помощь. В столбце "А" я указываю тоннаж , нужно чтобы в столбце "B" автоматом от тоннажа проставлялась цена, Хочется воспользоваться средствами VBA ,чтобы  зашить эти цены и не пользоваться функцией ВПР.
 
Цитата
Vetalb пишет: чтобы зашить эти цены и не пользоваться функцией ВПР.
Куда "зашить"? а если цена поменяется, что будете делать?
 
Правильно Михаил говорит - не нужно "зашивать": создайте таблицу соответствий на соседнем листе и с помощью VBA забирайте оттуда данные.  
 
Вариант в файле.
 
Если поменяется в ее в VBA сам и поменяю
 
Юрий Спасибо , вариант то что надо, а чтобы в сам макрос цены залить такой вариант можете показать, чтобы не было другого листа.
 
Во-первых - слишком много "забивать". Используйте Select Case.
Во-вторых - потом, если придётся редактировать - каждый раз менять код?
Зачем Вам это? Просто спрячьте лист-справочник.
 
Цитата
Vetalb пишет: чтобы не было другого листа.
его можно скрыть или очень скрыть если он вам глаза мозолит.
 
Спасибо за совет, а если добавить дополнительное условие имя подрядчика пример прикладываю  Лист 3 имена подрядчиков Под1 , Под2 , ПОд3
 
Вот пример
 
Если уж "зашить" очень хочется, то можно так:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
        Application.EnableEvents = False
        Select Case (Target)
            Case 10: Target.Offset(0, 1) = 1524168
            Case 11: Target.Offset(0, 1) = 1534418
            Case 12: Target.Offset(0, 1) = 1552312
            '...Продолжение
        Case Else
                MsgBox "Такого значения не найдено.", 48, "Ашыпка!"
                Target.Offset(0, 1) = ""
        End Select
    End If
    Application.EnableEvents = True
End Sub 
Цитата
Vetalb пишет: а если добавить дополнительное условие...
А вот по этому поводу - нужно сразу было говорить
 
Так ничего ведь не меняется:

Код
Select Case (Target & target.offset(,1))
      Case "10Под2": Target.Offset(0, 2) = 1524168
 
и т.д.  :)

Но конечно это не дело. Да и может строк кода не хватить :(
Изменено: Hugo - 13.06.2014 12:19:22
 
Юрий М,  Да я начинал также через Case забивать понял , что долгая история.
 
Цитата
Юрий М пишет: А вот по этому поводу - нужно сразу было говорить
Забыл упомянуть  :(
 
Цитата
Vetalb пишет: Да я начинал также через Case забивать понял , что долгая история.
Зачем тогда спрашивали, как "зашить"?))
===
Посмотрел Ваш второй файл - плохой пример: например, тоннажу 10 соответствуют несколько подрядчиков - кого из них считать за "правильного"? Это я просто ради интереса спрашиваю...
 
Может вариант есть другой поэтому и интересуюсь и я не знал как сделать чтобы сразу значение появлялось. Я в листе 1 добавил столб для подрядчик который нас интересует. Если поможете с этим вопросом , тему можно будет закрывать.
 
Да Вы даже код не сохранили в новом примере. Вам лень? Мне тоже.
 
Мне не лень сейчас попробую еще раз у меня файл не загружался сюда с кодом
 
Цитата
Vetalb пишет: у меня файл не загружался сюда с кодом
Это Вы серъёзно?
 
Ваш первый код.
 
Цитата
Юрий М пишет:
Это Вы серъёзно?
Серьезно
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, iColumn As Integer
    If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
        Application.EnableEvents = False
        With Sheets("Лист2")
            Set Rng = .Rows(4).Find(what:=Target.Offset(0, 1), LookIn:=xlValues, lookAt:=xlWhole)
            If Not Rng Is Nothing Then
                iColumn = Rng.Column
                Set Rng = .Columns(iColumn).Find(what:=Target, LookIn:=xlValues, lookAt:=xlWhole)
                If Not Rng Is Nothing Then
                    Target.Offset(0, 2) = Rng.Offset(0, 1)
                Else
                    MsgBox "Такого тоннажа не найдено.", 48, "Ашыпка!"
                    Target.Offset(0, 2) = ""
                    Application.EnableEvents = True
                    Exit Sub
                End If
            Else
                MsgBox "Такого подрядчика не найдено.", 48, "Ашыпка!"
                Target.Offset(0, 1) = ""
                Application.EnableEvents = True
                Exit Sub
            End If
        End With
    End If
    Application.EnableEvents = True
End Sub

 
 
Как вариант - сперва найти в строке подрядчика, затем (если его нашли) искать в этом столбце ниже тоннаж (диапазоны поиска в коде можно ограничить, чтоб лишнего не найти, ну или оперативно его определить).
 
Юрий М, Спасибо Огромное.
На последок Юрий посоветуйте книгу по макросам на данный момент я закончил "Мэтью Харрис программирование MS Excel за 21 день".
 
Обратите внимание на совет Игоря (Hugo) по поводу ограничения диапазона: для тоннажа 10 и Подрядчика1 будет найдено значение "12/18" в ячейке D289.
По литературе: я в своё время читал Уокенбаха, многие советуют Гарнаева. Ну лучший учебник - форум: смотрите чужие решения, анализируйте их. "Полезняшки" сохраняйте у свою "Копилку".
 
Пока Юрий писал код, я немного подглядывал  :)
Я бы всё лишнее убрал ниже данных, через пустую строку, а искал тоннаж в intersect(Rng.currentregion, .Columns(iColumn))
Ну как-то так.
А изменение удобнее отслеживать по тому столбцу, который последний заполняется, или по обоим - при условии что соседний уже заполнен.
 
Всем Спасибо!
 
Юрий М
Здравствуйте! Воспользовался Вашим макросом, очень помогло, спасибо!
Но обнаружилась ошибка, своими силами не удаётся решить, помогите пожалуйста!
При вставке новой строки ругается на:
Target.Offset(0, 1) = Rng.Offset(0, 1)
Изменено: Андрей Максимов - 05.11.2025 13:32:21
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range
    If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
        If Target.Cells.CountLarge = 1 Then
            With Sheets("Лист2")
                Set Rng = .Columns(1).Find(what:=Target, LookIn:=xlValues, lookAt:=xlWhole)
                If Not Rng Is Nothing Then
                    Target.Offset(0, 1) = Rng.Offset(0, 1)
                Else
                    MsgBox "Такого значения не найдено.", 48, "Ашыпка!"
                    Target.Offset(0, 1) = ""
                End If
            End With
        End If
    End If
End Sub
 
Спасибо Вам большое! Сам бы не смог.
я копался не в ту сторону! Буду изучать countLarge
спасибо!
Страницы: 1
Читают тему
Наверх