Здравствуйте! Я снова к вам за советом. Есть UserForm с текстбоксами и листбоксом. И есть таблица, в которой нужно отфильтровать диапазон на основании текстбокса1 UserForm, и затем вставить полученные значения в листбокс.
Подскажите, что не так с моим макросом?
Код
Private Sub UserForm2_Initialize()
Application.ScreenUpdating = False
Dim stRow As Long
Dim strName As String
Dim t As Integer
Dim Wbb As Workbook
strName = ThisWorkbook.Path & "\приложения\база\движение.xlsb"
Set Wbb = Workbooks.Open(strName)
Me.ListBox1.Clear
stRow = Wbb.Sheets("движение").Cells(Rows.Count, 5).End(xlUp).Row
With Wbb.Sheets("движение")
.Cells(2, 5).AutoFilter Field:=5, Criteria1:=Me.UserForm2.TextBox1
.Select
End With
Cells = SpecialCells(xlVisible)
t = 0
For r = 2 To stRow
Me.UserForm2.ListBox1.AddItem ""
Me.UserForm2.ListBox1.List(t, 0) = Wbb.Sheets("движение").Cells(r, 2).Value
Me.UserForm2.ListBox1.List(t, 1) = Wbb.Sheets("движение").Cells(r, 8).Value
Me.UserForm2.ListBox1.List(t, 2) = Wbb.Sheets("движение").Cells(r, 9).Value
Me.UserForm2.ListBox1.List(t, 3) = Wbb.Sheets("движение").Cells(r, 10).Value
Me.UserForm2.ListBox1.List(t, 4) = Wbb.Sheets("движение").Cells(r, 11).Value
Me.UserForm2.ListBox1.List(t, 5) = Wbb.Sheets("движение").Cells(r, 15).Value
Me.UserForm2.ListBox1.List(t, 6) = Wbb.Sheets("движение").Cells(r, 16).Value
Me.UserForm2.ListBox1.List(t, 7) = Wbb.Sheets("движение").Cells(r, 17).Value
t = t + 1
Next
Windows("движение").Close False
Application.ScreenUpdating = True
End Sub
есть две формы. В одной - прайс лист, при двойном клике на названии в первой форме - появляется вторая форма, в которой указано движение детали..(приход, расход, кем, когда, сколько)
первая форма работает отлично, при двойном клике появляется вторая форма, в текстбоксе - название детали, а дальше.на этом все и заканчивается - все остальное - пусто
еще есть предположение что с первой формы я кидаю название детали на страницу книги, а уже потом текстбокс второй формы берет это название.. может в этом причина?
но я добавляла при инициализации строку - Me.UserForm2.TextBox1 = Workbooks("программа").Sheets("главная").Cells(1, 23) не помогло, в итоге сейчас в свойствах самого текстбокса выставлена конкретная ячейка из которой он и берет название
Set myCells = Cells.SpecialCells(xlCellTypeVisible)
Настоятельный совет - избегайте использовать в качестве имен переменных зарезервированные слова (Cells например). Это не ошибка, но очень большая вероятность возникновения ошибки
Согласие есть продукт при полном непротивлении сторон
Sanja, спасибо Вам большое за помощь) проблеск уже есть, уже открывает и сортирует ту таблицу, теперь заминка на вставке, но это уже завтра буду разбираться)
Все получилось, теперь вставляет в форму при нажатии кнопки"добавить", но теперь новая проблема - при автофильтре в форму добавляет все нужные и ненужные данные... т.е. подхватывает с таблицы все ячейки что выше выбранной позиции. В примере я удалила с книг все, оставив только то, что нужно - кнопка в первой книге, и 2 таблицы во второй, из которой формы берут данные. В примере это можно проверить выбрав "датчик ПРП..." Помогите мне пожалуйста со второй формой .
Код
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Me.ListBox1.Clear
Dim Wb As Workbook
Set Wb = Workbooks.Open(ThisWorkbook.Path & "\расход.xlsb")
With Wb.Sheets("расход")
.Cells(2, 5).AutoFilter Field:=5, Criteria1:=Me.TextBox1
.Select
End With
stRow = Wb.Sheets("расход").Cells(Rows.Count, 5).End(xlUp).Row
Set myCells = Cells.SpecialCells(xlCellTypeVisible)
t = 0
For r = 3 To stRow
Me.ListBox1.AddItem ""
Me.ListBox1.List(t, 0) = Wb.Sheets("расход").Cells(r, 2).Value
Me.ListBox1.List(t, 1) = Wb.Sheets("расход").Cells(r, 8).Value
Me.ListBox1.List(t, 2) = Wb.Sheets("расход").Cells(r, 9).Value
Me.ListBox1.List(t, 3) = Wb.Sheets("расход").Cells(r, 10).Value
Me.ListBox1.List(t, 4) = Wb.Sheets("расход").Cells(r, 11).Value
Me.ListBox1.List(t, 5) = Wb.Sheets("расход").Cells(r, 15).Value
Me.ListBox1.List(t, 6) = Wb.Sheets("расход").Cells(r, 16).Value
Me.ListBox1.List(t, 7) = Wb.Sheets("расход").Cells(r, 17).Value
t = t + 1
Next
With Wb.Sheets("прайс")
.Cells(2, 5).AutoFilter Field:=5, Criteria1:=Me.TextBox1
.Select
End With
stRow = Wb.Sheets("прайс").Cells(Rows.Count, 5).End(xlUp).Row
Set myCells = Cells.SpecialCells(xlCellTypeVisible)
myCells.Select
For r = 3 To stRow
Me.TextBox2.Text = Wb.Sheets("прайс").Cells(r, 2).Value
Me.TextBox3.Text = Wb.Sheets("прайс").Cells(r, 7).Value
Next
Windows("расход").Close False
ListBox1.ColumnWidths = "65;125;65;65;65;65;65;65"
Application.ScreenUpdating = True
End Sub
Я еще подработала код, он стал понятней, но фильтрация все равно проходит не правильно. Как и писала в прошлом посте - при автофильтре добавляет в форму кроме выбранной позиции и те, что расположены выше. Что не так с фильтрацией? подскажите плиззззз
Код
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Me.ListBox1.Clear
Dim Wb As Workbook
Set Wb = Workbooks.Open(ThisWorkbook.Path & "\расход.xlsb")
With Sheets("расход")
.Cells(2, 5).AutoFilter Field:=5, Criteria1:=Me.TextBox1
.Select
End With
stRow = Sheets("расход").Cells(Rows.Count, 5).End(xlUp).Row
Set myCells = Cells.SpecialCells(xlCellTypeVisible)
t = 0
For r = 3 To stRow
Me.ListBox1.AddItem ""
Me.ListBox1.List(t, 0) = Sheets("расход").Cells(r, 2).Value
Me.ListBox1.List(t, 1) = Sheets("расход").Cells(r, 8).Value
Me.ListBox1.List(t, 2) = Sheets("расход").Cells(r, 9).Value
Me.ListBox1.List(t, 3) = Sheets("расход").Cells(r, 10).Value
Me.ListBox1.List(t, 4) = Sheets("расход").Cells(r, 11).Value
Me.ListBox1.List(t, 5) = Sheets("расход").Cells(r, 15).Value
Me.ListBox1.List(t, 6) = Sheets("расход").Cells(r, 16).Value
Me.ListBox1.List(t, 7) = Sheets("расход").Cells(r, 17).Value
t = t + 1
Next
Windows("расход").Close False
ListBox1.ColumnWidths = "65;125;65;65;65;65;65;65"
Application.ScreenUpdating = True
End Sub
Ну вот опять, какой ответ Вы хотите получить? Раз фильтрация не работает, значит ВСЁ с ней не так.
Цитата
ALANA написал: Я еще подработала код, он стал понятней
Для Вас наверное да, понятнее, но для человека абсолютно далекого от Ваших форм/фильтров/и проч. это просто код. Не о чем. У Вас ДВА файла. В одном из них ДВЕ формы. К какому файлу/форме этот код относится? ЧТО, по Вашей задумке, он должен делать? Напишите словами. Обычными, без привязки к VBA
Согласие есть продукт при полном непротивлении сторон
на главной странице - кнопка "Прайс"(это для примера кроме кнопки на странице нет ничего, и для уменьшения размера) . При нажатии на кнопку появляется форма с названиями изделий, (то что в наличии на данное число). При клике на наименование в прайсе появляется вторая форма. В ней описано движение изделия(когда и от кого поступило, куда и кем расходовалось.(берется из таблицы расход) Это в принципе то, что я хотела бы увидеть.. Но споткнулась на этой фильтрации. Саму фильтрацию делает правильно код, я пошагово проверяла код. но вот в форму вставляет почему то и скрытые строки тоже, при чем только те, что выше выбранной позиции
С Вашими файлами так и не разобрался (честно говоря - лень). Валится куча ошибок, постоянно пытается открыться уже открытый файл 'расход' и прочее... По коду. Вот Вы определили диапазон видимых ячеек (myCells). А дальше что? Где Вы дальше его используете?
Согласие есть продукт при полном непротивлении сторон
я пыталась его вставить в строки - Me.ListBox1.List(t, 0) = Sheets("расход").myCells(r, 2).Value но в таком случае вообще никакой вставки не происходило в листбокс.. а открытый файл расход у Вас потому что код не до конца выполняется..когда все нормально срабатывает, то вы его вообще не увидите тот лист расход.
а вообще, это мои первые формы) я никогда не делала ничего подобного раньше, поэтому наверное они в чем то кривоватые) Да и про то что в эксель можно сделать такое я даже не догадывалась еще год назад)
ALANA. простите, ваш файл не смотрела (по времени совсем не свободна)... но судя по постановке вопроса, завалялся у меня один файл-пример... разберите его реализацию... что-то мне подсказывает, что вы это пытаетесь сделать, раз пишите .AutoFilter (если правильно поняла вас)... вобщем, пример в помощь прикладываю - если вы в листбокс хотите с отфильтрованного (согласно текстбоксам) диапазона вставлять данные... p.s. но листбокс можно и с массива заполнять - как альтернатива - ListBox.List=arr ... примеры на форуме были
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)