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

Страницы: 1
PowerPivot Ранжир по отфильтрованным данным (в контексте суток), Расчёт RANKX привязать к суткам сквозным образом по всё объектам
 
Здравствуйте!
Делаю ранжир по столбцу Пр с выборкой по суткам такой формулой:
Код
=RANKX (
   FILTER ('Table';
      [Время (Год)] = 'Table'[Время (Год)] && [Время (День)] =  'Table'[Время (День)]
   );
   'Table'[Пр];
   ;
   ASC;Dense
)

Но считает она по всей совокупности. Как прикрутить контекст суток?

vba Можно ли Массив перевести в байты?, Массив() as Variant. Не про байтовый массив
 
Здравствуйте.
А можно ли как перевести массив (тип Variant) в набор байтов?
Без циклов с cstr и strconv к элементам
Изменено: vladjuha - 23.10.2021 11:26:25
VBA. Определение связанных полей в исходных данных для вычисляемого элемента сводной таблицы
 
Здравствуйте!

По двойному щелчку по элементу, находящемуся в вычисляемом поле сводной, откроется лист со всеми связанными исходными данными.

Как на VBA можно обратиться к этим данным (без промежуточного листа, естественно)? В приложенном файле, например, при выделении в сводной ячейки из зелёной группы получить в жёлтой ячейке значение связанного исходного поля "ID" (отсутствует в самой сводной)?
Изменено: vladjuha - 10.11.2020 17:28:07
vba Мониторинг директории в реальном времени, (починка кода)
 
Здравствуйте!
Заинтересовался возможностью мониторить определённую директорию на предмет появления новых файлов в реальном времени (ReadDirectoryChangesW).
Подыскал подходящий код, но на него немножко ругается компилятор (win10 x64, excel x64): строка 168, AddressOf StartWatch_CallBack - Type mismatch.
Подскажите, пожалуйста, что где покрутить надобнать?
Код
Option Explicit
 
Private Type FILE_NOTIFY_INFORMATION
   NextEntryOffset As Long
   Action As Long
   FileNameLength As Long
   FileName As String
End Type
 
Private Const FILE_FLAG_OVERLAPPED = &H40000000
Private Const FILE_LIST_DIRECTORY = &H1
Private Const FILE_SHARE_READ = &H1&
Private Const FILE_SHARE_DELETE = &H4&
Private Const OPEN_EXISTING = 3
Private Const CREATE_NEW = 1
Private Const FILE_FLAG_BACKUP_SEMANTICS = &H2000000
Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1&
Private Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10&
Private Const FILE_SHARE_WRITE As Long = &H2
Private Const FILE_NOTIFY_CHANGE_ATTRIBUTES As Long = &H4
Private Const FILE_NOTIFY_CHANGE_DIR_NAME As Long = &H2
Private Const FILE_ACTION_ADDED = &H1&
Private Const FILE_ACTION_REMOVED = &H2&
Private Const FILE_ACTION_MODIFIED = &H3&
Private Const FILE_ACTION_RENAMED_OLD_NAME = &H4&
Private Const FILE_ACTION_RENAMED_NEW_NAME = &H5&
 
Private Declare PtrSafe Sub MoveMemory Lib _
"kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpcSource As Any, ByVal dwLength As Long)
 
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Private Declare PtrSafe Function ReadDirectoryChangesW Lib "kernel32" _
(ByVal hDirectory As Long, lpBuffer As Any, ByVal nBufferLength As Long, _
ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long, _
lpBytesReturned As Long, ByVal PassZero As Long, ByVal PassZero As Long) As Long
 
Private Declare PtrSafe Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
ByVal PassZero As Long, ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal PassZero As Long) As Long
 
Private Declare PtrSafe Function CreateThread Lib "kernel32" _
(lpThreadAttributes As Any, ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, _
lpThreadID As Long) As Long
 
Private Declare PtrSafe Function TerminateThread Lib "kernel32" _
(ByVal hThread As Long, ByVal dwExitCode As Long) As Long
 
Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
 
'Get the directory chages using ReadDirectoryChangesW
Private Const FILE_NOTIF_GLOB = FILE_NOTIFY_CHANGE_ATTRIBUTES Or _
                                FILE_NOTIFY_CHANGE_FILE_NAME Or _
                                FILE_NOTIFY_CHANGE_DIR_NAME Or _
                                FILE_NOTIFY_CHANGE_ATTRIBUTES Or _
                                FILE_NOTIFY_CHANGE_LAST_WRITE
 
Private WSubFolder As Boolean
Private nBufLen As Long
Private nReadLen As Long
Private sAction As String
Private fiBuffer As FILE_NOTIFY_INFORMATION
Private cBuffer() As Byte
Private cBuff2() As Byte
Private lpBuf As Long
Private WatchStart As Boolean
Private DirHndl As Long
Private FolderPath As String
Private ThreadHandle    As Long
 
Private Function GetDirHndl(ByVal PathDir As String) As Long
 
    On Error Resume Next
 
    Dim hDir As Long
 
    If Right(PathDir, 1) <> "\" Then PathDir = PathDir + "\"
    hDir = CreateFile(PathDir, FILE_LIST_DIRECTORY, _
    FILE_SHARE_READ + FILE_SHARE_WRITE + FILE_SHARE_DELETE, _
    ByVal 0&, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS Or FILE_FLAG_OVERLAPPED, ByVal 0&)
    GetDirHndl = hDir
 
End Function
 
Private Sub StartWatch_CallBack()
    If (DirHndl = 0) Or (DirHndl = -1) Then Exit Sub
    nBufLen = 1024
    ReDim cBuffer(0 To nBufLen)
 
    Call ReadDirectoryChangesW(DirHndl, cBuffer(0), nBufLen, WSubFolder, _
    FILE_NOTIF_GLOB, nReadLen, 0, 0)
 
End Sub
 
Private Function GetChanges() As String
 
   On Error Resume Next
   Dim fName As String
 
   MoveMemory fiBuffer.NextEntryOffset, cBuffer(0), 4
   MoveMemory fiBuffer.Action, cBuffer(4), 4
   MoveMemory fiBuffer.FileNameLength, cBuffer(8), 4
   ReDim cBuff2(0 To fiBuffer.FileNameLength)
   MoveMemory cBuff2(0), cBuffer(12), fiBuffer.FileNameLength
   fiBuffer.FileName = cBuff2
 
   Select Case fiBuffer.Action
            Case FILE_ACTION_ADDED
                sAction = "Added file"
            Case FILE_ACTION_REMOVED
                sAction = "Removed file"
            Case FILE_ACTION_MODIFIED
                sAction = "Modified file"
            Case FILE_ACTION_RENAMED_OLD_NAME
                sAction = "Renamed from"
            Case FILE_ACTION_RENAMED_NEW_NAME
                sAction = "Renamed to"
            Case Else
                sAction = "Unknown"
   End Select
 
   fName = sAction + "-" + FolderPath + fiBuffer.FileName
   If sAction <> "Unknown" Then GetChanges = fName
 
End Function
 
Private Sub ClearHndl(Handle As Long)
 
    CloseHandle Handle
    Handle = 0
 
End Sub
 
'______________________________________________________________________________________
Private Sub DisplayInfoOnSheet(i As Long, changes As String)
 
    With ThisWorkbook.Sheets(1)
        .Cells(i, 1) = changes
        .Columns("A:A").EntireColumn.AutoFit
   End With
 
End Sub
 
Sub StartWatch()
 
    Dim changes As String
    Dim WaitNum As Long
    Dim i As Long
 
    WSubFolder = True
    If Not WatchStart Then
        WatchStart = True
    Else
        MsgBox " The Directory Watcher is already enabled", vbInformation
        Exit Sub
    End If
    'Get Folder Handle
    FolderPath = "C:\test\" 'change this path as required
    If Right(FolderPath, 1) <> "\" Then FolderPath = FolderPath + "\"
    DirHndl = GetDirHndl(FolderPath)
    If (DirHndl = 0) Or (DirHndl = -1) Then MsgBox "Cannot create handle": Exit Sub
    i = 1
    Do
        'Create thread to Watch changes
        ThreadHandle = CreateThread(ByVal 0&, ByVal 0&, AddressOf StartWatch_CallBack, 0, 0, 0)
        Do
            WaitNum = WaitForSingleObject(ThreadHandle, 50)
            DoEvents
        Loop Until (WaitNum = 0) Or (WatchStart = False)
        changes = ""
        If WaitNum = 0 Then changes = GetChanges
        If changes <> "" Then Call DisplayInfoOnSheet(i, changes): i = i + 1
    Loop Until Not WatchStart
    'Terminate the Thread & Clear Handle
    If DirHndl <> 0 Then ClearHndl DirHndl
    If ThreadHandle <> 0 Then Call TerminateThread(ThreadHandle, ByVal 0&): ThreadHandle = 0
 
End Sub
 
Sub StopWatch()
    WatchStart = False
    With ThisWorkbook.Sheets(1)
        .Columns("A:A").ClearContents
        .Columns("A:A").ColumnWidth = Columns("B:B").ColumnWidth
    End With
 
End Sub
Изменено: vladjuha - 25.05.2018 17:02:57
vba Создать объект где все свойства только для чтения, где свойства Class1 есть экземпляры Class2
 
Здравствуйте.
Посоветуйте, пожалуйста, в следующем.

Есть Class1, в нём определено свойство. Это свойство является экземпляром Class2.
В Class2 также определено свойство, но оно только для чтения.
Я не могу понять, как можно при создании экземпляра Class1 задать значение для свойства из Class2, при условии, что значение для свойства Class2 известно только на этапе создания объекта от Class1.

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

Я вымучил только через глобальную переменную, поднося на лопате в момент new. Но это ужасно коряво и не годится для большого кол-ва свойств, как можно сделать нормально? Может оставить Property Let, но после создания объекта как-то блокировать попытки записи, вполне сгодилось бы, но как это реализовать?
vba Установить значение UDT-свойства экземпляра класса
 
Здравствуйте.
Подскажите, пожалуйста, как в примере установить требуемое значение для свойства пользовательского типа для созданного экземпляра.
vba Логика проверки нескольких условий в IF .. THEN
 
Здравствуйте!
Просветите, пожалуйста, в блоке
Код
If a = 1 or b = 2 then
  Statements
End If
если выполнилось условие a = 1 (True), будет ли осуществляться проверка b = 2 или руль отдаётся сразу в statements?

А вообще у меня прикладная задачка: соотнести экземпляры текста к определённым, своим, группам. Делаю путём простой проверки через InStr (не использую RegExp - хочу добиться максимальной скорости проверки). Будет ли выигрышнее в варианте "А"?
Вариант "А":
Код
If InStr(1, t, "ааа", 1) Then
    ...
ElseIf InStr(1, t, "ббб", 1) Then
    ...
ElseIf InStr(1, t, "ввв", 1) Then
    ...
End If
Вариант "Б":
Код
If InStr(1, t, "ааа", 1) Or InStr(1, t, "ббб", 1) Or InStr(1, t, "ввв", 1) Then
    ...
End If
(заместо ... одинаковый блок операторов)

Или может другие методы/способы быстрой проверки текста подскажите?
vba Передать аргументы полученные by ParamArray в другую процедуру
 
Здравствуйте.
Подскажите, пожалуйста, как элегантно передать все полученные аргументы далее (без дикости с их перечислением и проверкой на существование каждого).
Код
Sub f1()
    f2 1, 2, 3
End Sub

Sub f2(ParamArray a())
'    f3 a()
    f3 a(0), a(1), a(2)
End Sub

Sub f3(ParamArray a())
    Dim c
    Debug.Print TypeName(a), UBound(a) + 1
    For Each c In a
        Debug.Print c
    Next
End Sub
vba Регулярное выражение преобразования строки в нумерованный список
 
Добрый день.
Помогите, пожалуйста, с регулярным выражением.
Необходимо все вхождения типа 1. asdf. 2. xv cb-1. 3. uio №1 uio. преобразовать в список:
1. asdf.
2. xv cb-1.
3. uio №1 uio.

Написал такое, но оно не работает, как надоть:
Код
Public Function NormPhrase(ByVal s As String) As String
    On Error Resume Next
    Dim re As Object, mtchs As Object, i As Integer, p As String
    Set re = CreateObject("VBScript.RegExp"): re.Global = True: re.MultiLine = True
    re.Pattern = "(.+\.\s)([0-9]{1,2}\.\s.*)"
    
    Do While s Like "*  *"
        s = Replace(s, "  ", " ")
    Loop
    s = Trim(Replace(Replace(s, " .", "."), " ,", ","))
    s = UCase(Left(s, 1)) & Right(s, Len(s) - 1) & IIf(Right(s, 1) = ".", "", ".")
    
    Debug.Print s
    
    Set mtchs = re.Execute(s)
    For i = 0 To mtchs.Count - 1
        p = p & mtchs.Item(i).Submatches.Item(0) & vbLf & mtchs.Item(i).Submatches.Item(1)
    Next
    
    NormPhrase = p
End Function

Sub tstNormPhrase()
    Debug.Print NormPhrase("1. asdf. 2. xv cb-1. 3. uio №1 uio.")
End Sub
Изменено: vladjuha - 25.02.2017 05:24:52
vba Отключить (заблокировать) кнопку на панели инструментов, Excel 2016
 
Добрый день.
На вкладке главная (Excel 2016) есть кнопочка "Формат по образцу", остающаяся активной даже при защищённом листе с опцией запрета формата ячеек (наряду с "Очистить").
Требуется её заблокировать. Я уже определил её ID (108) и использую следующий код, и, хотя ComBarCtrl.Enabled изменяет состояние, на панели инструментов всё остаётся как прежде. Как можно заблокировать кнопочку?
Код
Private Sub DisAbleAllCLear()
    EnableControl 108, False
End Sub
Private Sub EnableControl(iId As Integer, blnState As Boolean)
    Dim ComBar As CommandBar
    Dim ComBarCtrl As CommandBarControl
    On Error Resume Next
    For Each ComBar In Application.CommandBars
        Set ComBarCtrl = ComBar.FindControl(ID:=iId, recursive:=True)
        If Not ComBarCtrl Is Nothing Then ComBarCtrl.Enabled = blnState
    Next
End Sub
Изменено: vladjuha - 11.02.2017 08:00:21
vba Прочитать диапазон применения условного форматирования, не работает AppliesTo
 
Здравствуйте.
На листе есть вручную созданные правила УФ. Созданы они с большим запасом по строкам (диапазон применения) - на все случаи вводимых пользователем объёмов данных.
Но чаще УФ работают на ~10%. А раз так, да учитывая, что правила УФ  к тому же волотильны, пришла идея макросом, при необходимости, причёсывать нижнюю границу правил УФ (через ModifyAppliesToRange).
Проблема в том, что не получается прочитать (свойство AppliesTo) текущий диапазон применения правила УФ (не все правила однотипно ссылаются на одну область) - ошибка Type mismatch.
Почему жизнь так несправедлива Почему так происходит с некоторыми свойствами FormatCondition и как всё-таки можно считать диапазон?
Сводная комбинированная диаграмма (линейчатая+гистограмма), событие + результат не выводятся по одной оси времени :(
 
Добрый день!
Пробую создать сводную комбинированную диаграмму, где линейчатая - событие и его длительность, а гистограмма - результат события (деньги).

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

Можно ли увязать оба графика к одной оси времени?
Обратиться по CodeName к листу книги-не-ThisWorkbook, без проверок - напрямую
 
Добрый день.

Подозреваю, что вопрос наивен и не знаю элементарного (поиск не помог).
Но как самым простым образом обратиться по CodeName к листу книги, не являющейся ThisWorkbook?
Наподобие, как для ThisWorkbook это можно сделать коротко, при обращении к ячейке A1 так: ASheet1.[A1]

Конструкции типа ABook1.ASheet1.[A1] не работают, а каждый раз проверять через If sh.CodeName = "ASheet1" Then sh.[A1] .. - громоздко.
Изменено: vladjuha - 12.10.2016 07:16:19
Результат работы регулярного выражения не работает с FormulaLocal, при корректном поиске и замене
 
Добрый день.

В представленном примере при помощи регулярного выражения подбираются вхождения ДВССЫЛ(...) с последующей заменой на прямой путь к файлу.
Есть две ячейки: в одном исходная формула состоит из одной строки, во второй - из трёх (перевод строки внутри ячейки).

Результат поиска и замены корректный - это видно в отладочном окне, более того, если скопировать получаемый итог (для "трехстрочной" ячейки) ручками из отладки в ячейку - будет работать. Но программно через [A2].FormulaLocal в случае многострочной ячейки не работает. Подскажите, пожалуйста, что является тому причиной.
VBA. Доступ к эскизу файла (свойство документа)
 
Здравствуйте!
Возможен ли сабж? Я, конечно, пробежался по справке коллекции BuiltinDocumentProperties и там ничего такого нету, но вдруг кто-то познал сию истину
Узнать символ разделения аргументов в функциях, точка с запятой или запятая?
 
Здравствуйте!
В англофицированной windows в XL разделитель аргументов функций - запятая. Как можно программно это узнать? Или, может, есть спец.константа для разделителя?
Код
r1.FormatConditions.Add Type:=xlExpression, Formula1:=IIf(Application.ReferenceStyle = xlA1, "=ИНДЕКС(_ДЗ;СТРОКА()-$AJ$1)>0", "=ИНДЕКС(_ДЗ;СТРОКА()-R1C36)>0")
Excel повреждается при запуске, если в файле была обновлена сводная
 
Здравствуйте!
В прилагаемом файле имеются "умная" и основанная на первой сводная таблицы. Дополнительно имеется макрос, чья задача - при обновлении сводной пересоздать условное форматирование.
Если после первого открытия файла обновить сводную и закрыть с сохранением, то файл безвозвратно повреждается (в Excel  2016, на других - не знаю).
Понятно, что xl не нравится способ задания именованного диапазона scp. Бат вай, на каком основании, доколе??

Хочется понять логику - почему? Что, собственно, некорректно сделано?
Изменено: vladjuha - 04.05.2016 15:09:23
Формат столбца "Общий итог" в сводной, при группировке и по строкам и по столбцам
 
Приветствую!
Я, наверное, упускаю какую-то тривиальную вещь, но не могу понять, как применить условной форматирование к столбцу "Общий итог" в сводной таблице, при условии, что в таблице группировка устроена не только по строкам, но и по столбцам.
Как-нибудь можно выкрутиться?
"Составной" запрос на именованный диапазон в другой книге, текст.строка(адрес книги)+ИД
 
Здравствуйте!
Хочу передать определение адреса книги юзеру - он указывает в книге file1 текстом в ячейке полный путь до файла c:\dir1\dir2\file2.xlsb
А далее мне необходимо прислюнявить туда именованный диапазон, что существует в открываемом файле: ИД
Всё это крепится в Диспетчере имён file1 под каким-то именем. В итоге должно получиться родимое: ='c:\dir1\dir2\file.xlsb'!ИД
Решение в лоб как скрепление строк не работает.
Можно ли такое осуществить?
Подгрузка фантомных данных при открытии файла, связи файлов нет, но подгрузку видно
 
Здравствуйте!
Периодически замечаю в своём целевом файлике xlsb, при его запуске, в статусной строке некую "подгрузку данных" из ещё одного файла exlel, действительно когда-то существовавшего (и возможно задействованного тогда же тем или иным образом в целевом файле - хотя я и не уверен, что так действительно организовывал процесс).
То есть выглядит так, будто настроена связь (Данные - Подключения), хотя там и пусто.
Как/где ещё можно определить где сидит диверсант (целевой файл тяжёлый для расчёта - хочется избавиться от лишних вычислений)?

Файл приложить не могу, извините:)
Как макросом узнать активный фильтрующий срез в сводной
 
Здравствуйте!
Есть сводная таблица и множество срезов к ней. Подскажите, пожалуйста, как макросом вычислить какой из них фильтрует и по каким критериям?
Ссылка на последнюю ячейку в диапазоне, где значения ячеек выводятся формулами, **не** про поиск последней яч. среди данных, вводимых вручную :)
 
Здравствуйте.

Как найти ссылку на последнюю непустую ячейку в диапазоне, если значения (текстовые) в этом диапазоне выводятся формулами и могут выводить пустоты (="")  как выше, так и ниже её?
Конструкции вида
Код
=ИНДЕКС(A:A;ПОИСКПОЗ("ЯЯЯ";A:A))
=ИНДЕКС(A:A;СЧЁТЕСЛИ(A:A;"*?"))
=ИНДЕКС(A:A;ПОИСКПОЗ("*";A:A;-1))
здесь не помогут
Сослаться на место безусловно, при изменении диапазона, по-прежнему сослаться на старое физ.место
 
Приветствую!

Как можно безусловно сослаться на диапазон А1:С3 вне зависимости от возможных действий пользователя.

Например, юзер удаляет строку 2, столбец B, затем перемещает (уже скукоженный) A1:B2 в сторону. Соответственно умненькая XL во всех зависимых формулах будет уже ссылаться на некий ~ E8:F9, но мне надо всё-равно сослаться на А1:С3.
Можно ли это реализовать без волатильной ДВССЫЛ?

В приложении "реализация" на ДВССЫЛ.
Изменено: vladjuha - 27.01.2016 18:45:41
Сводная таблица. Совмещение исчисляемых данных с неисчисляемыми
 
Приветствую! Подскажите, пожалуйста, есть ли в XL возможность совместить данные разных типов в сводной таблице.
Вот, для примера в приложении: как вместо нулей для характеристики "Эксплуатационное состояние" заставить отображаться текстовые значения для каждого часа - как в исх.таблице?
Страницы: 1
Наверх