после установки x64 офиса - формулы полностью нагружают все 100% потоки процессора и справа снизу в строке состояния пишет количество нагруженных процессоров но сам vba код работает только в однопоточном режиме, загружая процессор на 5-15%
есть ли какие-то опции по включению всех потоков в vba? бывают ли вообще многопоточные компиляторы в программировании?
как объединить несколько ячеек в одну с сохранением всех цветов? кто-то прорабатывал такую процедуру?
тут есть два момента: 1. обрабатывать нужно посимвольно, т.к. в исходных ячейках может быть несколько цветов текста внутри каждой ячейки, т.е. цвет текста нельзя считывать со всей ячейки 2. этот код имеет максимальную длину 255:
т.е. посимвольно удлинять результирующую строку и тут же менять цвет в этом же цикле сработает только до длины 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, вдобавок можно добавить кастомный сепаратор между значениями исходных ячеек и фильтр по ячейкам
Как открыть рабочий стол? (vba, winapi, win7) по какому адресу он находится?
в идеале бы получить CLSID в реестре прописан "Desktop" ::{00021400-0000-0000-C000-000000000046}, но он никуда не ведёт "file:///C:/Users/Admin/Desktop" открывает папку с рабочим столом (на картинке слева) а нужно именно виндовый рабочий стол с уникальной иконкой (на картинке справа)
как автоматически проставить табуляцию или отступы в 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 не предлагать
загружаю файл в string потом делю на массив строк обрабатываю каждую строку склеиваю txt = txt & s сохраняю через ADODB.Stream
и вот именно на txt = txt & s идёт накопительная задержка если txt уже длинная (более 10000 строк), то к ней долго клеится новая строка
а через FSO.OpenTextFile ForAppending сохранять неудобно, т.к. поддерживает очень мало кодировок
вот таймер по каждому склеиванию + общая длина переменной txt: в последнем столбце видно как падает скорость склеивания симв/сек
Цитата
timer
Δ timer
len txt
Δ len
Δ len / Δ timer
0,164
0,164
30826
30826
187 963
0,373
0,209
63112
32286
154 490
0,648
0,275
102291
39179
142 267
0,984
0,336
137951
35660
106 151
1,476
0,492
182898
44947
91 321
2,113
0,637
227332
44434
69 786
2,959
0,846
271972
44640
52 784
4,369
1,41
327410
55438
39 313
6,16
1,791
380373
52963
29 571
8,244
2,084
432141
51768
24 841
10,406
2,162
494479
62338
28 832
12,849
2,443
549227
54748
22 407
15,439
2,59
590227
41000
15 831
18,22
2,781
627428
37201
13 376
вопрос: 1. есть ли у ADODB.Stream функция дозаписи в имеющийся файл? 2. если нету, то как правильно клеить длинные строки? проверять на длину txt и при превышении условных 200 000 использовать новую чистую string txt[2] txt[3] , а потом склеить txt[1] txt[2] txt[3] перед сохранением в файл ?
Есть ли у Excel метод "прогресс" на панели задач, как у любого приложения? Даже у видеоплеера есть, и он на иконке показывает сколько фильма прошло Класс WindowsFormsExtensions содержит два метода – SetTaskbarProgress и SetTaskbarProgressState. Вызов первого метода позволяет указать процент выполнения текущей задачи. Метод SetTaskbarProgressState позволяет задать текущее состояние прогресс-бара.
Как получить список окон проводника в том порядке, в котором они открыты на панели задач? (слева направо) Или при наведении мышкой если много окон, то выскакивает список тоже с таким же порядком (сверху вниз)
ShellWindows и дерево hwnd хоть и дают разные по сортировке списки, но ни в одном из них этот панель-задачный порядок не соблюдается. Пока удалось узнать только класс выпадающего списка из панели задач TaskListThumbnailWnd или может в другом месте в системе хранится этот порядок окон проводника, но где?
Shell_TrayWnd - ReBarWindow32 - MSTaskSwWClass - MSTaskListWClass - где есть TaskBar API или объект "панель задач" ? есть ещё и четвёртая сортировка - ALT+Tab - TaskSwitcherWnd
Снимаю параметры окон проводника: из 30 окон - 25 нормальные, но 5 "застарелые" и выдают ShellWindows .Left = -32000 .Top = -32000, т.е. значение ненормальное После того, как вручную мышкой переключаюсь на окно и после этого беру значения заново - всё норм. Не знаю как "застареть" окно вручную, чтобы повторить такую ошибку, но пока что 5 застарелых окон есть
Вопрос: Как через vba обновить или активировать окно проводника, чтобы снять правильные параметры? Пробовал это, но не помогло:
Помогите подправить код для того, чтобы он заработал в 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
Отключаешь защиту - макрос работает. После перезагрузки тоже работает, но через время всё равно блочит. Пока 3 решения: - перезагрузка - отключить защиту - отключить сетевой экран Закидывал Excel.exe в доверенные, в сетевом экране принудительно разрешал ему интернет - ничего не помогает. Как лечить?
Как вернуть иконки из панели инструментов Excel 2010 ? Не могу привыкнуть к новым плоским, старые были приятнее. Это же просто иконки, должен быть способ выдрать их из 2010 и скормить их в 2013-2016
"возникла проблема перенаправления" возникает во время Microsoft.XMLHTTP.send через время, когда жму на Debug + F8, выскакивает "Неопознанная ошибка" макрос приходится перезапускать с нуля ответ - возникает в случае не рабочей страницы, т.е. это ошибка не по вине Excel
Excel 2016, Параметры макросов стоят "Отключить все макросы с уведомлением" При первом открытии любой книги выскакивает сверху сообщение, при втором открытии и последующих - макросы включены без уведомления! Если переименовываю книгу, то окошко опять всплывает. Даже переключал на "отключить все макросы без уведомления", перезапускаю Excel, открываю книгу и в ней макросы работают. Вопрос: Почему так происходит и где это отключить? (нужно, чтобы всегда было уведомление.)
Здравствуйте. В двух ячейках две одинаковых картинки. Но высота первой 1651.5, а высота второй 74.25 Если высоту первой напрямую задать 74.25, то они станут выглядеть одинаково.
Вопрос1: Почему внутри файла одна картинка image1.jpeg, а на листе две разных картинки? Вопрос2: Если обе эти картинки берут данные из одного источника, то можно ли обнулить высоту и ширину (т.е. взять родную высоту ширину из оригинального файла источника)? Или может быть какое-то "Scale свойство" нарушено и при задании правильного значения первая картинка станет отображаться нормально с оригинальным соотношением сторон?
Или по другому: Как узнать высоту и ширину вставленной картинки-файла, к которой обращается комментарий?
Здравствуйте. Знак произведения "*" в формуле СУММПРОИЗВ является функцией "И" Как можно добавить "ИЛИ" в СУММПРОИЗВ ?
Например: Нужно посчитать И("год";Или("Зима";"2000")) формулой СУММПРОИЗВ
красный - исходные данные синий - вспомогательные СУММПРОИЗВ (по сути, не нужные) желтый - тут нужная формула (в примере формула считает неправильно) оранжевый - решение на формулах И,ИЛИ (как шпаргалка)
хочу изменить 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
при попытке выявить уникальные значения из списка через фильтр выдает ошибку диапазон выборки не имеет имени или имеет неправильное имя поля - ошибка 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
Здесь выложены несколько простеньких макросов для работы с PDF из Excel Как ни странно, но из Excel можно получить доступ к PDF. Причём сделать это на двух разных языках - IAC(AcroExch) и JavaScript третий, самый полный доступ к PDF можно получить только через *.api плагины, выход на которые не доступен с VBA
один и тот же результат можно получить четырьмя разными способами:
Макросы: 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 и возможно выдаёт больше значений из меню
В первый раз все макросы рекомендуется запускать по порядку. Либо для запуска одного конкретного макроса нужно уточнить файл, к которому обращается макрос.
как отключить показ всех MsgBox в макросе? Application.DisplayAlerts = False не отключает или если отключить нельзя, то как послать команду нажатия кнопки ОК например ? чтобы не беспокоили, когда это нужно, а макрос спокойно работал
Здравствуйте! что нужно изменить в коде, чтобы при ошибке он писал в 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