Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Помогите, пожалуйста с колонками в ListBox, VBA Добавлено: 08.07.08 13:06  

Автор вопроса:  Aleksandr
Помогите, пожалуйста, с кодом, а может у кого-нибудь есть пример как прописать свойсвта ListBox в VBA Excel для следующего случая:

Например, есть пять заполненных столбцов (A,B,C,D,E)на листе и есть некая переменная Z. Я циклом построчно проверяю на условие, что Если значение в строке по столбцу "A" = переменной Z, то значения столбца "C" и "E" из этой строки добавляется в список ListBox т.е. в две колонки. (как сделать одну колонку знаю).
Как прописать свойства ListBox, чтобы это осуществить.
И Второй вопрос. Как, при выборе из полученного списка в ListBox, узнать координату СТРОКИ с которой добавились эти значения? Т.е. когда мышкой выделяю в ListBox строчку, какой-то переменной присвоилось бы координата СТРОКИ откуда она была добавлена c листа Excel?

Буду очень признателен за помощь!

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 08.07.08 13:45
Хм. Подобные вещи в листбоксе сделать довольно сложно. Ищи по форуму ссылку, я писал пример пару месяцев назад. Там тоже надо было сделать две колонки в листбоксе. Если не найдешь - напишу снова или поищу у себя.

Ответить

Номер ответа: 2
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #2 Добавлено: 08.07.08 14:09
Спасибо за сообщение, Executioner!
Сложно первое или второе сделать?
Мне хотябы первое. Второе тогда тоже циклом совпадения можно сделать, хоть и долгая будет процедура, но хоть что-то.
А по первому вопросу о двух колонках, как их добавить в ListBox. Отобразить именно выборочные столбцы в таблице?

Ответить

Номер ответа: 3
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #3 Добавлено: 08.07.08 14:12
Упрощенно так:

Кидаешь ListBox на форму. В свойствах ищешь:
- ColumnCount. Ставишь сколько колонок тебе нужно отобразить.
- ColumnWidths числа через ; ширина колонок (если нужно)
- RowSource диапазон, который нужно отобразить в ListBox

Например, можно в первой колонке прописать Ячейка=ROW(). Будет номер строки. Поставить ее в первую колонку в ListBox и сделать ее 0 ширины, чтоб никто не увидел. :-)

По двойному щелчку на ListBox можно написать например, Label2.Caption = ListBox2.Column(0). Будет известен номер строки, откуда брали.

Ответить

Номер ответа: 4
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #4 Добавлено: 08.07.08 14:18
Если программно так:
Dim MyArray(6, 4)
  UserForm1.ListBox1.ColumnCount = 4

  For i = 2 To 5
    MyArray(i - 2, 0) = i - 2
  Next i

  MyArray(0, 1) = Первое значение колонка 1
  MyArray(1, 1) = Второе значение колонка 1
  MyArray(2, 1) = Третье значение колонка 1

  MyArray(0, 2) = Первое значение колонка 2
  MyArray(1, 2) = Второе значение колонка 2
  MyArray(2, 2) = Третье значение колонка 2

  UserForm1.ListBox1.ColumnWidths = "20;0;40;40"
  MyArray(0, 3) = Первое значение колонка 3
  MyArray(1, 3) = Второе значение колонка 3
  MyArray(2, 3) = Третье значение колонка 3

  UserForm1.ListBox1.List() = MyArray

Взятие значения опять же через двойной клик.

Ответить

Номер ответа: 5
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #5 Добавлено: 08.07.08 16:44
Спасибо, Jasmin!
Мне удалось применить этот код под свои нужды кроме одного: - Можно ли, чтобы в MyArray (6,4) "шестёрка" была бы переменной, т.к. у меня кол-во строк списка каждый раз меняются?

Ответить

