#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