Excel VBA Макросы: Возвращение значения в одной ячейке в зависимости от значения в другой ячейке

Автор gtz, 28 декабря 2017, 15:37

gtz

Подскажите макрос для возвращения значения в одной ячейке в зависимости от значения в другой. По принципу функции если.
Но хочется реализовать на VBA. Только начинаю изучать.
Суть такая - в одной ячейке отражается одно значение в другой в зависимости от значения в первой отражается соответствующее.
По принципу
если в a1 значение равно "АВС", то в b1 значение становится = "QWE"
если в a1 значение равно "DEF", то в b1 значение становится = "GHJ"
и т.д.
если значения нет, то оставить ячейку пустой
при этом реализация должна быть в группе строк (a2,b2; a3,b3; и т.д.) в тех строках в которых имеется значение в ячейках столбца

Как я понял реализация через if than else.
Но вот как работать с несколькими строками не понимаю + так чтобы сразу возвращалось значение.

При этом цель, чтобы не вызывать макрос дополнительно а он сразу возвращал значение без каких-либо событий.

Администратор

Чтобы макрос запускался без участия юзера, есть два способа:
1) использование события;
2) использование формулы, которая будет запускать макрос.

Способ с использованием события.
Макрос работает со столбцами A, B. В столбец A вставляйте данные, макрос будет подставлять данные в соответствующую строку в столбец B.

В пункт 2 запишите фразы. Можно сделать так, чтобы писать фразы не в код макроса, а на лист, т.е. можно специально создать лист.

Макрос
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim phrases As Collection

    '1. Различные проверки.
    ' Если изменение произошло в нескольких ячейках, то ничего не делаем,
        ' т.к. для этого надо как-то по особому обработать ячейки.
    If Target.CountLarge > 1 Then Exit Sub
    ' Если изменение произошло не в столбце A, то ничего не делаем.
    If Target.Column <> 1 Then Exit Sub
    ' Если изменение произошло в заголовке, то ничего не делаем.
    If Target.Row < 2 Then Exit Sub
   
    '2. Сюда запишите фразы, с которыми надо работать.
        ' В Key - что искать, в Item - новая фраза.
    Set phrases = New Collection
    phrases.Add Item:="QWE", Key:="АВС"
    phrases.Add Item:="GHJ", Key:="DEF"
   
    '3. Если юзер удалил данные, то очистка ячейки в столбце B.
    If Target.Value = "" Then
        Target.Offset(0, 1).ClearContents
        Exit Sub
    End If
   
    '4. Вставка в столбец B соответствующих данных.
    ' Включение перехватчика ошибок. Если в коллекции "phrases" не будет
        ' искомого текст, то произойдёт run-ошибка, которая остановит макрос.
        ' Чтобы макрос продолжил работу, используется перехватчик ошибок.
    On Error Resume Next
        ' Используется CStr, т.к. Key работает с типом String.
        Target.Offset(0, 1).Value = phrases(CStr(Target.Value))
    ' Откл. перехватчика ошибок, что ловить непредвиденные ошибки.
    On Error GoTo 0
   
End Sub
[свернуть]

[вложение удалено администратором]

Администратор

Способ с использованием формулы.
В этом способе вам надо вставлять формулы в столбец B.
В файле формула вставлена в "B2".

Макрос
Function MyIf(Target As Range) As Variant

    Dim phrases As Collection


    '1. Сюда запишите фразы, с которыми надо работать.
        ' В Key - что искать, в Item - новая фраза.
    Set phrases = New Collection
    phrases.Add Item:="QWE", Key:="АВС"
    phrases.Add Item:="GHJ", Key:="DEF"
   
    '2. Если юзер удалил данные, то очистка ячейки в столбце B.
    If Target.Value = "" Then
        MyIf = ""
        Exit Function
    End If
   
    '3. Вставка в столбец B соответствующих данных.
    ' Включение перехватчика ошибок. Если в коллекции "phrases" не будет
        ' искомого текст, то произойдёт run-ошибка, которая остановит макрос.
        ' Чтобы макрос продолжил работу, используется перехватчик ошибок.
    On Error Resume Next
        ' Используется CStr, т.к. Key работает с типом String.
        MyIf = phrases(CStr(Target.Value))
        ' Если произошла ошибка, то записываем в переменную-функцию "MyIf" пустую строку,
            ' иначе эксель подставит 0.
        If Err.Number <> 0 Then
            MyIf = ""
        End If
    ' Откл. перехватчика ошибок, что ловить непредвиденные ошибки.
    On Error GoTo 0
   
End Function
[свернуть]

[вложение удалено администратором]

gtz

Спасибо за идеи.
Больше конечно привлек внимание 1-й способ. Невидимая рука макроса так сказать.
Спасибо за разъяснения.