проверка значений

#excel #vba

#excel #vba

Вопрос:

 If UserForm1.ComboBox1.Value = "One" Then

    If UserForm1.ComboBox2.Value = "Attentive" Then

    For Each listItem In ws.Range("D1:D56").SpecialCells(xlConstants)

    With Me.ListBox1
    If listItem = "Y" Then .AddItem Sheets("Sheet2").Range("A" amp; listItem.Row).Value
    End With

    Next listItem

End If
  

Диапазон A имеет имена.Диапазон C имеет значения в виде «Один», «Два» и «Три».Внимателен диапазон D, который имеет значения в форме «Y» и «N».

Что делает эта программа, так это: проверяет диапазон D1: D56, который содержит значения «Один» в диапазоне C, а затем выводит имена из столбца A, в котором есть «Y», в поле списка.

Теперь я хочу добавить еще одну запись с «единицей», для этого мне придется изменить диапазон на D57 сейчас, и я не хочу повторять это, и это должно быть учтено само по себе, а не путем изменения кода вручную.

Как это можно сделать?

Комментарии:

1. Пожалуйста, не забудьте отметить вопросы как решенные, если вы получите подходящий ответ. Это позволяет другим разработчикам знать, что ваш вопрос решен.

Ответ №1:

Я понимаю, вы просто хотите сделать диапазон, который вы проверяете на наличие значений, динамическим. Поскольку в специальных ячейках используется usedrange, вы можете просто использовать:

 For Each listItem In ws.Columns(4).SpecialCells(xlConstants)
  

Или вы можете использовать:

 For Each listItem In ws.Range("D1", ws.cells(rows.count,"D").end(xlup)).SpecialCells(xlConstants)
  

На основе ваших комментариев вот обновленный ответ:

 Dim rCell As Range
Dim sValue As String '// Represents your One, Two, Three values
Dim sAttentive As String '// Represents your attentive value

sValue = UserForm1.ComboBox1.Value

If UserForm1.ComboBox2.Value = "Attentive" Then
    sAttentive = "Y"
Else
    sAttentive = "N"
End If

For Each rCell In ws.Columns(4).SpecialCells(xlConstants)
    If rCell.Value = sAttentive And rCell.Offset(, -1) = sValue Then
        Me.ListBox1.AddItem Sheets("Sheet2").Range("A" amp; listItem.Row).Value
    End If
Next rCell
  

Комментарии:

1. Ваш код работает, но он также выбирает значения, которых не должен, например, если вы выбираете «Два» в поле со списком 2, тогда он также извлекает значения из «один», у которого есть «Y» в столбце внимания.

2. Ваш вопрос немного сложен для понимания, можете ли вы отредактировать свой пост, чтобы показать либо пример данных, либо скриншот. Я смогу помочь вам решить эту проблему, если вы сможете таким образом уточнить свои требования.

3. Прежде всего, есть два поля со списком, в первом из которых выбирается «Один», «Два» и «Три», эти три значения находятся в столбце C, я имею в виду многие из них, в зависимости от этого другого поля со списком, в котором есть «внимательный» в столбце D, который имеет форму «Y» и «N». Итак, если я выберу «Один» из первого поля со списком и «внимательный» из другого, в нем должны отображаться все имена из столбца A, имеющие «Один» в столбце C и «Y» в столбце «внимательный».

4. Я.ListBox1.AddItem Sheets(«Лист2»). Диапазон («A» amp; ListItem.Row). Значение, это выдает ошибку «Переменная объекта или с не установленным блоком переменной»

5. Упс, попробуй: Me.ListBox1.AddItem rCell.Offset(, -3).Value