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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 117 След.
Сохранение реестра открытых файлов с последующей возможностью их открытия
 
Это уже было.  :)  
Изменено: sokol92 - 08.05.2021 14:07:00
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Цитата
RAN написал:
Время обработки каждого из потоков до 3 часов. Всего запускается 8 потоков
На мой взгляд, Excel не очень приспособлен для пакетных вычислений и во многих случаях ориентирован на присутствие пользователя. :(  
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Здравствуйте, Андрей!
Посмотрел примеры из #17. У меня снятие пароля с проекта работает нестабильно. Причина, может быть, в том, что когда мы открываем первую книгу и выполняем макрос, то, как когда-то заметил Владимир (ZVI), мы работаем в неполной модели Excel.
Если обязательно нужен вызов из VBS, то можно открывать специально созданную "стартовую" книгу, в этой книге по событию Workbook_open вызывать через Application.Ontime макрос с нужными действиями. Этот макрос после выполнения всей работы может закрыть Excel.

Экземпляры Excel у меня не зависают после XL.Quit.
Изменено: vikttur - 07.05.2021 20:47:06
Владимир
Копирование определенных листов из одной книги в другую новую книгу VBA
 
Если Вы хотите сохранить макросы, то проще вернуться к макросу из #1. Можно ведь удалить все листы, кроме листов из определенного списка. После этого неплохо бы пройтись по именам книги и удалить те, которые имеют недействительные ссылки.
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Цитата
vikttur написал:
Что в коде подразумевается под идентификатором?
Это я так (неудачно) пошутил (добавив Off). Цитата относится к VB.Net.  Конечно, Call можно использовать, это дело вкуса.

В документации по VBA ключевое слово Call описано как необязательное. Разница возникает при указании параметров при вызове макросов - с Call их надо заключать в скобки, без Call не надо. Вероятно, Call унаследован из старых версий.

Я никогда не использую Call.
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Посмотрел ссылку из #2. Код имеет более 300 строк, используется тот же подход, что в #3, вместо SendKeys используются соответствующие низкоуровневые API. Думаю, что эффективность кода такая же.
Да, и наверное, в свете нескольких дискуссий на форуме о побочных эффектах оператора SendKeys (NumLock и т.п.) стоит использовать одноименный метод SendKeys объекта WScript.Shell, у которого выявленных подобных недостатков нет.
Изменено: sokol92 - 06.05.2021 15:32:04
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Цитата
vikttur написал:
Ну, почему не Call DoEvents2?
Off. Как всегда, следую рекомендациям разработчика:  :)
Цитата
Обычно используется Call ключевое слово, если вызванное выражение не начинается с идентификатора. Использование Call ключевого слова для других целей не рекомендуется.
Изменено: sokol92 - 06.05.2021 14:35:06
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Цитата
RAN написал:
DoEvents2 - опечатка,
См. ниже в моем тексте.
Яндекс еще не успел посмотреть. :D  
Владимир
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Здравствуйте, Андрей! Попробуйте следующий код - меня он не подводил.
Код
' Снимает защиту проекта.
' Идея: http://www.rondebruin.nl/
Function UnprotectVBProject(ByVal wb As Workbook, ByVal Password As String) As Boolean
    Dim vbProj As Object, vbCtl As Object
    Set vbProj = wb.VBProject
    UnprotectVBProject = False

    If vbProj.Protection <> 1 Then
        UnprotectVBProject = True
        Exit Function
    End If

    Set Application.VBE.ActiveVBProject = vbProj
    DoEvents2
    If Application.VBE.ActiveVBProject.Name <> vbProj.Name Then
        Exit Function
    End If

    Set vbCtl = Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True)
    With vbCtl
        .Reset
        DoEvents2
        .Execute
    End With

    SendKeys Password & "~~", True
    DoEvents2
    
    If vbProj.Protection <> 1 Then
        UnprotectVBProject = True
    End If

End Function

' Многократное выполнение DoEvents
Private Sub DoEvents2(Optional ByVal n As Long = 10)
  Dim i As Long
  
  For i = 1 To n
    DoEvents
  Next i
  
End Sub
Владимир
Слетает выпадающий список после закрытия и открытия документа
 
Добрый день! В дополнение к ответу #5. Как пишет Михаил в #4, если в имена книги поместить формулу для проверки введенного значения и сослаться на нее (что сделано в ответе #4), то работает и со СМЕЩ (только диапазоны A:A и B:B лучше ограничить).
Владимир
Собирать дату из числовых показателей расположенных в разных столбцах.
 
В VBA ошибка, связанная с несуществующей датой 29 февраля 1900, исправлена. Цена - сдвинули начало отсчета дней для совместимости с Excel.
Код
Debug.Print Format(CDate(0), "YYYY-MM-DD")

выдает 1899-12-30.

Начиная с 1900-03-01 (61-й день) номера дней в Excel и в VBA совпадают.
Изменено: sokol92 - 05.05.2021 15:33:45
Владимир
Собирать дату из числовых показателей расположенных в разных столбцах.
 
Цитата
vikttur написал:
Считайте в этом промежутке количество високосных (/4 с учетом остатка),
... И не забудьте, как Билл Гейтс, что 1900 год не был високосным (надо было не в гараже сидеть, а в школе учиться). :D  
Изменено: sokol92 - 05.05.2021 14:25:43
Владимир
О присвоении значения ячейке листа Excel
 
Здравствуйте, Алексей!

По поводу оператора
Код
cell.Value2=arg

То же, что в стартовом сообщении с той лишь разницей, что ситуации в пунктах 2 и 3 обрабатываются так же, как в пункте 1, поскольку при присвоениии свойства value2 значения типов Date и Currency преобразуются в Double. Тексты, похоже, обрабатываются так же.

О присвоении значений диапазонам ячеек не писал, поскольку это не соответствует заявленной теме. Понятно, что присвоение значений ячейкам диапазона сводится к последовательному присвоению значений каждой ячейке этого диапазона. Нужно сформулировать правила для разных типов диапазонов (Range) и разных типов arg (скалярные значения, одномерные массивы, двумерные массивы, ...).
Владимир
О присвоении значения ячейке листа Excel
 
Цитата
_Igor_61 написал:
И судя по чтению интернета  не всегда понятно от чего это зависит
Сообщение #1 - это тоже интернет. :)  
Владимир
О присвоении значения ячейке листа Excel
 
Цитата
bedvit написал:
Владимир, перепутаны 1 и 2й пункты, поправьте.
Здравствуйте, Виталий, мне кажется, не перепутаны. В первом пункте анализируется ситуация, когда arg имеет числовой тип vbDouble, vbSingle, vbLong, ...  в зависимости от формата ячейки Cell, которым может быть числовым, датой, текстовым, ... Аналогично, во втором пункте.
Изменено: sokol92 - 03.05.2021 17:39:16
Владимир
При вставке пропадает разделитель целой и дробной части, Решено
 
Создал тему.
Владимир
О присвоении значения ячейке листа Excel
 
В данном сообщении речь пойдет об операторе VBA
Код
cell.Value=arg
где cell - объект типа Range, представляющий одну ячейку, arg - переменная типа Variant.

Задача (тривиального?) исследования заключается в оценке последствий выполнения указанного оператора. Отмечу, что предлагаемые выводы являются следствием эмпирических опытов и автор будет признателен за указанные ошибки и неточности.

К сообщению приложен "стенд" - книга TestValue.xlsm. Книга содержит макросы TestValueNum и TestValueStr, выполнив которые читатель может проверить выводы сообщения на своем экземпляре MS Excel. Книга прилагается с данными, полученными в системе Excel 2016 (32-) Windows 10 с кодовой страницей по умолчанию windows-1251 и стандартными региональными настройками для локализации ru-RU. Кроме этого, тестировались системы с другими региональными настройками, в том числе с кодовой страницей windows-1252 en-US. Системы Excel для Mac не проверялись (по причине наличия отсутствия) и автор будет признателен за соответствующее дополнение.
Классификация строится на основе типа переменной arg, который можно получить, например, с помощью функции TypeName. На результат исследуемого оператора в некоторых случаях влияет исходный формат ячейки (свойство NumberFormat).

1. arg имеет числовой тип (кроме Currency).

Если ячейка имеет формат даты, то свойство cell.Value после присвоения вернет тип Date, соответствующий Cdate(arg), при этом в ячейке отрицательные значения дат будут отображаться, как "##...#". Для других форматов cell.Value после присвоения будет равно arg. Формат ячейки (в том числе, текстовый) не будет изменен.

2. arg имеет тип Date.

Если ячейка имеет один из числовых форматов, то cell.Value после присвоения вернет число (Double), соответствующее Cdbl(arg). Если ячейка имеет текстовый формат, то дата превратится в текст с "американским" представлением даты (например, "4/30/2021" или "4/30/2021  2:27:16 PM"). Для других форматов cell.Value после присвоения будет равно arg. "Общий" (General) формат ячейки будет изменен на формат даты, стандартный для региональных настроек, в котором в случае дробного значения arg будет присутствовать компонента времени.

3. arg имеет тип Currency.

Редко используемый тип. Если ячейка имеет один из числовых форматов, то как в п.2. Для текстового формата ячейки arg преобразуется в текст по "американским" правилам (например, "$123,456.78"). Наконец, если ячейка имеет "Общий" формат или формат даты, то формат будет изменен на денежный.

4. arg имеет тип String

Попробуем сформулировать правила в порядке убывания приоритетов.

4.1. Первый символ arg- апостроф. После присвоения в cell.Value будет текст с удаленным первым символом апострофа.

4.2. Ячейка имеет текстовый формат. После присвоения cell.Value будет равна arg.

Теперь (arg является текстом, на начинающимся на апостроф и формат ячейки не текстовый) начинается самое интересное. Excel пытается интерпретировать текст как формулу, число, дату, логическое или ошибочное значение, не обращая внимания на региональные настройки. Возможно, для американца это выглядит естественно, но для всех остальных...

4.3. Первый символ arg равен "=". Excel однозначно считает, что это формула. Вначале делается попытка интерпретировать текст как формулу (нелокализованную!) в стиле "A1", затем как формулу (нелокализованную!) в стиле "R1C1". В случае успеха одной из попыток в ячейке cell появляется формула, иначе возникает ошибка (!) времени выполнения с кодом 1004.

4.4. Производится попытка интерпретации текста, как числа в локализации en-US: разделитель дробной доли точка, разделитель тысяч - запятая. Каждая из запятых должна отделять как минимум 3 цифры (больше можно). В случае успеха в ячейку заносится число, а не текст. В некоторых случаях изменится и формат ячейки: если arg представляет число в "экспоненциальном" формате, а формат ячейки "Общий" или Дата; если arg содержит запятую, а формат ячейки "Общий" и пр.

4.5. Если ячейка имеет один из числовых форматов, а arg имеет вид простой дроби (через "/") с ненулевым знаменателем, то cell.Value после присвоения будет содержать частное от деления.

4.6. Производится попытка интерпретации текста, как даты в локализации en-US: M/D/Y или YYYY-MM-DD с возможной компонентой времени (возможно, включая AM, PM).  Дата может содержать краткое или полное наименование месяца (на английском), в этом случае порядок компонент может быть иным. В случае, когда часть компонент опущена, Excel их присваивает по определенным (логичным) правилам, например 2/13 будет интерпретироваться как 13 февраля текущего года. В случае успеха интерпретации в ячейку заносится соответствующее число, при этом "Общий" формат ячейки будет изменен на формат даты с тем условием, чтобы свойство NumberFormat ячейки (нелокализованное) в максимальной степени соответствовало текcтовому представлению даты в arg.

4.7. Производится попытка интерпретации arg как логического (True, False) или ошибочного значения (#DIV/0! и т.д). В случае успеха в ячейку будет занесено преобразованное значение.

5. arg является массивом. Будет обработан первый элемент массива.

6. arg является объектом. cell.Value будет присваиваться свойство объекта по умолчанию. Если свойства по умолчанию нет или свойство по умолчанию не может быть присвоено cell.Value, то возникнет ошибка времени выполнения.

Общий вывод - всё достаточно не просто и это надо учитывать при написании макросов. Например, любимая некоторыми авторами конструкция для замены формул диапазона rng на значения:
Код
rng.Value=rng.Value
имеет массу "побочных эффектов" для:

  • текстов, начинающихся на апостроф или знак равенства
  • текстов "похожих" на числа, даты, логические, ошибочные значения и т.п.

Надежнее использовать специальную вставку значений!

В заключение автор выражает искреннюю признательность Владимиру (ZVI), обсуждения с которым способствовали началу подбора материалов по данной теме.
Изменено: sokol92 - 03.05.2021 18:41:24
Владимир
Формула ДЛСТР некорректно считает число символов в строке после 97 символа
 
Число знаков целого числа в десятичной системе счисления зависит от целой части его десятичного логарифма.
Соответственно, в Вашем примере из #1 Вы можете подставить следующую формулу в ячейку, например, D3:

Код
=1+ЦЕЛОЕ((СТРОКА(A3)-1)*(LOG10((КОРЕНЬ(5)+1)/2))-LOG10(5)/2)
и протянуть вниз. Эта формула уже не зависит от ограничений Excel.

Для 5000 члена последовательности (согласно нумерации в столбце A) первый множитель в формуле будет 5000 (ответ 1045 десятичных цифр).
Изменено: sokol92 - 02.05.2021 18:50:19
Владимир
Формула ДЛСТР некорректно считает число символов в строке после 97 символа
 
Кстати, для чисел Фибоначчи есть формула Бине (для #1):
Код
=ОКРУГЛ(((1 + КОРЕНЬ(5))/2)^(СТРОКА(A2)-1)/КОРЕНЬ(5); 0)
Изменено: sokol92 - 01.05.2021 14:44:34
Владимир
Формула ДЛСТР некорректно считает число символов в строке после 97 символа
 
В #1 к числам Фибоначчи относятся лишь строки с 1 по 74. Число в Excel обрабатывается в формате double и имеет ограничения на число значащих цифр. Посмотрите сами, у Вас B75 не равно сумме B73 и B74.
Для точных расчетов, как было отмечено, используйте библиотеку Виталия (Bedvit).
Изменено: sokol92 - 01.05.2021 14:18:00
Владимир
Отображение макросов из надстройки в списке Alt+F8
 
Скомбинируйте свои ответы #8 и #11.
На панели быстрого запуска достаточно одной кнопки, которая будет загружать надстройку (если она не загружена). Эту кнопку нужно будет нажимать только один раз после старта Excel.
После загрузки надстройки появится Ваша "вкладка с кнопками".
Альтернатива - пойти по пути, указанному Игорем. Список процедур надстройки без параметров (которые были бы показаны по Alt+F8 в случае не надстройки, а обычной книги) можно, разумеется, получить и программным путем, однако, на мой взгляд, "игра не стоит свеч".
Изменено: sokol92 - 01.05.2021 13:53:51
Владимир
Заполнение элементов управления word из excel
 
Никогда не пишите макросы без Option Explicit!
Владимир
Как получить в макросе код цвета ячейки?
 
Никогда не использую нелатинские буквы для идентификаторов, но: :)
Код
Sub test()
  Dim конкретнаяячейка As Range
  Set конкретнаяячейка = Range("A1")
  MsgBox конкретнаяячейка.Interior.ColorIndex
End Sub
Владимир
HB
 
Юрий, хотя и с опозданием, но присоединяюсь к коллегам. Здоровья и успехов по всем, молодежного задора! А в своем пожелании прочитать (без очков) до конца Михаил упустил последнюю строку: тираж 58146 экз.
Владимир
Ввод текста в таблицу Excel с помощью голоса ...
 
Здравствуйте, Андрей! Украинский язык есть в списке поддерживаемых языков в опциях настройки, проверить, к сожалению, не могу по причине незнания. Продукт бесплатный, как и Google Chrome, так что попробуйте и сообщите нам.

Ольга, я пробовал работать в следующем режиме:
Диктуешь кусок текста, делаешь паузу, программа (расширение для Chrome) записывает текст в буфер обмена и выдает звуковой сигнал. После этого обычным способом вставляешь текст в ячейку Excel (и куда угодно).
Изменено: sokol92 - 28.04.2021 12:56:32
Владимир
Ввод текста в таблицу Excel с помощью голоса ...
 
Я пробовал это расширение с включенной опцией копирования в буфер обмена. Точность распознавания речи - высокая.
Диктуешь текст - он попадает в буфер обмена. Далее можно вставить, например, в ячейку книги Excel.
Владимир
Ввод текста в таблицу Excel с помощью голоса ...
 
Есть статья (2017 год) на эту тему.
Владимир
Запрет на изменения на листе после отправки на печать
 
Цитата
Тимофеев написал:
свойству напечатано можно как-то обратиться
Можно. Только это свойство появляется при первом вызове диалога печати или предварительного просмотра и не означает фактической печати.
Код
Sub test()
 Dim printDate As Date
 On Error Resume Next
 printDate = ActiveWorkbook.BuiltinDocumentProperties("Last Print Date")
 On Error GoTo 0
 MsgBox "Последний диалог печати/просмотра: " & printDate
End Sub
Владимир
Сумма только видимых столбцов, Добрый день! Нужен макрос для суммирования только видимых столбцов, без скрытых столбцов.
 
Евгений Смирнов, хорошо, спасибо большое!
Добавил в #21 реакцию на Ctrl+0.
По хорошему, еще осталось добавить перехватчик скрытия/отображения столбцов через меню Главная/Формат/Скрыть или отобразить...
Владимир
Сумма только видимых столбцов, Добрый день! Нужен макрос для суммирования только видимых столбцов, без скрытых столбцов.
 
Цитата
Евгений Смирнов написал:
пересчет происходит рано
Вызывайте макрос, который будет вызывать пересчет ячеек, с помощью Application.Ontime.
Изменено: sokol92 - 26.04.2021 21:11:24
Владимир
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 117 След.
Наверх