Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Как приостановить программу?


Автор: newbie2009 28.8.2011, 12:33
Есть такая ситуация:
Прохожусь я по файлику ексель в каком-то столбце, в поисках определенных значений, их я заношу в массив строк.
Далее :
1. создать программно комбобокс и запихнуть туда этот массив. как это сделать?
2. прервать выполнение программы пока не будет выбрано какое-то значение из комбобокса?

комбобокс это не принципиально, просто нужен какой-то элемент где можно будет выбрать значение.


Если может кто-то знает, как например , программно создать выпадающий список в какой-то ячейке и потом с этим списком работать... буду очень благодарен.

Автор: dorogoyIV 28.8.2011, 19:32
Цитата(newbie2009 @  28.8.2011,  12:33 Найти цитируемый пост)
Если может кто-то знает, как например , программно создать выпадающий список в какой-то ячейке и потом с этим списком работать...

Код

Sub AddCombo()
 FillRandomRange
 
 Dim x, y, width, height
  
 Cells(3, 5).Select 'на эту ячейку положим комбобокс
 x = Selection.Left
 width = Selection.width
 y = Selection.Top
 height = Selection.height
 
 Dim k
 k = FindValues
 
 ActiveSheet.DropDowns.Add(x, y, width, height).Select
 With Selection
  .ListFillRange = "H1:" & "H" & k
  .LinkedCell = "E2" ' в этой ячейке индекс выбранного элемента комбобокса
                                    ' (поднял выше, что бы видно было)
 End With
 Range("H1:" & "H" & k).Select
End Sub

Function FindValues() As Integer ' ищем нужные значения (например четные)
                                                            ' и заполняем ими диапазон
 Dim k
 k = 0
 
 For i = 1 To 10
  For j = 1 To 3
   If (Cells(i, j) Mod 2 = 0) Then
    k = k + 1
    Cells(k, 8) = Cells(i, j)
   End If
  Next j
 Next i

 FindValues = k ' заодно определим последнюю строку диапазона
End Function

Function FillRandomRange() ' просто заполним диапазон случайными числами
 For i = 1 To 10
  For j = 1 To 3
   Cells(i, j) = Round(Rnd * 15)
  Next j
 Next i
End Function

Автор: newbie2009 29.8.2011, 09:53
А можно как-то отдельно обратится к списку? т.е. заполнять его как-то отдельно, а не сразу? или как его например заполнить массивом:

Код

Dim m(1) As String
 m(0) = "test"
 m(1) = "test2"
 
 ActiveSheet.DropDowns.Add(x, y, width, height).Select
 With Selection
  .ListFillRange = m
 ' .LinkedCell = "E2" ' ? ???? ?????? ?????? ?????????? ???????? ??????????
                                    ' (?????? ????, ??? ?? ????? ????)
 End With


Не захотел заполнится=(

Автор: dorogoyIV 29.8.2011, 10:03
Код

 .ListFillRange = ... ' здесь должен быть диапазон ячеек (например, как у меня "H1:H...")


а то, что ты хочешь, это на форме надо делать (если я правильно тебя понимаю)

Автор: newbie2009 29.8.2011, 10:21
По ходу правильно меня поняли=(
ладно тогда выделим какой-то ненужный стоблец черт знает где=)

Спасибо!


Автор: newbie2009 29.8.2011, 12:45
Подскажите:
Если я допустим используя процедуру AddCombo создал 2 выпадающих списка в разных ячейках.
Каким образом мне сделать так, что бы если я поменяю какие-то данные в ячейках, что бы данные в первом списке не менялись сразу. Вот пример кода как я хочу сделать, но после выполнения программы, данные в списках одни и теже. Почему?


Код

Sub main()

Call AddCombo(1, 3)

Cells(1, 8) = "test"

Call AddCombo(2, 4)

End Sub



Sub AddCombo(row, k)
 
 Dim x, y, width, height
  
 Cells(row, 2).Select 
 x = Selection.Left
 width = Selection.width
 y = Selection.Top
 height = Selection.height
 
  
 ActiveSheet.DropDowns.Add(x, y, width, height).Select
 With Selection
   .ListFillRange = "H1:" & "H" & k
   .LinkedCell = "E2" 
 End With
 
 
End Sub




Автор: dorogoyIV 29.8.2011, 12:56
Цитата(newbie2009 @  29.8.2011,  12:45 Найти цитируемый пост)
данные в списках одни и теже. Почему?

потому, что оба комбобокса имеют ссылку на один и тот же диапазон ячеек с данными  smile 
разным контролам присваивай разные диапазоны

Автор: newbie2009 29.8.2011, 13:53
А не подскажите как считать цвет ячейки?
А то пробывал вот так:

Код

Color = Cells(1, 1).Interior.ColorIndex


Выводите какие-то слишком большие числа....

И как программно получать значения с выпадающих списков?
или как привезать, что бы при выборе какого-то значения из списка, в соседнем столбце появлялось, связанное с ним значение?

Автор: dorogoyIV 29.8.2011, 14:18
Цитата(newbie2009 @  29.8.2011,  13:53 Найти цитируемый пост)
И как программно получать значения с выпадающих списков?

в ячейке .LinkedCell = "E2" индекс выбранного элемента. отсчитываешь в диапазоне "H1:H..." этот индекс


Цитата(newbie2009 @  29.8.2011,  13:53 Найти цитируемый пост)
Выводите какие-то слишком большие числа....

оттенков много разных  smile 

Автор: newbie2009 29.8.2011, 14:27
Цитата(dorogoyIV @ 29.8.2011,  14:18)
Цитата(newbie2009 @  29.8.2011,  13:53 Найти цитируемый пост)
И как программно получать значения с выпадающих списков?

в ячейке .LinkedCell = "E2" индекс выбранного элемента. отсчитываешь в диапазоне "H1:H..." этот индекс


Цитата(newbie2009 @  29.8.2011,  13:53 Найти цитируемый пост)
Выводите какие-то слишком большие числа....

оттенков много разных  smile


Отсчитать можно, если бы был 1 диапозон, а так получается 1 сплошной и точно нельзя сказать...
надо тогда получается для каждого нового комбокса делать отдельный стоблец с диапозоном.
Но тогда как узнать какой список к какому столбцу привязан?

Автор: dorogoyIV 29.8.2011, 15:33
да что ты столбцы жалеешь?
выделяй для контролов столбцы по порядку да и все.

например:
первый комбо, индекс в ячейке [2, 5], данные в столбце "H"
второй комбо - индекс в ячейке [2, 6], данные в столбце "I"
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)