AlexGor написал: Запуск с кнопки описал ранее в #37
Да, спасибо, тогда, на мой взгляд, с практической точки зрения проблемы нет. Разбираться с разным поведением макросов при запуске из VBE и непосредственно из Excel (и еще в различных версиях Win и Office) можно бесконечно.
AlexGor написал: так я код запускаю клавишей "Run Sub" из редактора.
Попробуйте закрыть редактор и запускать макрос непосредственно из Excel посредством диалога "Макрос" (Alt+F8) или назначьте на макрос горячую клавишу (можно через кнопку "Параметры" в том же диалоге).
Использование пользовательских классов, или не использование - дело вкуса автора, к алгоритмам в данной теме не имеющее отношения. Вот редакция макросов из #16 без использования классов (потратил минут 5, детально не проверял). Функция HtmlEncode и ее вызов добавлены.
Спасибо за тестирование! Отмеченные Вами проблемы могут быть связаны с ограничениями (безопасности) для вызова PowerShell.
Об отображении букв русского алфавита. "HTML Format" буфера обмена использует для текста кодировку utf-8. Текст программы из сообщения #16 этого не учитывает. Можно обойти эту проблему так. 1. Добавьте в модуль vbaClipboard функцию HtmlEncode из сообщения #30. 2. В модуле vbaClipboard в функции addHTMLWraper перед строкой
Тестирование показывает, что не все программы соблюдают стандарты и корректно работают с русскими буквами при вставке из буфера обмена, имеющего формат "Html". Так что придется до копирования в буфер обмена кодировать (по старинке) все символы юникода с кодом >=128. После этого кодировка utf-8 не отличается от кодировки windows-1251.
Протестируйте, пожалуйста (занести в стандартный модуль книги):
Код
Option Explicit
' Копирует в буфер обмена строку в Html - формате.
' Теги <HTML> и <BODY> указывать не следует.
Sub HtmlToClipboard(ByVal txt As String)
Dim fso As Object, f As Object, fileName As String
Set fso = CreateObject("Scripting.FileSystemObject")
fileName = fso.GetSpecialFolder(2) & "\" & fso.GetTempName() & ".html" ' временный файл
Set f = fso.OpenTextFile(fileName, 2, True) ' для записи
f.Write HtmlEncode("<HTML><BODY>" & txt & "</BODY></HTML>")
f.Close
RunPgm "powershell -command ""type " & fileName & " | Set-Clipboard -AsHtml"""
Set f = Nothing
Set fso = Nothing
Kill fileName
End Sub
' Кодирует в строке txt все символы с кодом >=128 по стандарту Html (&#код;).
Function HtmlEncode(ByVal txt As String) As String
Dim arr, n As Long, i As Long, s As String
If Len(txt) = 0 Then Exit Function
ReDim arr(1 To Len(txt))
For i = 1 To Len(txt)
s = Mid(txt, i, 1)
n = AscW(s)
If n > 127 Then
arr(i) = "&#" & n & ";"
Else
arr(i) = s
End If
Next i
HtmlEncode = Join(arr, "")
End Function
' Запуск внешних программ в синхронном режиме
Function RunPgm(ByVal pgm)
Dim wshShell
Set wshShell = CreateObject("WScript.Shell")
RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
Set wshShell = Nothing
End Function
Sub Test()
HtmlToClipboard "<B>Это полужирный</B> and <I>this is italic.</I>"
End Sub
nilske написал: Почему через PowerShell или Word сделать красивее, чем через пользовательский класс
Если Вы о программе из #16, то пользовательские классы не при чем, всё это без проблем переносится в стандартный модуль. Там используются Windows API для работы с буфером обмена. Соответственно, нужно разбираться с проблемами. Например:
Цитата
AlexGor написал: 2. вместо кириллицы выдаёт кракозябры.
Могу (не вникая в текст макросов) предположить, что проблема с использованием ASCII версий Windows API вместо Unicode версий.
На мой взгляд, лучше идти проторенными путями и контролировать свои шаги. Например, в результате пункта 1 из #19 будет создан (временный) файл формата html. Мы сможем проверить его корректность, открыв в любом браузере.
БМВ, написал: А там и вода , да еще и не верная вода.
Действительно, как-то все некрасиво и проблемы с символами Unicode, не попадающими в диапазон 0-127. Проще сделать так: 1. Создать временный файл и записать туда HTML в кодировке utf-8. Например, файл C:\Temp\test2.html c содержимым
Код
<html> <body>Это обычный шрифт.<b>Это полужирный.</b> <i><b>This is bold italic.</b> This is italic.</i></body> </html>
2. Скопировать содержимое файла в буфер обмена в формате "Html". Например, через PowerShell:
Код
Sub Test()
RunPgm "powershell -command ""type C:\Temp\test2.html | Set-Clipboard -AsHtml"""
End Sub
' Запуск внешних программ в синхронном режиме
Function RunPgm(ByVal pgm)
Dim wshShell
Set wshShell = CreateObject("WScript.Shell")
RunPgm = wshShell.Run("%comspec% /c " & pgm, 0, True)
Set wshShell = Nothing
End Function
Дополнение к ответу МатросНаЗебре (один из возможных вариантов):
Код
Option Explicit
Const myColumnName = "Moy_UID"
Sub test()
Dim tbl As ListObject, rg1 As Range
Set tbl = ActiveSheet.ListObjects("Таблица2")
Set rg1 = tbl.ListColumns(myColumnName).Range
rg1.Select ' Range("Таблица2[Moy_UID]").Select
rg1.Rows(1).Select ' Range("Таблица2[[#Headers],[Moy_UID]]").Select
End Sub
Уже забыл, что это такое ( SlicerCache ). Скачал отличный пример у Николая Павлова. Думаю, что имя можно поменять стандартным образом через Диспетчер имен (Ctrl+F3). Попробуйте на своем примере.
Если у Вас есть формула, выводящая сумму прописью в указанном Вами стандартном формате для суммы из ячейки A1, то сумму в требуемом формате можно получить так:
Введите в любую свободную ячейку формулу: =A4=B4 Ее значение - ИСТИНА. То есть, значения ячеек A4 и B4 одинаковы. В этих ячейках установлены разные числовые форматы (соответственно Общий и Числовой с 2 знаками после запятой), поэтому на экране они отображаются по-разному.
Поставьте первым правилом условного форматирования: если значение факта и плана 0, то числовой формат ";;" и укажите для него флажок "Остановить, если Истина".