Почему ошибка при вызове формы?
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 в первол листе книги.
Есть кнопка на рабочем листе которая вызывает некую форму. Вот код вызова:
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".
Если кнопка на листе создана с помощью панели "Формы", то попробуйте Private Sub заменить на Public Sub.
Если кнопка создана с помощью панели "Элементы управления", то проверьте соответствие свойства "Name" кнопки и имени процедуры-обработчика события "Click".
Кнопка создана с помошью панели "Элементы управления" , на листе 3 кнопки, Одна работает исправно, а 2 вызывают ошибку. Но повторюсь что в 97 такой ошибки не происходит.
Перепроверил соответствие "Name" и обработчика "Click" они соответствуют
имя - StartCheki
соответственно в обработчике StartCheki_Click()
Кнопка создана с помошью панели "Элементы управления" , на листе 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
Раз так, то давайте кое-что уточним.
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 он работает исправно.
Нонсенс...
1) В ошибочном случае не появляеться вообще.
2) Простите, а что есть нормальный случай. Повторюсь что в офисе 97 всё работает. К тому же ещё одно уточнение из трёх кнопок запускающих формы, работает исправно в 2002 только 1. Но в ней инициализация прописана также как и в 2 остальных (естественно имена различны).
3) в процедуре инициализации непрописаны listBox
4) В форме действительно есть один элемент списка, но, в 97 он работает исправно.
Нонсенс...
Может выложите коды и формы "на пробу". Проверю у себя на разных версиях "Офиса".
Может выложите коды и формы "на пробу". Проверю у себя на разных версиях "Офиса".
так а куда можно скинуть исходник?
тама архивчик на 46 килобайт.
Попутно возниколо несколько вопосов, но их я смогу задать только после размещения исходника, ибо насколько понимаю без понимания о чём речь, нельзя ответить можно ли воплотить задуманное.
Извините за путанность и сбивчивость речи.
так а куда можно скинуть исходник?
тама архивчик на 46 килобайт.
Попутно возниколо несколько вопосов, но их я смогу задать только после размещения исходника, ибо насколько понимаю без понимания о чём речь, нельзя ответить можно ли воплотить задуманное.
Извините за путанность и сбивчивость речи.
Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.
Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.
Cобственно вот оно.
Кладите архив сюда же. Правила форума позволяют прикрепить к сообщению файл до 1 МБ.
1)Собственно первая и третья кнопка описывает событие и вываливается с ошибкой в офиссе2003, вторая кнопка не описана и открывается на ура.
2)Хотелось бы сюда же добавить сохранение в файл с последующим вытаскиванием по параметру дата
3) И заменить присутствующую билеберду перевода цифр в текст, на более нормально написанное.
А вот как реализовать эти пункты незнаю (((
OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100")
на :
OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100").Value
P.S. MS Excel 97 - выбор посвящённых …
А ларчик просто открывался, надо заменить :
OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100")
на :
OtdelenieCheki.List = Worksheets("Лист3").Range("a2:a100").Value
P.S. MS Excel 97 - выбор посвящённых …
Это надоже :-(. И ведь говорили поверь список, повеил:-(( Век живи век учись. Сенку. а то лоб разбил об эту поблему.
Теперь поблем меньше ровно на 1.
Набравшись смелости спошу:
Можно ли добавить к данным формам возможность сохранения данных.
Имеется ввиду чтобы по нажатии на "сохранить" в форме, данные сохранялись либо на отдельный лист, либо в файл. Гм, а щё лучше чотбы эти сохранённые данные можно было в дальнейшем вызволить в форму для редактиования. В какой области копать??
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
...
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
Опубликованный выше код будет работать только в MS Excel 2000 и выше, так как использует StrReverse, которая появилась только в VB 6.0
Учитывая, что Вы также работаете и в MS Excel 97 возможно Вам окажется полезна данная ссылка, так как большинство программ написаны в период с 97 по 99 г.
http://relib.com/forums/topic.asp?id=859354
P.S.
Зря Вы назвали решение проблемы суммы прописью с помощью формул белибердой, так как людей которые решили этот вопрос именно этим способом на несколько порядком меньше, чем тех, кто написал свою собственную пользовательскую функцию. Скажу даже больше, многие абсолютно уверены, что решить этот вопрос с помощью формул невозможно.
Опубликованный выше код будет работать только в 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
Зря Вы назвали решение проблемы суммы прописью с помощью формул белибердой, так как людей которые решили этот вопрос именно этим способом на несколько порядком меньше, чем тех, кто написал свою собственную пользовательскую функцию. Скажу даже больше, многие абсолютно уверены, что решить этот вопрос с помощью формул невозможно.
Ради интереса попробовал решить задачу именно таким способом. Результат - в прикреплённом файле.
По трудоёмкости работа вполне сравнима с написанием макроса, но, с моей точки зрения, более нудная.
Да, про Office 97 как-то забылось.
Вот код функции реверсии строки, взятый у Гетца и Джилберта ("Программирование в Microsoft Office"):
Попробую прикрутить данную функцию, понять бы ещё как, но думаю что удастся с этим справиться.
Тихо тихо движемся к финальному месту.
Попробую прикрутить данную функцию, понять бы ещё как, но думаю что удастся с этим справиться.
Тихо тихо движемся к финальному месту.
А какие предвидятся сложности в "прикрутке" функции?
Если не знаете, куда вставить её код, то лучше всего в тот же модуль кода, где находится и вызывающий её макрос.
http://www.microsoft.ru/offext/details.aspx?id=613
Для просмотра программного кода функции введите пароль nikita Функция будет работать в MS Excel 97, 2000, 2002. Есть небольшой help и т.д. и т.п.
Вот прямая ссылка на одну из функций суммы прописью :
http://www.microsoft.ru/offext/details.aspx?id=613
Сенкю, запихнул данную функцию в свой можуль и вызываю её как там и сказано, всё работает. Уря...
А вот вопрос, можно ли в excel сделать такое.
Данные из формы сохраняются на отдельный лист книги. Это я как раз сейчас пишу, хотя ругаеться excel страшно, но думаю это осилю.
Теперь то что нужно получить.
Имеем например 3 записи за определённое число (пусть это будет например 10 апреля)
Как в форму вызвать эти данные?
Чуть подробнее имеем
запись такая-то
запись такая-то
запись такая-то
все за 10 апреля, помимо етого естественно есть записи за другие числа.
Так вот понадобилось исправить например запись под номером 2, но я естественно уже не помню что там есть.
Ещё точнее как сделать выборку по конкретному числу или это уже к access?
в далеке моячат 2 варианта:
1) заходим на лист где сохраняються данные, находим ту запись которая нужна для редактирования, и каким то образом отсылаем её в форму, тока как ето сделать незнаю, но можно подумать.
2) имеем форму в которой есть календарь, в этом календаре выбираем число и туда заносятся построчно данные.
Можно ли такое реализовать?
Или вот нет ли в excel элемента похожего на перемещение по записям в access?
Много вопросов и все теоретические. Вот пытаюсь понять можно ли реализовать хоть какой то вариант.
Написал и понял чо наверно поспешил, ведь есть элемент ScrollBar, можно ли его применить для данного случая? с учётом того что как то надо прикрутить к нему чтобы он скролил данные за заданную дату.??
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.
IMHO
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.
Гм. Короший пример. Он натолкнул меня на то что можно производить заполнение на основе поискового фильтрика который будет отсекать данные по дате и ещё какому-нибудь уникальному параметру. Самое главное что такой параметр имеется и это упрощает процесс.
Пошёл копать в обозначенном Вами направлении....
IMHO
По всей видимости это тот вопрос, в котором единодушного мнения Вы не услышите, так как реализация Вашей задачи будет во многом зависеть от личных предпочтений того и иного человека.
Вот пример "связки" ячеек рабочего листа и MSForms, если добавить поиск среди элементов ListBox, то получите полное решение Вашей задачи, во всяком случае в моём понимании.
Изучив более детальнее данную проблему появилось несколько вопросов.
1) Используя ListBox включающий несколько столбцов можно ли уйти от указания источником заполениня жёсткого диапазона (например А3:Р15), хотя бы из-за того что изначально задавать диапазон по 65655 строк это чревато.
Имею ввиду можно ли задать каким то образом диапазон который на данный момент присутствует на листе. И учитывать что данный диапазон постоянно растёт.
2) Можно ли к данному ListBox прилепить выборку по дате.
Имеется ввиду на UserForm Повесить календарик и исходя из выбранного числа будет производиться поиск на листе и заполнение ListBox будет произведено только данными соответсвующими данной дате.
Ибо просто листбокс хорошо, но когда количество строк перевалит хотя бы за сотню, прокручивать всё время скролл будет нудно и неудобно.
3) Исходя из вышесказанного и размышлений по поводу TreeView, нет ли у кого грамотного описания по работе с данным деревом, его заполнении и тд.(поиск по форуму мало чего дал)
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub
2) Можно воспользоваться стандартным элементом управления Календарь. Если таковой отсутствует на Панели инструментов, то его необходимо выбрать в списке Дополнительных элементов.
Вот несколько примеров сравнения исходных данных (в данном случае фамилий) и значений элементов списка ListBox, путём перебора всех элементов списка.
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
Можно и немного по другому :
For iCount = LBound(iMassiv) To UBound(iMassiv)
If "Иванов" = iMassiv(iCount, 0) Then
Rem Необходимые действия
End If
Next
P.S. Если Вы воспользуетесь элементом управления Календарь, то вместо Фамилий будете сравнивать с выбранной датой.
1) Конечно можно, просто мне было проще задать его вручную.
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub
2) Можно воспользоваться стандартным элементом управления Календарь. Если таковой отсутствует на Панели инструментов, то его необходимо выбрать в списке Дополнительных элементов.
Вот несколько примеров сравнения исходных данных (в данном случае фамилий) и значений элементов списка ListBox, путём перебора всех элементов списка.
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
Можно и немного по другому :
For iCount = LBound(iMassiv) To UBound(iMassiv)
If "Иванов" = iMassiv(iCount, 0) Then
Rem Необходимые действия
End If
Next
P.S. Если Вы воспользуетесь элементом управления Календарь, то вместо Фамилий будете сравнивать с выбранной датой.
Мучился несколько дней, учитывая свой опыт в vba(малюсенький)
Не получается сделать (хотя примеры тут привели очень наглядные) следующее:
Научился задавать диапазон для listbox и организовать поиск по условию, но
Скомпоновать вместе задание диапазона ограниченного существующими данными для listbox и фильтра по условию не получается.
Так сказать немогу их склеить.
Можно ли попросить привести пример в котором это реализовано?
Например 3 фамилии с именами и надо выбрать определённую фамилию. Имею ввиду чтобы listbox был заполнен фамилией например Иванов.
/// загрузка в ListBox всех данных конкретной таблицы (см.пример)
- выбор определённой даты в элементе управления Календарь
/// поиск этой даты в определённом столбце ListBox
/// выделение всей строки, содержащую самую первую найденную дату ***
- визуальное определение нужной строки и её выбор в ListBox *** (см.пример)
- изменение нужных данных в TextBox, которые отображают элементы списка выделенной строки в ListBox (см.пример)
- запись изменённых данных в соответствующие ячейки рабочего листа (см.пример)
*** - Если данные в таблице отсортированы по дате, то при наличии нескольких записей содержащих одну и туже дату, нужную строку необходимо определить и выбрать визуально, а в в случае если выбранная дата не будет найдена, можно например выделить самый первый элемент списка (но это уже можно сделать программно)
Что касается фильтра, то насколько я знаю в ListBox нет фильтра, который например можно применить к ячейкам рабочего листа, поэтому если Вам по всей видимости остановить свой выбор на одном из трёх нижеперечисленных вариантах (или добавить к этому списку свой альтернативный вариант) :
- изначально "загружать" только данные соответствующие выбранному условию/критерию отбора
- создать дополнительный элемент, например ComboBox/ListBox и "загружать" в него данные соответствующие выбранному условию/критерию отбора
- после "загрузки" данных в ListBox c использованием свойства List удалять все данные несоответствующие выбранному условию/критерию отбора
P.S. Но лично я под этими вариантами не подписываюсь, ибо консервативен и лично меня устраивает мой алгоритм решения этой задачи.
На самом деле я подразумевал несколько другой алгоритм :
/// загрузка в ListBox всех данных конкретной таблицы (см.пример)
- выбор определённой даты в элементе управления Календарь
/// поиск этой даты в определённом столбце ListBox
/// выделение всей строки, содержащую самую первую найденную дату ***
- визуальное определение нужной строки и её выбор в ListBox *** (см.пример)
- изменение нужных данных в TextBox, которые отображают элементы списка выделенной строки в ListBox (см.пример)
- запись изменённых данных в соответствующие ячейки рабочего листа (см.пример)
Пересмотрел ещё раз примеры, пошёл от простого.
Так как не получаеться практически посмледний блок.
Имеем:
Создал форму в которую поместил listbox, разбил его на 4 колонки, в эту же форму добавил кучу элементов которые соответствуют той информации которая забита на странице, получилось произвести считывание в эти элементы с листа эксель.
Но тут начинаються но.
1) возвращаясь к пердыдущим постам, есть код
ListBox1.ColumnCount = ActiveSheet.UsedRange.Columns.Count
ListBox1.RowSource = ActiveSheet.UsedRange.Address
Rem ListBox1.List = ActiveSheet.UsedRange.Value
End Sub
Как здесь задать заполнение не с активного лист а любого. Попробовал подставить Worksheets, всё равно заполнение происходить только с активного листа. ((
2) Данные считываються вот таким образом и подставляються в нужные элементы на форме
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
Вроде бы правильно. данные считываються, используя готовый код подставляються в опись и распечатываються, но как сохранить их в туже строку откуда они взяты? Сохраняться они сохраняються но где попало.
Использую следующий код:
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"
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 = CDate(ListBox1.List(ListBox1.ListIndex, 0)) 'Вариант II.
Важно
Если в первом столбце ListBox окажутся данные отличные от формата дата, то применение макрофункции Cdate приведёт к возникновению ошибки, поэтому, если Вы хотите использовать Cdate, то лучше всего проверять что находится в первом столбце. Однако макрофункция Format в этом отношении более универсальна, так как не будет "реагировать" на подобные "сюрпризы" ...
2) Термин - куда попало, очень расплывчатый. Если, к примеру, данные из первого TextBox сохраняются в первую строку первого столбца, а данные из второго в пятую строку пятого столбца, то это действительно - куда попало. Если же речь идёт просто о несоответствии строк, то можете ещё раз посмотреть мой первый пример. И не забывайте, что нумерация элементов ListBox начинается с 0. Это касается и свойства ListIndex (см. первый пример)
.
2) Пересмотрел ещё раз ваш код и не всё в нём ясно
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 элементах. (( вот так то непонимаю почаму :-(
iListName = Worksheets.Item(2).Name
Свойство Tag я использовал исключительно для хранения значения предыдущего ListIndex ()
-----------------------------------
На самом деле принципиальное значение имеет использование RowSource, подробнее …
Предположим, что в диапазоне "A1:A5" находятся следующие данные :
B
L
I
N
D
Используем вот этот код :
MsgBox iCell, , ""
В результате мы получаем "N"
Если в ListBox Вы выбрали "N", то ListIndex = 3, и если разложить этот код :
на составляющие, то мы получим :
Примечание :
Может имеет смысл представить свою рабочую книгу или написать в приват, "так как лучше один раз увидеть, чем сто раз услышать"
P.S.
1 - записывается, 2-3-4 нет, а что с пятым столбцом …
Примечание :
Может имеет смысл представить свою рабочую книгу или написать в приват, "так как лучше один раз увидеть, чем сто раз услышать"
P.S.
1 - записывается, 2-3-4 нет, а что с пятым столбцом …
5 столбец тоже не пишеться,
ТО есть из 5 пишеться какой то один но не более того, ставлю ремарки на строках чтобы проверить остальные и везде одно и тоже, заменяетсья только значение прописанное в процедуре ближе к началу, всё что идёт дальше игнорируеться.
В принципе есть как минимум три решения Вашего вопроса :
- использовать свойство List
- изменять сразу все ячейки в одной строке
- или не дать совершиться злодеянию, описанному в самом начале
В принципе есть как минимум три решения Вашего вопроса :
- использовать свойство List
- изменять сразу все ячейки в одной строке
- или не дать совершиться злодеянию, описанному в самом начале
Выслал книгу почтой.
Гм, а:
1) имееться ввиду свойство "ListCount" или что-о другое.
А как можно изменить сразу все ячейки, до такого я ещё не дошёл(.
По крайней мере дата теперь подставляеться в нужном формате, учёл замечание, исправил и оно заработало:-))
Злодеяние то ещё но как его избежать(((?
2)
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) Для того чтобы решить Вашу задачу можно использовать, например :
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
Примечание :
Оба вышеперечисленных способа также помогут избежать злодеяния.