Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 140 След.
Защита от взлома пароля на проект VBA, Есть ли какие-нибудь идеи или алгоритмы такой защиты.
 
Цитата разработчика защиты Unviewable+  в вольном переводе:
"Если моя зашита оградит от доступа 99% любителей, то я спокойно смогу жить с оставшимся 1% профи, которые, скорее всего, знают больше, чем я. И если бы они захотели, то написали бы то, что написал я намного лучше, более эффективно и значительно чище!"
Изменено: ZVI - 7 мар 2021 10:11:38
Защита от взлома пароля на проект VBA, Есть ли какие-нибудь идеи или алгоритмы такой защиты.
 
Цитата
Marat Ta написал: Есть какие то новые разработки в этой области защиты файлов Excel?
В Excel есть старая надежная защита паролем именно файлов при открытии.  Но после открытия в Excel такая книга в памяти легкодоступнее.
Если Вы о защите кода VBA, то помимо обфускации там можно хитрить, но это не обсуждается. Надежнее, когда какая-то критическая часть кода хранится во внешней DLL, а основной код VBA вызывает функции этой DLL.
Как нажать кнопку(control As IRibbonControl) из надстройки?
 
Код
Application.Run "НадстройкаМоя.xlam!Module1.myButton", Nothing
Долгая передача данных из recordset в массив методом Getrows (VBA)
 
Доюбрый день.
Обычно так и советуют - выгрузить на временный лист через CopyFromRecordset и считывать в массив.
Можно поэкспериментировать:
1. rs.CursorLocation = adUseClient, иногда может помочь за счет локального кеширования строк rs, если база данных не локальная и сервер тормознутый.
2. rs.LockType = adLockOptimistic, это может исключить медленную блокировку записей на сервере во время запроса. Зависит от провайдера, конечно.
Изменено: ZVI - 14 фев 2021 04:54:00
Защита книги
 
Цитата
lsod написал: проект VBA будем защищать данным решением
Добрый день.
Чтобы не принять ошибочное решение - использование Unviewable+ VBA Project For Excel имеет смысл, если VBA код хранится в отдельной защищенной надстройке, а книга с данными использует этот VBA-код. После сохранение XLSM (книгу же предполагается периодически сохранять) не вся, но самая интересная часть защиты Unviewable+ с книги слетает, сообщаю это, так как ранее обсуждалось здесь. Вообще, обсуждение деталей защиты кода дает подсказки по методам вскрытия кода, что правилами форума запрещено, поэтому с этим лучше поосторожнее ))
Странный стиль ссылок на ячейки
 
Заменить имена на ссылки можно либо вручную (поиск-замена), либо с помощью надстройки Name Manager (вверху формы 6-я кнопка справа)
Странный стиль ссылок на ячейки
 
Это именованные ячейки или диапазоны ячеек.
Их адреса можно посмотреть, выбрав на ленте:  Формулы -  Диспетчер имен
Изменено: ZVI - 23 янв 2021 17:04:39
Как огромную таблицу Word экспортировать в Excel
 
Добрый день. Замена компа не поможет, но повод заменить - хороший ))
Такой код в Excel отработал у меня на примере из сообщения #11 за 15 секунд:
Код
Sub WordTableToExcel()
'ZVI:2021-01-19 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&TID=136468#message1109953

  Dim a, b()
  Dim r As Long, c As Long, rs As Long, cs As Long, i As Long
  Dim t As Single, t1 As Single
  
  t = Timer: t1 = t
  On Error GoTo exit_
  Debug.Print "Read",
  With GetObject(, "Word.Application").ActiveDocument.Tables(1)
    rs = .Rows.Count
    cs = .Columns.Count
    a = Split(.Range.Text, Chr(13) & Chr(7))
    .Parent.Close False
  End With
  Debug.Print Round(Timer - t, 3) & " s": t = Timer
  
  Debug.Print "Rebuild",
  ReDim b(0 To rs, 0 To cs - 1)
  For r = 0 To rs - 1
    For c = 0 To cs
      If c < cs Then b(r, c) = a(i)
      a(i) = Empty
      i = i + 1
    Next
  Next
  Debug.Print Round(Timer - t, 3) & " s": t = Timer
  
  Debug.Print "Write",
  Range("A1").Resize(rs, cs).Value = b()
  Debug.Print Round(Timer - t, 3) & " s"
  Debug.Print "Total", Round(Timer - t1, 3) & " s"
  
exit_:
  If Err Then MsgBox Err.Description, vbExclamation, "Word document not found!"
  
End Sub

Для экономии общей памяти (это не обязательно) документ Word закрывается строчкой .Parent.Close False
Изменено: ZVI - 19 янв 2021 07:08:27
Словарь (Scripting.Dictionary). Соответствие массивов ключей и элементов между собой
 
Алексей, у  Вас код другой, в нем так и должно быть.
Вот пример с массивом по теме сообщения #20:
Код
'Требуется VBE-Tools-References-Microsoft Scripting Runtime
Sub Test1()

  Dim i As Long
  Dim a(0 To 2) As New Dictionary

  For i = 0 To UBound(a)
    Set a(i) = Nothing
    Debug.Print i, a(i) Is Nothing
  Next

End Sub

' Для сравнения
Sub Test2()

  Dim i As Long
  Dim a(0 To 2) As Dictionary

  For i = 0 To UBound(a)
    Set a(i) = New Dictionary
  Next

  For i = 0 To UBound(a)
    Set a(i) = Nothing
    Debug.Print i, a(i) Is Nothing
  Next

End Sub
Изменено: ZVI - 12 янв 2021 21:20:47
Словарь (Scripting.Dictionary). Соответствие массивов ключей и элементов между собой
 
На всякий случай - если в коде #20 вместо Dim dic As New Dictionary написать:
Код
  Dim dic As Dictionary
  Set dic = New Dictionary

или
Код
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")

то код поведет себя иначе
Изменено: ZVI - 12 янв 2021 11:32:02
Словарь (Scripting.Dictionary). Соответствие массивов ключей и элементов между собой
 
Цитата
Jack Famous написал: ...можно из словаря спокойно получать 2 массива (ключи и значения) и не беспокоится о их соответствии?
Да. Но ждем примеров, когда  это (якобы) не работает.
Оптимизация использования типов переменных Integer, Long и проч.
 
Да 🙂
Оптимизация использования типов переменных Integer, Long и проч.
 
Выравниванием адресов занимается операционная система (ОС), цель - повышенная скорость доступа за счет оптимального шага (Step),  для 32-битной ОС оптимальный шаг - 4 Байта. В VBA  выравнивание происходит автоматически, если не использовать API, то о выравниванеии можно и не задумываться.
Изменено: ZVI - 11 янв 2021 23:39:07
Оптимизация использования типов переменных Integer, Long и проч.
 
В примере из сообщения #13 - выравнивается, в #17 - нет, получается - в 50% случаев ))
Изменено: ZVI - 11 янв 2021 22:44:43
Оптимизация использования типов переменных Integer, Long и проч.
 
Цитата
vikttur написал: когда выгодно применять Integer или Byte?
Добрый вечер, Виктор.
Выгоду от использования Integer на сегодняшний день трудно найти, скорее можно говорить о необходимости в некоторых случаях.
Обычно встречается необходимость в использовании Integer и Byte в кодах API.
Ограничение в положительных Integer, например, есть в VBA - см.  FreeFile
Шагать побайтно обычно приходится при обработке текстового массива: Dim b() As Byte: b() = "Текст" и т.д.
Но работа побайтно может приводить к замедлению кода.
Например, в 64-битных приложениях использование API CopyMemory (точнее - RtlMoveMemory) медленнее даже кода VBA и в раз шесть медленее, чем в 32-битных приложениях.
Почему-то в CopyMemory до сих пор используется побайтное копирование, обычно копируют по 4 ( 8 ) Байта, и отдельно побайтно - оставшийся хвостик Байтов, если не кратно 4-м Байтам.
В принципе, Integеr и в UDT (пример в #13) займет свои положенные 2 Байта, если не требуется выравнивание памяти:
Код
Type MyType1
  Int1 As Integer
  Int2 As Integer
  Lng As Long
End Type
 
Sub Test1()
  Dim x As MyType1
  Debug.Print "Integer", VarPtr(x.Lng) - VarPtr(x.Int2)
End Sub
Изменено: ZVI - 11 янв 2021 22:46:54
Словарь (Scripting.Dictionary). Соответствие массивов ключей и элементов между собой
 
Добрый вечер, Алексей.
Запутаться можно и с ранним связыванием, вот, например: не запуская кода, показанного ниже, что ожидать в 3-х сообшениях?
Код
Sub Test()
'Требуется VBE-Tools-References-Microsoft Scripting Runtime 
  
  Dim dic As New Dictionary
  
  dic.Add "Key", "Item"

  MsgBox dic.Count()

  Set dic = Nothing
  
  If dic Is Nothing Then
    MsgBox "dic is nothing"
  Else
    MsgBox "dic is not nothing"
  End If
  
  MsgBox dic.Count()
  
End Sub

Здесь все работает правильно, но, не понимая некторых внутренних правил, можно ошибиться в причинах поведения.
Сравнивать dic.RemoveAll c Set dic = Nothing не очень-то корректно, т.к. это разные методы с разным результатом  
RemoveAll  только удаляет элементы , но оставляет объект живым, а  Set to Nothing принудительно анигилирует и сам объект.
С поздним связыванием Set dic = Nothing в конце кода рекомендуется для устранения утечек памяти, которые иногда могут проявиться.
Полагаю, что с претензиями к  объектам Scripting.Dictionary тоже что-то не учли в коде, т.к. с их непредсказуемостью я ни разу не  сталкивался. Хорошо бы, конечно, ссылку на конкретный пример с проблемой, если вдруг попадется - сообщите, пожалуйста.
Изменено: ZVI - 11 янв 2021 21:51:48
Оптимизация использования типов переменных Integer, Long и проч.
 
Из-за выравнивания адресов вот здесь, например, будет зарезервировано по 4 Байта в памяти операционной системы как для Integer, так и для Byte:
Код
Type MyType1
  Int As Integer
  Lng As Long
End Type

Type MyType2
  Bt As Byte
  Lng As Long
End Type

Sub Test1()
  Dim x As MyType1, y As MyType2
  Debug.Print "Integer", VarPtr(x.Lng) - VarPtr(x.Int)
  Debug.Print "Byte", VarPtr(y.Lng) - VarPtr(y.Bt)
End Sub
Словарь (Scripting.Dictionary). Соответствие массивов ключей и элементов между собой
 
Добрый день.
Никогда не сталкивался ни с одной из перечисленных в теме проблем Scripting.Dictionary, как и упоминаний о них на зарубежных Excrl/VBA-форумах.
Полагаю, что какие-то проблемы могли быть вызваны иными причинами кода, не связанными непосредствено со Scripting.Dictionary.
Если кому-то вдруг попадется пример с воспроизведением проблем, выложите, пожалуйста, с удовольсвием бы проанализировал.
Обновление 05.12.2020
 
В Google Chrome (сейчас версия 87.0.4280.88 Официальная сборка, 64 бит) давно так: из «Форумы "Планета Excel"» на «Вопросы по Microsoft Excel» переход мгновненный,  а наоборот - с задержкой в 2...4 секунды. Комп быстрый, от чистки кеша браузера задержка не зависит.
Изменено: ZVI - 25 дек 2020 11:07:47
Очистка памяти при выполнении макроса
 
Добрый день, Владимир! Спасибо за пример!
В Вашем примере - коллекции. У них есть особеность - быстро набирать вес, а его сгон отдавать операционной системе, когда/если у нее найдется для этого время.
Для форсирования очистки коллекций можно использовать - Set json = New Collection
Код
Sub TestJson3()
  Dim s As String, i As Long, nMax As Long, t As Double
  Dim json As Object ' As Collection
  ' Генерация строки json: массив с 2 объектами
  nMax = 100000
  ReDim arr(1 To nMax)
  For i = 1 To nMax
    arr(i) = "{""Key1"":1, ""Key2"":""Value2""}"
  Next i
  s = "[" & Join(arr, "," & vbLf) & "]"
  Erase arr
  Stop ' для замера памяти
  t = Timer
  For i = 1 To 10
    Set json = ParseJson(s)
    If TypeName(json) = "Collection" Then Set json = New Collection
    Set json = Nothing
  Next i
  Debug.Print "Time="; Format(Timer - t, "0.00") ', nMax
  Stop ' для замера памяти
End Sub
Изменено: ZVI - 11 дек 2020 14:11:47
Очистка памяти при выполнении макроса
 
Вместо Set oResponse = Nothing попробуйте oResponse.RemoveAll: DoEvents.
На простом тесте утечки не обнаружил, приведите, пожалуйста, пример с утечкой.
Код
Sub Test_Json()
  Const N = 10000
  Dim i As Long, s As String
  Dim oResponse As Object ' Dictionary
  s = "{""a"":123,""b"":[1,2,3,4],""c"":{""d"":456}}"
  For i = 1 To N
    Set oResponse = JsonConverter.ParseJson(s)
    'oResponse.RemoveAll: DoEvents
    If i = N Then Stop
  Next
End Sub
Изменено: ZVI - 10 дек 2020 02:37:31
Из буфера обмена вставляется не то что нужно
 
Есть еще такой вариант функций для надежной работы с буфером обмена:
Код
Function SetClipBoardText(ByVal Text As Variant) As Boolean
  SetClipBoardText = CreateObject("htmlfile").ParentWindow.ClipboardData.SetData("Text", Text)
End Function

Function GetClipBoardText() As String
  On Error Resume Next
  GetClipBoardText = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("Text")
End Function

Function ClearClipBoardText() As Boolean
  ClearClipBoardText = CreateObject("htmlfile").ParentWindow.ClipboardData.СlearData("Text")
End Function
Изменено: ZVI - 26 ноя 2020 21:50:09
Не работает функция CBR
 
Татьяна, добрый день. Там, похоже, зависимость от регистра.
Напишите код валюты заглавными буквами: =cbr(СЕГОДНЯ();"USD")
Изменено: ZVI - 23 ноя 2020 16:26:25
HB
 
Андрей, с Днём Рождения! Всегда с интересом читаю Ваши решения, удивляйте ими и дальше!
Power Query при получение данных из Excel теряет нолик
 
В PQ вытягивают все без excel NumberFormat (так устроен PQ), а потом форматируют требуемый столбец вытянутых данных.
Как обработать свойство ячейки .Text в PQ - не знаю, это Максим по ссылке колдовал. Но такой винегрет из форматов не для нормальной обработки, конечно. Это в VBA проще делать.
Изменено: ZVI - 22 окт 2020 00:17:22
Power Query при получение данных из Excel теряет нолик
 
Игорь, в источнике в столбце3 реально - числа, но с форматом ячеек с 12-ю нулями и с выравниванием по левому краю.
Можно было бы просто в источнике применить формат "000-000-000000" и не нужен ни PQ, ни VBA,
но так неинтересно :)
Изменено: ZVI - 21 окт 2020 23:55:14
Power Query при получение данных из Excel теряет нолик
 
Цитата
Hugo написал: Ну а всёж - можно вытянуть то, что указано форматом?
У Андрея форматом (не Excel, а PQ) и вытянуто, там можно сократить:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица4"]}[Content],
    Result = Table.TransformColumns(Source, {"Столбец3", each Number.ToText(_, " 000-000-000000"), Text.Type})
in
    Result
Изменено: ZVI - 21 окт 2020 23:18:12
Отправка писем с других почтовых ящиков (которые также имеются в Outlook)
 
Дмитрий, да, это часто путается, сам тоже участвовал  :)
Отправка писем с других почтовых ящиков (которые также имеются в Outlook)
 
Добрый день, нужно так:
Код
Set .SendUsingAccount = objOutlookApp.Session.Accounts.Item("testmail@mail.ru")

Это относится к коду сообщения #7.
Всесто текстового значения аккаунта (обычно -адреса) можно использовать числовой индекс аккаунта: 1, 2 и т.п.
Изменено: ZVI - 2 сен 2020 19:11:55
Спам.
 
И мне пришло утром, Google переводчик с сомалийского на русский то переводит, а прочитать е-mail адрес в профиле русскоязычного форума не умеет.
Пробил фотку из профиля - использовано фото Abigail Harrison, которая мечтает быть членом космического экипажа экспедиции на Марс, интересная девушка, но она не Джессика. Есть списки адресов таких разводчиков, там можно выбрать и русский язык, что удобно и для разводчиков, наверное.
Напомнило другую Джессику  :)
Изменено: ZVI - 25 авг 2020 12:23:17
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 140 След.
Наверх