Что то никак не могу разобраться с синтаксисом Скриптом спамить не буду, кратко опишу.
Есть форма для заполнения юзерами. В форме есть выпадающие списки, которые формируются в зависимости от участка работы юзера. Т.е. выбор участка - выбор линии (динамический диапазон через ВПР). В общем вопрос - как правильно указать VBA что имя источника для популяции списка Lines именно L (последняя строка).
Код
Dim L As String
L = CStr(main.Range("LineSource"))
Lines.List = lists.Range("" & L & "").Value
Такой вариант не работает - та же ошибка 1004 Lines.List = lists.Range("" & Range("LineSource") & "").Value
L определяется как, например, П_ЭСП. Динамический список с 12 позициями так и называется П_ЭСП. Число списков будет пополняться, равно как и число участков. Вот это
Что то завис с одной простой проблемкой. Недавно начал осваивать сводные таблицы и сталкиваюсь с проблемами которые элементарно решал с помощью стандартных функций.
КАК вывести ТОЛЬКО в столбце итогов разницу между столбцами 2019 и 2018? Поиски юзал, но везде что то не то Заранее спасибо!!!
Пример в приложении. Хотел скрины просто выложить - на выходе белиберда получается если вставлять принтскрины.
UPD Решение найдено. Может и не совсем элегантное. В значение добавляем идентичное выводимому полю (в поле значения у нас получается Сумма по Полю количество и Сумма по Полю количество 2). Кликаем на втором столбце в сводной таблице, выбираем Дополнительные вычисления - Отличия. Базовое поле Годы, Базовый элемент - в моем случае 2018. Скрываем столбец с пустыми значениями. И все...
Доброго времени суток! Очередной вопрос от нуба. Есть несколько листов с данными, которые надо обрабатывать подставляя формулы (фактически подстановка критериев для работы формул типа суммеслимн и иже с ней). Количество строк на листах 45 000 строк. Код работал при количестве строк до 32 000 (переменные шли как Integer). Заменил на Long и ппц((( Рылся и на форуме и в инете... так и не смог найти объяснение. Основные части кода (однотипные части не выкладываю, т.к. идет однотипная обработка 6 листов, отличается только количество колонок куда подставляются формулы).
Код
Sub Tchpok()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wb As Workbook
Set wb = ThisWorkbook
Dim sales As Worksheet
Set sales = wb.Sheets("Продажи")
Dim dz As Worksheet
Set dz = wb.Sheets("ДЗ")
Dim pay As Worksheet
Set pay = wb.Sheets("Оплаты")
Dim i As Long, n As Long, z As Long
i = Application.WorksheetFunction.CountA(sales.Columns(2)) + 5
sales.Range(Cells(8, 1), Cells(i, 1)).FormulaR1C1 = "=IFERROR(INDEX(Оплаты!C1,MATCH(Продажи!RC3,Оплаты!C3,0)),"""")"
sales.Range(Cells(8, 1), Cells(i, 1)).Copy
sales.Range(Cells(8, 1), Cells(i, 1)).PasteSpecial xlPasteValues
sales.Range(Cells(8, 17), Cells(i, 17)).FormulaR1C1 = "=IFERROR(INDEX(Менеджер_для_премии,MATCH(RC[-9],Менеджер_в_отчетах,0)),"""")"
sales.Range(Cells(8, 17), Cells(i, 17)).Copy
sales.Range(Cells(8, 17), Cells(i, 17)).PasteSpecial xlPasteValues
n = Application.WorksheetFunction.CountA(dz.Columns(1)) + 50
dz.Range(Cells(8, 15), Cells(n, 15)).FormulaR1C1 = "=IFERROR(INDEX(Продажи!C17,MATCH(ДЗ!RC1,Продажи!C3,0)),"""")"
dz.Range(Cells(8, 15), Cells(n, 15)).Copy
dz.Range(Cells(8, 15), Cells(n, 15)).PasteSpecial xlPasteValues
dz.Range(Cells(8, 16), Cells(n, 16)).FormulaR1C1 = "=IFERROR(INDEX(Месяц_период,MATCH(RC3,Дата_ДЗ,0)),R[-1]C)"
dz.Range(Cells(8, 16), Cells(n, 16)).Copy
dz.Range(Cells(8, 16), Cells(n, 16)).PasteSpecial xlPasteValues
dz.Range(Cells(8, 17), Cells(n, 17)).FormulaR1C1 = "=IFERROR(INDEX(Продажи!C6,MATCH(ДЗ!RC1,Продажи!C3,0)),"""")"
dz.Range(Cells(8, 17), Cells(n, 17)).Copy
dz.Range(Cells(8, 17), Cells(n, 17)).PasteSpecial xlPasteValues
z = Application.WorksheetFunction.CountA(pay.Columns(2)) + 50
pay.Range(Cells(7, 17), Cells(z, 17)).FormulaR1C1 = "=IFERROR(INDEX(Месяц_период,MATCH(RC[1],Месяц_период,0)),R[-1]C)"
pay.Range(Cells(8, 17), Cells(z, 17)).Copy
pay.Range(Cells(8, 17), Cells(z, 17)).PasteSpecial xlPasteValues
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
При выполнении выдает ошибку на этой строчке, и других строках, аналогичных этой: sales.Range(Cells(8, 1), Cells(i, 1)).FormulaR1C1 = "=IFERROR(INDEX(Оплаты!C1,MATCH(Продажи!RC3,Оплаты!C3,0)),"""")"
Буду очень благодарен, если еще подскажете как обойти вот эту ерунду (подстановку результатов вычисления формулы в ячейку):
Есть таблица с переменным числом строк (от 10 до 60) и столбцов (от 6 до 120). Необходимо под ней по критерию проссуммировать значения по всей длине таблицы. Высота таблицы должна соответствовать количеству критериев. Пример таблицы (картинку не смог приклеить почему то).
Попробовал следующие варианты. Ни один не отрабатывает((( Точнее отрабатывает только по вертикали.
Логику закладывал следующую: Цикл перебором заполняет горизонталь, по достижении максимального значения горизонтали переходит к новому значению вертикали, далее горизонталь и т.д.
Код
' определяем общее число строк со значениями на исходной странице
Dim rown As Integer
Sheets("Продажи").Activate
rown = Application.WorksheetFunction.CountA(Range("A:A")) + 1
'Первый столбец массива - фиксированный
Dim ColNumStart As Integer
ColNumStart = 4
'Последний столбец массива - подсчитывает число введенных столбцов с данными
Dim ColNumFinish As Integer
ColNumFinish = Sheets("Intermed").Range("A3").End(xlToRight).Column
' указывает первую строку для подстановки формул
Dim RowNumStart As Integer
RowNumStart = rown + 3
' указывает последнюю строку для подстановки формул
Dim RowNumFinish As Integer
RowNumFinish = rown + 16
Do While RowNumStart <= RowNumFinish
Do While ColNumStart <= ColNumFinish
Cells(RowNumStart, ColNumStart) = WorksheetFunction.SumIfs(Range(Cells(3, ColNumStart), Cells(rown, ColNumStart)), _
Range(Cells(3, 3), Cells(rown, 3)), Cells(RowNumStart, 1))
ColNumStart = ColNumStart + 1
Loop
RowNumStart = RowNumStart + 1
Loop
Этот цикл заполняет только горизонталь и завершается((( Попробовал второй вариант, добавив дополнительную переменную - та же хрень...
Код
' указывает последнюю строку для подстановки формул
Dim RowNumFinish As Integer
RowNumFinish = rown + 16
Dim i As Integer
For i = RowNumStart To RowNumFinish
Do While ColNumStart <= ColNumFinish
Cells(i, ColNumStart) = WorksheetFunction.SumIfs(Range(Cells(3, ColNumStart), Cells(rown, ColNumStart)), _
Range(Cells(3, 3), Cells(rown, 3)), Cells(i, 1))
ColNumStart = ColNumStart + 1
Loop
i = i + 1
Next i
Понимаю, что в какой то мелочи что то упустил. Но не могу понять где и что... Буду очень благодарен за помощь
PS Ответ искал долго и нудно, но наверное ограниченность моих знаний в VBA не позволяет найти выход из моего тупика(((
Возникла проблема, не могу понять даже под каким соусом искать в инете.
Есть Listbox в Userform в котором пользователи должны выбирать определенное значение. После выбора значения в выпадающем списке, пользователь может посмотреть сколько вхождений данного типа есть в столбике (базе) и в какой строке первое вхождение данного типа. Проблема когда пользователь нажимает на кнопку проверки не выбрав значение в списке. Тогда выскакивает ошибка и работа формы останавливается. Хотел сделать защиту от этого... Что то не получается(((
Код
Private Sub CheckNum_Click()
If Me.TypeList.Text = "" Then
' Если в списке ничего не выбрано (пусто)
MsgBox "Введите тип"
' Появляется сообщение. После нажатия на ОК курсор перемещается в окно выпадающего списка.
Exit Sub
End If
TypeList.Focus
Dim iType As Integer
Dim iMatch As Integer
iType = Application.WorksheetFunction.CountIf(Range("A:A"), TypeList.Value)
iMatch = Application.WorksheetFunction.Match(TypeList.Value, Range("A:A"))
MsgBox iType & "*" & iMatch
End Sub
Если в выпадающем списке выбрано значение - все работает. Если не выбрано - сообщение "Введите тип" появляется, но после нажатия на ОК выскакивает сообщение об ошибке "Compile Error: Method or data member not found"
Если убираю TypeList.Focus - все работает, только курсор не возвращается в выпадающий список
Уже битый час не могу понять в чем проблема. В строку заданы даты
21.12.2015
22.12.2015
23.12.2015
24.12.2015
25.12.2015
26.12.2015
27.12.2015
Формат ячеек дата. Требуется найти порядковый номер столбика, в котором дата совпадает с текущей. Думал с помощью MATCH решить свою проблему... Но почему то никак... Возвращает ошибку Run-time error '13': Type Mismatch и стопорится именно на строке MATCH. Явно какая то мелочь...
Заранее спасибо за помощь!
Код
Sub try1()
Dim curD As Date
curD = Range("a1").Value
'В А1 стоит формула =ДАТАЗНАЧ(ТЕКСТ(ТДАТА();"ДД.ММ.ГГГГ")).
'Единственный вариант, когда сравнение дает "Истина".
'Может ошибаюсь, но меня устраивает пока.
Dim colN As Long
colN = Application.Match(curD, Range(Cells(7, 1), Cells(7, 400)), 0)
Cells(1, 2) = colN
End Sub
Дописал скрипт/макрос. Делал в Excel 2013 х64. Версия VBA 7.1.1049 При тестовом запуске на машинах с Excel 2013 х64 - нет проблем. Все работает как часы.
При запуске на машинах с более ранними версиями (в офисе стоят версии 2007 и 2010 х32, верcия VBA 6.5.1055) выскакивает множество ошибок (ошибка на установлении связи с принтером, в одном случае удаление всех нужных строк, в другом случае НЕ удаление ненужных строк). Проблема в том, что у нас весь софт лицензионный и обновлять на 50+ машинах офис с 2010 до 2013 как бы мягко говоря накладно.
Возможно есть какие то пути решения такой проблемы? (Поиски дистрибутива либо путей обновления до версии 7.1.1049 не дали результатов).
Суть проблемы: есть Н-ое количество одноранговых выгрузок из 1С. Надо сделать отчетную таблицу по установленной руководством форме (сводные таблицы посему не катят) с возможностью формирования отчетов по произвольным периодам и критериям (товар, отдел, склад, и т.д.) и построением графиков под выбранные данные. Сваливать все исходные данные в одну таблицу - антивариант.
В общем вопрос Может ли СУММЕСЛИМН обрабатывать диапазон (формируемый произвольно) в качестве критерия? Пробовал через формулу массива... Функция использует в качестве критерия только первое значение в диапазоне. Если в диапазоне первая строка пустая, то формула не отрабатывает.
В файле примера привел... примеры и что пытался сделать. надеюсь смог внятно в примере объяснить что к чему.
Искал ответ на свой простой вопрос - не смог найти. Опыт работы с VBA - мизерный.
В общем ситуация: у меня отделы заполняют определенную информацию по определенной форме. форма создана на основе универсального шаблона. отдел, создавая документ на основе шаблона, выбирает себя из выпадающего списка. после заполнения мне надо эту информацию перенести в архивный файл закрепленный за каждым отделом.
Наиболее простой для меня вариант - формирование ссылки на файл через ГИПЕРССЫЛКА с учетом выбора отдела. Но при записи через макрос фиксируется значение, сгенерированное формулой, т.е. ссылка на файл того отдела, который был выбран в момент записи макроса. Соответственно, выбор другого отдела никак не влияет на гиперссылку в макросе.
Сразу оговорюсь - я новичок в VBA. Буду благодарен за конструктивизм.
Думаю этот вопрос решается через правильную запись Hyperlink.Add но возможно и нет(
На всякий случай повторю перефразирую просьбу. Необходим переход и открытие книги по гиперссылке, значение которой формируется с учетом выбора, сделанного в выпадающем списке.
В общем проблема: задача какая - у меня есть отчетная таблица по ДДС. она формируется из двух других - приход и расход. таблицы двумерные, поэтому ни о каких сводных таблицах речи нет((( выгружаются из 1С.
на входных таблицах большой перечень операций. при раскрытии иерархии много повторяющихся значений. количество операций со временем растет. т.е. делать жесткую привязку по диапазонам - антивариант.
но это лирика.
не знаю по каким причинам, но функция СМЕЩ для задания динамического диапазона - ни в какую не хочет работать. вроде все правильно ввожу. все компоненты индивидуально выдают правильные результаты. но свожу вместе - и все(
ломал ломал голову... не придумал ничего лучше как обойти эту проблему АДРЕС.
функциями АДРЕС задаю начальную и конечную ячейки диапазона, по соответствующим критериям. пытаюсь вставить их в определение размера диапазона - ругается. через СЦЕПИТЬ, съедает, но диапазон не виден в выпадающем списке диапазонов, т.е. его нет по прежнему....
В общем две формулы определения абсолютных адресов ячеек. Определяют чётко то что надо: =АДРЕС(ПОИСКПОЗ(поставщики!A13;приход_статья;0)+7;2;;;"приход" и =АДРЕС(ПОИСКПОЗ(поставщики!A14;приход_статья;0)+6;366;;;"приход"
одна на выходе условно дает результат приход!$b$88 вторая - приход!$NB$120 но ЭКСЕЛЬ не хочет воспринимать формулу
Проблема вкратце. Есть карточка счета складских затрат. Из нее надо выбрать и разнести по итоговой таблице затраты по складам и по месяцам. Проблема в том что 1с выдает по контрагенту в ячейку всю инфу о нем, включая номер договора и пр.
Сделал необходимые диапазоны, указал критерии отбора... суммеслимн ни в какую не хочет работать...
проблемная формула на листе итог - в желтой ячейке, выделена красным.
на первой странице ввел дополнительно столбик с указанием названия месяуа в текстовом формате для упрощения итоговой формулы.
при этом суммесли при указании аналогичных критериев отбора работает без вопросов.
В тырнете не смог почему то найти объяснений( догадываюсь, что вопрос для первого класса, но уже мозг набекрень... туплю(((
Вынужден обратиться за помощью, ибо никак не могу ни сам разобраться, ни найти ответа.
Что имеем (основные моменты): 1. 16+ листов с данными по закупкам и продажам товарных групп, в том числе расчет доходности продаж, ДДС, налогов, оплаты поставщику, транспорта, склада, пр. 2. Сводный лист итогов на который выводиться суммарная инфа с листов по продуктам. Формулы для каждой ячейки прописаны вручную и имеют вид =СУММ('товар 1:товар 16'!C100).
Все работает, но не сохраняет уверенности в правильности подсчета))). Плюс есть нюансы с самими товарами - часть у нас считается в единицах измерения, часть в денежном выражении без привязки к количеству. Но это опять же не существенно. В суть таблицы и источники данных не буду вдаваться поскольку не имеют отношения к моей проблеме.
Сейчас сам вопрос: 1. Возможно одной формулой (пусть и многосоставной) прописать суммирование данных с 16 таблиц соответствующих двум критериям (например "склад" и "январь 2013"), т.е. чтобы в ячейке отображались все оплаты за склад по всем товарам, осуществленные в январе 2013. Особенность в том что месяца введены в строчку, а количественные и финансовые показатели в столбик. 2. Насколько целесообразно использовать имена диапазонов? и если да - то в диапазоны включать только цифры или же заголовки строк и столбиков?