Страницы: 1
RSS
Список дат в ComboBox c уникальными записями и привязанные к динамичному массиву дат
 
Здравствуйте!
Столкнулся со следующей проблемой,  прошу помощи опытных форумчан.
Требуется создать форму с списком, списком который будет иметь следующие свойства:

1. Иметь формат даты: dd/mm/yyyy
2. Содержать уникальные записи в выпадающем списке ComboBox
3. Массив дат на листе может сокращаться или увеличиваться, и список в ComboBox тоже должен это учитывать.
С первой задачей я вроде справился, вторую пробою решить через UniqueItems, но что-то не получается. По третьей задаче, я думал написать следующий код, но excel выводит ошибку:
Код
1
2
3
4
5
Private Sub UserForm_Initialize()
Dim iMassiv As Range
Set iMassiv = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
ComboBox1.Value = iMassiv
End Sub
Прошу помочь, подсказать, где можно что-нибудь изучить, чтобы решить эти задачи.
 
Код
1
2
3
Dim iMassiv
iMassiv = Range(Cells(2, 1), Cells(Rows.Count, 1). End (xlUp))
ComboBox1.List = iMassiv
F1 творит чудеса
 
Так пробовал прописать. Не работает.
 
Вот так с уникальными датами (но в том же порядке, что и на листе)
Код
1
2
3
4
5
6
7
8
9
10
Private Sub UserForm_Initialize()
Dim iMassiv, i as Long
iMassiv = Range(Cells(3, 2), Cells(Rows.Count, 2). End (xlUp))
With CreateObject("scripting.dictionary")
For i = 1 To UBound(iMassiv)
   .Item(iMassiv(i, 1)) = 1
Next
ComboBox1.List = .Keys
End With
End Sub
Поправил для вашего файла-примера. Всё работает
Изменено: Максим Зеленский - 12.09.2014 18:05:24
F1 творит чудеса
 
Да, спасибо, Максим огромное! А без словаря получается здесь никак не обойтись, если мы говорим об уникальных записях в выпадающем списке ComboBox?
 
А чем он мешает? Он создается на лету и по окончании инициализации уничтожается, память не жрет, быстренько выгружает ключи сразу в список без промежуточных переборов массивов и т.п. - "всё правильно сделал". Словарь или коллекция - наверное, самые быстрые и простые способы формирования списков уникальных значений в VBA.
Ну еще можно, конечно, самостоятельно побегать по массиву и удалить дубликаты - на любителя.
F1 творит чудеса
 
Словарь - отличное решение! И сам код меньше =) К VBA возвращаюсь время от времени, и пока словарей и коллекций касался очень косвенно.
 
Еще один вопрос. Знаю, что не хорошо писать, не имея своего первичного кода, пусть и неверного, но сейчас его нет. Допустим, есть массив, состоящий из нескольких столбцов. Через окно UserForm требуется задать начальное значение в ComboBox 1 и конечное в ComboBox2.  Затем используя эти значения, копировать часть массива со всеми столбцами на другой лист.



Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub UserForm_Initialize()
iMassiv = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
ComboBox1.List = iMassiv
ComboBox2.List = iMassiv
End Sub
Private Sub CommandButton1_Click()
If iMassiv(Cell(i).Value) = ComboBox1.Value;iMassiv (Cell (j).Value) = ComboBox2.Value Then
Range(Cell(i), Cell(j)).Select
Worksheets("Лист2").Paste
End If
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub

Знаю, что код неверный в части ComboBox  и дальнейшего копирования на другой лист. Идея процедуры If в коде  заключается в том, что если значение  в ComboBox 1 находит совпадение в ячейке массива, и если значение  в ComboBox 1 находит совпадение в ячейке массива, то происходит копирование диапазона ячеек, где начальной и конечной ячейками будут вышеописанные ячейки.
 
строка
Код
1
If iMassiv(Cell(i).Value) = ComboBox1.Value;iMassiv (Cell (j).Value) = ComboBox2.Value Then
предполагает наличие 2 циклов. Где они?
Код
1
iMassiv
в процедуре
Код
1
Private Sub CommandButton1_Click()
отсутствует напрочь.
Код
1
iMassiv(Cell(i).Value
)
Вообще не понятно, с каким хреном есть.
 
Хорошо, тогда поясните как написать следующее условие. Если выбранное значение в списке ComboBox1 совпадает хотя бы с одним значением ячейки из массива iMassavie, то происходит копирование этой ячейки на другой лист.  
 
Цитата
Максим Зеленский написал:
Sample.xlsm  (18.43 КБ)
Здравствуйте! Будьте добры, если возможно, добавить в данный код отображение дат в выпадающем списке в формате dd.mm.yyyy.
Заранее спасибо!
 
К этому коду:
Код
1
2
3
4
5
6
7
8
9
10
Private Sub UserForm_Initialize()
Dim iMassiv, i as Long
iMassiv = Range(Cells(3, 2), Cells(Rows.Count, 2). End (xlUp))
With CreateObject("scripting.dictionary")
For i = 1 To UBound(iMassiv)
   .Item(iMassiv(i, 1)) = 1
Next
ComboBox1.List = .Keys
End With
End Sub
 
Цитата
sc0ffer написал:
Через окно UserForm требуется задать начальное значение в ComboBox 1 и конечное в ComboBox2.  Затем используя эти значения, копировать часть массива со всеми столбцами на другой лист.
в модуль UserForm:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim iMassiv As Range
Private Sub UserForm_Initialize()
Set iMassiv = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
ComboBox1.List = iMassiv.Value
ComboBox2.List = iMassiv.Value
End Sub
Private Sub CommandButton1_Click()
Dim R&, Cel As Range
Worksheets("Лист2").Cells.ClearContents
For Each Cel In iMassiv
    If Cel.Value >= Val(Me.ComboBox1) And Cel.Value <= Val(Me.ComboBox2) Then
        R = R + 1
        Cel.Resize(, 3).Copy Worksheets("Лист2").Cells(R, 1)
    End If
Next
Me.Hide
Worksheets("Лист2").Activate
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
Изменено: Михаил С. - 24.09.2016 12:11:25 (Добавил файл)
 
Цитата
Natvba написал:
отображение дат в выпадающем списке в формате dd.mm.yyyy.
как вариант:
Код
1
2
3
4
5
6
7
8
9
10
Private Sub UserForm_Initialize()
Dim iMassiv As Range, i As Long, C As Range
Set iMassiv = Range(Cells(3, 2), Cells(Rows.Count, 2).End(xlUp))
With CreateObject("scripting.dictionary")
    For Each C In iMassiv
       .Item(C.Text) = 1
    Next
    ComboBox1.List = .Keys
End With
End Sub
 
Михаил С.,
Спасибо Вам большое! То что надо! :)
Страницы: 1
Читают тему
Loading...