Заполнение комбобоксов
ПоискЗаказа-имяформы,ПЗкомбоГод-имя одного из комбобоксов.
Значения теперь во всех комбо уникальны,но расположены как попало.Может кто нибудь знает,как расположить их по порядку.
a = ПоискЗаказа.ПЗкомбоГод.ListCount - 1
For u = 0 To a
s = ПоискЗаказа.ПЗкомбоГод.Column(u) * 1
If Sheets("архив").Cells(i, 14) = s Then GoTo op
Next
ПоискЗаказа.ПЗкомбоГод.AddItem Sheets("архив").Cells(i, 14)
ПоискЗаказа.ПЗкомбоГод.Text = Sheets("архив").Cells(i, 14)
End If
op:
s = ПоискЗаказа.ПЗкомбоГод.Column(u) * 1 у меня стоит
s = ПоискЗаказа.ПЗкомбоДлина.List(u)
Простите,описАлся.
Разумеется все это находится внутри цикла,который просматривает весь лист,и еще,заметил у себя ошибку,разумеется вместо
s = ПоискЗаказа.ПЗкомбоГод.Column(u) * 1 у меня стоит
s = ПоискЗаказа.ПЗкомбоДлина.List(u)
Простите,описАлся.
Так ведь у AddItem есть аргумент куда именно Add. Можешь каждый раз выискивать нужное местечко.
Так ведь у AddItem есть аргумент куда именно Add. Можешь каждый раз выискивать нужное местечко.
а подробнее?У себя в учебниках чет ниче не нашел,видимо не умею в учебники смотреть:P
Если не сложно,подскажи плизз.
а подробнее?У себя в учебниках чет ниче не нашел,видимо не умею в учебники смотреть:P
Если не сложно,подскажи плизз.
AddItem Method
For a single-column list box or combo box, adds an item to the list. For a multicolumn list box or combo box, adds a row to the list.
Syntax
Variant = object.AddItem( [ item [, varIndex]])
The AddItem method syntax has these parts:
Part Description
object Required. A valid object.
Item Optional. Specifies the item or row to add. The number of the first item or row is 0; the number of the second item or row is 1, and so on.
varIndex Optional. Integer specifying the position within the object where the new item or row is placed.
Remarks
If you supply a valid value for varIndex, the AddItem method places the item or row at that position within the list. If you omit varIndex, the method adds the item or row at the end of the list.
The value of varIndex must not be greater than the value of the ListCount property.
For a multicolumn ListBox or ComboBox, AddItem inserts an entire row, that is, it inserts an item for each column of the control. To assign values to an item beyond the first column, use the List or Column property and specify the row and column of the item.
If the control is bound to data, the AddItem method fails.
Note You can add more than one row at a time to a ComboBox or ListBox by using List.
Copyright(c) 1996 Microsoft Corporation.
Ладно,попробую завтра на наисвежайшую голову подумать.
Мдя,с индексами то я все таки по учебнику разобрался,а вот логику вложения по порядку никак не придумаю.Понедельник видимо.
Ладно,попробую завтра на наисвежайшую голову подумать.
А что там думать? Берешь очередной элемент и вставляешь на нужное место.
А что там думать? Берешь очередной элемент и вставляешь на нужное место.
их более 1000,ручками не вставишь,нужен еще цикл для прослеживания чего куда вставлять.Я уже в принципе придумал как это будет выглядеть,но видимо придется отказатся.Проект готовится для людей,которые работают на первом пне.Боюсь три вложеных цикла,да по более чем 1000 строкам,да еще 19 столбцам их комп будет обрабатыват полдня.
их более 1000,ручками не вставишь,нужен еще цикл для прослеживания чего куда вставлять.Я уже в принципе придумал как это будет выглядеть,но видимо придется отказатся.Проект готовится для людей,которые работают на первом пне.Боюсь три вложеных цикла,да по более чем 1000 строкам,да еще 19 столбцам их комп будет обрабатыват полдня.
Я попробовал программно сортировать на Пентиуме4, но доолго.
nn = 1500
With ComboBox1
.Clear
For i = 1 To nn
.AddItem Cells(i, 1)
Next i
'--------------------- sort
For it = 0 To nn - 1
For i = 1 To nn - 1
If .List(i) < .List(i - 1) Then
x = .List(i)
.List(i) = .List(i - 1)
.List(i - 1) = x
End If
Next i
Next it
End With
А почему нельзя использовать встроенну функцию сортировки в каком-нибудь уголке книги?
Range("...").Select
Selection.Sort ...
Работает махом.
Пользуйтесь. Она с .List работать, наверное, не будет (хотя попробуйте!) - а если в отдельный массив перетащить - то все будет ок.
'Демо-запуск сортировки
Dim dd As Variant
dd = Array(1, 3.2, 2, 1, 4, 2, 4, -1, 3, 1)
SortArray dd, 1
End Sub
Sub SortArray(Ar As Variant, Ord As Integer)
'Логарифмическая сортировка массива
'ВНИМАНИЕ!!! Использует процедуру SortSubArray
If Not IsArray(Ar) Then Exit Sub
Call SortSubArray(Ar, Ord, LBound(Ar), UBound(Ar))
End Sub
Sub SortSubArray(ByRef Ar As Variant, Ord As Integer, ArLow As Integer, ArHigh As Integer)
'Вспомогательная процедура для сортировки массивов
Dim TempAr As Variant, ArMid As Integer
Dim i1 As Integer, i2 As Integer, it As Integer, Flag As Integer
If ArHigh - ArLow = 0 Then Exit Sub
ReDim TempAr(ArLow To ArHigh)
ArMid = Int((ArLow + ArHigh) / 2)
Call SortSubArray(Ar, Ord, ArLow, ArMid)
Call SortSubArray(Ar, Ord, ArMid + 1, ArHigh)
i1 = ArLow
i2 = ArMid + 1
it = ArLow
Do
'Flag:
'0 - ещё ничего не определено
'1 - берём из первой половины
'2 - берём из второй половины
'3 - кончились обе половины
Flag = 0
If i1 = ArMid + 1 Then Flag = 2
If i2 = ArHigh + 1 Then
If Flag = 2 Then Flag = 3 Else Flag = 1
End If
If Flag = 0 Then
If Ar(i1) * Ord <= Ar(i2) * Ord Then Flag = 1 Else Flag = 2
End If
Select Case Flag
Case 0
Stop 'Глюк
Case 1
TempAr(it) = Ar(i1)
i1 = i1 + 1
it = it + 1
Case 2
TempAr(it) = Ar(i2)
i2 = i2 + 1
it = it + 1
Case 3
' Ничего
End Select
Loop While Flag <> 3
For it = ArLow To ArHigh
Ar(it) = TempAr(it)
Next it
End Sub
Но все-таки я думаю, самый быстрый способ - поотключать всякие пересчеты, перерисовки - и 19 раз отсортировать твой диапазон в Экселе.
Dim e As Integer ' длина интервала (кол-во элементов между ib и ie)
Dim i As Integer ' тек. индекс
Dim ib As Integer, ie As Integer ' начало и конец интервала
x = 51 ' ищем например куда всунуть такое число
ib = 0
ie = ComboBox1.ListCount
i = ie \ 2
Do
If x > ComboBox1.List(i) Then
ib = i
i = (ie - i) \ 2 + i
e = ie - ib
ElseIf x < ComboBox1.List(i) Then
ie = i
i = (i - ib - 1) \ 2 + ib
e = ie - ib
Else ' =; такой уже есть, не добавляем
MySort = Null
Exit Do
End If
Loop Until e < 2
' результат, под этим индексом нужно вставлять
MySort = ie
Определяет нужный индекс для вставки в ComboBox через метод addItem методом "Деление пополам". Смысл этого метода такой: если мы имеем отсортированный массив, то чтобы вставить новый элемент, не нужно бегать по всему массиву с проверкой, а просто делим его пополам и смотрим больше или меньше наше значение середины, если больше, то берем верхнюю половину и опять делим пополам и опять сравниваем и т.д. Такой метод поиска очень часто используется в базах данных, где кол-во элементов очень большое, а такой метод позволяет фиксированным (с верху) числом шагом дойти до нужного индекса, т.е. по формуле: кол-во максимальных шагов для поиска будет является степнью двойки общего кол-ва элементов, например - в массиве=1024 элементов понадобится не больше 10 шагов/циклов.
Но в его случае, когда элементы могут быть не числами а символами и их комбинациями проще конечно не городить огород, а воспользоваться встроенной сортировкой (котрая уже и так очень граммотно написана) как советует gacol.
От себя могу только добавить, что все это не очень сложно и долго. В скрытой книге Personal.xls, создаем новый лист (он невидимый) и копируем туда строки(1500 это не долго), запускаем сортировку, а потом распихиваем по ComboBox - так что, помойму очень хорошую идею выдвинул gacol, в твоем случае это лучший вариант.
Рассказываю что получилось.Сделал три варианта,и испытал на нужном компе.
Вариант первый:Стандартная сортировка по 19-ти позициям и возврат как было.На моем компе проходит практически незаметно,на ихнем около 40 сек.(В проекте кроме расматриевомого вопроса еще куча обработок данных)
Вариант второй:сортировка через индексы.На моем компе 10 секунд,на ихнем 2 минуты.При этом из десяти проб,четыре пробы прошли с полным повисанием Ёкселя.Не выдержал бедняга.
Вариант третий:в комбо вставляются уникальные данные без сортировки.Прошло на их компе довольно гладко.Люди выбрали именно этот вариант.
Тем не менее всем огромное спасибо,сделал для себя очень хорошие открытия.Очень понравился вариант с делением на два.Теперь буду переделывать свои проекты по новой,основываясь на новых знаниях.Еще раз огромное спасибо