VBA Dynami c Диапазон Определенное имя Vlookup - PullRequest
1 голос
/ 14 июля 2020

мир! Что ж, я здесь впервые, так что не сердитесь, если я сделал что-то не так.

Мне нужно заполнить ComboBox RowSource на основе другого значения Combobox. Пользовательская форма с комбинированным списком

В моем проекте есть два зависимых ComboBox: Laborator ie и Test

Они инициализируются источниками строк, созданными в Defined Name с уважением ко всем лабораториям (TodosLaborator ios) и все тесты (TodasAmostragens)

У меня 464 лабораторных теста и 5 лабораторий. Не все лаборатории могут проводить все типы тестов.

Пример:

     TEST                               | LABORATORIE
     álcool benzilio                    | ALAC
     n-Butano (vide álcoo n-butílico)   | ALAC, ENVIRON
     Clorobenzeno                       | ALAC, ENVIRON, SOLUTECH

У меня есть списки в Defined Names со всеми тестами, выполненными лабораторией expecifi c, поэтому, если я выберу lab в моем первом ComboBox, другой ComboBox RowSource заполняется списком лабораторных тестов expecifi c.

    Private Sub labb1_Change()
    
        If labb1.Value = "" Then labb1.RowSource = "todoslaboratorios"
        If labb1.Value = "ALAC" Then lab1.RowSource = "labALAC"
        If labb1.Value = "ENVIRON" Then lab1.RowSource = "labENVIRON"
        If labb1.Value = "FIRJAN" Then lab1.RowSource = "labFIRJAN"
        If labb1.Value = "SOLUTECH" Then lab1.RowSource = "labSOLUTECH"
        If labb1.Value = "UNIANALISYS" Then lab1.RowSource = "labUNIANALISYS"
    
    End Sub

Я пытаюсь сделать обратное, так как я выбираю тест expecifi c, я хочу, чтобы ComboBox лабораторий был заполнен только теми лабораториями, которые могут выполнять этот тест.

У меня есть лист со всеми лабораториями, тестами и их ценами. Я организовал тесты / лабораторию следующим образом: тесты и лабораторные работы

Я не понял, как сделать диапазон с определенным именем Dynami c с помощью ссылки Dynami c. .. Я пробовал такие вещи, как:

  =index($t3$, match($t$1, todasamostragens, 0), 
         offset($t$3,match($t$1, todasamostragens, 0),0,0,5)

Я на правильном пути? Может ли кто-нибудь помочь мне в достижении моей цели?

С уважением к программистам.

1 Ответ

0 голосов
/ 14 июля 2020

Мне удалось решить мою проблему другим подходом.

Я заказал тесты в одну строку и поместил лаборатории в каждый столбец конкретного c теста. тесты с лабораториями

Затем я использовал .find для поиска в этом диапазоне и создания определенного имени.

Для тестов ComboBox:

Private Sub Amostragens()

            Dim teste As Variant
            
            Dim linharange As range
            Dim colunarange As range
            'Dim Lrow As Long
            Dim range As range
            Dim rangeD As range
                      
            Set range = Worksheets("lab").range("t3:ro3")
            
            
            If lab1.Value = "" Then
                labb1.RowSource = "todoslaboratorios"
                Exit Sub
            End If
            
            If lab1.Value <> "" Then
                With range
                     If .Find(what:=lab1.Value) <> "" Then
                     
                     Set linharange = range.Find(what:=lab1.Value).Offset(2, 0)
                     
'                     Lrow = Cells.Find(what:="*", _
'                     AFTER:=range(linharange.Address()), _
'                     searchorder:=xlPrevious, _
'                     searchdirection:=xlNext, _
'                     MatchCase:=False).Row
                     
                     Set colunarange = range.Find(what:=lab1.Value).Offset(6, 0)
                     
                     Set rangeD = .range(linharange.Offset(-2, -19), colunarange.Offset(-2, -19))
                     rangeD.Name = "AmostragensLab"
                     
                     End If
                 End With
                
                labb1.RowSource = "AmostragensLab"
                
            End If
End Sub

Для лаборатории ComboBox:

Private Sub Laboratorios()

            If lab1.Value = "" Then
                    If labb1.Value = "" Then labb1.RowSource = "todoslaboratorios"
                    If labb1.Value = "ALAC" Then lab1.RowSource = "labALAC"
                    If labb1.Value = "ENVIRON" Then lab1.RowSource = "labENVIRON"
                    If labb1.Value = "FIRJAN" Then lab1.RowSource = "labFIRJAN"
                    If labb1.Value = "SOLUTECH" Then lab1.RowSource = "labSOLUTECH"
                    If labb1.Value = "UNIANALISYS" Then lab1.RowSource = "labUNIANALISYS"
                Exit Sub
            End If

            If lab1.Value <> "" Then
            Exit Sub
            End If

End Sub

При изменении:

        Private Sub labb1_Change()

        Laboratorios
        valorlab

        End Sub
            
        Private Sub lab1_change()
            
        Amostragens
        valorlab
            
        End Sub

Я изучаю VBA и буду признателен за предложения по улучшению этого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...