Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Подстановка динамического имени диапазона в выпадающий список в юзерформе (VBA)
 
Доброго времени суток!

Что то никак не могу разобраться с синтаксисом :(
Скриптом спамить не буду, кратко опишу.

Есть форма для заполнения юзерами. В форме есть выпадающие списки, которые формируются в зависимости от участка работы юзера. Т.е. выбор участка - выбор линии (динамический диапазон через ВПР).
В общем вопрос - как правильно указать 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 позициями так и называется П_ЭСП. Число списков будет пополняться, равно как и число участков.
Вот это
Код
Lines.List = lists.Range("П_ЭСП").Value
- заполняет список без проблем :(

Заранее спасибо!
Изменено: Павел - 25.08.2019 00:49:59
Разница между двумя столбцами в сводной таблице
 
Приветствую коллеги!

Что то завис с одной простой проблемкой. Недавно начал осваивать сводные таблицы и сталкиваюсь с проблемами которые элементарно решал с помощью стандартных функций.

КАК вывести ТОЛЬКО в столбце итогов разницу между столбцами 2019 и 2018?
Поиски юзал, но везде что то не то :(
Заранее спасибо!!!

Пример в приложении. Хотел скрины просто выложить - на выходе белиберда получается если вставлять принтскрины.

UPD
Решение найдено. Может и не совсем элегантное.
В значение добавляем идентичное выводимому полю (в поле значения у нас получается Сумма по Полю количество и Сумма по Полю количество 2).
Кликаем на втором столбце в сводной таблице, выбираем Дополнительные вычисления - Отличия. Базовое поле Годы, Базовый элемент - в моем случае 2018.
Скрываем столбец с пустыми значениями. И все...
Изменено: Павел - 11.04.2019 12:37:31
Ошибка при заполнении диапазона формулами, Вываливается в ошибку 1004 - Range of Object _Worksheet failed
 
Доброго времени суток!
Очередной вопрос от нуба.
Есть несколько листов с данными, которые надо обрабатывать подставляя формулы (фактически подстановка критериев для работы формул типа суммеслимн и иже с ней). Количество строк на листах 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)),"""")"




Буду очень благодарен, если еще подскажете как обойти вот эту ерунду (подстановку результатов вычисления формулы в ячейку):
 
sales.Range(Cells(8, 1), Cells(i, 1)).Copy
   sales.Range(Cells(8, 1), Cells(i, 1)).PasteSpecial xlPasteValues

Насколько я понимаю можно использовать .Value
Но с синтаксисом туплю((( Никак не могу понять как правильно использовать

Заранее спасибо за помощь и внимание!
Вложенные циклы - Do While ... Loop или From to, Запуск цикла в рамках цикла
 
Доброго дня!

Есть таблица с переменным числом строк (от 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 не позволяет найти выход из моего тупика(((

[img]file:///C:/Users/BPN/Pictures/loop.png[/img]
Продолжение работы формы при ошибке и фокусировке на листбоксе
 
День добрый!

Возникла проблема, не могу понять даже под каким соусом искать в инете.

Есть 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 - все работает, только курсор не возвращается в выпадающий список
Изменено: Павел - 15.04.2016 13:26:08
Поиск текущей даты в строчном массиве
 
Доброго времени суток!

Уже битый час не могу понять в чем проблема.
В строку заданы даты
21.12.201522.12.201523.12.201524.12.201525.12.201526.12.201527.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
Изменено: Павел - 21.12.2015 23:03:44
Обратная совместимость VBA по версиям офиса, Почему макрос написанный под 2013 не работает под 2007-2010
 
Столкнулся с очередной проблемой.

Дописал скрипт/макрос. Делал в Excel 2013 х64. Версия VBA 7.1.1049
При тестовом запуске на машинах с Excel 2013 х64 - нет проблем. Все работает как часы.

При запуске на машинах с более ранними версиями (в офисе стоят версии 2007 и 2010 х32, верcия VBA 6.5.1055) выскакивает множество ошибок (ошибка на установлении связи с принтером, в одном случае удаление всех нужных строк, в другом случае НЕ удаление ненужных строк).
Проблема в том, что у нас весь софт лицензионный и обновлять на 50+ машинах офис с 2010 до 2013 как бы мягко говоря накладно.

Возможно есть какие то пути решения такой проблемы? (Поиски дистрибутива либо путей обновления до версии 7.1.1049 не дали результатов).  
Выбор следующей пустой строки и вставка данных в нее, ошибка в коде
 
Пытаюсь писать код... Выдает дебаг на строк с определением ячейки для вставки
Код
' Выбираем область
    Rows("1:150").Select
    
' Копируем
    Selection.Copy
    
' Открываем книгу отдела
    Workbooks.Open Filename:="\\srv\Obmen\_ФОРМЫ\АРХИВ\" & Range("C5").Value & ".xlsx"
    
' Снимаем защиту
    ActiveSheet.Unprotect Password:="*******"
' Вставляем скопированное в первую пустую строку
    Dim emptyRow As Long
    emptyRow = WorksheetFunction.CountA(Range("B:B")) + 1
    Cells(emptyRow, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Стопорится на строке Selection.PasteSpecial
Никак не могу понять. почему не срастается.

Please HELP

Тема поднята также тут http://www.excel-vba.ru/forum/index.php?topic=4136.msg22415#msg22415
Изменено: BPN1973 - 29.10.2015 11:23:21
СУММЕСЛИМН использование диапазона в качестве критерия
 
Всем доброго дня суток!

Суть проблемы:
есть Н-ое количество одноранговых выгрузок из 1С.
Надо сделать отчетную таблицу по установленной руководством форме (сводные таблицы посему не катят) с возможностью формирования отчетов по произвольным периодам и критериям (товар, отдел, склад, и т.д.) и построением графиков под выбранные данные.
Сваливать все исходные данные в одну таблицу - антивариант.

В общем вопрос
Может ли СУММЕСЛИМН обрабатывать диапазон (формируемый произвольно) в качестве критерия?
Пробовал через формулу массива... Функция использует в качестве критерия только первое значение в диапазоне. Если в диапазоне первая строка пустая, то формула не отрабатывает.

В файле примера привел... примеры и что пытался сделать. надеюсь смог внятно в примере объяснить что к чему.

Заранее спасибо за помощь!
Изменяемая гиперссылка через VBA
 
Всем доброго дня!

Искал ответ на свой простой вопрос - не смог найти. Опыт работы с VBA - мизерный.

В общем ситуация:
у меня отделы заполняют определенную информацию по определенной форме.
форма создана на основе универсального шаблона.
отдел, создавая документ на основе шаблона, выбирает себя из выпадающего списка.
после заполнения мне надо эту информацию перенести в архивный файл закрепленный за каждым отделом.

Наиболее простой для меня вариант - формирование ссылки на файл через ГИПЕРССЫЛКА с учетом выбора отдела.
Но при записи через макрос фиксируется значение, сгенерированное формулой, т.е. ссылка на файл того отдела, который был выбран в момент записи макроса. Соответственно, выбор другого отдела никак не влияет на гиперссылку в макросе.

Сразу оговорюсь - я новичок в VBA. Буду благодарен за конструктивизм.  

Думаю этот вопрос решается через правильную запись Hyperlink.Add но возможно и нет(

На всякий случай повторю перефразирую просьбу. Необходим переход и открытие книги по гиперссылке, значение которой формируется с учетом выбора, сделанного в выпадающем списке.

Ориентировочный пример в документе.

Заранее огромное спасибо!
Динамический диапазон не через СМЕЩ, Альтернативы СМЕЩ при задании динамически именованных диапазонов
 
В общем проблема:
задача какая - у меня есть отчетная таблица по ДДС. она формируется из двух других - приход и расход. таблицы двумерные, поэтому ни о каких сводных таблицах речи нет((( выгружаются из 1С.

на входных таблицах большой перечень операций. при раскрытии иерархии много повторяющихся значений. количество операций со временем растет. т.е. делать жесткую привязку по диапазонам - антивариант.

но это лирика.

не знаю по каким причинам, но функция СМЕЩ для задания динамического диапазона - ни в какую не хочет работать. вроде все правильно ввожу. все компоненты индивидуально выдают правильные результаты. но свожу вместе - и все(

ломал ломал голову... не придумал ничего лучше как обойти эту проблему АДРЕС.

функциями АДРЕС задаю начальную и конечную ячейки диапазона, по соответствующим критериям.
пытаюсь вставить их в определение размера диапазона - ругается. через СЦЕПИТЬ, съедает, но диапазон не виден в выпадающем списке диапазонов, т.е. его нет по прежнему....

В общем две формулы определения абсолютных адресов ячеек. Определяют чётко то что надо:
=АДРЕС(ПОИСКПОЗ(поставщики!A13;приход_статья;0)+7;2;;;"приход" ;)
и
=АДРЕС(ПОИСКПОЗ(поставщики!A14;приход_статья;0)+6;366;;;"приход" ;)

одна на выходе условно дает результат приход!$b$88
вторая - приход!$NB$120
но ЭКСЕЛЬ не хочет воспринимать формулу

=АДРЕС(ПОИСКПОЗ(поставщики!A13;приход_статья;0)+7;2;;;"приход" ;) :АДРЕС(ПОИСКПОЗ(поставщики!A14;приход_статья;0)+6;366;;;"приход" ;)

таблица тут не принципиальна - поэтому не прикладываю.

если какие либо альтернативные варианты функции СМЕЩ. VBA не знаю, поэтому ограничиваюсь только формулами.

Заранее спасибо всем кто откликнется.
Изменено: Павел Бузо - 09.01.2013 16:59:23
помогите с суммеслимн с критерием "*"&A1&"*"
 
Проблема вкратце.  
Есть карточка счета складских затрат.  
Из нее надо выбрать и разнести по итоговой таблице затраты по складам и по месяцам. Проблема в том что 1с выдает по контрагенту в ячейку всю инфу о нем, включая номер договора и пр.  
 
Сделал необходимые диапазоны, указал критерии отбора... суммеслимн ни в какую не хочет работать...  
 
проблемная формула на листе итог - в желтой ячейке, выделена красным.  
 
на первой странице ввел дополнительно столбик с указанием названия месяуа в текстовом формате для упрощения итоговой формулы.  
 
при этом суммесли при указании аналогичных критериев отбора работает без вопросов.  
 
В тырнете не смог почему то найти объяснений( догадываюсь, что вопрос для первого класса, но уже мозг набекрень... туплю(((  
 
заранее спасибо за участие и помощь)
Суммирование данных с нескольких листов по нескольким критериям
 
Всем привет)  
 
Вынужден обратиться за помощью, ибо никак не могу ни сам разобраться, ни найти ответа.  
 
Что имеем (основные моменты):  
1. 16+ листов с данными по закупкам и продажам товарных групп, в том числе расчет доходности продаж, ДДС, налогов, оплаты поставщику, транспорта, склада, пр.  
2. Сводный лист итогов на который выводиться суммарная инфа с листов по продуктам. Формулы для каждой ячейки прописаны вручную и имеют вид =СУММ('товар 1:товар 16'!C100).    
 
Все работает, но не сохраняет уверенности в правильности подсчета))). Плюс есть нюансы с самими товарами - часть у нас считается в единицах измерения, часть в денежном выражении без привязки к количеству. Но это опять же не существенно. В суть таблицы и источники данных не буду вдаваться поскольку не имеют отношения к моей проблеме.    
 
Сейчас сам вопрос:  
1. Возможно одной формулой (пусть и многосоставной) прописать суммирование данных с 16 таблиц соответствующих двум критериям (например "склад" и "январь 2013"), т.е. чтобы в ячейке отображались все оплаты за склад по всем товарам, осуществленные в январе 2013. Особенность в том что месяца введены в строчку, а количественные и финансовые показатели в столбик.    
2. Насколько целесообразно использовать имена диапазонов? и если да - то в диапазоны включать только цифры или же заголовки строк и столбиков?  
 
Заранее огромное спасибо
Страницы: 1
Наверх