From 1d3639d34585260273dfd671d0877e6c926b07c9 Mon Sep 17 00:00:00 2001 From: thest1tch Date: Tue, 27 Jun 2023 17:43:05 +0500 Subject: [PATCH] update --- docs/docker/docker-compose-healthcheck.md | 38 ++ docs/docker/nextcloud/during-scan.md | 0 docs/docker/nextcloud/php-imagick.md | 0 .../office/excel-vba-progress-bar-01.png | Bin 0 -> 2389 bytes .../office/excel-vba-progress-bar-02.png | Bin 0 -> 3366 bytes .../office/excel-vba-progress-bar-03.png | Bin 0 -> 3251 bytes docs/other/office/excel/index.md | 15 + docs/other/office/excel/vba-align-comments.md | 15 + docs/other/office/excel/vba-create-file.md | 12 + docs/other/office/excel/vba-open-file.md | 39 ++ docs/other/office/excel/vba-progress-bar.md | 83 ++++ docs/other/office/excel/vba-remove-pass.md | 186 ++++++++ docs/other/office/excel/vba-security-page.md | 34 ++ docs/other/office/excel/vba-send-email.md | 32 ++ docs/other/office/excel_vba.md | 422 ------------------ mkdocs.yml | 10 + 16 files changed, 464 insertions(+), 422 deletions(-) create mode 100755 docs/docker/docker-compose-healthcheck.md mode change 100644 => 100755 docs/docker/nextcloud/during-scan.md mode change 100644 => 100755 docs/docker/nextcloud/php-imagick.md create mode 100644 docs/images/other/office/excel-vba-progress-bar-01.png create mode 100644 docs/images/other/office/excel-vba-progress-bar-02.png create mode 100644 docs/images/other/office/excel-vba-progress-bar-03.png create mode 100755 docs/other/office/excel/index.md create mode 100644 docs/other/office/excel/vba-align-comments.md create mode 100644 docs/other/office/excel/vba-create-file.md create mode 100644 docs/other/office/excel/vba-open-file.md create mode 100644 docs/other/office/excel/vba-progress-bar.md create mode 100644 docs/other/office/excel/vba-remove-pass.md create mode 100644 docs/other/office/excel/vba-security-page.md create mode 100644 docs/other/office/excel/vba-send-email.md delete mode 100644 docs/other/office/excel_vba.md diff --git a/docs/docker/docker-compose-healthcheck.md b/docs/docker/docker-compose-healthcheck.md new file mode 100755 index 0000000..bf83069 --- /dev/null +++ b/docs/docker/docker-compose-healthcheck.md @@ -0,0 +1,38 @@ +Собрал несколько настроек для docker-compose, чтобы проверять работоспособность различных баз данных + +## MySQL / MariaDB +```yaml +healthcheck: + test: out=$$(mysqladmin ping -h 127.0.0.1 -P 3306 -u root --password=$$(cat $${MARIADB_ROOT_PASSWORD_FILE}) 2>&1); echo $$out | grep 'mysqld is alive' || { echo $$out; exit 1; } + interval: 1m + timeout: 10s + retries: 5 +``` +## Redis +```yaml +healthcheck: + test: [ 'CMD', 'redis-cli', 'ping' ] + interval: 5m + timeout: 10s + retries: 5 +``` +## PostgreSQL + +pg_isready не очень полезно, потому что часто служба может работать, но БД недоступна. +```yaml +healthcheck: + test: [ "CMD", "psql", "-U", "postgres", "-c", "SELECT 1;" ] + interval: 1m + timeout: 10s + retries: 5 +``` +## Curl + +Ensure you use --fail or your health check will always succeed. +```yaml +healthcheck: + test: [ "CMD", "curl", "--fail", "http://localhost" ] + interval: "60s" + timeout: "5s" + retries: 3 +``` \ No newline at end of file diff --git a/docs/docker/nextcloud/during-scan.md b/docs/docker/nextcloud/during-scan.md old mode 100644 new mode 100755 diff --git a/docs/docker/nextcloud/php-imagick.md b/docs/docker/nextcloud/php-imagick.md old mode 100644 new mode 100755 diff --git a/docs/images/other/office/excel-vba-progress-bar-01.png b/docs/images/other/office/excel-vba-progress-bar-01.png new file mode 100644 index 0000000000000000000000000000000000000000..377b5c6b802bf77f490e4f6afcf2939163950a6b GIT binary patch literal 2389 zcmV-b399yqP)~<_6n-t0WLa-JSi^C1B(#)?GV-pb})t>{uPG2#AP+?l4vtil|UZ$K5Vo z3V4I1JJdQ_4A5ZFoz8T|t=tkWGy7pLT7e`ScV}-iTU#~n*$*c$NNfQT3lzzD z65=2^PeL3d=Shfz${S6$=31W2 z{`Y^+=>&7iw-3Jy4^xS);u(12a6EeS*l4=7Dkbr6|Co2Lyh^2bB|I!N@_g^}B<2F1 z?UKaS;scdR@k+QVWb%AC@4&%|-+Xvd=+qBS%?!BI><7-k+EreD`QD7s(jATUdD>^L zg0NvMcyx~^$;dJ#Z#wnHZm%~&cmgmoTLAM>39BT7A6Zh@?@rIvN%l{r_qwTC(m2DJI%Z1;Lvim!eO0Oedr*dG+- z4$^(5At0Mg7;URFMizc_M8_LW_tn?gHlEt4^Q=pcTBfvm&C`}Br9%FLFlFfFjo#=H ze1r@Np~x z;MI0D9`v=@R%S;#6UHn<348K&9u-);Dv$McTaz}XYkW@XI#f!h?LsNz#!d1%9%hRks+LX$jHKIfnpl+r6F&3PJ}>+W}q#?uMn!6jhj^o*DE}#4|W{sq{RG zPgiBC{miRS%EMI(G32=pjmC%bJZ^aqy%KP#fLv(%`u2SwZI$5uENyG9+my*EX#l>w z(q#nz+tpKSBM>;- z0^AsiqNwrKz2~XoGX?SfW>qTW;Yvm5v+8YfDubSfR=sz zu7b(MX9{@r0m$XDFr`8id72d~Z8iIfoy8KVzf1(}|1d(#z`!8;Y*C?*`!b&haJEZI zO624{eDql0?uHtYY zkXVSw2q9u?kXVSwh(mIogb2tSf@|LJg|~n8wd*9cyrWPbB2B?&#)SY&^BVH3?|4M& zR}3GiymFsyXK4V~d*3~UQnoD-e5gPE>8?PR`C|TO+V^TRBLRE&@n2eVTK7E1ckt&2 z=H{Z|r1M33uLv$4wQf3=t+sa`@6lEl>1k6{kEXWZMSZiq0QlMG5e5ul2q6Fiq$b1? zLSVjB&>2;CBGb7NaHr-=1&#ggu`#*M94^j9fa%X`E3ZttgZ!Ev?Z$opspTz&dao|8 zG;WHKbHzgmEk2g$=^Mt|$vL}um&`@X4B#MyFaSe{t-EDvb5*9a2cARxIS-iVtbDr@ z09NfepG61(2mprR263kZh}m3wY`q$Qxvj{^=8Rr!w7&UXQ)VPa&zCg!#8q!l1F%m` zrtEJjfGdq()7>7u*ob|tO>y=wjyLz($kO7`V#LfF2s0ShY#V>v2covl2Ux z7F+>hHrMXyZ64fMohA8hPLUD92=y_D$vIY&p#i2%^+o5HmLeU%VB&gJ{&fIL@~W#M z8Gvyxgn(-RT-##46SMM|h7bm^E0fL`Ew-!-4QT6BbmS&N?7XqAng9@!;~a~DJNfK7 znq*_hVxcszDPjxH#=`r$=;8jU6%mBkcxld> zz({+E(JKhRPnwS@d@<77$rx(lc-`I+fbP9yGrW^wZtqI0YN}S#y$vSwx}EX93Q9Z| zi-<7no`(=Z?8C!TDRHqgf(!$O;hl2H?zS#2X>!$~epKVvUk z_$87E9O}-{sMs1L79!HqGYN5!5k~NDTM3D|Lt67B#6fbNggD3;$$1iDAp7q7@5R<2 zu@Lzmh0M5#;JCm@0000KbVXQnQ*UN;cVTj609j#fWMz0RL}_ztPG9(u00000NkvXX Hu0mjfJuk7` literal 0 HcmV?d00001 diff --git a/docs/images/other/office/excel-vba-progress-bar-02.png b/docs/images/other/office/excel-vba-progress-bar-02.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2123d87b1a56632cc92d301d15634b81fc273c GIT binary patch literal 3366 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 literal 0 HcmV?d00001 diff --git a/docs/images/other/office/excel-vba-progress-bar-03.png b/docs/images/other/office/excel-vba-progress-bar-03.png new file mode 100644 index 0000000000000000000000000000000000000000..2d463c2f98e3a9417e2f10ea0e18d2766995fb41 GIT binary patch literal 3251 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 Использование APPLICATION.STATUSBAR + +## Прогресс бар внизу страницы: +```vba +Application.StatusBar = "TEST" + DoEvents + ... +Application.StatusBar = False +``` + +## Прогресс бар для циклов: +```vba +For i = 1 To n + Istochnik = Cells(i, 20) + Application.StatusBar = "Делаю источник " & i & "-" & Istochnik & "/" & 50 & "" + DoEvents +Next +``` +## Можно сделать показ % завершения: + +![](../../../images/other/office/excel-vba-progress-bar-01.png) + +```vba +Sub ShowProgressBar() + Dim lAllCnt As Long, lr as Long + Dim rc As Range + 'кол-во ячеек в выделенной области + lAllCnt = Selection.Count + 'цикл по всем ячейкам в выделенной области + For Each rc In Selection + 'прибавляем 1 при каждом шаге + lr = lr + 1 + Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" + DoEvents 'чтобы форма перерисовывалась + Next + 'сбрасываем значение статусной строки + Application.StatusBar = False +End Sub +``` +## Текст + блоки символов из 10 штук: + +![](../../../images/other/office/excel-vba-progress-bar-02.png) + +```vba +Sub StatusBar2() + Dim lr As Long, lp As Double + Dim lAllCnt As Long 'кол-во итераций + Dim s As String + lAllCnt = 10000 + For lr = 1 To lAllCnt + lp = lr \ 100 'десятая часть всего массива + 'формируем строку символов(от 1 до 10) + s = String(lp \ 10, ChrW(10152)) & String(11 - lp \ 10, ChrW(8700)) + Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents + DoEvents + Next + 'очищаем статус-бар от значений после выполнения + Application.StatusBar = False +End Sub +``` + +## Текст + блоки квадратов из n штук: + +количество квадратов можно менять +![](../../../images/other/office/excel-vba-progress-bar-03.png) + +```vba +Sub StatusBar3() + Dim lr As Long + Dim lAllCnt As Long 'кол-во итераций + Const lMaxQuad As Long = 20 'сколько квадратов выводить + lAllCnt = 10000 + + For lr = 1 To lAllCnt + Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" & String(CLng(lMaxQuad * lr / lAllCnt), ChrW(9632)) & String(lMaxQuad - CLng(lMaxQuad * lr / lAllCnt), ChrW(9633)) + DoEvents + Next + 'очищаем статус-бар от значений после выполнения + Application.StatusBar = False +End Sub +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-remove-pass.md b/docs/other/office/excel/vba-remove-pass.md new file mode 100644 index 0000000..776ed09 --- /dev/null +++ b/docs/other/office/excel/vba-remove-pass.md @@ -0,0 +1,186 @@ +# Удаление пароля VBA + +> Пожалуйста, сделайте резервную копию ваших файлов в первую очередь! +{.is-warning} + +## Для 32 битной версии +Откройте файл(ы), которые содержат ваши заблокированные проекты VBA +Создайте новый файл **xlsm** и сохраните этот код в `Module1` + +```vba +code credited to Siwtom (nick name), a Vietnamese developer + +Option Explicit + +Private Const PAGE_EXECUTE_READWRITE = &H40 + +Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ + (Destination As Long, Source As Long, ByVal Length As Long) + +Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _ + ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long + +Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long + +Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _ + ByVal lpProcName As String) As Long + +Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _ + ByVal pTemplateName As Long, ByVal hWndParent As Long, _ + ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer + +Dim HookBytes(0 To 5) As Byte +Dim OriginBytes(0 To 5) As Byte +Dim pFunc As Long +Dim Flag As Boolean + +Private Function GetPtr(ByVal Value As Long) As Long + GetPtr = Value +End Function + +Public Sub RecoverBytes() + If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 +End Sub + +Public Function Hook() As Boolean + Dim TmpBytes(0 To 5) As Byte + Dim p As Long + Dim OriginProtect As Long + + Hook = False + + pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") + + + If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then + + MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 + If TmpBytes(0) <> &H68 Then + + MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 + + p = GetPtr(AddressOf MyDialogBoxParam) + + HookBytes(0) = &H68 + MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 + HookBytes(5) = &HC3 + + MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 + Flag = True + Hook = True + End If + End If +End Function + +Private Function MyDialogBoxParam(ByVal hInstance As Long, _ + ByVal pTemplateName As Long, ByVal hWndParent As Long, _ + ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer + If pTemplateName = 4070 Then + MyDialogBoxParam = 1 + Else + RecoverBytes + MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ + hWndParent, lpDialogFunc, dwInitParam) + Hook + End If +End Function +``` +Вставьте этот код под вышеуказанным кодом в Module1 и запустите его +```vba +Sub unprotected() + If Hook Then + MsgBox "VBA Project is unprotected!", vbInformation, "*****" + End If +End Sub +``` +Возвращайтесь к своим проектам VBA и наслаждайтесь. + +## Для 64 битной версии: +Откройте файл (ы), содержащий ваши заблокированные проекты VBA. + +Создайте новый файл xlsm и сохраните этот код в `Module1` +```vba +Option Explicit + +Private Const PAGE_EXECUTE_READWRITE = &H40 + +Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ +(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) + +Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _ +ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr + +Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr + +Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _ +ByVal lpProcName As String) As LongPtr + +Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _ +ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ +ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer + +Dim HookBytes(0 To 5) As Byte +Dim OriginBytes(0 To 5) As Byte +Dim pFunc As LongPtr +Dim Flag As Boolean + +Private Function GetPtr(ByVal Value As LongPtr) As LongPtr + GetPtr = Value +End Function + +Public Sub RecoverBytes() + If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 +End Sub + +Public Function Hook() As Boolean + Dim TmpBytes(0 To 5) As Byte + Dim p As LongPtr + Dim OriginProtect As LongPtr + + Hook = False + + pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") + + + If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then + + MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 + If TmpBytes(0) <> &H68 Then + + MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 + + p = GetPtr(AddressOf MyDialogBoxParam) + + HookBytes(0) = &H68 + MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 + HookBytes(5) = &HC3 + + MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 + Flag = True + Hook = True + End If + End If +End Function + +Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _ +ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ +ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer + + If pTemplateName = 4070 Then + MyDialogBoxParam = 1 + Else + RecoverBytes + MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ + hWndParent, lpDialogFunc, dwInitParam) + Hook + End If +End Function +``` +Вставьте этот код в Module2 и запустите его +```vba +Sub unprotected() + If Hook Then + MsgBox "VBA Project is unprotected!", vbInformation, "*****" + End If +End Sub +``` \ No newline at end of file diff --git a/docs/other/office/excel/vba-security-page.md b/docs/other/office/excel/vba-security-page.md new file mode 100644 index 0000000..217b478 --- /dev/null +++ b/docs/other/office/excel/vba-security-page.md @@ -0,0 +1,34 @@ +# Защита страницы через VBA + +Каждый кто хоть раз писал макросы, сталкивался с тем, что требуется защитить лист и формулы на нем от шаловливых ручек пользователей. При том, нужно чтобы макросы на листе работали. Самое просто решение, это перед кодом макроса, добавить это: + +```vba +Worksheets("Лист1").Unprotect Password:="123" +'тут макрос делает действия +Worksheets("Лист1").Protect Password:="123" +``` + +Это будет работать, но у такого подхода есть и свои минусы. Во-первых, нужно эту конструкцию размещать в каждом макросе. Во-вторых - если будет ошибка, лист останется без защиты. + +## Есть другой способ + +Нажмите `Alt+F11`, чтобы попасть в редактор Visual Basic. Затем в левом верхнем углу в окне Project Explorer (если его не видно, то нажмите Ctrl+R) модуль ЭтаКнига (ThisWorkbook) и откройте двойным щелчком: + +![]( ../../images/other/office/excel_vba_01.png){ loading=lazy } + + +Вставьте этот код: + +```vba +Private Sub Workbook_Open() + 'включаем защиту первого листа для пользователя, но не макроса + Worksheets("Лист1").Protect Password:="123", UserInterfaceOnly:=True + + 'второй лист защищаем аналогично, но с возможностью пользоваться группировкой + Worksheets("Лист2").EnableOutlining = True + Worksheets("Лист2").Protect Password:="555", UserInterfaceOnly:=True +End Sub +``` + +Данный код будет автоматически запускаться при открытии файла и ставить защиту на заданные листы. Параметр `UserInterfaceOnly` указывает Excel, что защита не должна работать для действий макроса, а только на операции юзера. +Второй параметр `EnableOutlining` разрешает пользоваться группировкой. diff --git a/docs/other/office/excel/vba-send-email.md b/docs/other/office/excel/vba-send-email.md new file mode 100644 index 0000000..2d733df --- /dev/null +++ b/docs/other/office/excel/vba-send-email.md @@ -0,0 +1,32 @@ +# Отправка почты VBA + +отправляет почту, используя для этого запущенный MS Outlook + +```vba +' Запрос ввода темы письма + Dim vRetVal + vRetVal = InputBox("Введи тему письма", "Тема", "Test") + ActiveSheet.Range("I3").Value = vRetVal + + Dim OutApp As Object + Dim OutMail As Object + Dim cell As Range + + Send_ist = Cells(1, 1) + + Application.ScreenUpdating = False + Set OutApp = CreateObject("Outlook.Application") + OutApp.Session.Logon + Set OutMail = OutApp.CreateItem(0) + On Error Resume Next + With OutMail + .To = Send_ist + .Body = "Заполнить в день получения и отправить обратно на your_email" + .Subject = Range("A1").Value + .Attachments.Add iFullName + .Send + End With + + On Error GoTo 0 + Set OutMail = Nothing +``` \ No newline at end of file diff --git a/docs/other/office/excel_vba.md b/docs/other/office/excel_vba.md deleted file mode 100644 index b724151..0000000 --- a/docs/other/office/excel_vba.md +++ /dev/null @@ -1,422 +0,0 @@ -## Защита страницы через VBA - -Каждый кто хоть раз писал макросы, сталкивался с тем, что требуется защитить лист и формулы на нем от шаловливых ручек пользователей. При том, нужно чтобы макросы на листе работали. Самое просто решение, это перед кодом макроса, добавить это: - -```vba -Worksheets("Лист1").Unprotect Password:="123" -'тут макрос делает действия -Worksheets("Лист1").Protect Password:="123" -``` - -Это будет работать, но у такого подхода есть и свои минусы. Во-первых, нужно эту конструкцию размещать в каждом макросе. Во-вторых - если будет ошибка, лист останется без защиты. - -### Есть другой способ - -Нажмите `Alt+F11`, чтобы попасть в редактор Visual Basic. Затем в левом верхнем углу в окне Project Explorer (если его не видно, то нажмите Ctrl+R) модуль ЭтаКнига (ThisWorkbook) и откройте двойным щелчком: - -![]( ../../images/other/office/excel_vba_01.png){ loading=lazy } - - -Вставьте этот код: - -```vba -Private Sub Workbook_Open() - 'включаем защиту первого листа для пользователя, но не макроса - Worksheets("Лист1").Protect Password:="123", UserInterfaceOnly:=True - - 'второй лист защищаем аналогично, но с возможностью пользоваться группировкой - Worksheets("Лист2").EnableOutlining = True - Worksheets("Лист2").Protect Password:="555", UserInterfaceOnly:=True -End Sub -``` - -Данный код будет автоматически запускаться при открытии файла и ставить защиту на заданные листы. Параметр `UserInterfaceOnly` указывает Excel, что защита не должна работать для действий макроса, а только на операции юзера. -Второй параметр `EnableOutlining` разрешает пользоваться группировкой. - -## Исправление примечаний VBA - -Бывает так, что ты вставляешь примечания и они уползают вниз при действиях со строками.  - -Чтобы такого не было, используй этот макрос: - -```vba -Sub align_comments() -Dim x As Comment -For Each x In ActiveSheet.Comments - x.Shape.Left = x.Parent.Offset(0, 1).Left + 10 - x.Shape.Top = x.Parent.Top -Next -End Sub -``` - -## Открытие файла VBA - -Для открытия 1 файла и передачи его на дальнейшую обработку, используй этот код: - -```vba -avFiles = Application.GetOpenFilename _ - ("Excel files(*.xls*),*.xls*", 1, "Выбери Excel файл", , False) -If VarType(avFiles) = vbBoolean Then - 'была нажата кнопка отмены - выход из процедуры - Exit Sub -End If - -Set avFiles1 = Workbooks.Open(Filename:=avFiles) -``` - -Чтобы открыть много файлов и запустить обработку по ним, используем цикл: - -```vba -FilesToOpen = Application.GetOpenFilename _ - (FileFilter:="All files (*.*), *.*", _ - MultiSelect:=True, Title:="Files to Merge") - -If TypeName(FilesToOpen) = "Boolean" Then - MsgBox "Не выбрано ни одного файла!" - Exit Sub -End If - -'проходим по всем выбранным файлам -x = 1 -While x <= UBound(FilesToOpen) - With Workbooks.Open(FilesToOpen(x)).Sheets(1) - ... - ... - End With - x = x + 1 -Wend -``` - -## Отправка почты VBA - -отправляет почту, используя для этого запущенный MS Outlook - -```vba -' Запрос ввода темы письма - Dim vRetVal - vRetVal = InputBox("Введи тему письма", "Тема", "Test") - ActiveSheet.Range("I3").Value = vRetVal - - Dim OutApp As Object - Dim OutMail As Object - Dim cell As Range - - Send_ist = Cells(1, 1) - - Application.ScreenUpdating = False - Set OutApp = CreateObject("Outlook.Application") - OutApp.Session.Logon - Set OutMail = OutApp.CreateItem(0) - On Error Resume Next - With OutMail - .To = Send_ist - .Body = "Заполнить в день получения и отправить обратно на your_email" - .Subject = Range("A1").Value - .Attachments.Add iFullName - .Send - End With - - On Error GoTo 0 - Set OutMail = Nothing -``` - -## Отключение обновления экрана -```vba -Application.ScreenUpdating = False -' в конце -Application.ScreenUpdating = True -``` - -## Прогресс бар VBA - -> Использование APPLICATION.STATUSBAR -{.is-info} - -### Прогресс бар внизу страницы: -```vba -Application.StatusBar = "TEST" - DoEvents - ... -Application.StatusBar = False -``` - -### Прогресс бар для циклов: -```vba -For i = 1 To n - Istochnik = Cells(i, 20) - Application.StatusBar = "Делаю источник " & i & "-" & Istochnik & "/" & 50 & "" - DoEvents -Next -``` -### Можно сделать показ % завершения: - -![](https://pics.thest1tch.ru/pic/xwbza0bv.png) - -```vba -Sub ShowProgressBar() - Dim lAllCnt As Long, lr as Long - Dim rc As Range - 'кол-во ячеек в выделенной области - lAllCnt = Selection.Count - 'цикл по всем ячейкам в выделенной области - For Each rc In Selection - 'прибавляем 1 при каждом шаге - lr = lr + 1 - Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" - DoEvents 'чтобы форма перерисовывалась - Next - 'сбрасываем значение статусной строки - Application.StatusBar = False -End Sub -``` -### Текст + блоки символов из 10 штук: - -![](https://pics.thest1tch.ru/pic/umeq366g.png) - -```vba -Sub StatusBar2() - Dim lr As Long, lp As Double - Dim lAllCnt As Long 'кол-во итераций - Dim s As String - lAllCnt = 10000 - For lr = 1 To lAllCnt - lp = lr \ 100 'десятая часть всего массива - 'формируем строку символов(от 1 до 10) - s = String(lp \ 10, ChrW(10152)) & String(11 - lp \ 10, ChrW(8700)) - Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents - DoEvents - Next - 'очищаем статус-бар от значений после выполнения - Application.StatusBar = False -End Sub -``` - -### Текст + блоки квадратов из n штук: - -количество квадратов можно менять -![](https://pics.thest1tch.ru/pic/pq1o9ua4.png) - -```vba -Sub StatusBar3() - Dim lr As Long - Dim lAllCnt As Long 'кол-во итераций - Const lMaxQuad As Long = 20 'сколько квадратов выводить - lAllCnt = 10000 - - For lr = 1 To lAllCnt - Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" & String(CLng(lMaxQuad * lr / lAllCnt), ChrW(9632)) & String(lMaxQuad - CLng(lMaxQuad * lr / lAllCnt), ChrW(9633)) - DoEvents - Next - 'очищаем статус-бар от значений после выполнения - Application.StatusBar = False -End Sub -``` - -## Создание файла VBA - -Простое - -```vba -iFullName = ThisWorkbook.Path & "name.xlsx" -``` -С именем из ячейки: - -```vba -iFullName = ThisWorkbook.Path & "\" & Range("A1").Value & ".xlsx" -``` - -## Список уникальных значений VBA - -```vba -PS = Range("A" & Rows.Count).End(xlUp).Row -Range("N6:N" & PS).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("T11"), Unique:=True -Range("T11:T300").Font.ColorIndex = 5 -MsgBox "Создали уникальный список источников" -``` - -## Удаление пароля VBA - -> Пожалуйста, сделайте резервную копию ваших файлов в первую очередь! -{.is-warning} - -### Для 32 битной версии -Откройте файл(ы), которые содержат ваши заблокированные проекты VBA -Создайте новый файл **xlsm** и сохраните этот код в `Module1` - -```vba -code credited to Siwtom (nick name), a Vietnamese developer - -Option Explicit - -Private Const PAGE_EXECUTE_READWRITE = &H40 - -Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ - (Destination As Long, Source As Long, ByVal Length As Long) - -Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _ - ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long - -Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long - -Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _ - ByVal lpProcName As String) As Long - -Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _ - ByVal pTemplateName As Long, ByVal hWndParent As Long, _ - ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer - -Dim HookBytes(0 To 5) As Byte -Dim OriginBytes(0 To 5) As Byte -Dim pFunc As Long -Dim Flag As Boolean - -Private Function GetPtr(ByVal Value As Long) As Long - GetPtr = Value -End Function - -Public Sub RecoverBytes() - If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 -End Sub - -Public Function Hook() As Boolean - Dim TmpBytes(0 To 5) As Byte - Dim p As Long - Dim OriginProtect As Long - - Hook = False - - pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") - - - If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then - - MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 - If TmpBytes(0) <> &H68 Then - - MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 - - p = GetPtr(AddressOf MyDialogBoxParam) - - HookBytes(0) = &H68 - MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 - HookBytes(5) = &HC3 - - MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 - Flag = True - Hook = True - End If - End If -End Function - -Private Function MyDialogBoxParam(ByVal hInstance As Long, _ - ByVal pTemplateName As Long, ByVal hWndParent As Long, _ - ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer - If pTemplateName = 4070 Then - MyDialogBoxParam = 1 - Else - RecoverBytes - MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ - hWndParent, lpDialogFunc, dwInitParam) - Hook - End If -End Function -``` -Вставьте этот код под вышеуказанным кодом в Module1 и запустите его -```vba -Sub unprotected() - If Hook Then - MsgBox "VBA Project is unprotected!", vbInformation, "*****" - End If -End Sub -``` -Возвращайтесь к своим проектам VBA и наслаждайтесь. - -### Для 64 битной версии: -Откройте файл (ы), содержащий ваши заблокированные проекты VBA. - -Создайте новый файл xlsm и сохраните этот код в `Module1` -```vba -Option Explicit - -Private Const PAGE_EXECUTE_READWRITE = &H40 - -Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ -(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) - -Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _ -ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr - -Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr - -Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _ -ByVal lpProcName As String) As LongPtr - -Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _ -ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ -ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer - -Dim HookBytes(0 To 5) As Byte -Dim OriginBytes(0 To 5) As Byte -Dim pFunc As LongPtr -Dim Flag As Boolean - -Private Function GetPtr(ByVal Value As LongPtr) As LongPtr - GetPtr = Value -End Function - -Public Sub RecoverBytes() - If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6 -End Sub - -Public Function Hook() As Boolean - Dim TmpBytes(0 To 5) As Byte - Dim p As LongPtr - Dim OriginProtect As LongPtr - - Hook = False - - pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") - - - If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then - - MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 - If TmpBytes(0) <> &H68 Then - - MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 - - p = GetPtr(AddressOf MyDialogBoxParam) - - HookBytes(0) = &H68 - MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 - HookBytes(5) = &HC3 - - MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 - Flag = True - Hook = True - End If - End If -End Function - -Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _ -ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _ -ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer - - If pTemplateName = 4070 Then - MyDialogBoxParam = 1 - Else - RecoverBytes - MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ - hWndParent, lpDialogFunc, dwInitParam) - Hook - End If -End Function -``` -Вставьте этот код в Module2 и запустите его -```vba -Sub unprotected() - If Hook Then - MsgBox "VBA Project is unprotected!", vbInformation, "*****" - End If -End Sub -``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 5bdd1d2..efb66b9 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,6 +48,16 @@ nav: - Установка TelnetCE: other/tsd/install-telnetce.md - Synology: - HPE Microserver Gen10: other/synology/install-hpe-ms-gen10 + - Office: + - Excel: + - other/office/excel/index.md + - VBA Защита страницы: other/office/excel/vba-security-page.md + - VBA Исправление примечаний: other/office/excel/vba-align-comments.md + - VBA Создание файла: other/office/excel/vba-create-file.md + - VBA Открытие файла: other/office/excel/vba-open-file.md + - VBA Отправка почты: other/office/excel/vba-send-email.md + - VBA Прогресс бар: other/office/excel/vba-progress-bar.md + - VBA Удаление пароля: other/office/excel/vba-remove-pass.md - Сеть: - Mikrotik: