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

Страницы: 1 2 3 След.
как включить ускоренную многопоточную x64 работу vba кода?, vba
 
после установки x64 офиса - формулы полностью нагружают все 100% потоки процессора и справа снизу в строке состояния пишет количество нагруженных процессоров
но сам vba код работает только в однопоточном режиме, загружая процессор на 5-15%

есть ли какие-то опции по включению всех потоков в vba?
бывают ли вообще многопоточные компиляторы в программировании?
Изменено: KUDRIN - 20.02.2025 11:37:01
объединить текст (из разных ячеек в одну) с сохранением цвета (форматирования) текста, vba
 


как объединить несколько ячеек в одну с сохранением всех цветов?
кто-то прорабатывал такую процедуру?

тут есть два момента:
1. обрабатывать нужно посимвольно, т.к. в исходных ячейках может быть несколько цветов текста внутри каждой ячейки, т.е. цвет текста нельзя считывать со всей ячейки
2. этот код имеет максимальную длину 255:
Код
[A1].Characters.Text(Start, Length)
[A1].Characters(Start, Length).Caption
т.е. посимвольно удлинять результирующую строку и тут же менять цвет в этом же цикле сработает только до длины 255

одно решение есть тут, но страдает от ошибки переполнения 255 и не учитывает разный цвет внутри исходных ячеек
Код
Sub Tester()
    With ActiveSheet
        AddValue .Range("A1"), "Hello", vbRed
        AddValue .Range("A1"), "Hello", vbGreen
        AddValue .Range("A1"), "Hello", vbBlue
    End With
End Sub
Sub AddValue(rngVal As Range, val, theColor As Long)
    Const SEP As String = " "
    Dim firstChar As Long, extra As Long
    firstChar = 1 + Len(rngVal.Value)
    extra = IIf(firstChar = 1, 0, 1)
    With rngVal
        .Characters(firstChar).Text = IIf(Len(rngVal.Value) > 0, SEP, "") & val
        .Characters(firstChar + extra, Len(val)).Font.Color = theColor
    End With
End Sub

ещё одно из решений есть тут, но страдает от ошибки переполнения 255
Сцепляет с сохранением форматирования выделенные строки и помещает результат справа от выделения. Ячейка куда записывается результат сначала затирается
Код
Sub RunConcat()
  ConcatenatewithFormat Selection, ThisWorkbook.ActiveSheet.Cells(Selection.Row, Selection.Column + Selection.Columns.Count)
End Sub
Sub ConcatenateWithFormat(InputRange As Range, OutPutRange As Range)
Dim i As Integer, q As Variant
Dim sText As String, c As String, A As Variant
Dim oChars As Characters, n As Integer
  OutPutRange.Clear: n = 0
  For Each A In InputRange
    sText = A.Text
    For i = 1 To Len(sText)
      Set oChars = A.Characters(i, 1)
      Set q = OutPutRange.Characters(i + n, 1)
      q.Caption = oChars.Caption
      With oChars
        q.Font.Bold = .Font.Bold
        q.Font.Name = .Font.Name
        'q.Font.Color = .Font.Color
        q.Font.ColorIndex = .Font.ColorIndex
        q.Font.FontStyle = .Font.FontStyle
        q.Font.OutlineFont = .Font.OutlineFont
        q.Font.Size = .Font.Size
        q.Font.Strikethrough = .Font.Strikethrough
        q.Font.Subscript = .Font.Subscript
        q.Font.Superscript = .Font.Superscript
        q.Font.Underline = .Font.Underline
      End With
    Next i
    n = n + Len(sText)
  Next A
End Sub

пока что думаю алгоритм такой:
v1
1. сначала выгрузить сырое сцепленное Value в результирующую ячейку
2. пройтись по исходным ячейкам и изменение цвета текста записать в словарь или коллекцию в виде [номер символа, индекс нового цвета]
3. покрасить итоговый сырой результат на основе этого словаря или коллекции
4. если нужно сохранить не только цвет, но и форматирование - то писать кодировку вида Font_Size_Bold_Underline_italic_Color, например Arial_12_NoBold_UL_Noit_FFFF00, хотя в данном случае возможно проще будет сделать на многомерном массиве, чтобы не сплитать и не расшифровывать эту кодовую строку форматирования

v2
а можно так:
1. сцепить сырой текст из всех исходников в результат
2. покрасить текст функцией выше, заквотив в ней две строки - 1. предочистка результирующей ячейки и 2. посимвольное впечатывание символа в результирующую ячейку
v2 успешно отрабатывает на длине более 255

таким образом можно переделать пару строк в ConcatenateWithFormat и получить процедуру, которая успешно отработает и на разных цветах и на длине более 255, вдобавок можно добавить кастомный сепаратор между значениями исходных ячеек и фильтр по ячейкам

смежные темы:
https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=11600
https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=137447
Изменено: KUDRIN - 19.02.2025 09:42:04
Как открыть рабочий стол?, vba, winapi, CLSID, win7, Shell.windows
 
Как открыть рабочий стол? (vba, winapi, win7)
по какому адресу он находится?

в идеале бы получить CLSID
в реестре прописан "Desktop" ::{00021400-0000-0000-C000-000000000046}, но он никуда не ведёт
"file:///C:/Users/Admin/Desktop" открывает папку с рабочим столом (на картинке слева)
а нужно именно виндовый рабочий стол с уникальной иконкой (на картинке справа)


Изменено: KUDRIN - 01.08.2024 04:24:11
как автоматически проставить табуляцию или отступы в vba коде?, онлайн или офлайн
 
как автоматически проставить табуляцию или отступы в vba коде?
есть ли такая кнопка в самом VBA  в экселе?
если нету, то есть ли онлайн сервисы куда можно вставить сырой код и забрать код с отступами?

есть такой код:
Код
Sub TabTest()
If i = 1 Then
j = 2
End If
End Sub

нужно сделать из него такой:
Код
Sub TabTest()
    If i = 1 Then
        j = 2
    End If
End Sub
--
вручную в каждой строке Tab и Shift+Tab не предлагать
Изменено: KUDRIN - 05.12.2023 09:50:26
поиск по таблице, формулами
 
вот есть такая табличка
нужно найти названия ящиков для каждого фрукта
решение есть одно, но может есть и другие

Изменено: KUDRIN - 18.08.2023 07:43:39
сохранение склеенной длинной строки через ADODB.Stream, vba
 
загружаю файл в string
потом делю на массив строк
обрабатываю каждую строку
склеиваю txt = txt & s
сохраняю через ADODB.Stream

и вот именно на txt = txt & s идёт накопительная задержка
если txt уже длинная (более 10000 строк), то к ней долго клеится новая строка

а через FSO.OpenTextFile ForAppending сохранять неудобно, т.к. поддерживает очень мало кодировок

вот таймер по каждому склеиванию + общая длина переменной txt:
в последнем столбце видно как падает скорость склеивания симв/сек

Цитата
timerΔ timerlen txtΔ lenΔ len / Δ timer
0,1640,1643082630826187 963
0,3730,2096311232286154 490
0,6480,27510229139179142 267
0,9840,33613795135660106 151
1,4760,4921828984494791 321
2,1130,6372273324443469 786
2,9590,8462719724464052 784
4,3691,413274105543839 313
6,161,7913803735296329 571
8,2442,0844321415176824 841
10,4062,1624944796233828 832
12,8492,4435492275474822 407
15,4392,595902274100015 831
18,222,7816274283720113 376

вопрос:
1. есть ли у ADODB.Stream функция дозаписи в имеющийся файл?
2. если нету, то как правильно клеить длинные строки? проверять на длину txt и при превышении условных 200 000 использовать новую чистую string txt[2] txt[3] , а потом склеить txt[1] txt[2] txt[3] перед сохранением в файл ?
Изменено: KUDRIN - 17.05.2023 07:27:05
Excel - метод прогресс панель задач - есть ли?, progress indicator taskbar, vba
 
Есть ли у Excel  метод "прогресс" на панели задач, как у любого приложения?
Даже у видеоплеера есть, и он на иконке показывает сколько фильма прошло

Класс WindowsFormsExtensions содержит два метода – SetTaskbarProgress и SetTaskbarProgressState.
Вызов первого метода позволяет указать процент выполнения текущей задачи.
Метод SetTaskbarProgressState позволяет задать текущее состояние прогресс-бара.
Код
WindowsFormsExtensions.SetTaskbarProgress(this, 35);
this.SetTaskbarProgressState(Windows7Taskbar.ThumbnailProgressState.Normal);
Могу ли я через vba подать сигнал в Excel о прогрессе?
Что-то типа
Код
for i=1 to 100
Application.Progress(i)
next i
Чтобы он на своей иконке Excel отображал прогресс, как это делает почти любое другое приложение?
Изменено: KUDRIN - 08.04.2022 08:22:32
как получить список окон с панели задач?, vba, hwnd WinAPI
 
Как получить список окон проводника в том порядке, в котором они открыты на панели задач? (слева направо)
Или при наведении мышкой если много окон, то выскакивает список тоже с таким же порядком (сверху вниз)




ShellWindows и дерево hwnd хоть и дают разные по сортировке списки, но ни в одном из них этот панель-задачный порядок не соблюдается.
Пока удалось узнать только класс выпадающего списка из панели задач TaskListThumbnailWnd
или может в другом месте в системе хранится этот порядок окон проводника, но где?

Shell_TrayWnd - ReBarWindow32 - MSTaskSwWClass - MSTaskListWClass - где есть TaskBar API или объект "панель задач" ?
есть ещё и четвёртая сортировка - ALT+Tab - TaskSwitcherWnd
Изменено: KUDRIN - 29.03.2022 12:52:17
как обновить окно проводника? (ShellWindows .Left = -32000 .Top = -32000), vba, hwnd
 
Снимаю параметры окон проводника:
из 30 окон - 25 нормальные, но 5 "застарелые" и выдают ShellWindows .Left = -32000 .Top = -32000, т.е. значение ненормальное
После того, как вручную мышкой переключаюсь на окно и после этого беру значения заново - всё норм.
Не знаю как "застареть" окно вручную, чтобы повторить такую ошибку, но пока что 5 застарелых окон есть

Вопрос:
Как через vba обновить или активировать окно проводника, чтобы снять правильные параметры?
Пробовал это, но не помогло:
Код
SetForegroundWindow w.hwnd
ShowWindow w.hwnd, 5
retval = SendMessage(w.hwnd, WM_SETFOCUS, 0, 0)
Есть ещё варианты?
Изменено: KUDRIN - 28.03.2022 10:41:38
SendInput не работает в x64
 

Помогите подправить код для того, чтобы он заработал в x64 офисе

нужно изменить dwExtraInfo на LongPtr и подправить размерность GENERALINPUT?

Код
Const VK_H = 72, VK_E = 69, VK_L = 76, VK_O = 79, KEYEVENTF_KEYUP = &H2, INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2
Type MOUSEINPUT: dx As Long: dy As Long: mouseData As Long: dwFlags As Long: time As Long: dwExtraInfo As Long: End Type
Type KEYBDINPUT: wVk As Integer: wScan As Integer: dwFlags As Long: time As Long: dwExtraInfo As Long: End Type
Type HARDWAREINPUT: uMsg As Long: wParamL As Integer: wParamH As Integer: End Type
Type GENERALINPUT: dwType As Long: xi(0 To 23) As Byte: End Type
Declare PtrSafe Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Sub go1()
AppActivate "Блокнот"
SendKey VK_H: SendKey VK_E: SendKey VK_L: SendKey VK_L: SendKey VK_O
End Sub
Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey
KInput.dwFlags = 0
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
KInput.wVk = bKey
KInput.dwFlags = KEYEVENTF_KEYUP
GInput(1).dwType = INPUT_KEYBOARD
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub

Изменено: KUDRIN - 26.03.2020 14:40:23
Ввод пароля Безопасность Windows, vba
 



Подскажите, как ввести логин пароль ? Через сендки как то не круто или это единственный вариант?
Изменено: KUDRIN - 25.03.2020 09:50:30
как обнулить XMLHTTP от кешированных значений?
 
Как обнулить XMLHTTP от кешированных значений ?
Пробовал 5 разных способов, не помог ни один, всё равно приносит старое значение респонса с юкоза
Код
set obj = Nothing
max-age=0
no-cache, no-store, must-revalidate
"If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
?hash=rnd

Как вы обнуляете кеш? или просто не используете XMLHTTP ?

И заодно, через сколько минут кеш сбрасывается? через 30 минут?

Изменено: KUDRIN - 19.03.2020 11:23:25
Найти строку текста (RegExp)
 
есть строка текста
Код
asd1qwd1er345568678345111
Как применить d1*345 через RegExp, чтобы получить "d1er345", а не "d1qwd1er345" ?

Это "d1.+?345" выдаёт "d1qwd1er345", как ограничить с последнего вхождения d1 ? Что то типа "(d1)(не(d1)).+?345"
Изменено: KUDRIN - 16.03.2020 15:35:51
Касперский блокирует интернет для Excel, vba
 
Касперский блокирует интернет для Excel.



Отключаешь защиту - макрос работает. После перезагрузки тоже работает, но через время всё равно блочит.
Пока 3 решения:
- перезагрузка
- отключить защиту
- отключить сетевой экран
Закидывал Excel.exe в доверенные, в сетевом экране принудительно разрешал ему интернет - ничего не помогает.
Как лечить?
Как вернуть иконки из панели инструментов Excel 2010 ?, для Excel 2013-2016
 
Как вернуть иконки из панели инструментов Excel 2010 ?
Не могу привыкнуть к новым плоским, старые были приятнее.
Это же просто иконки, должен быть способ выдрать их из 2010 и скормить их в 2013-2016


Изменено: KUDRIN - 27.03.2019 07:55:41
Возникла проблема перенаправления, vba, как лечить?
 
"возникла проблема перенаправления" возникает во время Microsoft.XMLHTTP.send
через время, когда жму на Debug + F8, выскакивает "Неопознанная ошибка"
макрос приходится перезапускать с нуля

ответ - возникает в случае не рабочей страницы, т.е. это ошибка не по вине Excel
Изменено: KUDRIN - 26.03.2019 09:02:27
Несовпадение значений при выгрузке из массива, vba
 
При загрузке ячеек в массив и выгрузке - наблюдается несовпадение значений.
Есть более точный макрос, в котором эти несовпадения учтены?

Как отключить макросы при вторичном открытии книги?
 
Excel 2016, Параметры макросов стоят "Отключить все макросы с уведомлением"
При первом открытии любой книги выскакивает сверху сообщение, при втором открытии и последующих - макросы включены без уведомления!
Если переименовываю книгу, то окошко опять всплывает.
Даже переключал на "отключить все макросы без уведомления", перезапускаю Excel, открываю книгу и в ней макросы работают.
Вопрос: Почему так происходит и где это отключить? (нужно, чтобы всегда было уведомление.)
Изменено: KUDRIN - 31.03.2018 05:04:17
Как починить соотношение сторон у картинки в комментариях?
 
Здравствуйте.
В двух ячейках две одинаковых картинки.
Но высота первой 1651.5, а высота второй 74.25
Если высоту первой напрямую задать 74.25, то они станут выглядеть одинаково.

Вопрос1: Почему внутри файла одна картинка image1.jpeg, а на листе две разных картинки?
Вопрос2: Если обе эти картинки берут данные из одного источника, то можно ли обнулить высоту и ширину (т.е. взять родную высоту ширину из оригинального файла источника)? Или может быть какое-то "Scale свойство" нарушено и при задании правильного значения первая картинка станет отображаться нормально с оригинальным соотношением сторон?

Или по другому: Как узнать высоту и ширину вставленной картинки-файла, к которой обращается комментарий?

xls прикреплён
Изменено: KUDRIN - 13.10.2017 16:45:51
Как удалить комментарий с картинкой?, vba
 
Здравствуйте.
Как удалить только комментарии с .UserPicture, а остальные не трогать ?
IE скачать файл, vba
 
Здравствуйте.
Подскажите метод для скачивания файла через CreateObject("InternetExplorer.Application")

Например
http://am.cdnmob.org/pic/v2/gallery/preview/abstrakciya-fon-40658.jpg - ПКМ по картинке - Сохранить изображение как
http://7-zip.org.ua/ru/download.html - ПКМ по ссылке на файл - Сохранить объект как
Изменено: KUDRIN - 19.08.2017 07:25:43
ИЛИ в СУММПРОИЗВ, формулы
 
Здравствуйте.
Знак произведения "*" в формуле СУММПРОИЗВ является функцией "И"
Как можно добавить "ИЛИ" в СУММПРОИЗВ ?

Например:
Нужно посчитать И("год";Или("Зима";"2000")) формулой СУММПРОИЗВ

красный - исходные данные
синий - вспомогательные СУММПРОИЗВ (по сути, не нужные)
желтый - тут нужная формула (в примере формула считает неправильно)
оранжевый - решение на формулах И,ИЛИ (как шпаргалка)
Изменено: KUDRIN - 24.04.2017 07:53:08
изменить горячую клавишу перехода между листами, VBA
 
хочу изменить Ctrl+PGDN Ctrl+PGUP на Ctrl+TAB Ctrl+Shift+TAB

при использовании этого кода переход происходит только один раз, а на второй раз выскакивает ошибка


Код
Sub auto_open()
Application.OnKey "^{TAB}", "Переход1" 'Ctrl+TAB 'следующий лист
Application.OnKey "^+{TAB}", "Переход2" 'Ctrl+Shift+TAB 'прошлый лист
End Sub

Sub Переход1()
Application.ScreenUpdating = False
On Error Resume Next
Application.OnKey "^{TAB}", ActiveSheet.Next.Select 'Ctrl+TAB 'следующий лист
Application.ScreenUpdating = True
End Sub

Sub Переход2()
Application.ScreenUpdating = False
On Error Resume Next
Application.OnKey "^+{TAB}", ActiveSheet.Previous.Select 'Ctrl+Shift+TAB 'прошлый лист
Application.ScreenUpdating = True
End Sub


что нужно подправить?
VBA AdvancedFilter Unique:=True (уникальные фильтром), диапазон выборки не имеет имени или имеет неправильное имя поля - ошибка 1004
 
при попытке выявить уникальные значения из списка через фильтр выдает ошибку
диапазон выборки не имеет имени или имеет неправильное имя поля - ошибка 1004

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

прикреплен пример
test1 работает
test2 не работает

test1
Код
Sub test1()
[A1:A10].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[D1], Unique:=True
End Sub

test2
Код
Sub test2()
[D1:D10].ClearContents
[A1:A10].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[D1], Unique:=True
[D1] = "111"
[A1:A10].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[D1], Unique:=True
End Sub
Изменено: KUDRIN - 23.11.2016 10:59:32
посчитать количество вопросов на листе, vba
 
Здравствуйте!
подскажите, можно ли через .CountIf посчитать количество вопросов?

правильный ответ в данном примере "3", а выдаёт "10"
Изменено: KUDRIN - 30.04.2015 13:18:44
Обнуление разных переменных, vba
 
Здравствуйте!
подскажите, где почитать про обнуление переменных?
что-то типа таблички
Код
Erase a 'массив
Set a = Nothing 'object, range
a = VbNullString '$
a = "" '$
a = Empty '&
a = 0 '&

какие из них универсальные? например из этого списка "a = Empty" работает и для & и для $
Изменено: KUDRIN - 07.04.2015 19:31:23
количество строк несвязанного диапазона, vba union() rows.count
 
подскажите, как посчитать количество строк? должно быть 3

Код
Sub test()
Set t1 = Union([a1:c1], [a3:d4])
t2 = t1.Rows.Count
t1.Select
End Sub
Работа с PDF
 
Здесь выложены несколько простеньких макросов для работы с PDF из Excel
Как ни странно, но из Excel можно получить доступ к PDF.

Причём сделать это на двух разных языках - IAC(AcroExch) и JavaScript
третий, самый полный доступ к PDF можно получить только через *.api плагины, выход на которые не доступен с VBA

один и тот же результат можно получить четырьмя разными способами:
Код
AVDoc.GetAVPageView.ZoomTo 1, 1
doc.zoomtype = jso.zoomtype.fitP
Exch.MenuItemExecute ("FitPage")
doc.app.execMenuItem ("FitPage")

После этих познаний такие темы как эта решаются в одну строку:
Код
jso.getField("Name").Value = "text"

1. К сообщению прикреплен только xls файл с кодом
2. По ссылке есть полный комплект https://yadi.sk/d/Xcs9E4HseAmfm , зеркало https://cloud.mail.ru/public/8e338c0db206/ExcelPDF
(xls, pdf файлы для тестирования, SDK и другая документация)
(152 Мб. из них 150 Мб Документация, 2 Мб рабочие файлы)

Макросы:
Info                        Информация о PDF файле (Debug.print)
BM                         Создание закладки в файле (Настроено на merge.pdf)
BMPage                 Куда переходит закладка (Debug.print Настроено на merge.pdf)
TreeBookmarks    Создание дерева закладок (Настроено на merge.pdf -> tree.pdf)
BookmarkNames  Перебор имён всех закладок (Debug.print Настроено на merge.pdf)
Экспорт                Экспорт информации о закладках на лист (Настроено на tree.pdf)
mergePDF             Объединить файлы PDF в одной папке (Настроено на папку Join)
mergePDF_BM     Объединить файлы PDF в одной папке и создать закладки (Настроено на папку Join)
ListMenuItems     Изъять названия пунктов меню на лист
PDF2TXT               Вариант 1 (adobe.pdf -> adobe.txt)
PDF2TXT_2           Вариант 2 (adobe.pdf -> adobe2.txt)
jsodoc                   Тестовый файл. много разных команд. Рекомендуется запускать в пошаговом F8 режиме (создает jso.pdf и jso.txt)

Файл AcquireMenuItemNames.pdf выполняет ту же функцию, что и ListMenuItems, но делает это более наглядно в самом pdf и возможно выдаёт больше значений из меню

В первый раз все макросы рекомендуется запускать по порядку.
Либо для запуска одного конкретного макроса нужно уточнить файл, к которому обращается макрос.
Изменено: KUDRIN - 23.01.2015 00:18:04
как отключить MsgBox, vba
 
Здравствуйте!

как отключить показ всех MsgBox в макросе?
Application.DisplayAlerts = False не отключает
или если отключить нельзя, то как послать команду нажатия кнопки ОК например ?
чтобы не беспокоили, когда это нужно, а макрос спокойно работал
Изменено: KUDRIN - 14.01.2015 13:36:44
On error отследить цикл
 
Здравствуйте!
что нужно изменить в коде, чтобы при ошибке он писал в debug.print i и продолжил работу
чтобы отследить ошибочные номера цикла

Код
Sub test()
txt = "123abc123"
For i = 1 To Len(txt)
y = Сложение(Mid(txt, i, 1))
on error debug.Print i
Next
End Sub
Function Сложение(x$) As Long
Сложение = x + 1
End Function
Страницы: 1 2 3 След.
Наверх