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

Ваш аккаунт

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

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

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

Почему ошибка при вызове формы?

3.7K
10 марта 2005 года
blind7
56 / / 12.01.2005
Есть кнопка на рабочем листе которая вызывает некую форму. Вот код вызова:

 
Код:
Private Sub StartCheki_Click()
    Cheki.Show
End Sub

Так вот, суть проблемы в следующем. В Excel 97 c сервис паком всё открываеться нормально, а под Excel 2002 данная процедура выдаёт следующую ошибку:

Run-time error '381':
Could not set the List property. Invalid property array index.

Чуть не забыл, код прописан в разделе Microsoft Excel Objects в первол листе книги.
405
10 марта 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7
Есть кнопка на рабочем листе которая вызывает некую форму. Вот код вызова:

 
Код:
Private Sub StartCheki_Click()
    Cheki.Show
End Sub

Так вот, суть проблемы в следующем. В Excel 97 c сервис паком всё открываеться нормально, а под Excel 2002 данная процедура выдаёт следующую ошибку:

Run-time error '381':
Could not set the List property. Invalid property array index.

Чуть не забыл, код прописан в разделе Microsoft Excel Objects в первол листе книги.



Если кнопка на листе создана с помощью панели "Формы", то попробуйте Private Sub заменить на Public Sub.
Если кнопка создана с помощью панели "Элементы управления", то проверьте соответствие свойства "Name" кнопки и имени процедуры-обработчика события "Click".

3.7K
10 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii


Если кнопка на листе создана с помощью панели "Формы", то попробуйте Private Sub заменить на Public Sub.
Если кнопка создана с помощью панели "Элементы управления", то проверьте соответствие свойства "Name" кнопки и имени процедуры-обработчика события "Click".



Кнопка создана с помошью панели "Элементы управления" , на листе 3 кнопки, Одна работает исправно, а 2 вызывают ошибку. Но повторюсь что в 97 такой ошибки не происходит.

Перепроверил соответствие "Name" и обработчика "Click" они соответствуют
имя - StartCheki
соответственно в обработчике StartCheki_Click()

405
11 марта 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7


Кнопка создана с помошью панели "Элементы управления" , на листе 3 кнопки, Одна работает исправно, а 2 вызывают ошибку. Но повторюсь что в 97 такой ошибки не происходит.

Перепроверил соответствие "Name" и обработчика "Click" они соответствуют
имя - StartCheki
соответственно в обработчике StartCheki_Click()



Раз так, то давайте кое-что уточним.
1. Формы в "ошибочных случаях" не появляются на экране вообще?
2. Если ответ на 1-й вопрос "да", то нет ли в процедурах инициализации этих форм действий по настройке элементов управления типа "ListBox"?
3. Если ответ на 2-й вопрос "да, есть", то не выполняются ли аналогичные действия для "нормального случая"?
4. Если ответ на 3-й вопрос "нет, не выполняются", то, думается, что "копать" надо именно инициализацию элементов типа "ListBox".

Дело в том, что очень похожее сообщение об ошибке (и по коду, и по содержанию) возникает при неверном обращении к элементам списка.
Посмотрите вот этот материал:
http://support.microsoft.com/default.aspx?scid=kb;en-us;110957

3.7K
11 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii


Раз так, то давайте кое-что уточним.
1. Формы в "ошибочных случаях" не появляются на экране вообще?
2. Если ответ на 1-й вопрос "да", то нет ли в процедурах инициализации этих форм действий по настройке элементов управления типа "ListBox"?
3. Если ответ на 2-й вопрос "да, есть", то не выполняются ли аналогичные действия для "нормального случая"?
4. Если ответ на 3-й вопрос "нет, не выполняются", то, думается, что "копать" надо именно инициализацию элементов типа "ListBox".

Дело в том, что очень похожее сообщение об ошибке (и по коду, и по содержанию) возникает при неверном обращении к элементам списка.
Посмотрите вот этот материал:
http://support.microsoft.com/default.aspx?scid=kb;en-us;110957



1) В ошибочном случае не появляеться вообще.
2) Простите, а что есть нормальный случай. Повторюсь что в офисе 97 всё работает. К тому же ещё одно уточнение из трёх кнопок запускающих формы, работает исправно в 2002 только 1. Но в ней инициализация прописана также как и в 2 остальных (естественно имена различны).

3) в процедуре инициализации непрописаны listBox
4) В форме действительно есть один элемент списка, но, в 97 он работает исправно.

Нонсенс...

405
11 марта 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7


1) В ошибочном случае не появляеться вообще.
2) Простите, а что есть нормальный случай. Повторюсь что в офисе 97 всё работает. К тому же ещё одно уточнение из трёх кнопок запускающих формы, работает исправно в 2002 только 1. Но в ней инициализация прописана также как и в 2 остальных (естественно имена различны).

3) в процедуре инициализации непрописаны listBox
4) В форме действительно есть один элемент списка, но, в 97 он работает исправно.

Нонсенс...



Может выложите коды и формы "на пробу". Проверю у себя на разных версиях "Офиса".

3.7K
27 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii
Может выложите коды и формы "на пробу". Проверю у себя на разных версиях "Офиса".


так а куда можно скинуть исходник?
тама архивчик на 46 килобайт.
Попутно возниколо несколько вопосов, но их я смогу задать только после размещения исходника, ибо насколько понимаю без понимания о чём речь, нельзя ответить можно ли воплотить задуманное.
Извините за путанность и сбивчивость речи.

405
28 марта 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7
так а куда можно скинуть исходник?
тама архивчик на 46 килобайт.
Попутно возниколо несколько вопосов, но их я смогу задать только после размещения исходника, ибо насколько понимаю без понимания о чём речь, нельзя ответить можно ли воплотить задуманное.
Извините за путанность и сбивчивость речи.



Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.

3.7K
28 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii
Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.


Cобственно вот оно.

3.7K
28 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii
Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.


1)Собственно первая и третья кнопка описывает событие и вываливается с ошибкой в офиссе2003, вторая кнопка не описана и открывается на ура.

2)Хотелось бы сюда же добавить сохранение в файл с последующим вытаскиванием по параметру дата
3) И заменить присутствующую билеберду перевода цифр в текст, на более нормально написанное.
А вот как реализовать эти пункты незнаю (((

275
28 марта 2005 года
pashulka
985 / / 19.09.2004
А ларчик просто открывался, надо заменить :

OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100")

на :

OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100").Value

P.S. MS Excel 97 - выбор посвящённых …
3.7K
29 марта 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
А ларчик просто открывался, надо заменить :

OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100")

на :

OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100").Value

P.S. MS Excel 97 - выбор посвящённых …



Это надоже :-(. И ведь говорили поверь список, повеил:-(( Век живи век учись. Сенку. а то лоб разбил об эту поблему.
Теперь поблем меньше ровно на 1.

Набравшись смелости спошу:
Можно ли добавить к данным формам возможность сохранения данных.
Имеется ввиду чтобы по нажатии на "сохранить" в форме, данные сохранялись либо на отдельный лист, либо в файл. Гм, а щё лучше чотбы эти сохранённые данные можно было в дальнейшем вызволить в форму для редактиования. В какой области копать??

275
29 марта 2005 года
pashulka
985 / / 19.09.2004
Для решения Вашей задачи можно использовать уже известное Вам свойство List, например :

Private Sub UserForm_Initialize()
Me.ComboBox1.List = Range("A1:A5").Value
'ComboBox1.List = Range("A1:A5").Value
End Sub

Private Sub CommandButton1_Click()
Range("B1:B5").Value = Me.ComboBox1.List
'Range("B1:B5").Value = ComboBox1.List
End Sub

Примечание :
- В принципе, данные находящиеся в ComboBox, ListBox можно записать и в файл, например текстовый.
- Не забывайте, что у ComboBox, ListBox есть ещё свойство RowSource, применение которого позволит Вам связать свой элемент управления с указанным диапазоном ячеек. При этом все изменения сделанные в указанном диапазоне будут отображаться в списке.

ComboBox1.RowSource = "A1:A5"
'или
ComboBox1.RowSource = Range("A1:A5").Address

P.S. Обратите внимание на то, что свойство RowSource доступно только если ComboBox, ListBox расположен на MSForm, для этих же элементов управления, расположенных на рабочем листе применяют свойство ListFillRange
405
31 марта 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7
...
3) И заменить присутствующую билеберду перевода цифр в текст, на более нормально написанное.


Могу предложить код, который преобразует целые числа в диапазоне от 0 до 999999999 в их текстовое описание. Может быть пригодится для Вашей задачи.

Sub NumToText()
Dim keyWords(1 To 3, 1 To 19), myStr(1 To 3), resText As String
Dim numGroups, lenDigit, curDigit As Integer
Dim myDigit As Variant
'keyWords() - массив названий чисел
'1 строка: "один","два" ... "девятнадцать"
'2 строка: "","двадцать","тридцать" ... "девяносто"
'3 строка: "сто","двести" ... "девятьсот"
myDigit = Cells(1, 1).Value
If IsNumeric(myDigit) Then
If myDigit <> 0 Then
resText = ""
lenDigit = Len(CStr(myDigit))
numGroups = lenDigit \ 3
If lenDigit Mod 3 > 0 Then
numGroups = numGroups + 1
End If
For i = 0 To numGroups - 1
myStr(i + 1) = StrReverse(Mid(StrReverse(CStr(myDigit)), i * 3 + 1, 3))
Next i
For i = numGroups To 1 Step -1
lenDigit = Len(myStr(i))
j = lenDigit
Do
curDigit = CInt(Mid(StrReverse(myStr(i)), j, 1))
If curDigit > 0 Then
If curDigit = 1 And j = 2 Then
curDigit = CInt(StrReverse(Mid(StrReverse(myStr(i)), 1, 2)))
j = j - 1
End If
If resText <> "" Then
resText = resText & " "
End If
If i = 2 And j = 1 Then
Select Case curDigit
Case 1: resText = resText & "одна"
Case 2: resText = resText & "две"
Case Else: resText = resText & keyWords(j, curDigit)
End Select
Else
resText = resText & keyWords(j, curDigit)
End If
End If
j = j - 1
Loop While j > 0
If i = 3 Then
x1 = " миллионов"
x2 = " миллион"
x3 = " миллиона"
ElseIf i = 2 Then
x1 = " тысяч"
x2 = " тысяча"
x3 = " тысячи"
End If
If i > 1 Then
Select Case Right(myStr(i), 1)
Case "1"
If curDigit = 11 Then
resText = resText & x1
Else
resText = resText & x2
End If
Case "2", "3", "4"
If curDigit >= 12 And curDigit <= 14 Then
resText = resText & x1
Else
resText = resText & x3
End If
Case Else: resText = resText & x1
End Select
End If
Next i
Else
resText = "ноль"
End If
Else
resText = "это не число"
End If
MsgBox resText
End Sub

275
31 марта 2005 года
pashulka
985 / / 19.09.2004
To blind7

Опубликованный выше код будет работать только в MS Excel 2000 и выше, так как использует StrReverse, которая появилась только в VB 6.0

Учитывая, что Вы также работаете и в MS Excel 97 возможно Вам окажется полезна данная ссылка, так как большинство программ написаны в период с 97 по 99 г.

http://relib.com/forums/topic.asp?id=859354

P.S.
Зря Вы назвали решение проблемы суммы прописью с помощью формул белибердой, так как людей которые решили этот вопрос именно этим способом на несколько порядком меньше, чем тех, кто написал свою собственную пользовательскую функцию. Скажу даже больше, многие абсолютно уверены, что решить этот вопрос с помощью формул невозможно.
405
01 апреля 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by pashulka

Опубликованный выше код будет работать только в MS Excel 2000 и выше, так как использует StrReverse, которая появилась только в VB 6.0



Да, про Office 97 как-то забылось.
Вот код функции реверсии строки, взятый у Гетца и Джилберта ("Программирование в Microsoft Office"):
Function StrRev(ByVal strDirect As String) As String
Dim bytArray() As Byte
Dim bytTmp As Byte
Dim strTmp As String
Dim maxIndex As Integer
Dim curIndex As Integer
Dim newIndex As Integer
If Len(strDirect) > 0 Then
bytArray = strDirect
maxIndex = UBound(bytArray)
For curIndex = LBound(bytArray) To maxIndex \ 2 Step 2
newIndex = maxIndex - curIndex
bytTmp = bytArray(curIndex)
bytArray(curIndex) = bytArray(newIndex - 1)
bytArray(newIndex - 1) = bytTmp
bytTmp = bytArray(curIndex + 1)
bytArray(curIndex + 1) = bytArray(newIndex)
bytArray(newIndex) = bytTmp
Next curIndex
StrRev = bytArray
Else
StrRev = ""
End If
End Function

Цитата:
Originally posted by pashulka

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



Ради интереса попробовал решить задачу именно таким способом. Результат - в прикреплённом файле.
По трудоёмкости работа вполне сравнима с написанием макроса, но, с моей точки зрения, более нудная.

3.7K
08 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by Dmitrii
Да, про Office 97 как-то забылось.
Вот код функции реверсии строки, взятый у Гетца и Джилберта ("Программирование в Microsoft Office"):


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

405
08 апреля 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by blind7
Попробую прикрутить данную функцию, понять бы ещё как, но думаю что удастся с этим справиться.
Тихо тихо движемся к финальному месту.



А какие предвидятся сложности в "прикрутке" функции?
Если не знаете, куда вставить её код, то лучше всего в тот же модуль кода, где находится и вызывающий её макрос.

275
12 апреля 2005 года
pashulka
985 / / 19.09.2004
Вот прямая ссылка на одну из функций суммы прописью :

http://www.microsoft.ru/offext/details.aspx?id=613

Для просмотра программного кода функции введите пароль nikita Функция будет работать в MS Excel 97, 2000, 2002. Есть небольшой help и т.д. и т.п.
3.7K
13 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
Вот прямая ссылка на одну из функций суммы прописью :

http://www.microsoft.ru/offext/details.aspx?id=613



Сенкю, запихнул данную функцию в свой можуль и вызываю её как там и сказано, всё работает. Уря...

А вот вопрос, можно ли в excel сделать такое.
Данные из формы сохраняются на отдельный лист книги. Это я как раз сейчас пишу, хотя ругаеться excel страшно, но думаю это осилю.

Теперь то что нужно получить.
Имеем например 3 записи за определённое число (пусть это будет например 10 апреля)
Как в форму вызвать эти данные?
Чуть подробнее имеем
запись такая-то
запись такая-то
запись такая-то
все за 10 апреля, помимо етого естественно есть записи за другие числа.
Так вот понадобилось исправить например запись под номером 2, но я естественно уже не помню что там есть.
Ещё точнее как сделать выборку по конкретному числу или это уже к access?
в далеке моячат 2 варианта:
1) заходим на лист где сохраняються данные, находим ту запись которая нужна для редактирования, и каким то образом отсылаем её в форму, тока как ето сделать незнаю, но можно подумать.
2) имеем форму в которой есть календарь, в этом календаре выбираем число и туда заносятся построчно данные.

Можно ли такое реализовать?

Или вот нет ли в excel элемента похожего на перемещение по записям в access?

Много вопросов и все теоретические. Вот пытаюсь понять можно ли реализовать хоть какой то вариант.


Написал и понял чо наверно поспешил, ведь есть элемент ScrollBar, можно ли его применить для данного случая? с учётом того что как то надо прикрутить к нему чтобы он скролил данные за заданную дату.??

275
14 апреля 2005 года
pashulka
985 / / 19.09.2004
IMHO
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.
3.7K
14 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
IMHO
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.



Гм. Короший пример. Он натолкнул меня на то что можно производить заполнение на основе поискового фильтрика который будет отсекать данные по дате и ещё какому-нибудь уникальному параметру. Самое главное что такой параметр имеется и это упрощает процесс.
Пошёл копать в обозначенном Вами направлении....

3.7K
17 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
IMHO
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.




Изучив более детальнее данную проблему появилось несколько вопросов.
1) Используя ListBox включающий несколько столбцов можно ли уйти от указания источником заполениня жёсткого диапазона (например А3:Р15), хотя бы из-за того что изначально задавать диапазон по 65655 строк это чревато.
Имею ввиду можно ли задать каким то образом диапазон который на данный момент присутствует на листе. И учитывать что данный диапазон постоянно растёт.
2) Можно ли к данному ListBox прилепить выборку по дате.
Имеется ввиду на UserForm Повесить календарик и исходя из выбранного числа будет производиться поиск на листе и заполнение ListBox будет произведено только данными соответсвующими данной дате.
Ибо просто листбокс хорошо, но когда количество строк перевалит хотя бы за сотню, прокручивать всё время скролл будет нудно и неудобно.
3) Исходя из вышесказанного и размышлений по поводу TreeView, нет ли у кого грамотного описания по работе с данным деревом, его заполнении и тд.(поиск по форуму мало чего дал)

275
17 апреля 2005 года
pashulka
985 / / 19.09.2004
1) Конечно можно, просто мне было проще задать его вручную.

 
Код:
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub


2) Можно воспользоваться стандартным элементом управления Календарь. Если таковой отсутствует на Панели инструментов, то его необходимо выбрать в списке Дополнительных элементов.

Вот несколько примеров сравнения исходных данных (в данном случае фамилий) и значений элементов списка ListBox, путём перебора всех элементов списка.

Код:
For iCount = 0 To ListBox1.ListCount - 1
    If "Иванов" = ListBox1.Column(0, iCount) Then
        Rem Необходимые действия
    End If
Next

For iCount = 0 To ListBox1.ListCount - 1
    If "Петров" = ListBox1.List(iCount, 0) Then
        Rem Необходимые действия
    End If
Next


Можно и немного по другому :

 
Код:
iMassiv = ListBox1.List

For iCount = LBound(iMassiv) To UBound(iMassiv)
    If "Иванов" = iMassiv(iCount, 0) Then
        Rem Необходимые действия
    End If
Next


P.S. Если Вы воспользуетесь элементом управления Календарь, то вместо Фамилий будете сравнивать с выбранной датой.
3.7K
21 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
1) Конечно можно, просто мне было проще задать его вручную.

 
Код:
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub


2) Можно воспользоваться стандартным элементом управления Календарь. Если таковой отсутствует на Панели инструментов, то его необходимо выбрать в списке Дополнительных элементов.

Вот несколько примеров сравнения исходных данных (в данном случае фамилий) и значений элементов списка ListBox, путём перебора всех элементов списка.

Код:
For iCount = 0 To ListBox1.ListCount - 1
    If "Иванов" = ListBox1.Column(0, iCount) Then
        Rem Необходимые действия
    End If
Next

For iCount = 0 To ListBox1.ListCount - 1
    If "Петров" = ListBox1.List(iCount, 0) Then
        Rem Необходимые действия
    End If
Next


Можно и немного по другому :

 
Код:
iMassiv = ListBox1.List

For iCount = LBound(iMassiv) To UBound(iMassiv)
    If "Иванов" = iMassiv(iCount, 0) Then
        Rem Необходимые действия
    End If
Next


P.S. Если Вы воспользуетесь элементом управления Календарь, то вместо Фамилий будете сравнивать с выбранной датой.




Мучился несколько дней, учитывая свой опыт в vba(малюсенький)
Не получается сделать (хотя примеры тут привели очень наглядные) следующее:
Научился задавать диапазон для listbox и организовать поиск по условию, но
Скомпоновать вместе задание диапазона ограниченного существующими данными для listbox и фильтра по условию не получается.
Так сказать немогу их склеить.

Можно ли попросить привести пример в котором это реализовано?

Например 3 фамилии с именами и надо выбрать определённую фамилию. Имею ввиду чтобы listbox был заполнен фамилией например Иванов.

275
21 апреля 2005 года
pashulka
985 / / 19.09.2004
На самом деле я подразумевал несколько другой алгоритм :

/// загрузка в ListBox всех данных конкретной таблицы (см.пример)
- выбор определённой даты в элементе управления Календарь
/// поиск этой даты в определённом столбце ListBox
/// выделение всей строки, содержащую самую первую найденную дату ***
- визуальное определение нужной строки и её выбор в ListBox *** (см.пример)
- изменение нужных данных в TextBox, которые отображают элементы списка выделенной строки в ListBox (см.пример)
- запись изменённых данных в соответствующие ячейки рабочего листа (см.пример)

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


Что касается фильтра, то насколько я знаю в ListBox нет фильтра, который например можно применить к ячейкам рабочего листа, поэтому если Вам по всей видимости остановить свой выбор на одном из трёх нижеперечисленных вариантах (или добавить к этому списку свой альтернативный вариант) :
- изначально "загружать" только данные соответствующие выбранному условию/критерию отбора
- создать дополнительный элемент, например ComboBox/ListBox и "загружать" в него данные соответствующие выбранному условию/критерию отбора
- после "загрузки" данных в ListBox c использованием свойства List удалять все данные несоответствующие выбранному условию/критерию отбора

P.S. Но лично я под этими вариантами не подписываюсь, ибо консервативен и лично меня устраивает мой алгоритм решения этой задачи.
3.7K
25 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka
На самом деле я подразумевал несколько другой алгоритм :

/// загрузка в ListBox всех данных конкретной таблицы (см.пример)
- выбор определённой даты в элементе управления Календарь
/// поиск этой даты в определённом столбце ListBox
/// выделение всей строки, содержащую самую первую найденную дату ***
- визуальное определение нужной строки и её выбор в ListBox *** (см.пример)
- изменение нужных данных в TextBox, которые отображают элементы списка выделенной строки в ListBox (см.пример)
- запись изменённых данных в соответствующие ячейки рабочего листа (см.пример)



Пересмотрел ещё раз примеры, пошёл от простого.
Так как не получаеться практически посмледний блок.
Имеем:
Создал форму в которую поместил listbox, разбил его на 4 колонки, в эту же форму добавил кучу элементов которые соответствуют той информации которая забита на странице, получилось произвести считывание в эти элементы с листа эксель.
Но тут начинаються но.
1) возвращаясь к пердыдущим постам, есть код

 
Код:
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub

Как здесь задать заполнение не с активного лист а любого. Попробовал подставить Worksheets, всё равно заполнение происходить только с активного листа. ((
2) Данные считываються вот таким образом и подставляються в нужные элементы на форме

 
Код:
Private Sub ListBox1_Click()
NameOrganiz.Value = ListBox1.List(ListBox1.ListIndex, 1)
txtDataOperac.Value = ListBox1.List(ListBox1.ListIndex, 0)
txtKolvoOtpravlen.Value = ListBox1.List(ListBox1.ListIndex, 3)
txtSerNomerOtpravlen.Value = ListBox1.List(ListBox1.ListIndex, 4)
txtNomerEmkosti.Value = ListBox1.List(ListBox1.ListIndex, 2)
End Sub


Вроде бы правильно. данные считываються, используя готовый код подставляються в опись и распечатываються, но как сохранить их в туже строку откуда они взяты? Сохраняться они сохраняються но где попало.
Использую следующий код:
Код:
Private Sub SaveDannie_Click()
    Dim Range As Object
    Dim iRow, i As Integer
    iRow = ListBox1.ListIndex        
        Worksheets("База").Cells(iRow, 1).Value = txtDataOperac.Text
        Worksheets("База").Cells(iRow, 3).Value = txtNomerEmkosti.Text
        Worksheets("База").Cells(iRow, 4).Value = txtKolvoOtpravlen.Text
        Worksheets("База").Cells(iRow, 2).Value = NameOrganiz.Text
        Worksheets("База").Cells(iRow, 5).Value = txtSerNomerOtpravlen.Text
        ListBox1.ListIndex = iRow
        End Sub


Как это поправить?

Чуть не забыл
3) почаму то данные из столбца "Дата Операсии" подставляютсья в форму в странном формате:
имеем "01,05,2005" в форму подставляеться "38473"
275
25 апреля 2005 года
pashulka
985 / / 19.09.2004
1) Вот так можно получить данные из ячеек рабочего листа, который не является активным (имя рабочего листа взято из Вашего примера)

 
Код:
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = Worksheets("База").UsedRange.Columns.Count
ListBox1.RowSource = Worksheets("База").UsedRange.Address
Rem ListBox1.List = Worksheets("База").UsedRange.Value
End Sub


2) Термин - куда попало, очень расплывчатый. Если, к примеру, данные из первого TextBox сохраняются в первую строку первого столбца, а данные из второго в пятую строку пятого столбца, то это действительно - куда попало. Если же речь идёт просто о несоответствии строк, то можете ещё раз посмотреть мой первый пример. И не забывайте, что нумерация элементов ListBox начинается с 0. Это касается и свойства ListIndex (см. первый пример)

3) На самом деле ничего странного, просто TextBox интерпретирует "01,05,2005" и отображает эту дату в виде соответствующего числа. То же самое можно получить если ввести в ячейку 01/05/2005 а затем установить формат Общий/Числовой

Вот два варианта решения Вашей проблемы :

 
Код:
txtDataOperac.Value = Format(ListBox1.List(ListBox1.ListIndex, 0), "dd,mm,yyyy") 'Вариант I.
txtDataOperac.Value = CDate(ListBox1.List(ListBox1.ListIndex, 0)) 'Вариант II.


Важно
Если в первом столбце ListBox окажутся данные отличные от формата дата, то применение макрофункции Cdate приведёт к возникновению ошибки, поэтому, если Вы хотите использовать Cdate, то лучше всего проверять что находится в первом столбце. Однако макрофункция Format в этом отношении более универсальна, так как не будет "реагировать" на подобные "сюрпризы" ...
3.7K
25 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka


2) Термин - куда попало, очень расплывчатый. Если, к примеру, данные из первого TextBox сохраняются в первую строку первого столбца, а данные из второго в пятую строку пятого столбца, то это действительно - куда попало. Если же речь идёт просто о несоответствии строк, то можете ещё раз посмотреть мой первый пример. И не забывайте, что нумерация элементов ListBox начинается с 0. Это касается и свойства ListIndex (см. первый пример)

.



2) Пересмотрел ещё раз ваш код и не всё в нём ясно

 
Код:
1 Private Sub CommandButton1_Click()
2 ListBox1.Tag = ListBox1.ListIndex
3 Range(ListBox1.RowSource).Item(ListBox1.Tag + 1, 2) = TextBox1.Value
4 ListBox1.ListIndex = ListBox1.Tag
5 End Sub


В данном коде непонятны 2,3,4 строка
Я так понимаю что в 3 строке сначала удаляеться (RowSource) пункт списка, а затем Item добавляется новый. Вот только нельзя ли чуть подробнее про Item, а то юлдбшего описания чем "item -элемент (строковое выражение), добавляемый в список" найти не удалось

А 2 и 4 строки непонятны из за собсвенноно ".Tag" то есть теоретически понятно что в строке 2 - ListBox1.Tag присваивается значение выбранной строки листбокс
а в 4 с точностью до наоборот но всё же кто такой этот ".Tag"
Собственно поэтому и использовал iRow.
При попытке сохранения изменённых данных изменяетсья почаму то только дата, учёл что нумерация с 0 и теперь сохранятеся в нужную строку , но сохраняется только первый столбец. Почаму то 2-3-4 неизменяються(((( Может ли это зависеть из за того что в форме присутсвует ещё один listbox в котором выбираються названия организаций..

Наверно очень расплывчато?
Добавление:
Пересмотрел ваш пример, попробовал использовать его за основу, в итоге, всё замечательно когда речь идёт об одном элементе (будь то listbox or textbox) Но когда их хотя бы 2 то изменяеться только один (тот который находится ближе к началу процедуры). Не говоря уже о 4 элементах. (( вот так то непонимаю почаму :-(
275
25 апреля 2005 года
pashulka
985 / / 19.09.2004
Свойство Item - это свойство используемое, так сказать по умолчанию, в данном примере используется для максимального облегчения понимания кода () Вот один из примеров :

 
Код:
iListName = Worksheets(2).Name
iListName = Worksheets.Item(2).Name

Свойство Tag я использовал исключительно для хранения значения предыдущего ListIndex ()
-----------------------------------
На самом деле принципиальное значение имеет использование RowSource, подробнее …

Предположим, что в диапазоне "A1:A5" находятся следующие данные :

B
L
I
N
D

Используем вот этот код :

 
Код:
iCell = Range("A1:A5").Item(4, 1)
MsgBox iCell, , ""

В результате мы получаем "N"

Если в ListBox Вы выбрали "N", то ListIndex = 3, и если разложить этот код :

 
Код:
Range(ListBox1.RowSource).Item(ListBox1.ListIndex + 1, 1) = TextBox1.Value

на составляющие, то мы получим :

 
Код:
Range("A1:A5").Item(3 + 1, 1) = "N"

Примечание :
Может имеет смысл представить свою рабочую книгу или написать в приват, "так как лучше один раз увидеть, чем сто раз услышать"

P.S.
1 - записывается, 2-3-4 нет, а что с пятым столбцом …
3.7K
25 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka

Примечание :
Может имеет смысл представить свою рабочую книгу или написать в приват, "так как лучше один раз увидеть, чем сто раз услышать"

P.S.
1 - записывается, 2-3-4 нет, а что с пятым столбцом …


5 столбец тоже не пишеться,
ТО есть из 5 пишеться какой то один но не более того, ставлю ремарки на строках чтобы проверить остальные и везде одно и тоже, заменяетсья только значение прописанное в процедуре ближе к началу, всё что идёт дальше игнорируеться.

275
26 апреля 2005 года
pashulka
985 / / 19.09.2004
В общем так и должно быть, так как сразу после изменения значения ячеек в исходном диапазоне, значения ListBox также обновляются, так как этот ListBox связан с ячейками рабочего листа посредством свойства RowSource. Обновление значений ListBox вызывает событие Click, которое в свою очередь приводит к тому, что во всех четырёх последующих TextBox появляются "старые" значения, которые затем заменяют самих себя в ячейках рабочего листа.

В принципе есть как минимум три решения Вашего вопроса :
- использовать свойство List
- изменять сразу все ячейки в одной строке
- или не дать совершиться злодеянию, описанному в самом начале
3.7K
26 апреля 2005 года
blind7
56 / / 12.01.2005
Цитата:
Originally posted by pashulka


В принципе есть как минимум три решения Вашего вопроса :
- использовать свойство List
- изменять сразу все ячейки в одной строке
- или не дать совершиться злодеянию, описанному в самом начале



Выслал книгу почтой.
Гм, а:
1) имееться ввиду свойство "ListCount" или что-о другое.
А как можно изменить сразу все ячейки, до такого я ещё не дошёл(.

По крайней мере дата теперь подставляеться в нужном формате, учёл замечание, исправил и оно заработало:-))

Злодеяние то ещё но как его избежать(((?

275
26 апреля 2005 года
pashulka
985 / / 19.09.2004
1) Нет я имел ввиду именно свойство List, а пример его использования есть в инициализации формы, только эта часть закомментирована, ну и конечно его применение должно повлечь и другие изменения кода.

2)
Код:
'Вариант I.

Dim iMassiv(1 To 5)

iMassiv(1) = "B"
iMassiv(2) = "L"
iMassiv(3) = "I"
iMassiv(4) = "N"
iMassiv(5) = "D"

Range("A1:E1").Value = iMassiv

Вариант II.

Range("A3:E3").Value = Array("B", "L", "I", "N", "D")


3) Для того чтобы решить Вашу задачу можно использовать, например :

Код:
Private Sub CommandButton1_Click()
ListBox1.Tag = ListBox1.ListIndex
Range(ListBox1.RowSource).Item(ListBox1.Tag + 1, 2) = TextBox1.Value
Range(ListBox1.RowSource).Item(ListBox1.Tag + 1, 3) = TextBox2.Value
ListBox1.ListIndex = ListBox1.Tag
ListBox1.Tag = ""
End Sub

Private Sub ListBox1_Click()
CommandButton1.Locked = False
If ListBox1.ListIndex = ListBox1.Tag Then Exit Sub
TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 1) 'Вариант I.
TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 2)
'TextBox1.Value = ListBox1.Column(1, ListBox1.ListIndex) 'Вариант II.
End Sub


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