А еще лучше для выбора использовать ЛистБоксы. У них функционал шире и работать с ними проще. Как по мне. Если не подходит вариант с ТекстБоксами, то, хотя бы, перенесите проверку введенного названия подраздела на нажатие кнопки ввода
Согласие есть продукт при полном непротивлении сторон.
vadim-kholkin написал: Если не сложно, то помогите с кодом
Сложно. Потому что код нужно переписывать полностью:-). Использовать для выбора данных из базы и ввода данных в базу один и тот-же КомбоБокс плохая идея. И даже в этом случае Вы не правильно понимаете работу процедуры
Код
Private Sub ИмяПодраздела_Change()
Она срабатывает при вводе КАЖДОЙ буквы имени подраздела. Ну и конечно не находит, в большинстве случаев, введенное сочетание букв. Раз Вы уже научились управлять видимостью контролов на форме, то, как вариант, разместить поверх КомбоБоксов простые ТекстБоксы такого же размера и менять их видимость при необходимости. При выборе данных видим КомбоБ, а ТекстБ не видим, и наоборот. П.С. Кстати зачем такие большие размеры контролов при таком маленьком размере шрифта в них? Смотрится не очень. ИМХО
Александр Бойко написал: и так как значения из столбцов "цифры" более не нужны, они должны удалятся, вместе со значения из столбцов "даты"
Удалять данные формулы НЕ могут, даже если это ГуглТаблицы)
Цитата
Александр Бойко написал: Что значит бюджет? Каждый сам оценивают свою работу
А то и значит. Читайте Правила (Рекомендации для заказчиков) этой ветки. Может, за предложенные Вами (условно) 100 руб. никто не согласиться, а за 100тыс.(тоже условно), которые попросят за работу, Вы не согласитесь
With ActiveSheet.ListObjects(Range("A" & fcell.Row).Value)
значение переменной fcell.Row равно 1, что означает, что на Активном листе должна быть Умная таблица с Именем как в ячейке A1, а такой таблицы на листе нет. П.С. Осваивайте инструменты отладки кода (точки останова, Immediate, Local и проч.)
Согласие есть продукт при полном непротивлении сторон.
Евгений Смирнов, Я думаю, что Сортировка Иерархии в 'боевых' условиях бесполезная задача. Иерархия и делается для структурирования данных в заранее ОПРЕДЕЛЕННОЙ последовательности и манипуляции с сортировкой нарушат эту структуру. Если только как лабораторный опыт). ТС видимо нужен только список в поле фильтра
Евгений Смирнов, Сама по себе иерархия (простой список цифр) вряд ли кому нужна. К ней, как правило, привязаны какие то данные (номенклатура, оглавление и т.п.). И эти данные тоже нужно тянуть со списком
Согласие есть продукт при полном непротивлении сторон.
rekv написал: Надо понять, можно ли в принципе отсортировать иерархический список без применения макросов (с ними пока не знакома)? Надо, чтобы при нажатии на фильтр выходила такая последовательность
Это разные вещи. Отсортировать и Отобразить в списке фильтра. Если именно Отсортировать еще можно попытаться макросом, то отобразить иерархию в списке фильтра в нужной Вам последовательности навряд ли
Согласие есть продукт при полном непротивлении сторон.
Александр Бойко написал: Вроде бы не сложная задача, тут заказы делают в тысячи раз сложнее.
Проблема в том, что решение нужно для Гугл-таблиц. Тут не так много специалистов по ним. Это, все таки не Excel. Задачу можно решить, например, макросом (VBA), но они ГуглТ не поддерживаются. Точнее там свой язык. Ну и сроки выполнения и предполагаемый бюджет не плохо было бы знать
Согласие есть продукт при полном непротивлении сторон.
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
Вот такой код ищет столбец с нужным форматом данных и использует его в дальнейших вычислениях
Код
'..........................................
For Each iSh In ThisWorkbook.Worksheets
If iSh.Name <> "000" Then
With iSh
For Each iCell In .UsedRange.Cells
If iCell Like "*.*.*.*" Then
iClmn = iCell.Column
Exit For
End If
Next
arr = .Range(.Cells(1, iClmn), .Cells(.Cells(.Rows.Count, iClmn).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column)).Value
'...........далее по тексту кода ............
То же самое для итогового столбца
Код
With Worksheets("000")
For Each iCell In .UsedRange.Cells
If iCell Like "*.*.*.*" Then
iClmn = iCell.Column
Exit For
End If
Next
arr = .Range(.Cells(5, iClmn), .Cells(.Cells(.Rows.Count, iClmn).End(xlUp).Row, iClmn + 1)).Value
For I = LBound(arr, 1) To UBound(arr, 1)
If iDic.Exists(arr(I, 1)) Then
arr(I, 2) = iDic(arr(I, 1))
End If
Next
.Cells(5, iClmn + 1).Resize(UBound(arr, 1)) = Application.Index(arr, 0, 2)
End With
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
Если структура листов одинаковая, то зачем пользователю выбирать столбец? Определите его сразу в коде, или, кодом-же, ищите нужный столбец по какому либо признаку (заголовку, формату данных и т.п.). То же и со столбцом для вставки. Хотя это дело хозяйское, Вам виднее. Если это действительно нужно - допилите сами См.файл
Скрытый текст
Код
Sub trovial()
Dim iSh As Worksheet
Dim arr()
Dim iDic As Object
Dim I&
Set iDic = CreateObject("Scripting.Dictionary")
For Each iSh In ThisWorkbook.Worksheets
If iSh.Name <> "000" Then
With iSh
arr = .Range(.Cells(1, 2), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column)).Value
End With
For I = LBound(arr, 1) To UBound(arr, 1)
If iDic.Exists(arr(I, 1)) Then
iDic(arr(I, 1)) = iDic(arr(I, 1)) + arr(I, 4)
Else
iDic.Add arr(I, 1), arr(I, 4)
End If
Next
Erase arr
End If
Next
With Worksheets("000")
arr = .Range("B5:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).Value
For I = LBound(arr, 1) To UBound(arr, 1)
If iDic.Exists(arr(I, 1)) Then
arr(I, 2) = iDic(arr(I, 1))
End If
Next
.Range("C5").Resize(UBound(arr, 1)) = Application.Index(arr, 0, 2)
End With
End Sub
Sub DateFilter()
Dim iCell As Range
Dim rDate As Range
Dim rDel As Range
Dim iDays, I&
iDays = InputBox("Количество дней:", , "90")
If iDays = "" Then Exit Sub
Application.ScreenUpdating = False
With Worksheets("Лист1")
Set rDate = .Range("D2:D" & .Cells(.Rows.Count, "D").End(xlUp).Row)
End With
For Each iCell In rDate
If iCell.Value + Val(iDays) < Now Then
If Not rDel Is Nothing Then
Set rDel = Union(rDel, iCell)
Else
Set rDel = iCell
End If
I = I + 1
End If
Next
If Not rDel Is Nothing Then
rDel.EntireRow.Delete
MsgBox "Удалено " & I & " строк"
End If
Application.ScreenUpdating = True
End Sub
vadim-kholkin написал: Я понимаю, что это конфликт с макросом, который заполняет Combobox "ИмяПодраздела"
Судя по второй картинке - нет. Проблема в том, что при заполнении массива из диапазона листа, массив имеет 2 размерности. Т.е. и в Ubound нужно указывать для какой размерности
Код
For I = 1 To UBound(M, 1)
П.С. файл не смотрел. Вопрос не относится к заявленной теме
vadim-kholkin написал: Ну и нюанс - это не сразу появляется в Комбобоксе имя нового листа, только после выхода с формы и возврата.
Можно продублировать наполнение Комбобоксов в обработке нажатия на кнопку КомбоБокса Добавьте в модуль формы такой код
Код
Private Sub ИмяРаздела_DropButtonClick()
Dim ws As Worksheet
Me.ИмяРаздела.Clear
For Each ws In Worksheets
If ws.Range("C1") = Me.Name Then ИмяРаздела.AddItem ws.Name 'Заполнение Combobox "ИмяРаздела" именами вкладок
Next
End Sub
Согласие есть продукт при полном непротивлении сторон.
vadim-kholkin написал: не могу найти строку заполнения КомбоБокса.
Заполнение КомбоБокса перенесено в отдельную процедуру
Код
Private Sub UserForm_Activate()
Dim ws As Worksheet
Me.ИмяРаздела.Clear
For Each ws In Worksheets
If ws.Range("C1") = Me.Name Then ИмяРаздела.AddItem ws.Name 'Заполнение Combobox "ИмяРаздела" именами вкладок
Next
End Sub
Потому что Инициализация формы происходит один раз, и, для того чтобы обновились значения в Комбо, форму нужно выгружать из памяти (Unload) и опять инициализировать. А Активация формы - процесс периодический, и каждый раз данные в Комбо обновляются
Согласие есть продукт при полном непротивлении сторон.
vadim-kholkin написал: если будет создано 20-30 листов
Я конечно до конца не представляю Вашей задумки, но такой подход не совсем правильный. Зачем Вам для каждого НАИМЕНОВАНИЯ номенклатуры иметь отдельный лист? А если их будет 200-300? Правильнее будет для каждого ВИДА номенклатуры иметь лист и в него, в табличной форме складывать Наименования. Шарниры\Ручки\Полки в таблицу Фурнитура. Доски\ДВП\ДСП в таблицу Материалы. И т.п. Но это мое мнение.
lost.eu написал: Задача была в том, чтобы проставить такое количество сколько имеется видимых строк буквы A, B, C
Мало что понятно. Может так?
Скрытый текст
Код
Sub тест()
Dim количествоСтрок As Integer
Dim количествоБукв As Integer
Dim буква As String
Dim I As Integer
Dim видимаяСтрока As Range
количествоСтрок = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count
If количествоСтрок = 1 Then
Range("H2").Value = "A"
Exit Sub
End If
' Деление на 3 и округление вверх
количествоБукв = Application.WorksheetFunction.RoundUp(количествоСтрок / 3, 0)
' Проставление букв по видимым строкам столбца H
I = 1
For Each видимаяСтрока In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible)
If I <= количествоБукв Then
буква = "A"
ElseIf I <= 2 * количествоБукв Then
буква = "B"
Else
буква = "C"
End If
видимаяСтрока.Offset(0, 7).Value = буква ' смещение на 7 столбцов вправо
I = I + 1
Next видимаяСтрока
End Sub
П.С. Кстати. И Ваш код выдал какой-то результат. Который из них правильный?
Вот такой макрос удалит ВСЕ картинки(фигуры, диаграммы и т.п.) на АКТИВНОМ листе
Код
Sub DelPictures()
Dim iPict As Shape
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
For Each iPict In ActiveSheet.Shapes
iPict.Delete
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон.
Варианты 1. При создании Листа записывать ИмяФормы, из которой он создан, в какую нибудь ячейку этого листа. Для наполнения КомбоБокса - цикл по листам с проверкой имени формы. 2. При создании Листа записывать его Имя в свойство UserForm.Tag или в КомбоБокс.Tag (длина строки до 2048 символов). Для наполнения КомбоБокса - считывать значение этого свойства. 3. Масса других способов. Включая запись в реестр Windows)
В файле см.код для форм Фурнитуры и Материалов. Реализован п.1 П.С. У вас реально где-то еще используется Excel 97 ?