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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 След.
объединить текст (из разных ячеек в одну) с сохранением цвета (форматирования) текста, vba
 
Цитата

по другому алгоритму
способ рабочий, только в нём такой же алгоритм как в v2 первого сообщения - сначала вставка сырых значений, а потом посимвольная покраска


исходя из практики - такой алгоритм очень долгий, обрабатывает  200-1000 символов в минуту, но из альтернатив наверное ничего и нету
Изменено: KUDRIN - 05.03.2025 16:54:51
как включить ускоренную многопоточную 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
 
Цитата
testuser написал:
Вот эта комманда
да, Shell.Explore помогла
только если открыт рабочий стол через InvokeVerbEx, то Shell.Explore уже не откроет новое, а просто активирует.

1. если вручную открыто 3 рабочих стола, потом InvokeVerbEx откроет 4-ое окно (игнорируя ранее открытые), и Explore активирует это 4-ое окно
2. если вручную открыто 3 рабочих стола, и сразу Explore, то открываются новые окна
таким образом - у окна, открытого InvokeVerbEx , некий особый статус
Изменено: KUDRIN - 02.08.2024 18:49:50
Как открыть рабочий стол?, vba, winapi, CLSID, win7, Shell.windows
 
testuser, сработало

ниже:
обычная папка - это та которая не нужна (если вручную идти в мои документы\рабочий стол)
уникальная папка с синей иконкой - тот рабочий стол, который нужен - если тыкать на рабочий стол в боковом меню любой папки

1. если открыта "обычная" папка рабочий стол - то открывает всё равно новое окно с уникальной синей иконкой
2. если уже открыто хотя бы одно окно с уникальной иконкой - то активирует его
3. если открыто несколько окон с уникальной синей иконкой - то активирует самое раннее открытое
4. если не открыто ни одного окна с уникальной синей иконкой - то открывает новое нужное окно

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

нашлась только
Код
CreateObject("Shell.Application").Namespace(0).Self.InvokeVerbEx ("open")
но она работает аналогично - тоже только 1 окно открывает/активирует

а список команд;

Код
objFIV = CreateObject("Shell.Application").Namespace(0).Items().Verbs

не показывает ничего интересного в духе "new window"

Код
CreateObject("Shell.Application").Namespace(0).Self.InvokeVerbEx ("Explore")

не делает ничего

--

что интересно, в кавычках "CreateObject("Shell.Application").Namespace(0).Self.InvokeVerbEx" гуглится и яндексится только 1 результат

Изменено: KUDRIN - 02.08.2024 10:02:33
Как открыть рабочий стол?, vba, winapi, CLSID, win7, Shell.windows
 
с каких пор vba код стал быть в курилке?
Как открыть рабочий стол?, vba, winapi, CLSID, win7, Shell.windows
 
Цитата
\root , "C:\Users\Admin\Desktop"
Как открыть рабочий стол?, vba, winapi, CLSID, win7, Shell.windows
 
Цитата
написал:
Уточнить бы еще какая из картинок какая :-).


пока никакими командами не удалось открыть три рабочих стола, только мышкой
Изменено: KUDRIN - 01.08.2024 09:51: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 коде?, онлайн или офлайн
 
Цитата
Sanja написал:
Smart Indenter v3.5
инсталятор просто распаковывает одну DLL в отдельную папку - C:\Program Files (x86)\Office Automation\Smart Indenter\VBA6
как его подключить к офису выше 2003 ?
через VBA - Tools - References - Browse - IndenterVBA.DLL - не подключается
Изменено: KUDRIN - 05.12.2023 11:55:56
как автоматически проставить табуляцию или отступы в vba коде?, онлайн или офлайн
 
у плекса 6/65 - это значительно ниже чем 27/58

v05/12/23
6/64 PLEX.zip https://www.virustotal.com/gui/file/b17e08c0a7b4959eb0c375924f7d5f6e6b804df1132711124f8bea01843b­f892
6/62 PLEX.xlam https://www.virustotal.com/gui/file/39ffdee6c41b97a128ed8162bd4a3a4c1d4b7dcf3c99e33d8ec539547f1f­f52d
6/65 PLEX_Eng.xlam https://www.virustotal.com/gui/file/8fa3cb0d2cfbb702810d866b986f626efad3bd728aacbb3101c056faaf08­be3d

Изменено: KUDRIN - 05.12.2023 10:46:20
как автоматически проставить табуляцию или отступы в vba коде?, онлайн или офлайн
 
Цитата
написал:
Снимок экрана
кроме каспера есть ещё 60 других антивирусов
с подключением
с таким же успехом можно вообще ни один антивирус не ставить и говорить, что вирусов не существует в природе
как автоматически проставить табуляцию или отступы в vba коде?, онлайн или офлайн
 
Цитата
irabel  написал:
MacroTools

v1.8.47 от 09.07.2023
addin_macrotoolsexcel.7z 19/61 https://www.virustotal.com/gui/file/e360e8f06d4dace3e4318b15dc4efaa1d5b99c3598e5576bef9126ffac7a­0840
Addin_MacroTools_ENG.xlsb 18/64 https://www.virustotal.com/gui/file/da59bfb55bbecadab2fdc66253c2ae3837f755768ae28349e1d57897397d­9a63
Addin_MacroTools_RUS.xlsb 27/58 https://www.virustotal.com/gui/file/e6fc8797f4ccbc53de145bba75b1969dba883efb6762fab3f43c8d14bbbb­8887

ухты какая интересная надстройка

Изменено: KUDRIN - 05.12.2023 10:22:03
как автоматически проставить табуляцию или отступы в 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
поиск по таблице, формулами
 
Цитата
написал:
замените
=ЕСЛИОШИБКА(ИНДЕКС($G$9:$L$9;НАИМЕНЬШИЙ(ЕСЛИ($G10:$L10="X";СТОЛБЕЦ($G$9:$L$9)-СТОЛБЕЦ($F$9));СТОЛБЕЦ(A7)));"")
формула массива
Изменено: KUDRIN - 18.08.2023 17:02:33
поиск по таблице, формулами
 
Цитата
Павел \Ʌ/ написал:
=ЕСЛИОШИБКА(ИНДЕКС($G$9:$L$9;НАИМЕНЬШИЙ(ЕСЛИ($G10:$L10="X";--ПРАВСИМВ($G$9:$L$9));СТОЛБЕЦ(A7)));"")
не подписано что формула массива
Изменено: KUDRIN - 18.08.2023 10:09:23
поиск по таблице, формулами
 
классные решения, удобнее чем моё
поиск по таблице, формулами
 
Цитата
написал:
=IFERROR(INDEX($G$9:$L$9;1;AGGREGATE(15;6;(COLUMN($G$9:$L$9)-6)/($G10:$L10="X");COLUMN(A1)));"")
кто может перевести эту формулу на ру?
тут есть переводчик от MS как надстройка, но нет магазина в 2010 офисе чтобы ее установить
https://support.microsoft.com/ru-ru/office/%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D1%87%D­0%B8%D0...

вот перевел через https://poisk-v-seti.ru/cat/servisy/excel-translate
Цитата
=ЕСЛИОШИБКА(ИНДЕКС($G$9:$L$9;1;АГРЕГАТ(15;6;(СТОЛБЕЦ($G$9:$L$9)-6)/($G10:$L10="X");СТОЛБЕЦ(A1)));"")
Изменено: KUDRIN - 18.08.2023 09:57:17
поиск по таблице, формулами
 
вот есть такая табличка
нужно найти названия ящиков для каждого фрукта
решение есть одно, но может есть и другие

Изменено: KUDRIN - 18.08.2023 07:43:39
простой макрос в строке кк = 10 * 1000 * 10 выдает ошибки Overflow (Error 6) офис 2003 ср3
 
Цитата
ZVI написал:
т.к. макс. значение Long равно 2147483647
ах, это многое объясняет
а то https://learn.microsoft.com/ru-ru/dotnet/visual-basic/language-reference/data-types/long-data-type
Цитата
Тип данных Long (Visual Basic)
Содержит 64-разрядные (8-байтовые) целые числа со знаком в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 (9,2...E+18).
оказывается у них ещё и бейсики разные - один для офиса, а второй для дотнета


Цитата
ZVI написал:
переменные типа Variant при компилировании кода приведены к типу aa#, т.е. к double
жаль у Variant нет короткого объявления
хотя наоборот есть - оно без короткого знака
Код
Sub sdd()
Dim a0 As Variant 'All types
a1! = 1 'Single / -3.402823E38 to -1.401298E-45, 1.401298E-45 to 3.402823E38
a2@ = 1 'Currency / -922,337,203,685,477.5808 to 922,337,203,685,477.5807
a3# = 1 'Double / -1.79769313486232E+308 to -4.94065645841247E-324, 4.94065645841247E-324 to 1.79769313486232E+308
a4$ = 1 'String / 0 to 2,147,483,647 characters
a5% = 1 'Integer / -32,768 to 32,767
a6^ = 1 'LongLong / -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
a7& = 1 'Long / -2,147,483,648 to 2,147,483,648
a8 = 1 'Variant 'All types
End Sub
Изменено: KUDRIN - 22.05.2023 05:41:26
простой макрос в строке кк = 10 * 1000 * 10 выдает ошибки Overflow (Error 6) офис 2003 ср3
 
Цитата
написал:
В каждой вычисляемой части учитывается типы данных и их ограничения.
имеются ввиду 2 части слева и справа от знака равенства? или имеются ввиду слагаемые части справа от равно?
Код
aa# = 0
a1& = 10
a2% = 10
aa = (a1 * 100000) * (a2 * 1000)
aa = (a1 * 100000) + (a2 * 1000)
aa = (a1 * 10000) * (a2 * 1000)

вот три строки, 1 выдаст ошибку, а 2 и 3 не выдадут
хотя непонятно как это работает - если плюс изменил ситуацию, значит тип мат операции имеет значение
а дальше в 3й строке мы убрали нолик около лонга - на лонг a1 этот ноль вообще не влияет, а каким образом он влияет на a2 тоже не понятно. т.е. если учитывается общий результат справа от равно, то наличие лонга должно решать все проблемы, т.к. справа 10 нулей, а у лонга 18
Код
aa# = 0
a1& = 10
a2& = 10
aa = (a1 * 100000) * (a2 * 1000)
или вот = справа два лонга, максимум 18 разрядов, а слева 300 разрядов, число 10 разрядов, но выдает ошибку, пока не сделаешь a1# или a2#
за всю практику первый раз столкнулся напрямую с перемножением в vba и это всё сделано как то криво косо неудобно

да еще если часто менять типы данных у переменной, то выскакивает ошибка о несоответствии. причем если ты менял с 1 на 10 - то эта ошибка никак не обойдётся, пока не введешь третье число типа 200, тогда он успешно обновляет тип данных (MS 2010)


в общем в любой непонятной ситуации пиши CDbl() или CLng() и это в большинстве случаев поможет
Изменено: KUDRIN - 21.05.2023 19:49:44
простой макрос в строке кк = 10 * 1000 * 10 выдает ошибки Overflow (Error 6) офис 2003 ср3
 
Цитата
написал:
А я считаю иначе.
почему не вижу полного ФИО в твоём нике тогда?
почему только неполная "М" ? ты что-то скрываешь? в чём-то замешан?
щас бы в инете к никам придираться. ikki то очень осмысленный ник, намного круче йцукена
надеюсь регистрацию на форуме по тилибону скоро прикрутят? + геолокацию
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
последние две строки выдают ошибку
как полечить?:
Код
'a1 = 100 * 100 * 100
a1# = 1000000
a1 = 100 * 100: a1 = a1 * 100
a1 = 100# * 100 * 100
a1 = CLng(100) * 100 * 100

a1 = CLng(0) + 100 * 100 * 100
a1 = CLng(100 * 100 * 100)

тут последняя строка тоже выдает ошибку при использовании массива
как лечить? только через  a1 = clng(a00(0)) * 100 * 100 ?:
Код
a0 = 100
a1 = a0 * 100 * 100
Dim a00(1) As Integer
a00(0) = 100
a1 = a00(0) * 100 * 100

и так тоже не хочет:
Код
a0 = 100
a1 = a0 * (100 * 100 + 1)
Dim a00(1) As Integer
a00(0) = 100
a1 = CLng(1) * (a00(0) * 100 * 100 + 1)
Изменено: KUDRIN - 21.05.2023 13:52:20
Как вернуть иконки из панели инструментов Excel 2010 ?, для Excel 2013-2016
 
Цитата
написал:
Все иконки зашиты в DLL-ки офиса и приляпать иконки из старого к новому невозможно.
а dll нельзя пропатчить?
flat-дизайн дно
сохранение склеенной длинной строки через ADODB.Stream, vba
 
Цитата
написал:
http://calendar.vpogiba.info/wg/wsh/ADOStreamObject.htm
explorer.exe
google.ru
компьютер включать кнопкой POWER
печатать на сайте надо на клавиатуре
мышь это манипулятор курсора
ответ уже дан во 2-ом посте
Изменено: KUDRIN - 17.05.2023 08:33:29
сохранение склеенной длинной строки через ADODB.Stream, vba
 
короче можно просто периодически перезаписывать в файл (чтение с файла & txt)
Изменено: KUDRIN - 17.05.2023 08:20:41
сохранение склеенной длинной строки через 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
как копировать формулу протягивание с пропуском ячеек
 
Цитата
Герасим Бредихин написал:
и  в больших таблицах это долго.
изучайте vba либо купите компьютер + XL64, чтобы работать на старых формулах но быстрее
Изменено: KUDRIN - 08.04.2022 18:25:07
как копировать формулу протягивание с пропуском ячеек
 
Цитата
Пытливый написал:
А вам куда НА САМОМ деле и ЧТО надо поставить?
в ТЗ идёт разговор про вставку в "Аванс!AH16"
а при проверке прилагаемого решения он вставляет формулу на совершенно другой новый чистый лист и жалуется, что получается не то что ему надо
Изменено: KUDRIN - 08.04.2022 18:14:04
Excel - метод прогресс панель задач - есть ли?, progress indicator taskbar, vba
 
Как вариант тогда можно использовать какую-нибудь программку-посредник и из макроса через Shell запускать/обновлять её с параметрами:
Код
/Progress [0-100]
/State [NoProgress, Indeterminate, Normal, Error, Paused]
либо, чтобы запуск программы не гонять каждый раз, можно экселем создавать в папке с этой программой txt файл "60.txt" "70.txt", а она сама будет брать процент из имени этого файла

Таким образом она будет отображать ход выполнения макроса в своём окне на панели задач
Ей даже можно иконку XLS скормить и любой Title подкинуть
Может ли кто-нибудь написать такую?
.NET Sample Interop Library https://rsdn.org/article/winshell/taskbar7.xml

или может можно на WinAPI CreateWindowEx создать окно с прогресс баром как-то
Изменено: KUDRIN - 08.04.2022 15:38:41
Excel - метод прогресс панель задач - есть ли?, progress indicator taskbar, vba
 
Цитата
написал:
ТЕМУ
Посмотрел, там же опять пользовательские формы внутри самого Excel.
Я же говорю про Windows кнопку на панели задач внизу, чтобы прогресс отображался прямо на кнопке Excel, что умеет делать любое приложение

Изменено: KUDRIN - 08.04.2022 14:35:03
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 След.
Наверх