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

Страницы: 1
Ошибка `-2147417848 (80010108)` при вставке строки
 
Внимание! При возникновении ошибки прилагаемый файл вешает эксель (придётся убивать его через диспетчер задач).

Столкнулся с непонятной периодически случающейся проблемой, которая возникает не всегда и не на всех компьютерах (проверял только на MS office 13, но на нескольких компах). Вероятно, ошибка зависит от того, с какой скоростью пользователь нажимает на кнопки.

Механизм вызова ошибки:
1. В в жёлтом столбце вбиваем любое значение.
2. Быстро кликаем правой кнопкой на любой ячейке таблицы и выбираем пункт "Добавить строку".
3. Повторяем 3-4 раза, пока ошибка не появится (она просто то появляется сразу, то не появляется не сразу, где-то её вообще нет. В полном проекте она более стабильно появляется, тут в урезанном файле - реже.)

Всё. Ошибка  `-2147417848 (80010108)` "Method 'Insert' of object 'Range' failed" возникает между двумя безобидными строками:    
Код
shTempRows.Range("$25:$25").EntireRow.Copy
sh2.Range("$26:$26").EntireRow.Insert Shift:=xlDown
Проблема не в условном форматировании (в реальном проекте удалил всё УФ, проблема всё-равно осталась).

Не могу понять, что с чем конфликтует и как лечить. В другом проекте, в аналогичной ситуации выскакивает ошибка c этим же номером, но с описанием "Automation error Вызванный объект был отключен от клиентов."
Я не волшебник, я только учусь.
Подпись первых чисел месяцев оси OX в диаграмме Ганта
 
Добрый день!

Пытаюсь построить диаграмму Ганта, ну или что-то похожее. Никак не могу привести в порядок ось OX. Я хочу там промежуточные значения в начале каждого месяца, а Ёксель позволяет мне ось дат только для OY задать, на OX у меня число в формате дата и промежуточные значения через равные промежутки (в днях, а не месяцах). Что делать? Может график как-то переделать или придётся заморачиваться и делать не диаграмму, в её имитацию за счёт ячеек на листе и условного форматирования (https://www.youtube.com/watch?v=QVoO47sDOv0)?
Изменено: Wiss - 18.08.2020 15:34:23
Я не волшебник, я только учусь.
Как разрешить редактировать данные только по двойному клику для всех TextBox и ComboBox в форме
 
Всем доброй охоты!

Рисую форму, в которой будет около 20 текстбоксов и комбобоксов разного размера. Хочу, чтобы данные в них можно было вносить только по двойному щелчку. Менять свойство на Locked для каждого элемента и прописывать событие onDoubleClick лениво. Вроде бы это всё делается через ClassModule, но я с ними не особо дружу и реализовал всё как-то коряво, на мой взгляд. Как правильно создать и использовать customTextBox и customComboBox?

myClass
Код
Option Explicit

Private WithEvents cbX As MSForms.ComboBox
Private WithEvents tbX As MSForms.TextBox

Public Sub setCont(ByVal cont)
    If TypeName(cont) = "ComboBox" Then
        Set cbX = cont
        cbX.Locked = True
    ElseIf TypeName(cont) = "TextBox" Then
        Set tbX = cont
        tbX.Locked = True
    End If
End Sub

Private Sub cbX_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    cbX.Locked = False
    cbX.BackColor = vbGreen
End Sub

Private Sub tbX_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    tbX.Locked = False
    tbX.BackColor = vbGreen
End Sub
Код в форме
Код
Option Explicit

Private contList() As myClass

Private Sub UserForm_Initialize()
    Dim cntrX As Control
    ReDim contList(0 To 0)

    For Each cntrX In frmTest.Controls
        ReDim Preserve contList(0 To UBound(contList) + 1) 'да, нулевой элемент массива пустой, но я с этим массивом работать не собираюсь. Он просто костыль.
        Set contList(UBound(contList)) = New myClass
        contList(UBound(contList)).setCont cntrX
    Next cntrX
    
End Sub

'Событие Exit вроде как нельзя описать в Class Module, так что придётся писать для каждого элемента. Можно как-то это сократить?
'Ещё один вопрос: я могу как-то обратиться к элементу, на котором произошло событие? This (ничего)? Me (форма)?
Private Sub cb1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    cb1.Locked = True
    cb1.BackColor = &H80000005
End Sub

Private Sub tb1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    tb1.Locked = True
    tb1.BackColor = &H80000005
End Sub

Private Sub tb2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    tb2.Locked = True
    tb2.BackColor = &H80000005
End Sub
В комментариях к коду ещё 2 маленьких вопроса, ответ на которые вроде бы "никак", но спросить-то всё-равно надо.
Изменено: Wiss - 04.07.2020 01:18:19
Я не волшебник, я только учусь.
Как ускорить свой код в 1000 раз
 
Напоролся на 2 интересных видео:
1. Первое - ничего особенного, просто конкретно в цифрах показывает почему нельзя выделять, копировать/вставлять и т.д. Лично для меня это видео оказалось из серии "смотреть до конца", потому что я слоупок и не знал про Range.AdvancedFilter.
https://www.youtube.com/watch?v=GCSF5tq7pZ0
2. Во втором видео более продвинутые техники, например про то, что Коллекции существенно быстрее перебираются через For Each.
https://www.youtube.com/watch?v=RNqd89K_bbU


P.S. Как думаете, позднее/ранее связывание со словарями экономить 30 милисекунд или реально существенно ускоряет код? (последний трик во втором видео)
Я не волшебник, я только учусь.
Как правильно организовать заполнение формы, являющейся увеличивающимся списком
 
Добрый день!

Входные данные следующие:
1. Есть 50+ пользователей, которые заполняют форму (каждый свой экземпляр). От пользователей можно ожидать чего угодно, поэтому на литы и на макросы вешается защита, чтобы не добавляли столбцы/строки где не нужно и не портили формулы.
2. Форма представляет из себя нарастающий список. чего-то. В реале 20+ столбцов и 100-1000 строк (в зависимости от пользователя). Для примера сделал журнал хранения: Наименование / вес / стоимость хранения (формула = вес *100). Столбцы наименование и вес забиваются руками, а вес всегда должен оставаться формулой.
3. В конечном итоге файлы от всех пользователей будут собраны и объединены в единую длинную простыню.

Вопрос состоит в том, как правильно организовать заполнение подобной таблицы?!
Сейчас использую 3 варианта:
1. Скрыть / отобразить пустые строки.
- Создаю сразу максимально возможное количество строк (тут в примере 100) нужного образца (форматы/формулы) и ставлю защиту на те, ячейки, которые редактировать нельзя..
- Делаю кнопку скрыть/отобразить пустые строки.
2. Макрос по добавлению/ удалению строк:
-Добавляются кнопки добавить/удалить строку, которые соответственно удаляют выделенные строки или добавляют новые строки с уже установленным форматом.
(тут срока добавляется только в конце, можно добавить в середине и не одну, а столько, сколько выделят. Это понятно).
3. Тот же второй, но вместо кнопок пункты выпадающего меню по нажатию правой кнопки мыши.

Все варианты несколько топорны и не очень мне нравятся. Основная претензия к ним - то, что нельзя сортировать/фильтровать (AlolowFiltering не работает из-за столбца с формулами ).  Я так понимаю, что это не решаемо((

Как эту задачу можно реализовать принципиально иначе и более грамотно силами экселя?!
Я не волшебник, я только учусь.
Сводная, подсчёт итогов в зависимости от уровня вложенности.
 
Ещё раз добрый день!
Пытаюсь построить сводную таблицу по данным, имеющим 4 уровня вложенности (ФО / Субъект / Организация / Филиал ) большинство цифр имеют отношение к конкретным филиалам, но есть одно значение, относящееся к организации в целом, которую я не могу разбить по отдельным филиалам (для каждого филиала написана общая сумма по организации).
Как мне это в сводной отобразить правильно? Чтобы:
по показателю Организации:
- в Филиалах была сумма по организации (или вообще пусто);
- в Организации была реальная цифра (а не сумма филиалов);
- в Субъекте и ФО была сумма подчинённых филиалов.
по показателям филиалов: для Организации, Субъекта и ФО всё просто суммировалось (с этим проблем нет).

З.Ы. Данные берутся из PQ  + модель данных (может подскажете, как это правильно преобразовать / разбить на 2 таблицы, а потом собрать в единый свод).
З.З.Ы. Показателей по филиалу на самом деле несколько, общий по субъекту 1.
Изменено: Wiss - 30.01.2020 09:12:47
Я не волшебник, я только учусь.
PQ ускорение преобразования таблицы с промежуточными итогами в нормализованный вид
 
Всем доброго дня!
Имеется таблица ~8 тыс строк, содержащая промежуточные итоги (наглядно видно в файле-примере).
Мне нужно столбец 1 (в котором или федеральный округ или субъект или конкретная организация или ничего) разделить  на 3 отдельных столбца, чтобы можно было потом работать. Свой вариант на PQ я написал, но на 8 тыс. строк он работает как-то очень медленно. Хотелось бы ускорить в N раз.
Что я знаю о первом столбце:
1. После Федерального округа всегда идёт субъект РФ
2. После субъекта РФ всегда идёт строка "Итого по ОИВ" (я предполагаю, что тут могут быть разные варианты, но слово "ОИВ" точно будет. Если существенно быстрее будет проверить на точное совпадение,то можно считать, что всегда "Итого по ОИВ").
3. После строки "Итого по ОИВ" могут быть пустые строки (любое количество), а может сразу начинаться следующий субъект РФ или Федеральный орган.
4. Первая строчка и все промежуточные итоги по субъекту и ФО меня не особо интересуют (будут потом удаляться). Таблица на листе "Выгрузка" меня вполне устраивает, вот только формируется медленно.
С федеральными округами всё понятно, а вот субъекты РФ у меня ищутся очень медленно. В коде ниже [1] это столбец, который я пытаюсь разделить.
= Table.AddColumn(#"Добавлен индекс", "Субъект", each if [1]<>null then if Text.Contains(#"Добавлен индекс"[1]{[Индекс]+1},"ОИВ") then [1] else null else null)

P.s. Формулой 8888 строк Субъектов РФ делаются почти мгновенно, но хотелось бы в PQ.
Изменено: Wiss - 29.01.2020 12:10:36
Я не волшебник, я только учусь.
PQ номер вхождения значения
 
Добрый день!

Вчера на форуме была задачка с формированием таблички доходов/расходов за день. Так и не смог её решить в PQ. В тырнетах тоже не нашёл, так что обращаюсь к Вам.
Есть 2 таблицы (доход и расход) структурой Имя / Деньги / Дата. Нужно их объединить по столбцу дата в таблицу вида
Доходы.Имя  /  Доходы.Деньги  /  Дата  /  Расходы.Деньги  /  Расходы.Имя
Проблема возникает в том момент, когда в один и тот же день имеется несколько значений в одной из таблиц + есть значение в эту дату в другой таблице. При обычном объединении строки сцепляются "каждая с каждой" (выделено на листе "общий").

В качестве промежуточного этапа для решения этой проблемы я хотел в PQ сформировать дополнительный столбец с "номером вхождения даты" (пример есть  на листе "Расходы").
01.01.2019 1
01.01.2019 2
02.01.2019 1
01.01.2019 3
Так и не понял, как это можно сделать (сформировать в PQ столбец с "номером вхождения"). Не подскажете?

P.S. Правила запрещают ставить несколько вопросов, так что я "не спрашиваю" как сделать объединение таблиц без дублирования строк не через дополнительный столбец с номером вхождения. Если что, ответу будут рады тут.
Изменено: Wiss - 15.11.2019 12:09:25
Я не волшебник, я только учусь.
CREATEOBJECT("EXCEL.APPLICATION") на компьютере без EXCEL
 
Добрый день!

Столкнулся с довольно древней программкой (написана на VisualFoxpro), которая работает с фалами excel, посредством ActiveX.
Код
obj = CREATEOBJECT("EXCEL.APPLICATION")
obj.workbooks.open(tempdir+"tmp.xls")
...
Задача программы - выгрузить данные из базы в EXCEL и отформатировать.
Проблема в том, что возникла необходимость запускать эту программу на компьютере без MS Office, но с Windows (и на том спасибо).

Не подскажете, как можно выкрутиться из такой ситуации (какие-нить бесплатные/триальные версии MS Office, просто набор нужных библиотек)?
1. Купить лицензию MS Office нет возможности.
2. Пиратку ставить нельзя.
3. Переписывать часть программы для работы под  Open Office, либо реализовать экспорт иным путём это вообще ад.

З.Ы. Понятно, что это не эксель, но может кто-то сталкивался с подобным...
Я не волшебник, я только учусь.
Создание из VBA книги с макросами
 
Добрый день!

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

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

Проблема в том, что файл для экспорта я создаю путём копирования листа с данными в новую книгу, а потом пытаюсь в неё добавить макрос "Auto_Open", который открывает скрытый столбец, если пользователь входит в нужный домен.

Макрос на других компах не работает - выдаёт ошибку 1004 "Программный доступ к проекту Visual Basic не является доверенным".

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

Может есть какой-то другой более разумный вариант сделать книгу, в которой у пользователей будет скрыт или видим нужный столбец?

- Создавать копию текущей книги не хочу (в ней куча лишних макросов и листов)
- Отправлять пользователям 2 книги (книга для заполнения и шаблон, используемый для экспорта)  - странно и не удобно.
- Про дыры  с отключением безопасности я уже писал.
- Попробовал написать макрос в листе, который копирую и экспортировать его уже вместе с макросом, но там из подходящих событий только onActivate (не срабатывает если лист открыт) и onSelectChange (нужно клацать лишний раз).
Я не волшебник, я только учусь.
Ошибка при присвоении значения переменной Range после вставки гиперссылки
 
Добрый день столкнулся с необъяснимой для меня проблемой - после вставки гиперссылки на лист не могу нормально работать с объектом rngX - не могу присвоить ему новый диапазон.
Код
Option Explicit

Sub ProverkaProtocols()
    Dim sAdr
    Dim rngX

    ActiveSheet.UsedRange.Clear
   
    sAdr = "$A$2:$B$3,$C$4"
'    sAdr = "$A$2:$B$3" 'с таким диапазоном работает

    Set rngX = ActiveSheet.Range(sAdr)
    rngX.Value = 1

    ActiveSheet.Cells(1, 1).Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="", _
    SubAddress:="", TextToDisplay:="Ссылка"

'если на следующей строчке поставить прерывание, то код выполнится без ошибки
    Set rngX = ActiveSheet.Range(sAdr).Offset(6)
    rngX.Value = 1
    
End Sub

Код странный и совершенно бесполезный потому что упрощён так, чтобы оставить только то, что нужно чтобы вызвать ошибку.
Хочу поделиться следующими наблюдениями:
1. Ошибка возникает только для несвязанного диапазона.
2. Если при отладке попробовать продолжить выполнение кода, то он выполнится.

Подскажите, пожалуйста, что тут не так?! Как эта ошибка возникает? Почему код, блин, выполняется при попытке продолжить?
Изменено: Wiss - 23.11.2018 15:35:20
Я не волшебник, я только учусь.
Ожидание завершения процедуры
 
Добры день! Пишу небольшую программку, которая открывает несколько файлов excel и копирует из них данные в один общий. Сама процедура копирования данных выведена в отдельную процедуру. Проблема в том, что Excel не ожидает её выполнения, и периодически выполняет следующую строчку (закрытие обрабатываемой книги). Вот общая схема работы программы:
Код
Sub myTrouble()

Sub myTrouble()

Dim sFileName 'Имя открываемого файла
Dim arrSFileNames 'Массив открываемых файлов
Dim wbX 'Обрабатываемая книга

'ниже должен быть кусок кода, который формирует массив имен файлов arrSFileNames
'....
    For Each sFileName In arrSFileNames
        If subOpen(sFileName) Then  'Пытается открыть книгу и ещё что-то делает. Возвращает True, если получилось.
            If subCheckFile(sFileName) Then 'Проверят файл на наличие нужных листов, и наличие ключевых полей.
                subCopyData sFileName 'Копирует данные с нужных листов. в основную книгу
            End If
            wbX.Close SaveChanges:=False 'Вот тут иногда происходит ошибка, когда subCopyData ещё не завершена, а
            'программа пытается закрыть книгу.
        End If
    Next sFileName
End Sub

Как мне правильно заставить макрос ждать завершения работы процедуры subCopyData?
Пока рабочий вариант делать из subCopyData функцию и ждать пока она не вернёт что-нибудь, ну или создавать глобальную переменную, которая будет меняться перед выходом из subCopyData.

Как-то так:
Код
Dim bDone As Boolean
Dim myTime

'прочий код до subCopyData sFileName

    bDone = False
    myTime = Now + TimeSerial(0, 0, 5)
    
    subCopyData sFileName
    
    Do While Not bDone And myTime >= Now
        DoEvents
    Loop
    
    wbX.Close SaveChanges:=False

Это правильный ход мысли или есть более изящное и универсальное решение (не очень хочется ковыряться в subCopyData и искать там все места, где происходит выход из процедуры)?

Или можно просто создать процедуру, которая будет закрывать нужную книгу и запустить её через application.onTime?
Код
Sub myClose(wbX As Workbook)
    wbX.Close False
End Sub

и закрывать книгу через
Код
Application.OnTime Now + TimeSerial(0, 0, 1), "'myClose " & wbX & "'"

Я просто не знаю, какие подводные камни могут всплыть, а всплывут они, конечно, не во время тестированния, а в процессе эксплуатации.
Изменено: Wiss - 28.09.2018 10:35:43
Я не волшебник, я только учусь.
Не работает условное форматирование, вставленное макросом
 
Добрый день!
Спасите! Весь можг сломал...

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

Для проверки записывал процесс создания УФ макрорекодером (модуль2). Сделанное вручную правило работает. Записанный макрос глючит.

Проверял на 2013, 2010, 2003 оффисах. Везде такая же беда.
Я не волшебник, я только учусь.
Условное форматирование для строк, в которых сработало другое условное форматирование.
 
Есть табличка, в которой осуществляется контроль корректности внесённых данных (в часть ячеек можно вносить только цифры, в часть ячеек "+" или "-".
Ячейки с неправильными данными залиты условным форматированием. Таблица большая и по ней неудобно искать, что залито, а что - нет (фильтровать отдельно каждый столбец - не вариант).
Хочется чтобы первая ячейка в строчке заливалась если где-нить в строчке сработало условное форматирование.
Писать для первого столбца отдельное правило, проверяющее ошибки, не хочется
(пока готовил пример правило всё-таки, написал, но теперь не пропадать же вопросу).

Может можно как-нить иначе выкрутиться?
Основная задача - отфильтровать строки, в которых есть ячейки со сработавшим условным форматированием.
Изменено: Wiss - 01.08.2018 19:38:58
Я не волшебник, я только учусь.
Как избежать смены листа при снятии защиты.
 
Добрый день!

Столкнулся с неприятной особенностью Excel - при снятии защиты у меня автоматически активируется лист, с которого снимается защита.
Вроде бы так происходить не должно. Если код выполнить построчно, то переход не происходит. Может секрет какой есть?

Такая работа выявлена в 2010 и 2013 Excel. На виртуалке с 2003 всё норм.  
Я не волшебник, я только учусь.
Не редактируется незащищенная ячейка после перехода с защищенной
 
Приветствую. уважаемые форумчане!

Даже не знаю как описать проблему... Проще сразу работу файла-примера описать:
1. При нажатии правой кнопкой на красной ячейке (защищенной) выпадает меню с единственным пунктом.
2. При нажатии на менюшку становится активной жёлтая ячейка (не защищённая).
3. Если сразу после перехода на ячейку начать печатать - выдает ошибку будто бы ячейка защищена, а на самом деле нет.
4. Если, например, нажать F2, то всё вводится нормально.

То есть у меня как-то переход не завершается из ячейки в ячейку нормально. Подскажите, пожалуйста, чего тут не хватает.
Код
Sub zzz()
    Application.ScreenUpdating = False
        zzz1
    Application.ScreenUpdating = True
End Sub

Sub zzz1()
    Application.ScreenUpdating = True
        Cells(8, 5).Activate
    Application.ScreenUpdating = False
End Sub
Я не волшебник, я только учусь.
Суммирование значений в несвязанном диапазоне без дублирования пересекающихся ячеек
 
В ходе решения https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=104691&a... столкнулся с неприятной проблемой при работе с несвязанными диапазонами: "Если areas внутри диапазона пересекаются, то пересекающиеся ячейки дублируются при суммировании".
В экселе это выглядит вот так.

В vba фактически происходит то же самое. Формула СУММ выделенных диапазонов выдаёт 4 из-за того, что все они пересекаются в ячейке G10.

Как можно это обойти? Как получить корректную сумму этого диапазона? Я пробовал загонять значения всех ячеек в массив, но это топорно+медленно при большом диапазоне.

В идеале - нужно преобразовать несвязанный диапазон в другой несвязанный диапазон, в котором не будет пересечений между Areas, но у меня нет идей как это сделать, причём быстро.

В примере файлик с кусочком кода, который формирует и выделяет показанный на картинке диапазон. Application.WorksheetFunction.sum(rngX) конечно же выдаёт 4, а нужно 1.
Я не волшебник, я только учусь.
Организация разделения доступа к сводной таблице, получающей данные из Access
 
Доброе утро!

Заморочился созданием книги excel с некоторым количеством сводных таблиц, получающих данные из файла access. Всё наладил, всё работает, но необходимо разграничить уровень доступа к данным для разных пользователей (филиалов). То есть у каждого пользователя будет своя книга excel, которая обращается к базе access и получает только те данные, которые можно видеть пользователю. Основной вопрос: "КАК <много нецензурных слов>"!? Это точно уже делалось 100500 раз до меня, но что-то я толковых мануалов не нашёл.

Сейчас вижу следующую схему:
1. В файле access создать  запрос для каждого пользователя по типу SELECT * from MainQuerry WHERE филиал = "ФилиалХ".
2. Запоролить БД.
3. Создать вторую БД с подключением к первой, с запросами к запросам по каждому пользователю (не нравится мне что для того, чтобы нормально выполнялся запрос, у пользователя должен быть доступ ко всем используемым в нём таблицах, поэтому этот огород со второй БД).
4. Разграничить доступ к запросам для разных пользователей (в access 2003 это можно).
5. В excel сделать формочку выбора филиала. После выбора филиала PivotCashe (вроде бы там, но может и в настройке соединения) изменять имя пользователя и название выполняемого запроса.

Вроде бы, всё должно работать. Вчера по кускам проверял, сейчас буду пробовать реализовать.
Это вообще вменяемый план или горячечный бред?!
Может есть у кого в закладках правильная схема создания такого проекта, ну или просто концептуальные советы по более грамотной реализации?

P.S. Поднять небольшой сервак с нормальной СУБД, вероятно, не получится. Разрезать данные и сразу отдать их пользователям вместе с excel, к сожалению низя:((  Обновлять данные пользователи будут изредка. Хотелось бы обеспечить хоть какой-то уровень защиты данных в СУБД от любознательных пользователей.
P.P.S. Пример не выкладываю, ибо нечего.
P.P.P.S. Зараза excel отказывается строить сводные таблицы, которые обращаются к запросам access, имеющим в своей структуре функцию CurrentUser(), так что пока не вижу иного пути кроме как делать отдельный запрос для каждого пользователя (благо их мало). Формировать запрос в excel не хочу, чтобы не было лишний раз видно структуры Базы.
Изменено: Wiss - 11.04.2018 16:17:37 (Поднимется ли вверх?)
Я не волшебник, я только учусь.
Как сделать формулу, которая будет брать данные со строки сводной таблицы и меняться в случае изменения её размера.
 
Всем добры день!

Пытаюсь создать сводную табличку для анализа динамики задолжности. Для целей анализа написал пользовательскую функцию, которая получат диапазон значений и на выходе выдаёт один из 4-х результатов:
- погашена (значение за последний интервал = пусто)
- стабильность (все значения в диапазоне равны)
- меняется (есть падения)
- рост (есть увеличения, нет падений)

Указанная функция применяется к строкам сводной таблицы и если размер(ширина) таблицы постоянна, то всё хорошо, но как только я меняю ширину (в файле примере - фильтр по году), функция начинает выдавать кривые значения, так как диапазон входных значений не меняется и начинает захватывать сводную таблицу + пустые ячейки.

Проблема состоит в том, чтобы функция в столбце 1 в сводной таблицы и условное форматирование и спарклайн во втором столбце менялись при установке фильтра.
Я не волшебник, я только учусь.
Сбрасывается "DisplayAlerts=false" после выполнения range.copy
 
Добрый вечер!

Написал странный макрос для задачки из соседней темы. По ходу выполнения программы после копирования и вставки диапазона, почему-то Application.DisplayAlerts становится True.

Это нормально и после copy/paste нужно заново писать  DisplayAlerts = false или я что-то не так делаю?
А когда оно ещё сбрасывается без выхода из процедуры?
Код
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim wr As Range
Dim i As Integer

Application.ScreenUpdating = False
Application.DisplayAlerts = False 

    If Not Intersect(Target, Union(Range("A1"), Range("T1"), Range("AM1"))) Is Nothing Then
    
        Set wr = Target.Offset(6, 2).Resize(10, 16)
        
        wr.MergeCells = False

'--Вопрос тут      
        Range(wr(1, 1), wr(1, 16)).Copy wr.Offset(1, 0).Resize(9, 16)
        Application.DisplayAlerts = False 'предыдущая строчка почему-то сбрасывает "display Alerts"
'--Конец вопроса

        For i = 1 To Target.Value
            Range(wr(i, 1), wr(i, 3)).MergeCells = True
            Range(wr(i, 4), wr(i, 7)).MergeCells = True
            Range(wr(i, 8), wr(i, 10)).MergeCells = True
            Range(wr(i, 11), wr(i, 16)).MergeCells = True
        Next i
        
        If Target.Value < 10 Then
            Range(wr(Target.Value + 1, 1), wr(10, 3)).MergeCells = True
            Range(wr(Target.Value + 1, 4), wr(10, 7)).MergeCells = True
            Range(wr(Target.Value + 1, 8), wr(10, 10)).MergeCells = True
            Range(wr(Target.Value + 1, 11), wr(10, 16)).MergeCells = True
        End If

    End If
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Я не волшебник, я только учусь.
Ошибка при сравнении разницы дробных чисел с 0
 
Столкнулся со странной багулей excel...

Есть  3-х дробных числа A B C  (Например 3,1   0,7  2,4)
А-B-C = 0, но формула =(A-B-C) = 0 даёт результат "ЛОЖЬ".
Очень странная и неожиданная ошибка, вероятно, связанная с особенностями исчисления дробных чисел. Ниже приложен файлик с примером.
Из решений нашёл округление или через ссылку на ячейку (тогда всё нормально). Такая же проблема возникает при суммировании дробных чиел, которые в сумме дают 0.

Хотелось бы узнать, откуда вылазит такой баг, чтобы предусматривать его в будущем.
Я не волшебник, я только учусь.
Страницы: 1
Наверх