Страницы: 1
RSS
Установка текущего года из массива в Combobox. VBA
 
Здравствуйте. Подскажите, как правильно установить в комбобоксе текущий год из массива этого комбобокса. При запуске формы, в комбобоксе должен отобразиться текущий год с сохранением порядка дат(т.е. при вызове выпадающего списка после 2021 должен быть 2022 и т.д. )
 
Так?
Код
ComboBox1.Value = 2021
 
ComboBox1.Value = Year(Now)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Владимир S, Ігор Гончаренко так работает, но по правде, интересовал способ с перебором всех имеющихся дат в массиве, сравнение их с текущим годом year(Date) и в случае совпадения, установить его в ComboBox1.ListIndex. Должен был это в первом посте написать, прошу прощения.
 
Перебрали даты, определили, что в них 2 (3, 5... неважно) разных года. Каким будет  ListIndex?
 
vikttur в ComboBox1.ListIndex должно быть  11. 11 - позиция в массиве  2021 года в примере. Мне не понятно, как сравнить при переборе номер позиции  с текущим годом.
Изменено: Hashtag - 21.09.2021 16:31:40
 
Цитата
Hashtag написал: в случае совпадения, установить его [год] в ComboBox1.ListIndex
Зачем сравнивать даты? Чтобы понять, есть ли там даты текущего года?
Если нужно показать в ComboBox текущий год, зачем  ListIndex?
 
vikttur Чтобы найти в массиве дату текущего года и отправить в ListIndex номер его позиции. Нужен вариант именно с ListIndex.

Попробовал сделать так:
Код
Sub Test()
Dim i As Long, arr()
arr = ComboBox1.List
For i = LBound(arr) To UBound(arr)
    If Year(Now) = arr(i, 1) Then
        ComboBox1.ListIndex = Int(i)
    End If
Next
End Sub

Выдает ошибку 9 subscript out of range. Полагаю это из-за неверного обращения к массиву внутри комбобокса  arr(i, 1).
Как это возможно исправить?
Изменено: vikttur - 22.09.2021 11:22:43
 
Hashtag, после 3й строки поставьте break point и посмотрите что у Вас в массиве - какой он размерности. Если одномерный, то Вы неверно обращаетесь к элементу массива.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Код
Private Sub UserForm_Initialize()
  Dim i&, a&(1 To 21), y&
  y = Year(Now)
  For i = 1 To UBound(a)
    a(i) = y - 12 + i
  Next
  ComboBox1.List = a: ComboBox1 = y
End Sub
Изменено: Ігор Гончаренко - 22.09.2021 09:02:20
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко В вашем варианте в комбобоксе устанавливается текущий год 2021, но при раскрытии списка комбобокса следующий год идет 2010.
 
замените
ComboBox1 = y
на
ComboBox1.ListIndex = 11

только причем здесь
Цитата
Установка текущего года из массива в Combobox. VBA
зачем когда вам нужно установить ComboBox1.ListIndex на нужную позицию вы спрашиваете как в ComboBox1 установить текущий год? ЗАЧЕМ???
понимаете, я очень примитивно устроен, я научился читать то, что написано, но не умею читать мысли, поэтому читаю "как установить текущий год?", пишу как его установить, а потом оказывается нужно совсем не это....
Изменено: Ігор Гончаренко - 22.09.2021 09:36:41
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Я вот тоже никак не могу понять автора...
Текущий год известен. Так зачем искать какие-то даты?! Для чего они, если ИЗВЕСТНОЕ число (год) можно найти в списке и без них?
 
Здравствуйте, если правильно понял.
Изменено: nbaengineer - 22.09.2021 11:34:42
 
Ігор Гончаренко, мне жаль, что я что-то не понятно пояснил, но суть задачи была в том, чтобы найти в массиве дату текущего года и отправить в ComboBox1.ListIndex номер его позиции, в случае моего примера - это позиция 11 . При запуске формы в комбобоксе отобразится текущий год и при раскрытии списка комбобокса будет идти следующий год и т.д. В вашем варианте вы предложили заменить ComboBox1 = y на ComboBox1.ListIndex = 11. Мне нужно, чтобы значение 11  в ComboBox1.ListIndex попадало автоматом, а не прописывать 11 вручную.

Вот решение:
Код
Sub Test()
Dim i As Variant, s As Date, arr()
s = Year(Now)
arr = ComboBox1.List
For i = LBound(arr) To UBound(arr)
    If s = arr(i, 0) Then
        ComboBox1.ListIndex = Int(i)
        Exit For
    End If
Next
End Sub
 
Ещё раз перечитайте сообщение 13 и ответьте на простой вопрос - дата зачем?
 
Может я не так выразился, под датами подразумевались года в массиве. В любом случае вопрос закрыт.
 
Цитата
Hashtag написал: Вот решение...
Избыточное решение.
Год - не дата, это целое число - достаточно переменной Long
Int(i) - зачем. если счетчик и без этого - целое число?
Если процедура в модуле формы, то правильнее Private Sub

Код
    With Me
        w = .Width
    End With

А это зачем при инициализации формы?

Решение может быть таким:
Код
Private Sub Test()
    With ComboBox1
        .ListIndex = Year(Date) - .List(0, 0)
    End With
End Sub

А может, и не надо искать  текущий год, а весь список с него начинать?
Код
Private Sub UserForm_Initialize()
    Dim lYear As Long: lYear = Year(Date)
    Dim i As Long
    
    With ComboBox1
        For i = lYear To lYear + 20
            .AddItem i
        Next i
        
        .Value = lYear
    End With
End Sub
 
11 в моем варианте, это индекс ТЕКУЩЕГО года в массиве годов листбокса
(11 до текущего, текущий, и 9 после текущего)
это будет работать в этом году, в следующем и в 2051 году это тоже будет работать
там будет массив 2040, 2041,2042... 2051, 2052,... 2060. и в 2051-м году индекс текущего, (2051 года) в сформированном моим макросом списке будет 11-м, как и в любом другом году - текущий год имеет индекс 11.
Изменено: Ігор Гончаренко - 23.09.2021 23:02:29
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Hashtag написал: Ігор Гончаренко,... при раскрытии списка комбобокса следующий год идет 2010.
Цитата
Ігор Гончаренко написал: замените ComboBox1 = y на ComboBox1.ListIndex = 11
Hashtag, Вы же анализируйте то, что Вам предложили. Не заменить, а добавить, тогда и год отображаться будет, и список откроется на нужной позиции
 
vikttur, спасибо за наставление, обязательно это учту. w = .Width, забыл удалить, остался от другого кода. Понравилось ваше решение через With.
Ігор Гончаренко, разобрался с вашим кодом, спасибо, все работает.
Страницы: 1
Читают тему (гостей: 1)
Наверх