Спасибо Nic70y, сейчас проверяю, но вроде бы оно самое. А сумму по такому же принципу тоже ведь можно подсчитывать,или только по СУММЕСЛИ? (это вопрос для самообразования)
Извините, не до конца почистил листы (более ориентировался на размер файла), сейчас вроде бы убрал все лишнее и сохранил дополнительно в старом формате файлов. И все-таки можно ли решить данную проблему формулой массива, а не макросом, а то вдруг пользователь кнопку макроса забудет нажать или еще что-нибудь , а формулой как-то надежнее.
файлы удалены. Общий размер более 100 кБ [МОДЕРАТОРЫ]
Уважаемые гуру форума, помогите с решением задачи. В таблице на листе "товарный отчет" происходит выборка данных способом, описанном в приемах данного форума ("Многоразовый ВПР" по формуле массива: =ЕСЛИОШИБКА(ИНДЕКС(Запчасти!$B$3:$B$20;НАИМЕНЬШИЙ(ЕСЛИ($C$5=Запчасти!$A$3:$A$20;СТРОКА(Запчасти!$B$3:$B$20)-2;"" ;СТРОКА()-53));"" и все бы хорошо, но требуется, что бы при повторении позиций (в данном случае номера 24-44ОЕ) эта самая позиция показывалась только один раз, а цифры по повторяющимся позициям оказались бы сложенными, т.е. в данном случае не 4950, 2050, 2490 тремя строками, а 9490 одной строкой. Как это сделать? Заранее спасибо всем откликнувшимся.
Спасибо большое The_Prist, все работает. А можно еще маленький дополнительный вопросик по InputBox: я правильно понимаю, что этот объект, равно как и MsgBox не имеют каких-либо свойств, подобных остальным объектам и в них нельзя поменять ни размер шрифта ни прочего?
The_Prist, проверил Ваш вариант (там лишний пробел случайно закрался), но ситуация не изменилась почему-то :o , в коде только эту строку нужно или изменить для решения или еще что-нибудь? А по поводу стиля вопроса, я хотел как лучше, поподробнее.
Уважаемые гуру, проконсультируйте с небольшой проблемой. На лист вводятся данные через форму, количество через вводится с использованием ImputBox, вот соответствующая часть кода: ActiveCell.Offset(0, 5) = InputBox("Сколько записать?") ActiveCell.Offset(1).Activate Все бы хорошо, но если вводится дробное число, то оно во-первых выравнивается в соответствующей ячейке по левому краю (а не по правому, как задано), а во-вторых, что более важно, введенное число не участвует в расчетах (не вычитается). Если после этого войти в эту ячейку и нажать enter, введеное число и выравняется как надо и посчитается правильно. При всем этом, если число целое, все отрабатывается как надо сразу. Что мне надо изменить в коде (пытался определить формат InputBox, формат изменился, проблема - нет.) Заранее спасибо всем откликнувшимся.
SkyShark, спасибо большое предложенный вами вариант работает, но позвольте небольшое уточнение. В реальном файле задумывалась немного более сложная формула для расчеты промежуточных остатков с использование функции СЦЕПИТЬ, а также задействуя вычисленный макросом результат (чтобы было примерно "итого по стр.1 8998,29 руб."). Я правильно понимаю, что для приведения результатов к такому виду достаточно изменить вид формулы из вашего макроса?
Уважаемые гуру. Подскажите, можно ли решить данную проблемку. Имеется лист с остатками товара и хотелось бы иметь на каждой страницы постраничный итог, а уж совсем хорошо, если бы этот постраничный итог печатался бы не в ячейке (как сейчас), а в колонтитуле (на форуме была похожая тема о печати каких-либо результатов в колонтитулах). Я предполагал использовать для расчетов функцию СЧЕТЕСЛИМН, но она требует, скажем так, "контрольных ячеек" и вот эти самые ячейки я бы и хотел вычислить. На просторах сети я нашел макрос:
Public Sub PageNumner() Dim VPB As Excel.VPageBreak Dim HPB As Excel.HPageBreak Dim intVPBC As Integer Dim intHPPC As Integer Dim lngPage As Long
lngPage = 1
If ActiveSheet.PageSetup.Order = xlDownThenOver Then intHPPC = ActiveSheet.HPageBreaks.Count + 1 intVPBC = 1 Else intVPBC = ActiveSheet.VPageBreaks.Count + 1 intHPPC = 1 End If
For Each VPB In ActiveSheet.VPageBreaks If VPB.Location.Column > ActiveCell.Column Then Exit For End If
lngPage = lngPage + intHPPC Next VPB
For Each HPB In ActiveSheet.HPageBreaks If HPB.Location.Row > ActiveCell.Row Then Exit For End If
lngPage = lngPage + intVPBC Next HPB
MsgBox "Номер страницы активной ячейки = " & lngPage End Sub
который правильно и корректно вычисляет номер страницы активной ячейки. MsgBox с сообщением мне не нужен, а вот как если мне подсказали как присвоить диапазону I10:I39 (в примере) значения вычисленные вышеописаной функцией, все было бы замечательно. Сейчас значения "контрольных ячеек" забиты вручную и на 2-3 страницы это несложно, но если бы таких страниц было 100 или 500, неужели бы этот момент нельзя было бы решить по иному? Говоря покороче, как помощью макроса, который будет включаться по какому-либо событию или каким-либо "постоянным" образом через VBA или формулами (устроит любой способ) получать значения "контрольных ячеек", в данном примере диапазона I10:I39? Заранее большое спасибо всем откликнувшимся.
Уважаемые гуру, очень прошу помочь с написанием макроса. Необходимо в макросе выделить диапазон (для дальнейшей сортировки по дате) по последней заполненной ячейке столбце D. Сложность (для меня) в том что ниже этого диапазона (образовавшегося в результате работы другого макроса) после какого-то количества пустых строк, находятся заполненные ячейки и найденный мною в сети макрос: Sub Copy_To_Last_Cell() Range("B1:D" & Cells(Rows.Count, 1).End(xlUp).Row).Select End Sub
выделяет диапазон B1:D12, а мне нужно чтобы выделялся диапазон B1:D3. Как это сделать? Заранее спасибо всем откликнувшимся.
Пожалуйста, файла не жалко. UserForm вызывается правым кликом мыши. Образец заполнен по дням месяца только для января, но, разумеется для отсальных месяцев даты будут располагаться в том же столбце. Хотелось бы выбрав не только месяц, но и день (как и описывал) перейти в столбце "А" к этому самому дню.
Уважаемые гуру, подскажите как усовершенствовать возможности макроса. Ситуация следующая: на UserForm имеется combobox со списком месяцев, при выборе значения из этого combobox срабатывает небольшой макрос найденный мною на просторах интернета: Sub Search() Dim ИскомыйТекст As String, НайденныйТекст As Range, Массив As String ИскомыйТекст = UserForm1.ComboBox1 Массив = "J3:L530" Set НайденныйТекст = Range(Массив).Find(ИскомыйТекст) If Not НайденныйТекст Is Nothing Then НайденныйТекст.Select End Sub который перемещает активную ячейку в "заголовок" выбранного месяца. Все работает как надо, но вот захотел немного усовершенствовать. Дело в том, что на листе есть не только названия месяцев, но и даты в формате ДД.ММ. и хотелось бы иметь возможность перейти на конкретный день года. Так вот, если на UserForm добавить еще 1 combobox в котором можно будет выбрать числа (от 1 до 31) можно было бы (как мне кажется) сделать это. Вопрос: я так понимаю, что сначала нужно будет передать "сцепленные" значения combobox-ов в какой-либо другой объект (listbox, textbox, не знаю что из них лучше подходит), скорректировав и формат (ведь изначально он будет типа "27 января", а для поиска нужен "27.01." (почему-то, когда я пробую проверить поиск через Ctrl + F, соглашается искать только, если и дата для поиска и дата в колонке записаны в текстовом формате), а уж потом передать откорректированный текст в макрос для отработки. Правильно ли я предполагаю алгоритм выполнения задачи и, самое главное, как это сделать? Заранее спасибо всем откликнувшимся.
Файл прикрепляю. "Справочник" удалил. Данными, "от фонаря" конечно, заполнил. Появление формы меня бы абсолютно устроило по правому клику мыши. А вот насчет 300 строк, так это абсолютно неважно, сейчас формула массива на этом листе расположена с 14 по 184 и со 191 по 302 строки для любого в разумных мерках (нашей фирмы) количесва поставок/расходов, но если надо в примере можно хоть все обрезать, форма важнее многократно. И еще, я правильно догадываюсь, что достаточно медленная отработка вызываемых форм (в примере они удалены) на листах Приход и Расход нарямую связан с тем, что на листах находятся по 5000 строк, заполненных формулами почти полностью? (а на листе Расход я вообще сначала создал, разметил, заполнил формулами 10000 строк, а после сокращения вдвое заметил небольшое ускорение отработки)
ОК. Итак, вызвав с листа "Приход+расход за месяц (проба)" Вашу форму я хочу видеть в ней данные столбцов U:W (или только столбца Т), находящихся на листе "Приход". "Помечаются" необходимые строки ("галочки" должны попадать на лист "Приход" конечно). Все, форма закрывается. Затем в дело вступят формулы массива на листе "Приход+расход за месяц (проба)" и все будет ОК. Три столбца я смогу видеть или один неважно, три конечно аккуратнее выглядят, но в столбце Т эти данные находятся в "склееном" виде и доступны для сравнения пользователю). Если уж совсем сильно наглеть, то на этой же форме должен быть еще один листбокс полностью аналогичный первому только с данными с листа "Расход", но это я надеюсь сделать сам, воспользовавшись вашей формой.
Простите, Юрий, вроде бы чистил файл перед отправкой. А Вашей формы в файле действительно нет, т.к. вариант с вызовом формы с листа Приход, т.е., как я понимаю с объявлением массива на текущем листе я надеюсь справиться сам (чуть откорректированный вариант Вашего кода работает, просто не уверен что этот вариант корректировки грамотен), а вот как вызвать вашу форму с другого листа (Приход+расход за месяц (проба), но с пометками на лист Приход, я вообще не представляю и недеюсь увидеть Ваш вариант. Лист Расход в примере оставлен, так как данные с него идут в отчетный лист и, если Вы мне поможете с моим сегодняшним вопросом, я постараюсь сделать аналог для таких же действий (с теми же целями отбора), но с данными листа Расход.
Уважаемый Юрий, моя благодарность за вашу помощь за прошедшее время не стала меньше, но при проверке Вашего варианта вылез "косячок". Пометки отказываются записываться на лист, если столбцы скрыты, (object variable or with block variable not set). Моих знаний хватило только на такую модификацию вашего кода
Private Sub UserForm_Initialize() Columns("D:E").EntireColumn.Hidden = False Dim i As Long, LastRow As Long LastRow = Cells(Rows.Count, 4).End(xlUp).Row For i = 4 To LastRow Me.ListBox1.AddItem Cells(i, 4) Next End Sub
Private Sub UserForm_Terminate() Columns("D:E").EntireColumn.Hidden = True End Sub
Ответьте, если не затруднит, это нормальное решение проблемы? И, уж коли тема немного не закрылась, вопрос по реальному файлу в новом примере, сам как хотел бы - не справился. Требуется на листе "Приход+расход за месяц (проба)" вызвать "вышепридуманную" Вами форму с данными из листа "Приход", видеть в Листбоксе я хотел столбцы U:W, отметки ставить в столбец Z. Хотя, если отображение нескольких столбцов по каким-либо причинам затруднительно, подошел бы вариант отображения только столбца T, в нем все равно содержится аналогичная информация, только тогда смещение нужно будет сделать Rng.Offset(0, 6) = "a" правильно? Самое главное и неполучающееся у меня это объявление массива с данными из другого листа, если конечно это возможно. Галочки в столбце Z в примере показаны для образца. Извините за сумбур, если кому-нибудь будет неясно, поясню подробнее. Заранее спасибо.
всегда вроде бы на форуме рекомендуют не перегружать примеры излишней информацией, в реальном примере и листов много и макросов и прочего в данном случае "мусора". А по поводу моего последнего вопроса я наверное неудачно объяснил. В примере скрытая информация начинается в ячейке D4 и соответственно отображается в форме, а как в форму добавить (только для отображения) информацию и из С4 и из D4 разом, причем колонка для отметок будет по-прежнему одна, та же самая, в форме нужно только отображение нескольких столбцов
Замечательно, все верно, огромное спасибо, но вот все-таки еще 1 вопросик появился: в примере я указал только один столбец с данными он и отображается, все верно, а вот в рабочем файле предполагается скрытие нескольких (№ поставки, дата, наименование поставки и т.д.) Что нужно изменить в Вашем коде, чтобы в Листбоксе отображались все эти скрытые столбцы?
Все правильно, вывести на форму нужно именно данные со скрытых столбцов и вот именно в ListBox как раз я и хочу иметь возможность их "пометить" галочкой там, checkbox -ом или еще как-нибудь, и эти пометки должны появиться на соответствующих строках листа для последующего отбора. И еще, подскажите уж заодно как можно будет (если можно) разом убирать все предыдущие пометки (для следующего отбора). PS А "птицы" на примере, нааверное смутившие и запутавшие Вас, поставлены просто для примера ,примерно так я хочу чтобы было после "прокрыживания" на форме
Задумывается следующее: столбцы скрыты, в них находятся предварительно отфильтрованные (формулами) данные. Для возможности дальнейшего (в случае необходимости) отбора предполагается "прокрыживание" выбранных строк. Данные я предполагал увидеть в текст- или листбоксе (или они не могут получить данные со скрытых диапазонов, тогда жаль очень), и вот увидев данные (в примере диапазона: столбец текста и столбец в котором предполаегается простановка "крыжей" проставляю "крыжи", они синхронно (или по закрытию формы, неважно) отображаются на соответствующих строках скрытых столбцов и в дальнейшем служат критериями отбора. Я могу конечно просто отобразить скрытые столбцы, проставить крыжи, опять их скрыть, но такой вариант я оставил на крайний случай, если не получится с вышеуказанным вариантом, так как имеются пусть и не критичные, но не сильно удобные проблемы скрытия/отображения нужных мне столбцов после выполнения "прокрыживания", а вышеуказанный план, как мне кажется, этих самых проблем лишен. Надеюсь теперь объяснил подробнее.
Уважаемые гуру, подскажите как решить небольшую задачу. В документе имеются скрытые столбцы (D:F) в них находится некая информация. С помощью темы "Пометка элементов списка флажками (checkbox)" (http://planetaexcel.ru/techniques/3/61/) найденной на этом уважаемом ресурсе я могу "отмечать" нужные мне строки. Вопрос таков: как перенести в listbox или textbox (я не знаю что из них лучше подходит для этой ситуации), находящихся на UserForm (вызов правой клавишей мыши) диапазон (в данном случае D4:E10) с возможностью аналогичным способом "простановки" этих самых галочек в UserForm или иного варианта пометок, но ОБЯЗАТЕЛЬНО с появлением этих самых пометок в соответствующих строках на листе, так как по ним (по отметкам) будет производиться отбор данных. Вариант с простым отображением скрытых строк подходит не совсем, так как в документа большое кол-во столбцов, могущих при различных условиях быть и скрытыми и открытыми, а после выполнения пометок хотелось бы возвращения к первоначальному варианту отображения столбцов без дополнительных манипуляций. Заранее спасибо всем откликнувшимся.
Hugo, я правильно Вас понял, что на ДРУГОМ листе необходимо выставить условие, а вот скрываемые строки указать приблизительно как: Sheets("Лист2" ) .Rows("89:127" ) .EntireRow.Hidden = False Так? А по первой части вопроса, неужели код не оптимизируется? (он и так работает конечно, но я посчитал, что простто перечислением n-го количества условий настоящие профи не пишут и хотел узнать как код выглядит более правильно)
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Rows("89:400" ) .EntireRow.Hidden = True
If Not Intersect(Target, Range("B89" ) ) Is Nothing Then
If Target.Value = 0 Then
Rows("89:127" ) .EntireRow.Hidden = True
Else
Rows("89:127" ) .EntireRow.Hidden = False
End If
End If
If Not Intersect(Target, Range("B128" ) ) Is Nothing Then
If Target.Value = 0 Then
Rows("89:166" ) .EntireRow.Hidden = True
Else
Rows("89:166" ) .EntireRow.Hidden = False
End If
End If
End If
Application.ScreenUpdating = True
End Sub
условий подобных If Not Intersect(Target, Range("B89" ) ) Is Nothing Then If Target.Value = 0 Then Rows("89:127" ) .EntireRow.Hidden = True Else Rows("89:127" ) .EntireRow.Hidden = False End If End If у меня не 2, а 8 и, я так понимаю, что данный вариант кода очень далеко не оптимален, ведь их могло бы быть и 80 или еще больше. Как оптимизировать данную часть кода? И еще, как в подобном коде (задача там полностью аналогична, при заполнении ячеек должны отображаться/скрываться определенные строки), на этой же странице указать "проверочную" ячейку не как: If Not Intersect(Target, Range("B128" ) ) Is Nothing Then а на ДРУГОМ листе данного файла . Заранее спасибо всем откликнувшимся
Спасибо Serge 007 за Ваш вариант, но для ума (мне) подскажите, почему в моем варианте формула не работала (ведь подобные я неоднократно использовал) и еще, в этом файле, если я вводил дату "ручками", а не через userform с заданным форматом и указывал эту ячейку в качестве контрольной, то все работало как и полагается без формулы массива