Excel нельзя установить свойство columnwidth класса range
Вроде бы - элементарное действие. но нет, здесь Microsoft нам усложнил задачу.
Получить ширину столбца в пикселах - не проблема, для этого есть свойство Width:
Но, увы, это свойство доступно только для чтения, - а для назначения ширины столбца нам придётся изменять значение другого свойства - ColumnWidth, которое задаётся отнюдь не в пикселах, а в символах (количестве знаков, которые поместятся в ячейке)
Результат - мы не можем со 100% точностью задать ширину столбца, чтобы она была равна заданному количеству пикселей.
Стал искать решение проблемы на сайте Microsoft - и увидел чудный макрос, который сначала ставит приблизительную ширину, и потом В ЦИКЛЕ подгоняет (увеличивает или уменьшает) значение ширины, до тех пор, пока результат не приблизитс к ожидаемому.
Я и сам пользовался подобным решением - для макроса вставки картинок в Excel, но когда пришла пора реализовать то же самое в универсальной программе для вставки изображений в Excel, понял, что надо искать более удобный способ
К тому же, подбор ширины столбца в цикле - очень медленный способ.
И вот что получилось:
Запустив этот макрос, вы увидите, что установленная ширина столбца почти совпадает с исходной.
Небольшое расхождение обычно некритично (всё-таки, Excel - это не графический редактор, где важна точность)
Еще один макрос - для тестирования применённого способа перевода Width в ColumnWidth:
Результат работы этого макроса:
Желаемая ширина = 3 полученная ширина = 3 ColumnWidth (в символах) = 0,33 совпадение = 100,00%
Желаемая ширина = 5 полученная ширина = 5,25 ColumnWidth (в символах) = 0,56 совпадение = 105,00%
Желаемая ширина = 7 полученная ширина = 6,75 ColumnWidth (в символах) = 0,78 совпадение = 96,43%
Желаемая ширина = 9 полученная ширина = 9 ColumnWidth (в символах) = 1,00 совпадение = 100,00%
Желаемая ширина = 11 полученная ширина = 11,25 ColumnWidth (в символах) = 1,38 совпадение = 102,27%
Желаемая ширина = 13 полученная ширина = 12,75 ColumnWidth (в символах) = 1,76 совпадение = 98,08%
Желаемая ширина = 15 полученная ширина = 15 ColumnWidth (в символах) = 2,14 совпадение = 100,00%
Желаемая ширина = 17 полученная ширина = 17,25 ColumnWidth (в символах) = 2,52 совпадение = 101,47%
Желаемая ширина = 19 полученная ширина = 18,75 ColumnWidth (в символах) = 2,90 совпадение = 98,68%
Желаемая ширина = 21 полученная ширина = 21 ColumnWidth (в символах) = 3,29 совпадение = 100,00%
Желаемая ширина = 23 полученная ширина = 23,25 ColumnWidth (в символах) = 3,67 совпадение = 101,09%
Желаемая ширина = 25 полученная ширина = 24,75 ColumnWidth (в символах) = 4,05 совпадение = 99,00%
Желаемая ширина = 27 полученная ширина = 27 ColumnWidth (в символах) = 4,43 совпадение = 100,00%
Желаемая ширина = 29 полученная ширина = 29,25 ColumnWidth (в символах) = 4,81 совпадение = 100,86%
Желаемая ширина = 31 полученная ширина = 30,75 ColumnWidth (в символах) = 5,19 совпадение = 99,19%
Желаемая ширина = 33 полученная ширина = 33 ColumnWidth (в символах) = 5,57 совпадение = 100,00%
Желаемая ширина = 35 полученная ширина = 35,25 ColumnWidth (в символах) = 5,95 совпадение = 100,71%
Желаемая ширина = 37 полученная ширина = 36,75 ColumnWidth (в символах) = 6,33 совпадение = 99,32%
Желаемая ширина = 39 полученная ширина = 39 ColumnWidth (в символах) = 6,71 совпадение = 100,00%
Желаемая ширина = 41 полученная ширина = 41,25 ColumnWidth (в символах) = 7,10 совпадение = 100,61%
Желаемая ширина = 43 полученная ширина = 42,75 ColumnWidth (в символах) = 7,48 совпадение = 99,42%
Желаемая ширина = 45 полученная ширина = 45 ColumnWidth (в символах) = 7,86 совпадение = 100,00%
Желаемая ширина = 47 полученная ширина = 47,25 ColumnWidth (в символах) = 8,24 совпадение = 100,53%
Желаемая ширина = 49 полученная ширина = 48,75 ColumnWidth (в символах) = 8,62 совпадение = 99,49%
Желаемая ширина = 51 полученная ширина = 51 ColumnWidth (в символах) = 9,00 совпадение = 100,00%
Желаемая ширина = 53 полученная ширина = 53,25 ColumnWidth (в символах) = 9,38 совпадение = 100,47%
Желаемая ширина = 55 полученная ширина = 54,75 ColumnWidth (в символах) = 9,76 совпадение = 99,55%
Желаемая ширина = 57 полученная ширина = 57 ColumnWidth (в символах) = 10,14 совпадение = 100,00%
Желаемая ширина = 59 полученная ширина = 59,25 ColumnWidth (в символах) = 10,52 совпадение = 100,42%
Желаемая ширина = 61 полученная ширина = 60,75 ColumnWidth (в символах) = 10,90 совпадение = 99,59%
Желаемая ширина = 63 полученная ширина = 63 ColumnWidth (в символах) = 11,29 совпадение = 100,00%
Желаемая ширина = 65 полученная ширина = 65,25 ColumnWidth (в символах) = 11,67 совпадение = 100,38%
Желаемая ширина = 67 полученная ширина = 66,75 ColumnWidth (в символах) = 12,05 совпадение = 99,63%
Желаемая ширина = 69 полученная ширина = 69 ColumnWidth (в символах) = 12,43 совпадение = 100,00%
Желаемая ширина = 71 полученная ширина = 71,25 ColumnWidth (в символах) = 12,81 совпадение = 100,35%
Желаемая ширина = 73 полученная ширина = 72,75 ColumnWidth (в символах) = 13,19 совпадение = 99,66%
Желаемая ширина = 75 полученная ширина = 75 ColumnWidth (в символах) = 13,57 совпадение = 100,00%
Желаемая ширина = 77 полученная ширина = 77,25 ColumnWidth (в символах) = 13,95 совпадение = 100,32%
Желаемая ширина = 79 полученная ширина = 78,75 ColumnWidth (в символах) = 14,33 совпадение = 99,68%
Желаемая ширина = 81 полученная ширина = 81 ColumnWidth (в символах) = 14,71 совпадение = 100,00%
Желаемая ширина = 83 полученная ширина = 83,25 ColumnWidth (в символах) = 15,10 совпадение = 100,30%
Желаемая ширина = 85 полученная ширина = 84,75 ColumnWidth (в символах) = 15,48 совпадение = 99,71%
Желаемая ширина = 87 полученная ширина = 87 ColumnWidth (в символах) = 15,86 совпадение = 100,00%
Желаемая ширина = 89 полученная ширина = 89,25 ColumnWidth (в символах) = 16,24 совпадение = 100,28%
Желаемая ширина = 91 полученная ширина = 90,75 ColumnWidth (в символах) = 16,62 совпадение = 99,73%
Желаемая ширина = 93 полученная ширина = 93 ColumnWidth (в символах) = 17,00 совпадение = 100,00%
Желаемая ширина = 95 полученная ширина = 95,25 ColumnWidth (в символах) = 17,38 совпадение = 100,26%
Желаемая ширина = 97 полученная ширина = 96,75 ColumnWidth (в символах) = 17,76 совпадение = 99,74%
Желаемая ширина = 99 полученная ширина = 99 ColumnWidth (в символах) = 18,14 совпадение = 100,00%
Желаемая ширина = 101 полученная ширина = 101,25 ColumnWidth (в символах) = 18,52 совпадение = 100,25%
Желаемая ширина = 103 полученная ширина = 102,75 ColumnWidth (в символах) = 18,90 совпадение = 99,76%
Желаемая ширина = 105 полученная ширина = 105 ColumnWidth (в символах) = 19,29 совпадение = 100,00%
Желаемая ширина = 107 полученная ширина = 107,25 ColumnWidth (в символах) = 19,67 совпадение = 100,23%
Желаемая ширина = 109 полученная ширина = 108,75 ColumnWidth (в символах) = 20,05 совпадение = 99,77%
Желаемая ширина = 111 полученная ширина = 111 ColumnWidth (в символах) = 20,43 совпадение = 100,00%
Желаемая ширина = 113 полученная ширина = 113,25 ColumnWidth (в символах) = 20,81 совпадение = 100,22%
Желаемая ширина = 115 полученная ширина = 114,75 ColumnWidth (в символах) = 21,19 совпадение = 99,78%
Желаемая ширина = 117 полученная ширина = 117 ColumnWidth (в символах) = 21,57 совпадение = 100,00%
Желаемая ширина = 119 полученная ширина = 119,25 ColumnWidth (в символах) = 21,95 совпадение = 100,21%
Желаемая ширина = 121 полученная ширина = 120,75 ColumnWidth (в символах) = 22,33 совпадение = 99,79%
Желаемая ширина = 123 полученная ширина = 123 ColumnWidth (в символах) = 22,71 совпадение = 100,00%
Репутация: нет
Всего: нет
Есть странноватая проблема.
Дан алгоритм (подгоняет ширину вставляемого в Excel OLE-объекта под ширину ячейки, а высоту ячейки под высоту этого объекта):
делается это в цикле при сборке N > 1 документов. При сборке первого документа все хорошо. А на втором вылезает EOleException: Нельзя установить свойство RowHeight класса Range
И к.з. что за дела! Настройки безопасности макросов не помогают. Хелп оффиса ясно пишет, что у Range есть сво-во RowHeight с возможностью изменения его значения.
Помогите, пожалуйста, разобраться! Второй день сижу с этим глюком и никак! И самое обидное, что эта фигня запарывает весь проект в 3000 строк
Добавлено @ 22:54
Совсем забыл главное
Ошибка появляется при выполнении строки:
excCell.RowHeight := e1;
Репутация: 25
Всего: 453
2) Указывайте язык, на котором программируете.
3) Поскольку (судя по синтаксису) это Дельфи - размещайте вопрос в соответствующем разделе.
О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.
Репутация: 5
Всего: 165
Мне кажется, что все дело в величине параметра RowHeight
Например, вот такой код работает:
Worksheets("Лист1").Range("A1").RowHeight = 409
а такой
Worksheets("Лист1").Range("A1").RowHeight = 410
выдает ошибку "Нельзя установить свойство RowHeight класса Range"
Репутация: нет
Всего: нет
К сожалению, дело не в этом.
В первом документе (когда все работает) вставляется объект бОльшей высоты и ширины, чем при зборке второго документа (когда глючит). И оба объекта вписываются в предельную высоту ячейки в Excel = 409.
Вопрос в том разделе, т.к. касается глюков Excel VBA.
Репутация: нет
Всего: нет
Aloha, спасибо! Действительно дело было в высоте > 409. А я криво просто смотрел. Спасибо, проблема решена!
P.S. модератору: проьлема решена, тему можно закрывать
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Несанкционированная реклама на форуме запрещена
- Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
- Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
- Оставляйте свои записи в "Книге отзывов о работе администрации"
- А вот тут лежит FAQ нашего подраздела
Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.
[ Время генерации скрипта: 0.1151 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Я работаю над автоматизацией построения сметного листа затрат, сидя поверх предположений, правил, политик и т. д.
Все идет хорошо, пока я не захочу автоматизировать настройку ширины столбцов. Здесь короткая перегонка.
Я работаю с Excel 2016 под общим O365 bundle и в пределах Windows 10 OS
2 ответа
Я пытаюсь использовать ManagedProperty: Отсюда @ManagedBean(name = SelectionBean) @SessionScoped public class TableSelectionBean implements Serializable < private String selectionMode = single; private Collection<Object> selection; private List<MonitoringData> monitoringData; private.
Для тех, у кого есть аналогичная проблема, кто наткнулся на этот пост, обратите внимание, что можно получить ошибку даже при правильном синтаксисе, если назначенное значение слишком велико.
Единица измерения ColumnWidth не измеряется в пикселях или сантиметрах, а вместо этого:
Со стандартными настройками шрифта:
- значения, превышающие 255, приведут к ошибке
- значения в диапазоне от 94 до 255 выдают предупреждение о том, что ширина столбца превышает ширину страницы
- значения меньше 94 будут передаваться
Похожие вопросы:
Этот код работает уже целую вечность. Я подумал, что, может быть, случайно нажал клавишу, но, кажется, не вижу ее. Я вдруг получаю ошибку: Невозможно установить свойство NumberFormat класса Range в.
Я пытаюсь использовать ManagedProperty: Отсюда @ManagedBean(name = SelectionBean) @SessionScoped public class TableSelectionBean implements Serializable < private String selectionMode = single;.
Sub ex2() Sheets(sheet2).Range(a2).Text = Anil End Sub Я хочу скопировать данные Anil в ячейку a2, но получаю ошибку времени RUN, говорящую: Невозможно установить свойство Text класса Range. Может.
У меня этот код написан под командной кнопкой, лист защищен. Командная кнопка действует как кнопка сброса и удаляет данные из многих ячеек и изменяет свойство шрифта. Вот код: Диапазоны, которые я.
With ActiveSheet.PageSetup .PrintArea = Cells(1, 1).Resize(LR, 16).Address .Orientation = xlLandscape .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2).
У меня есть этот код, он просто берет 3 слова от пользователя, ищет слова в b , c и d и меняет значение на XXXXXXXXXXXXX . Проблема в том, что я получаю невозможно получить свойство findnext класса.
В общем нужно в макросе на vba выставить определенную ширину в 17,5 см (свойство ColumnWidth у WorkSheet) Ширина измеряется в единицах, равных шинине символа в нормальном стиле. Как её узнать.
PS
ColumnWidth Property
Returns or sets the width of all columns in the specified range. Read/write Variant.
Remarks
One unit of column width is equal to the width of one character in the Normal style. For proportional fonts, the width of the character 0 (zero) is used.
Use the Width property to return the width of a column in points.
If all columns in the range have the same width, the ColumnWidth property returns the width. If columns in the range have different widths, this property returns Null.
Габариты символов (высота и ширина) определяются шрифтом. Пробовал пару раз, так и не откопал. Скорее всего надо как-то через API к таблице шрифта достучаться.
Практически получается где-то 5.33 точки на символ, но как это программно вычислить не сообразил.
Руслан Резниченко Мастер (1071) Та ничего там практически не получается, потому как в шрифтах под каждый символ прописаны габариты, и один и тот же символ в разных шрифтах может и имеет разные габариты, при этом от кегля тоже все меняется. Можно копать MSDN, а можно экпериментальным путем подобрать. И еще грабли. Например символ под кегль 6 шириной 5,33. если поменям кегль на 10, то ширина должна стать 8,88 (пропорции), на практике далеко не так.
Не охота заморачиваться, но ширина символа измеряется в пунктах. стандартный размер в стиле normal вроде 10-10 пунктов, возможно один пункт это 1/72 дюйма, ну это так, для прикидок. Могу сразу огорчить, шрифт скорее всего пропорциональный, так что он тебе мало поможет
Попробуй тупо юзать width и ширину ячейки в пунктах умножать на .72 и на 2.54, должен получить ширину в милиметрах.
Мне нужно см перевести в пункты, в которых измеряется ширина колонок.
Или свойство/метод, которым задается ширина колонки в мм/см/дюймах/точках/пикселах.
Всеволод Коваленко БиК Мыслитель (8342) делаешь ширину колонки 10 или 100 пунктов, печатаешь и меряешь линейкой.
10 пунктов не подходит. ширина плучается больше ширины листа за вычетом ширины полей где-то на 40%.
Читайте также: