Страницы: 1
RSS
Фильтр работает до 10 текстбокса, на последующих вываливает ошибку Subscript out of range., Есть форма, но с багами. Помогите поправить
 
Код
Option Explicit
Public WithEvents vTBx As MSForms.TextBox

Private Sub vTBx_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
Dim x, y(), i&, j&, Idx&, tVal$, k&
Idx = Val(Right(vTBx.Name, 1)) - 1
tVal = vTBx.Value

With UserForm1.ListBox1
    x = .List
    ReDim y(UBound(x, 1), UBound(x, 2))
    For i = 0 To UBound(x)
        If InStr(x(i, Idx), tVal) Then    'Debug указывает на этот цикл
            For j = 0 To UBound(x, 2)
                y(k, j) = x(i, j)
            Next j
            k = k + 1
        End If
    Next i
    .List = y()
End With
End Sub

Файл с формой в архиве. Ума не приложу, как так получается, что фильтр работает, но частично( Благодарю за отклик
 
Очень прикольный макрос. Спасибо. Не знал что так можно.
Еле понял, что нужно (ошибка у меня не вылетает). Насколько я понимаю, у Вас не работают фильтры для последние 5 столбцов.
Проблема в том, что там нумерация текстбоксов становится двухзначной, а в Idx записывается только последний знак и соответственно, если если нажать на столбец 10, то в фильтр для сравнения записывается значение из столбца 10, а проверяются уже с значения не 10, а первого столбца.
Я не волшебник, я только учусь.
 
Ошибку понял. А вот как избежать? Хотя бы в каком направлении думать. Присвоить другие имена текстбоксам и сделать второй цикл для сравнения?
 
файл не смотрела - как написано в  #2 - проблема идёт с Idx -- т.е. ноги растут с 7-й строки - вы там по строке кода пишите, что берёте "правый символ из имени" - упорядочьте ваши имена и переменную Idx (не лезу в файл, т.к. свойства .Name всё равно ведь могут быть разные, дело не в этом частном случае - оптимизируйте как вам надо, взятие/выдёргтвание этой Idx переменной)... мы же не знаем, какие имена у вас там могут быть... если стандартно TextBox1 etc, используйте Replace(tb.Name, "TextBox","")
Изменено: JeyCi - 21.03.2019 07:07:33
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
взял хитростью. Текстбоксы у меня были Tbx1 etc, переименовал их на Tbx11 etc. Беру 2 крайние цифры, отнимаю от них 11 и получаю "порядковый номер". Код прилагаю, может кому будет полезным. Спасибо за помощь)
Код
Private Sub vTbx_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = True
Dim x, y(), i&, j&, Idx&, tVal$, k&
Idx = Val(Right(vTbx.Name, 2)) - 11
tVal = vTbx.Value

With UserForm1.ListBox1
    x = .List
    ReDim y(UBound(x, 1), UBound(x, 2))
    For i = 0 To UBound(x)
        If InStr(x(i, Idx), tVal) Then
            For j = 0 To UBound(x, 2)
                y(k, j) = x(i, j)
            Next j
            k = k + 1
        End If
    Next i
    .List = y()
End With
End Sub
Изменено: kidly - 20.03.2019 21:02:11
 
Тогда не проще и называть их Tbx01, Tbx02 и т.д.?
 
Изначально так и думал сделать, 01 и т.д. Но была ошибка runtime error, а с таким вариантом ошибок небыло
 
Есть атрибут Tag, который можно использовать проставив уже цифры тогда без привязки к именам просто
Idx = vTBx.Tag - 1
По вопросам из тем форума, личку не читаю.
 
Цитата
kidly написал:
переименовал их на Tbx11 etc.
зачем?
у меня при замене 7-й строки кода из #1
'Idx = Val(Right(vTBx.Name, 1)) - 1
на это
Idx = --(Replace(vTBx.Name, "TBx", "")) - 1
вроде работает
p.s.
кстати при сбрасывании в лист Результат -  у вас там вроде очистка сего листа изначально не предусмотрена (код не смотрю) - но пишет поверху (и если предыдущий массив больше текущего, то нижние строки из предыдущего остаются) -- перетрясите код на этот нюанс
Изменено: JeyCi - 21.03.2019 07:17:31
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
М.б. вместо
Код
Idx = Val(Right(vTBx.Name, 1)) - 1
вот так записать?
Код
Idx = vTBx.Index
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил Лебедев, А это точно работает, попробовал воспроизвести, что то не хочет. Говорит:
На TextBox(ах), то же самое.
Изменено: Nordheim - 21.03.2019 09:39:08
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Говорит:На TextBox(ах), то же самое.
Что Вы делаете, чтобы он это говорил? Не могу воспроизвести Вашу ошибку.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Михаил Лебедев написал:
Что Вы делаете, чтобы он это говорил
Нажимаю кнопки на форме :D , может версия Excel 2010 не поддерживает метод Index
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Нажимаю кнопки на форме
Понажимал на все кнопки... Никакого эффекта. Нет ошибки, и всё тут. Даже не интересно :)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Но и сообщения нет, а должно быть, как раз с номером индекса.
"Все гениальное просто, а все простое гениально!!!"
 
Упс... В Вашем файле - да, Index не работает.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Не только в файле, а вообще на АРМе. Дома попробую на  Excel 365
Изменено: Nordheim - 22.03.2019 09:56:30
"Все гениальное просто, а все простое гениально!!!"
 
Да, вааащщщщеееее.!!!!
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
А разве у MSForms.CommandButton (# 11) есть свойство Index?
Владимир
 
Цитата
sokol92 написал:
MSForms.CommandButton
Его удобней нажимать , а так и на TextBox(ах) воспроизводилась та же ошибка.
"Все гениальное просто, а все простое гениально!!!"
 
Может быть, имелось в виду TabIndex?
Владимир
 
Владимир, приветствую.
Цитата
Может быть, имелось в виду TabIndex?
ну оно то ваще не для этого, да и в данной форме идут в реверсном порядке.

Чем всех Tag то не устраивает?
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, Михаил! Лично я постоянно использую свойство Tag как формы, так и ее элементов.
Владимир
 
Tag штука хорошая, но, в данном конкретном случае, удобнее привязываться к имени.
Я бы написал так, и не парился.
Код
Idx = Val(Mid(vTBx.Name, 4))
 
RAN, Андрей, так как и в том и другом случае требуется расстановка в правильной последовательности, то трудозатраты одинаковы, а вот обработка дальнейшая проще. Но настаивать не буду, кому как удобнее.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх