Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Заполнение комбобоксов

1.2K
20 октября 2003 года
Штурман
147 / / 01.08.2003
Емеет место быть лист с девятнадцатью столбами,и порядка 1500 строк.Данные на них разбросанны,и могут повторятся.Так вот надо эти данные запихнуть в комбобоксы,но желательно так,чтоб они нормально выглядели.Сортировать 19 раз лист слишком муторно.Как убрать повторяющиеся значения я придумал.
ПоискЗаказа-имяформы,ПЗкомбоГод-имя одного из комбобоксов.
Значения теперь во всех комбо уникальны,но расположены как попало.Может кто нибудь знает,как расположить их по порядку.

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:
1.2K
20 октября 2003 года
Штурман
147 / / 01.08.2003
Разумеется все это находится внутри цикла,который просматривает весь лист,и еще,заметил у себя ошибку,разумеется вместо
s = ПоискЗаказа.ПЗкомбоГод.Column(u) * 1 у меня стоит
s = ПоискЗаказа.ПЗкомбоДлина.List(u)
Простите,описАлся.
267
20 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Штурман
Разумеется все это находится внутри цикла,который просматривает весь лист,и еще,заметил у себя ошибку,разумеется вместо
s = ПоискЗаказа.ПЗкомбоГод.Column(u) * 1 у меня стоит
s = ПоискЗаказа.ПЗкомбоДлина.List(u)
Простите,описАлся.



Так ведь у AddItem есть аргумент куда именно Add. Можешь каждый раз выискивать нужное местечко.

1.2K
20 октября 2003 года
Штурман
147 / / 01.08.2003
Цитата:
Originally posted by Cutty Sark


Так ведь у AddItem есть аргумент куда именно Add. Можешь каждый раз выискивать нужное местечко.


а подробнее?У себя в учебниках чет ниче не нашел,видимо не умею в учебники смотреть:P
Если не сложно,подскажи плизз.

267
20 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Штурман

а подробнее?У себя в учебниках чет ниче не нашел,видимо не умею в учебники смотреть: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.

1.2K
20 октября 2003 года
Штурман
147 / / 01.08.2003
Мдя,с индексами то я все таки по учебнику разобрался,а вот логику вложения по порядку никак не придумаю.Понедельник видимо.
Ладно,попробую завтра на наисвежайшую голову подумать.
267
20 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Штурман
Мдя,с индексами то я все таки по учебнику разобрался,а вот логику вложения по порядку никак не придумаю.Понедельник видимо.
Ладно,попробую завтра на наисвежайшую голову подумать.



А что там думать? Берешь очередной элемент и вставляешь на нужное место.

1.2K
21 октября 2003 года
Штурман
147 / / 01.08.2003
Цитата:
Originally posted by Cutty Sark


А что там думать? Берешь очередной элемент и вставляешь на нужное место.


их более 1000,ручками не вставишь,нужен еще цикл для прослеживания чего куда вставлять.Я уже в принципе придумал как это будет выглядеть,но видимо придется отказатся.Проект готовится для людей,которые работают на первом пне.Боюсь три вложеных цикла,да по более чем 1000 строкам,да еще 19 столбцам их комп будет обрабатыват полдня.

258
21 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Кстати, а что за данные? что нужно сортировать: текст или числа?
459
21 октября 2003 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by Штурман

их более 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 ...
Работает махом.

267
21 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Да можно даже без уголочка. Я вот себе как-то нацарапал логарифмическую сортировку массива.
Пользуйтесь. Она с .List работать, наверное, не будет (хотя попробуйте!) - а если в отдельный массив перетащить - то все будет ок.
Код:
Sub TestSub()
'Демо-запуск сортировки
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 раз отсортировать твой диапазон в Экселе.
267
21 октября 2003 года
Cutty Sark
1.2K / / 17.10.2002
Да, забыл - в предыдущем примерер аргумент Ord: 1 - по возрастанию, -1 по убыванию.
258
21 октября 2003 года
SergeySV
1.5K / / 19.03.2003
А я накатал такой алгоритм (решил поразмять мозги :) ) :
Код:
Dim x As Integer ' искомое значение например
  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, в твоем случае это лучший вариант.
258
21 октября 2003 года
SergeySV
1.5K / / 19.03.2003
Cutty Sark: Мы с тобой сошлись сразу по двум пунктам :) :) :)
1.2K
22 октября 2003 года
Штурман
147 / / 01.08.2003
Вчера не смог ответить,сайт почемуто не грузися при попытках ответа.Как собака был,все вижу,все понимаю,а сказать не могу.
Рассказываю что получилось.Сделал три варианта,и испытал на нужном компе.
Вариант первый:Стандартная сортировка по 19-ти позициям и возврат как было.На моем компе проходит практически незаметно,на ихнем около 40 сек.(В проекте кроме расматриевомого вопроса еще куча обработок данных)
Вариант второй:сортировка через индексы.На моем компе 10 секунд,на ихнем 2 минуты.При этом из десяти проб,четыре пробы прошли с полным повисанием Ёкселя.Не выдержал бедняга.
Вариант третий:в комбо вставляются уникальные данные без сортировки.Прошло на их компе довольно гладко.Люди выбрали именно этот вариант.

Тем не менее всем огромное спасибо,сделал для себя очень хорошие открытия.Очень понравился вариант с делением на два.Теперь буду переделывать свои проекты по новой,основываясь на новых знаниях.Еще раз огромное спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог