Макросы VBA Excel — Страница 31

Чтение значений из реестра Windows на VBA

Чтение и запись в реестр Windows в произвольную ветку можно произвести при помощи функций объекта WScript.Shell:

RegRead и RegWrite

Первая функция возвращает значение, считанное из реестра, вторая - записывает заданное значение в реестр.

При попытке считать несуществующий параметр возникает ошибка,
обойти которую нам поможет директива On Error Resume Next 

 

Пара функций для примера:

(получаем настройки программы из реестра Windows)

Макрос для установки (замены) пароля на открытие, для все файлов Excel в заданной папке

Макрос предназначен для замены паролей на открытие, для большого количества файлов Excel.

В качестве исходных данных, задаётся старый и новый пароли.

Если поле «старый пароль» - пустое, подразумевается, что у файлов нет пароля.
Если поле «новый пароль» - пустое, подразумевается, что с файлов снимается пароль.

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

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

ВНИМАНИЕ: Это очень опасный макрос, - если вы случайно забудете, какой пароль вы установили на файлы,
- все обработанные макросом файлы Excel станут недоступны!

Так что, пользуйтесь макросом на свой страх и риск.

Напоминаю: снять (сбросить) пароль н а открытие файла невозможно!
(только полным перебором, - а это очень долго)

Часть кода макроса: (см. прикреплённый файл)

Выборка случайных строк из двумерного массива

Функция RandomRowsFromArray предназначена для выборки из двумерного массива случайных строк.

К примеру, исходный массив (таблица) имеет размер 1000*20 (1000 строк, и 20 столбцов)
Нам требуется выбрать из этой таблицы, случайным образом, 50 строк
(получив, таким образом, таблицу размерами 50*20)
Кроме того, необходимо, чтобы при каждом новом запуске макроса,
в выборку попадали новые строки
.

В прикреплённом к статье файле вы найдете пример такого макроса:

Sub ПримерИспользования_RandomRowsFromArray()
    ' считываем массив с листа
    arr = [a1:e20].Value
    ' считываем количество строк в выборке
    Количество = Val([NewCount])
 
    ' выбираем строки из массива случайным образом (получаем новый массив newarr)
    newarr = RandomRowsFromArray(arr, Количество)
 
    ' заносим результат на лист (справа от исходных данных)
    Range("g1").Resize(UBound(newarr, 1), UBound(newarr, 2)).Value = newarr
End Sub

Преобразование текстовой строки в двумерный массив

Function Text2Array(ByVal txt$, Optional ByVal ColumnsSeparator$ = " ", _
                    Optional ByVal RowsSeparator$ = vbNewLine) As Variant
    ' получает в качестве параметров текстовую строку TXT,
    ' и разделители строк и столбцов для разбиваемой строки
    ' Возвращает двумерный массив - результат разбиения строки
    txt = Trim(txt): On Error Resume Next: Err.Clear
    If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))
 
    tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1

Ведение логов действий программы (модуль класса)

Для использования подобного кода записи логов необходимо скопировать (перетащив мышкой) модуль класса LogRecorder из прикреплённого файла в ваш файл.

Sub ПримерИспользованияКласса_LogRecorder()
    ' создаём новый экземпляр лог-рекордера
    Dim LR As LogRecorder: Set LR = New LogRecorder
    ' задаём имя файла для лога (указываем полный путь)
    LR.LogFileFullName = ThisWorkbook.Path & "\common.log"
    LR.OpenLog    ' открываем лог (очистка файла + запись стартовой строки)

    For i = 1 To 10
        ' здесь ваш код ...
        ' заносим запись в лог
        LR.AddRecord "Событие " & i, "Информация " & i, 1
        If i Mod 3 = 0 Then ' i делится на 3 без остатка
            ' добавляем запись, до и после неё вставляем строку-разделитель
            LR.AddRecord "Значение " & i & " делится на 3 без остатка", _
                         "дополнительная проверка", 2, LOG_SEPARATOR_BEFORE_AND_AFTER
        End If
    Next i
    LR.AddRecord "Цикл завершен", "Проверено 10 чисел", 1, LOG_SEPARATOR_AFTER
 
    LR.CloseLog  ' закрываем лог (очистка буфера + запись конечной строки)
    ' LR.Show ' запуск текстового файла с логом (для просмотра
End Sub

Можно при добавлении записей в лог указать уровень записей - чтобы выделять отдельные записи отступом слева, как на этом скриншоте: http://ExcelVBA.ru/pictures/20110829-cd9-96kb.jpg

Кроме того, можно задать максимальное значение буфера лога (запись непосредственно в файла происходит не при каждом выполнении команды AddRecord, а только при превышении размера буфера, принудительном сохранении лога опцией ForceSavingLog=TRUE, а также при сохранении лога командой SaveLog, и при закрытии лога методом CloseLog )
Размер буфера можно изменить, задав значение свойства maxLogSizeBeforeSave (количество символов, при котором лог-файл будет сохранён принудительно, по умолчанию = 5000)

Результатом работы этого кода будет создание файла с именем common.log в той же папке, где расположен файл Excel с макросом: