Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: Вопрос по ListBox-у. Добавлено: 20.08.07 16:54  

Автор вопроса:  Сергей
Привет.
Как из ListBox-a вставить информацию в ячейку листа в Экселе (ту строку, которая выделена курсором)? Как можно разбить ListBox на 3 столбца (или же в строке ввода необходимо вставлять символы таббуляции)? Как в этом случае (по столбцам) осуществляется их заполнение и вставка в ячейку строки, на которой находится курсор?
И еще вопрос: Видел ListBox и слевой стороны от каждой строки расположен Флажок (CheckBox), т.е. подразумевается что можно выделить несколько строк для вставки. Как организуется такой ListBox и как с ним работать (заполнять данными и брать из него инфу)?
Спасибо за разъяснения.

Ответить

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

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



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

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #1 Добавлено: 20.08.07 17:19
Для заполнения записей листбокса 3-ми столбацами следует использовать раздетель vbTab, но сначала нужно установить листбоксу флаг LB_SETTABSTOPS через SendMessage (третьим аргументом указывается количество столбцов, четвертым передается указатель на массив с размерами столбцов).
Флажки делаются свойством Style = Checkbox.

Ответить

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



Вопросов: 0
Ответов: 3
 Профиль | | #2 Добавлено: 21.08.07 09:22
Для вставки информации в ячейку можно использовать событие Change, которое происходит при изменении значения ListBox.

Ответить

Номер ответа: 3
Автор ответа:
 Сергей



Вопросов: 13
Ответов: 25
 Профиль | | #3 Добавлено: 21.08.07 13:39
А можно пример кода?

Ответить

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



Вопросов: 0
Ответов: 3
 Профиль | | #4 Добавлено: 21.08.07 15:03
Имя ListBox - lsbXXX.
Пример кода:
Private Sub lsbXXX_Change()
  ;Dim Yach As Range
  For Each Yach In Selection
      Yach.Value = lsbXXX.Value
   Next Yach
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Сергей



Вопросов: 13
Ответов: 25
 Профиль | | #5 Добавлено: 21.08.07 16:15
Пробовал пользоваться SendMessage.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const LB_SETSEL = &H185
 

Но в этом месте на ".hwnd"
Private Sub CommandButton3_Click()
   SendMessage ListBox1.hwnd, LB_SETSEL, True, ByVal True
End Sub
 

выдается сообщение об ошибке: Method or data member not found.

Ответить

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



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

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #6 Добавлено: 21.08.07 23:06
Для получения hwnd, тебе нужно найти свое окно (например, FindWindow), а на нем дочернее, твой листбокс.

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 23.08.07 20:28
попробуй помучь ListView. ListBox поддерживает столбцы, но это не похоже на столбцы экселя, это скорее всего список с прокруткой в бок, а не вниз. Количество стобцов помойму и через обычные свойства листбокса устанавливались, хотя я уже непомню..

Своё окно помойму можно и проще найти :) Me.hWnd

Ответить

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



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

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #8 Добавлено: 23.08.07 22:40
Своё окно помойму можно и проще найти :) Me.hWnd
В VBA нету hwnd

Ответить

Номер ответа: 9
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #9 Добавлено: 24.08.07 02:10
Может все-таки попробуем без API обойтись?
Private Sub UserForm_Initialize()

Dim m(2, 2)
m(0, 0) = 1
m(0, 1) = 2
m(0, 2) = 3
m(1, 0) = 4
m(1, 1) = 5
m(1, 2) = 6
m(1, 0) = 7
m(1, 1) = 8
m(1, 2) = 9
m(2, 0) = 10
m(2, 1) = 11
m(2, 2) = 12

With ListBox1
    .ColumnCount = 3
    .List = m
End With

End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

With ListBox1
    ActiveCell.Value = .List(.ListIndex, 0)
    ActiveCell.Offset(columnOffset:=1).Value = .List(.ListIndex, 1)
    ActiveCell.Offset(columnOffset:=2).Value = .List(.ListIndex, 2)
End With

End Sub

Ответить

Номер ответа: 10
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #10 Добавлено: 24.08.07 02:15
На всякий-разный - работает по двойному клику на строке ListBox'а :)

Ответить

Номер ответа: 11
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #11 Добавлено: 24.08.07 03:13
По вопросу о флажках: выставляете свойства ListBox'а:
- MultiSelect = fmMultiSelectMulti
- ListStyle = fmListStyleOption
Это можно делать также в UserForm_Initialize
По вводу вставки значений из нескольких строк из ListBox'а с несколькими столбцами на лист Excel'я - позже

Ответить

Номер ответа: 12
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #12 Добавлено: 24.08.07 04:52
Держите целиком. Работает от кнопки

Private Sub UserForm_Initialize()

Dim m(2, 2)

m(0, 0) = 1
m(0, 1) = 2
m(0, 2) = 3
m(1, 0) = 4
m(1, 1) = 5
m(1, 2) = 6
m(2, 0) = 7
m(2, 1) = 8
m(2, 2) = 9

With ListBox1
    .ColumnCount = 3
    .List = m
    .MultiSelect = fmMultiSelectMulti
    .ListStyle = fmListStyleOption
End With

End Sub

Private Sub CommandButton1_Click()

c = 0
With ListBox1
    For a = 0 To .ListCount - 1
        If .Selected(a) = True Then
            For b = 0 To 2
                ActiveCell.Offset(c, b).Value = .List(a, b)
            Next
            c = c + 1
        End If
    Next
End With

End Sub

Ответить

Номер ответа: 13
Автор ответа:
 Сергей



Вопросов: 13
Ответов: 25
 Профиль | | #13 Добавлено: 06.09.07 12:30
Спасибо все получилось.
Столкнулся с такой заморочкой и не знаю как ее решить:
На форме есть ListBox, TextBox и кнопка. ListBox заплнен большим списком строк (есть вертикальный скролл). В TextBox нужно вводить строку и по кнопки искать ее в ListBox-е. Если найдена то выделить ее. (ListBox - МультиСелект). Т.е. типа поиска. Проблема в том, что строка в ListBox выделяется, а автоматического скроллинга на эта строку не происходит. Т.е. пользователь не видит что выделяется если выделение происходит в глубине списка. Как это решить? Желательно не API функциями.
Спасибо.

Ответить

Номер ответа: 14
Автор ответа:
 Сергей



Вопросов: 13
Ответов: 25
 Профиль | | #14 Добавлено: 06.09.07 13:53
Все, нашел.

 Dim i As Byte
 For i = 0 To ListBox1.ListCount - 1
   If ListBox1.List(i, 0) = TextBox1.text Then
      ListBox1.Selected(i) = True
      [B][B]ListBox1.TopIndex = i[/B]
      Exit Sub
   End If
 Next i

Ответить

Номер ответа: 15
Автор ответа:
 Сергей



Вопросов: 13
Ответов: 25
 Профиль | | #15 Добавлено: 06.09.07 16:22
А вот такой вопрос:
У меня есть ListBox с тремя колонками и массив с тремя полями, т.е.
Mas(1).n = "123"
Mas(1).m = "456"
Mas(1).k = "789"
Как заполнить ListBox значениями из Mas? Пока только нашел способ передачи данных другому массиву типа Mas1(1,3), тогда командой ListBox1.List = Mas1 все получается.
Можно ли обойтись без второго массива а как то напрямую передать здначения Mas --> ListBox1?
Спасибо.

Ответить

Страница: 1 | 2 |

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



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