Номер ответа: 6
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #6 Добавлено: 08.07.08 19:57
Можно. Нужно попросить VBA вот так:
ReDim MyArray(n,m)(

И поставить эту строчку в коде после того, как определишь сколько столбцов M и строчек N тебе нужно.
Осторожно! Все предыдущие данные в массиве затираются. Чтобы оставить и просто расширить нужно:
ReDim Preserve MyArray(n,m)

Ответить

Номер ответа: 7
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #7 Добавлено: 08.07.08 19:58
В первом примере последняя открывающая скобка лишняя. Сорри.

Ответить

Номер ответа: 8
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #8 Добавлено: 10.07.08 07:59
Огромное спасибо! У меня всё получилось!

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

'Если formInfoObor.ComboBox4.Text = "Все"
    If formInfoObor.ComboBox4.Text = "Все" Then

        ChDir "E:\Мои документы\База данных"
        Workbooks.Open Filename:="E:\Мои документы\База данных\ПереченьОборудования.xls"
        Workbooks("ПереченьОборудования.xls";).Activate
        Sheets("СписокОбор";).Select

        Cells.Select
        Selection.Sort Key1:=Range(";D2";), Order1:=xlAscending, Key2:=Range("H2";) _
        , Order2:=xlAscending, Key3:=Range("I2";), Order3:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        ;DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortTextAsNumbers
        
    'Определяем количество строк для поиска и количество строк в MyZakArr
        KolStrok = 2
        MyArrayRow = -1
        ;Do While Sheets("СписокОбор";).Cells(KolStrok, "O";) <> ""
            KolStrok = KolStrok + 1
            MyArrayRow = MyArrayRow + 1
        Loop

        If MyArrayRow = -1 Then
            MsgBox "Ни одной записи не найдено! Попробуйте повторить поиск!"
            GoTo line10
            Else
        End If
        
    'Ищем совпадение заказчиков и добавляем данные в formInfoObor.ListBox1
        ReDim MyArrayZak(MyArrayRow, 22)
        formInfoObor.ListBox1.ColumnCount = 22
        Stroka = -1
        KolStrok = KolStrok - 1
        For pereboStrok = 2 To KolStrok

                Stroka = Stroka + 1
                
                MyArrayZak(Stroka, 0) = Stroka + 1
                MyArrayZak(Stroka, 1) = Sheets("СписокОбор";).Cells(pereboStrok, "B";)
                MyArrayZak(Stroka, 2) = Sheets("СписокОбор";).Cells(pereboStrok, "C";)
                MyArrayZak(Stroka, 3) = Sheets("СписокОбор";).Cells(pereboStrok, ";D";)
                MyArrayZak(Stroka, 4) = Sheets("СписокОбор";).Cells(pereboStrok, "E";)
                MyArrayZak(Stroka, 5) = Sheets("СписокОбор";).Cells(pereboStrok, "F";)
                MyArrayZak(Stroka, 6) = Sheets("СписокОбор";).Cells(pereboStrok, "G";)
                MyArrayZak(Stroka, 7) = Sheets("СписокОбор";).Cells(pereboStrok, "H";)
                MyArrayZak(Stroka, 8) = Sheets("СписокОбор";).Cells(pereboStrok, "I";)
                MyArrayZak(Stroka, 9) = Sheets("СписокОбор";).Cells(pereboStrok, "J";)
                MyArrayZak(Stroka, 10) = Sheets("СписокОбор";).Cells(pereboStrok, "K";)
                MyArrayZak(Stroka, 11) = Sheets("СписокОбор";).Cells(pereboStrok, "L";)
                MyArrayZak(Stroka, 12) = Sheets("СписокОбор";).Cells(pereboStrok, "M";)
                MyArrayZak(Stroka, 13) = Sheets("СписокОбор";).Cells(pereboStrok, "N";)
                MyArrayZak(Stroka, 14) = Sheets("СписокОбор";).Cells(pereboStrok, "O";)
                MyArrayZak(Stroka, 15) = Sheets("СписокОбор";).Cells(pereboStrok, "P";)
                MyArrayZak(Stroka, 16) = Sheets("СписокОбор";).Cells(pereboStrok, "Q";)
                MyArrayZak(Stroka, 17) = Sheets("СписокОбор";).Cells(pereboStrok, "R";)
                MyArrayZak(Stroka, 18) = Sheets("СписокОбор";).Cells(pereboStrok, "S";)
                MyArrayZak(Stroka, 19) = Sheets("СписокОбор";).Cells(pereboStrok, "T";)
                MyArrayZak(Stroka, 20) = Sheets("СписокОбор";).Cells(pereboStrok, "U";)
                MyArrayZak(Stroka, 21) = Sheets("СписокОбор";).Cells(pereboStrok, "V";)


        Next pereboStrok
            
            formInfoObor.ListBox1.ColumnWidths = "30;0;0;80;0;0;0;120;120;0;0;0;0;0;100;0;0;0;0;0;0;0"
            formInfoObor.ListBox1.List() = MyArrayZak
        formInfoObor.ListBox1.Width = 480
        
        GoTo line20
        
    Else
    End If

Ответить

Номер ответа: 9
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #9 Добавлено: 10.07.08 07:59
оконцовка к коду...

line10:
        formInfoObor.ListBox1.Clear

line20:
        Workbooks("ПереченьОборудования.xls";).Activate
        ActiveWorkbook.Save
        ActiveWindow.Close
    
    
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #10 Добавлено: 10.07.08 08:04
Прошу прощения!!! Номер ответа:8 не из того цикла!!! Вот правильный, с добавлением нужных строк в ЛистБокс:

'Если formInfoObor.ComboBox4.Text = "Заказчик"
    If formInfoObor.ComboBox4.Text = "Заказчик" Then

        ChDir "E:\Мои документы\База данных"
        Workbooks.Open Filename:="E:\Мои документы\База данных\ПереченьОборудования.xls"
        Workbooks("ПереченьОборудования.xls";).Activate
        Sheets("СписокОбор";).Select

        Cells.Select
        Selection.Sort Key1:=Range(";D2";), Order1:=xlAscending, Key2:=Range("H2";) _
        , Order2:=xlAscending, Key3:=Range("I2";), Order3:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        ;DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortTextAsNumbers
        
    'Определяем количество строк для поиска и количество строк в MyZakArr
        KolStrok = 2
        MyArrayRow = -1
        ;Do While Sheets("СписокОбор";).Cells(KolStrok, "O";) <> ""
            
                If Sheets("СписокОбор";).Cells(KolStrok, "O";) = formInfoObor.ComboBox2.Text Then
                    MyArrayRow = MyArrayRow + 1
                    
                Else
                
                End If
            KolStrok = KolStrok + 1
        Loop

        If MyArrayRow = -1 Then
            MsgBox "Ни одной записи не найдено! Попробуйте повторить поиск!"
            GoTo line10
            Else
        End If
        
    'Ищем совпадение заказчиков и добавляем данные в formInfoObor.ListBox1
        ReDim MyArrayZak(MyArrayRow, 22)
        formInfoObor.ListBox1.ColumnCount = 22
        Stroka = -1
        For pereboStrok = 2 To KolStrok
            If Sheets("СписокОбор";).Cells(pereboStrok, "O";) = formInfoObor.ComboBox2.Text Then
                Stroka = Stroka + 1
                
                MyArrayZak(Stroka, 0) = Stroka + 1
                MyArrayZak(Stroka, 1) = Sheets("СписокОбор";).Cells(pereboStrok, "B";)
                MyArrayZak(Stroka, 2) = Sheets("СписокОбор";).Cells(pereboStrok, "C";)
                MyArrayZak(Stroka, 3) = Sheets("СписокОбор";).Cells(pereboStrok, ";D";)
                MyArrayZak(Stroka, 4) = Sheets("СписокОбор";).Cells(pereboStrok, "E";)
                MyArrayZak(Stroka, 5) = Sheets("СписокОбор";).Cells(pereboStrok, "F";)
                MyArrayZak(Stroka, 6) = Sheets("СписокОбор";).Cells(pereboStrok, "G";)
                MyArrayZak(Stroka, 7) = Sheets("СписокОбор";).Cells(pereboStrok, "H";)
                MyArrayZak(Stroka, 8) = Sheets("СписокОбор";).Cells(pereboStrok, "I";)
                MyArrayZak(Stroka, 9) = Sheets("СписокОбор";).Cells(pereboStrok, "J";)
                MyArrayZak(Stroka, 10) = Sheets("СписокОбор";).Cells(pereboStrok, "K";)
                MyArrayZak(Stroka, 11) = Sheets("СписокОбор";).Cells(pereboStrok, "L";)
                MyArrayZak(Stroka, 12) = Sheets("СписокОбор";).Cells(pereboStrok, "M";)
                MyArrayZak(Stroka, 13) = Sheets("СписокОбор";).Cells(pereboStrok, "N";)
                MyArrayZak(Stroka, 14) = Sheets("СписокОбор";).Cells(pereboStrok, "O";)
                MyArrayZak(Stroka, 15) = Sheets("СписокОбор";).Cells(pereboStrok, "P";)
                MyArrayZak(Stroka, 16) = Sheets("СписокОбор";).Cells(pereboStrok, "Q";)
                MyArrayZak(Stroka, 17) = Sheets("СписокОбор";).Cells(pereboStrok, "R";)
                MyArrayZak(Stroka, 18) = Sheets("СписокОбор";).Cells(pereboStrok, "S";)
                MyArrayZak(Stroka, 19) = Sheets("СписокОбор";).Cells(pereboStrok, "T";)
                MyArrayZak(Stroka, 20) = Sheets("СписокОбор";).Cells(pereboStrok, "U";)
                MyArrayZak(Stroka, 21) = Sheets("СписокОбор";).Cells(pereboStrok, "V";)
            
            Else
            End If
        
        Next pereboStrok
        
            formInfoObor.ListBox1.ColumnWidths = "30;0;0;80;0;0;0;120;120;0;0;0;0;0;100;0;0;0;0;0;0;0"
            formInfoObor.ListBox1.List() = MyArrayZak
        formInfoObor.ListBox1.Width = 480
            
        GoTo line20



    End If

Ответить

Номер ответа: 11
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #11 Добавлено: 10.07.08 09:39
                MyArrayZak(Stroka, 1) = Sheets("СписокОбор";).Cells(pereboStrok, "B";)
и. д. можно заменить вот так
For iArrZak = 1 to 21
  MyArrayZak(Stroka, iArrZak) = Sheets("СписокОбор";).Cells(pereboStrok, Chr(iArrZak+65))
next iArrZak

Так красивее. :-)

Ответить

Номер ответа: 12
Автор ответа:
 Aleksandr



Вопросов: 7
Ответов: 15
 Профиль | | #12 Добавлено: 10.07.08 12:43
Действительно :0)
:) Спасибо!
Эх... Делаю на сколько хватает понимания и опыта, а его пока только пару месяцев.
Надеюсь, в скором времени обрету достаточно опыта и знаний для нахождения более простых решений! :)
Ещё раз спасибо!

Jasmin, не порекомендуешь литературу для изучения и практики, желательно с примерами? Можно сказать настольную книгу для новичка?
Буду очень признателен!

Ответить

Номер ответа: 13
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #13 Добавлено: 11.07.08 08:41
Мне нравиться книга Андрея Гарнаева "VBA в подлиннике". Издательство БХВ-Петербург. На первое время очень даже. А так есть еще много книг интересных и нужных.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам