Страницы: 1
RSS
Проверка значения ячеек и заполнение соседней
 
Добрый день!
Подскажите как сделать макросом, проверку значения в колонке А и согласно найденному значению заполнять соответствующую ячейку в колонке С.
Например: проверяем А2 если там ОТИ-4 тогда заполняем в С2 "По охране труда контролёров БТК". Вариантов значений будет порядка 20. То есть  если в А2 другое значение то в С2 тоже другие данные. Ниже привел соответствие ОТИ и данным в колонке С
ОТИ-4По   охране труда контролёров БТК
ОТИ-18По охране труда сверловщика
ОТИ-19По охране труда   зубошлифовщика
ОТИ-22По охране труда протяжчика
ОТИ-52По охране труда шлифовщиков
ОТИ-53По охране труда при   эскплуатации абразивного инструмента
ОТИ-57По охране труда для   фрезеровщика
ОТИ-60По охране труда для   грузчиков, и лиц, выполняющих погрузочно-разгрузочные и складские работы
ОТИ-65По охране труда для   стропальщиков
ОТИ-80По охране труда для лиц,   занятых управлением грузоподъёмными кранами с пола или стационарного пульта
ОТИ-118По охране труда при работе   на координатно-измерительных машинах (КИМ)
ОТИ-144По охране труда при работе   на долбёжных станках
ОТИ-192По охране труда зуборезчика
ОТИ-451По охране труда станочников
ОТИ-491По охране труда для   машинистов моечных машин
ОТИ-510По охране труда для лиц,   занятых обработкой металла с использованием смазочно-охлаждающих жидкостей
ОТИ-810По охране труда при работе   с ручным слесарным инструментом
ОТИ-1012По охране труда для   дефектоскопистов по магнитному и ультразвуковому контролю
ОТИ-1244По охране труда для   операторов станков с программным управлением
 
см. вложение
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Спасибо. С ВПР да, получается реализовать. Хочу именно в vba, чтобы не добавлять лист в документ и названия тянулись из кода. Понимаю что нужно будет все условия прописать. Я не селен в vba похожего примера на форумах не нашел
 
см. вложение
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Получилось решить задачу таким способом:
Код
Sub Name()
Dim a As Variant

For a = 2 To 30
          
            If Cells(a, "A") = "ОТИ-4" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда контролёров БТК"
               
            ElseIf Cells(a, "A") = "ОТИ-18" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда сверловщика"
  
            ElseIf Cells(a, "A") = "ОТИ-19" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда зубошлифовщика"
               
            ElseIf Cells(a, "A") = "ОТИ-22" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда протяжчика"
               
            ElseIf Cells(a, "A") = "ОТИ-52" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда шлифовщиков"
               
            ElseIf Cells(a, "A") = "ОТИ-53" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда при эскплуатации абразивного инструмента"
               
            ElseIf Cells(a, "A") = "ОТИ-57" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для фрезеровщика"
               
            ElseIf Cells(a, "A") = "ОТИ-60" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для грузчиков, и лиц, выполняющих погрузочно-разгрузочные и складские работы"
               
            ElseIf Cells(a, "A") = "ОТИ-65" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для стропальщиков"
               
            ElseIf Cells(a, "A") = "ОТИ-80" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для лиц, занятых управлением грузоподъёмными кранами с пола или стационарного пульта"
               
            ElseIf Cells(a, "A") = "ОТИ-118" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда при работе на координатно-измерительных машинах (КИМ)"
               
            ElseIf Cells(a, "A") = "ОТИ-144" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда при работе на долбёжных станках"
               
            ElseIf Cells(a, "A") = "ОТИ-192" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда зуборезчика"
               
            ElseIf Cells(a, "A") = "ОТИ-451" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда станочников"
               
            ElseIf Cells(a, "A") = "ОТИ-491" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для машинистов моечных машин"
               
            ElseIf Cells(a, "A") = "ОТИ-510" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для лиц, занятых обработкой металла с использованием смазочно-охлаждающих жидкостей"
               
            ElseIf Cells(a, "A") = "ОТИ-810" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда при работе с ручным слесарным инструментом"
               
            ElseIf Cells(a, "A") = "ОТИ-1012" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для дефектоскопистов по магнитному и ультразвуковому контролю"
               
            ElseIf Cells(a, "A") = "ОТИ-1244" Then
               Worksheets("Список инструкций").Cells(a, "D") = "По охране труда для операторов станков с программным управлением"
                
            End If
Next
    
End Sub
 
Может лучше так?
Код
Sub Name()
Dim a As Integer, b As Integer
    arr1 = Array("ОТИ-4", "ОТИ-18", "ОТИ-19", "ОТИ-22", "ОТИ-52", "ОТИ-53", "ОТИ-57", "ОТИ-60", "ОТИ-65", _
        "ОТИ-80", "ОТИ-118", "ОТИ-144", "ОТИ-192", "ОТИ-451", "ОТИ-491", "ОТИ-510", "ОТИ-810", "ОТИ-1012", "ОТИ-1244")
    arr2 = Array("По охране труда контролёров БТК", "По охране труда сверловщика", "По охране труда зубошлифовщика", "По охране труда протяжчика", "По охране труда шлифовщиков", _
        "По охране труда при эскплуатации абразивного инструмента", "По охране труда для фрезеровщика", "По охране труда для грузчиков, и лиц, выполняющих погрузочно-разгрузочные и складские работы", _
        "По охране труда для стропальщиков", "По охране труда для лиц, занятых управлением грузоподъёмными кранами с пола или стационарного пульта", "По охране труда при работе на координатно-измерительных машинах (КИМ)", _
        "По охране труда при работе на долбёжных станках", "По охране труда зуборезчика", "По охране труда станочников", "По охране труда для машинистов моечных машин", "По охране труда для лиц, занятых обработкой металла с использованием смазочно-охлаждающих жидкостей", _
        "По охране труда при работе с ручным слесарным инструментом", "По охране труда для дефектоскопистов по магнитному и ультразвуковому контролю", "По охране труда для операторов станков с программным управлением")
    For a = 2 To 30
        For b = LBound(arr1) To UBound(arr1)
            If Cells(a, 1) = arr1(b) Then
                Worksheets("Список инструкций").Cells(a, 4) = arr2(b)
                Exit For
            End If
        Next
    Next
End Sub
 
Msi2102, Ваш код на много лучше. У меня пока получается примитивными командами. Подскажите, почему при запуске вашего кода у меня потребовало обозначить переменные arr1 и arr2?
 
потому что сверху в модуле написано:
Option Explicit
(требовать обязательное обьявление переменных)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Лучше никогда не называть макросы по имени Name
P.S. У меня даже не запускается такой макрос с таким именем и пишет ошибку: Expected: Expression
 
Ігор Гончаренко, Спасибо
 
New, Благодарю, учту
 
чтобы не использовать число 30 в коде, можно в макросе самому вычислять номер последней строки в столбе А на листе "Список инструкций", тогда код будет таким

Код
Sub Name2()
    Dim a As Long, b As Long
    Dim arr1 As Variant, arr2 As Variant
    
    arr1 = Array("ОТИ-4", "ОТИ-18", "ОТИ-19", "ОТИ-22", "ОТИ-52", "ОТИ-53", "ОТИ-57", "ОТИ-60", "ОТИ-65", _
        "ОТИ-80", "ОТИ-118", "ОТИ-144", "ОТИ-192", "ОТИ-451", "ОТИ-491", "ОТИ-510", "ОТИ-810", "ОТИ-1012", "ОТИ-1244")
        
    arr2 = Array("По охране труда контролёров БТК", "По охране труда сверловщика", "По охране труда зубошлифовщика", "По охране труда протяжчика", "По охране труда шлифовщиков", _
        "По охране труда при эскплуатации абразивного инструмента", "По охране труда для фрезеровщика", "По охране труда для грузчиков, и лиц, выполняющих погрузочно-разгрузочные и складские работы", _
        "По охране труда для стропальщиков", "По охране труда для лиц, занятых управлением грузоподъёмными кранами с пола или стационарного пульта", "По охране труда при работе на координатно-измерительных машинах (КИМ)", _
        "По охране труда при работе на долбёжных станках", "По охране труда зуборезчика", "По охране труда станочников", "По охране труда для машинистов моечных машин", "По охране труда для лиц, занятых обработкой металла с использованием смазочно-охлаждающих жидкостей", _
        "По охране труда при работе с ручным слесарным инструментом", "По охране труда для дефектоскопистов по магнитному и ультразвуковому контролю", "По охране труда для операторов станков с программным управлением")
    
    With Worksheets("Список инструкций")
        For a = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row '<- вот тут мы вычисляем макросом номер последней строки в столбце 1 (он же столбец А)
            For b = LBound(arr1) To UBound(arr1)
                If Cells(a, 1) = arr1(b) Then
                    .Cells(a, 4) = arr2(b)
                    Exit For
                End If
            Next
        Next
    End With
End Sub
Изменено: New - 01.08.2022 15:47:51
 
Msi2102, New, господа, тут же прям хрестоматийно для словарей работа  :)
Ну какой прямой перебор…
Изменено: Jack Famous - 01.08.2022 17:06:11
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
из примера видно, что тут совсем небольшие объёмы. А так да..., но объём кода тоже больше

Код
Sub Name2()
    Dim Dict As Object, arr1 As Variant, arr2 As Variant, arrOut As Variant, arrTemp As Variant, i As Long
    
    arr1 = Array("ОТИ-4", "ОТИ-18", "ОТИ-19", "ОТИ-22", "ОТИ-52", "ОТИ-53", "ОТИ-57", "ОТИ-60", "ОТИ-65", _
        "ОТИ-80", "ОТИ-118", "ОТИ-144", "ОТИ-192", "ОТИ-451", "ОТИ-491", "ОТИ-510", "ОТИ-810", "ОТИ-1012", "ОТИ-1244")
         
    arr2 = Array("По охране труда контролёров БТК", "По охране труда сверловщика", "По охране труда зубошлифовщика", "По охране труда протяжчика", "По охране труда шлифовщиков", _
        "По охране труда при эскплуатации абразивного инструмента", "По охране труда для фрезеровщика", "По охране труда для грузчиков, и лиц, выполняющих погрузочно-разгрузочные и складские работы", _
        "По охране труда для стропальщиков", "По охране труда для лиц, занятых управлением грузоподъёмными кранами с пола или стационарного пульта", "По охране труда при работе на координатно-измерительных машинах (КИМ)", _
        "По охране труда при работе на долбёжных станках", "По охране труда зуборезчика", "По охране труда станочников", "По охране труда для машинистов моечных машин", "По охране труда для лиц, занятых обработкой металла с использованием смазочно-охлаждающих жидкостей", _
        "По охране труда при работе с ручным слесарным инструментом", "По охране труда для дефектоскопистов по магнитному и ультразвуковому контролю", "По охране труда для операторов станков с программным управлением")

    If UBound(arr1) <> UBound(arr2) Then
        MsgBox "Массивы данных не совпадают по размеру!", vbExclamation, "Внимание"
        Exit Sub
    End If

    With Worksheets("Список инструкций")
        arrTemp = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
    End With
    
    Set Dict = CreateObject("Scripting.Dictionary")
    Dict.comparemode = 1
    For i = LBound(arr1) To UBound(arr2)
        Dict.Add arr1(i), arr2(i)
    Next i
    
    ReDim arrOut(1 To UBound(arr1), 1 To 1)
    For i = LBound(arrTemp) To UBound(arrTemp)
        arrOut(i, 1) = Dict(arrTemp(i, 1))
    Next i
    
    With Worksheets("Список инструкций")
        .Range("B2").Resize(UBound(arrOut), 1).Value = arrOut
    End With
End Sub
Изменено: New - 01.08.2022 18:10:25
 
Цитата
Jack Famous написал:
господа, тут же прям хрестоматийно для словарей работа
А ты думаешь, что никто не догадался  :D
Во первых я ему просто показал, как можно лучше организовать цикл.
А во вторых, чем умничать взял бы да написал как надо.
 
Msi2102, справедливо  :D
Но нет времени и желания, что поделать)) хотел на Select Case накидать вариант…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Но нет времени и желания, что поделать))
такая же фингя, лето  :D
 
в #4 написано на словаре
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Msi2102, а ещё, я бы вынес "ОТИ-" и "По охране труда " в переменные, чтобы не повторять в каждом элементе  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Ігор Гончаренко написал:
в #4 написано на словаре
Вот и приложил бы код, и оправдываться не нужно было-бы  :D  :D  :D
Цитата
Jack Famous написал:
я бы вынес "ОТИ-" и "По охране труда "
это ещё две строчки кода, пальцы-то не казенные, по клаве клацкать  :D
Изменено: Msi2102 - 02.08.2022 12:29:50
 
Цитата
Msi2102: пальцы-то не казенные
дык лучше один раз в переменные прописать, чем везде одно и тоже писать - код захламлять  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
дык лучше один раз в переменные прописать,
Дык это домашнее задание ТС будет  :D  :D  :D
 
стандартном модуле:
Код
Public D

Function DTxt(k$)
  If D.exists(k) Then DTxt = D(k)
End Function


В ЭтаКнига
Код
Private Sub Workbook_Open()
  Dim a, r&
  Set D = CreateObject("scripting.dictionary")
  a = Worksheets(2).[a1].CurrentRegion
  For r = 1 To UBound(a): D(a(r, 1)) = a(r, 2): Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх