Мое почтение, джентльмены. Визуально разные по ширине столбцы, при одинаковой указанной ширине (14 пунктов) в прилагаемых 2х файлах. Ширина столбца (14 пунктов), шрифт, масштаб одинаковые. Что упустил?
Шрифт не везде одинаковый. Размер заголовков строк и столбцов во 2-м файле явно больше. Скорее всего книги были созданы на основании разных шаблонов. Плюс в файле 2 куча разных скрытых имен.
я вот на это отвечал и показал. Там визуально видно, что размер шрифта у заголовков строк и столбцов разный. Или это так выглядит вопрос про причину? А вот, кстати, причина почему разные заголовки:
я не знаю что еще сказать - Вам виднее откуда файлы взялись. Один, скорее всего выгрузка откуда-то. Лечить через Файл -Параметры -Общие -раздел При создании новых книг. Там и видно, что в одном файле размер 10, в другом 11...
Зайдём с другой стороны:) (про размер шрифта в заголовках я видел и вас понял, но это следствие?!). Мне нужна причина, что бы поправить. Моя задача сделать столбцы одинаковой ширины и визуально и по задаваемому размеру. Это можно сделать?
Скрытый текст
Т.к. далее работает программа по вставке фото и мне не нравятся разные отступы с одними и теми же условиями задаваемыми пользователем
ну это к экстрасенсам...Я точно не знаю откуда Вы берете эти файлы и кто их создает. Но вопросы точно лучше им задать Я лишь показал, где это можно посмотреть и при желании исправить
я и сам не знаю. В компании сотрудники ваяют. Мой древний макрос по загрузке фото прислали (пришлось переделать некоторые моменты под win10, пошел по вашему пути)
Итак обобщая: Ширина ячеек (столбцов) измеряется в количестве символов стандартного размера, причем этот "стандарнтный размер" зависит от размера шрифта установленного в разделе при создании новых книг. Другими словами для разных книг этот размер будет разный визуально и в количестве пикселей, хоть и написано и там и там = 8,43 (ширина столбца по умолчанию в новой книге). т.е. показатель "ширина столбца" не валидный в случаях обработки разных файлов для определения размера в пикселях, так местечковая (локальная) переменная. Здесь нужно обыграть как-то этот момент для своей задачи.
Высота ячеек (строк) измеряется в пунктах. Они всегда одинаковы для разных файлов, т.е высота строки = 15 пунктов будет во всех файлах - одинаковой. На практике по замерам 1п высоты = 1 пиксель * 0,75, т.е. 10 пикселей = 7,5 пунктов высоты
Вывод 2: задать ширину столбца в пикселях, т.е. одинаковую для любого файла Excel через ширину столбца - нельзя (танцы с бубнами и с реестром не рассматриваю)
Здравствуйте, коллеги! Виталий, посмотрите на стиль "Обычный" в указанных книгах, а именно на шрифт. В одной книге Calibri 12, в другой Calibri 11. Измените указанный стиль в одной из книг и выглянет солнце.
Как поменять стиль при создании новых книг написано здесь.
sokol92, Владимир, спасибо, помогло. Т.е. стиль "обычный" прописан в заголовках табличной части? (добавлю инфу в вывод) Т.е. по теме ответ найден. Коллеги, благодарю. По своей задаче, не правильным будет подход - менять стили в пользовательских файлах, видимо буду какие то костыли городить через переменную ActiveWorkbook.Styles("Normal").Font.Size, и масштабировать в зависимости от нее ширину столбца. Не нравится мне все это... ...Как и подозревал, кроме размера шрифта влияет и сам шрифт на пункты ширины столбца, костыль не выдержит таких мучений.
Да, когда мы задаем свойство ColumnWidth, то единицей измерения является ширина символа "0" шрифта Normal.
Если нужна ширина в "твердой" валюте, то придется применять коэффициенты, которые можно найти эмпирическим путем. В одной из тем на форуме мы с Михаилом (БМВ) это обсуждали.
Владимир, спасибо, вспомнил былое Вот накидал функцию (на основании данных по ссылке), для нужной ячейки определяет ширину столбца в пикселях Excel (помним про обычный пиксель и 0.75!) Можно и сразу было перевести в обычные пиксели, но так удобнее, т.к. высота строки тоже в пикселях Excel, т.е. сопоставимые показатели.
Тестируйте...
Код
Sub ActiveCellColumnWidthPixelExcel()
Debug.Print ColumnWidthPixelExcel(ActiveCell)
End Sub
Function ColumnWidthPixelExcel(r As Range) As Double
Dim Result(1 To 2) As Double
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
Dim ws As Worksheet
Set ws = r.Parent.Parent.Worksheets.Add
x1 = CDbl(1) 'characters
x2 = CDbl(255) 'characters
ws.Columns(1).ColumnWidth = x1
y1 = ws.Columns(1).Width 'points
ws.Columns(1).ColumnWidth = x2
y2 = ws.Columns(1).Width 'points
ws.Delete
Result(1) = (y2 - y1) / (x2 - x1) 'points per character
Result(2) = y1 - x1 * Result(1) 'points
ColumnWidthPixelExcel = (r(1).ColumnWidth * Result(1) + Result(2))
End Function
Или более универсально, получаем масштаб и далее используем по своему усмотрению. К примеру, если хотим задать, а не получить ширину столбца в пикселях Excel.
Код
Sub ActiveCellColumnWidthPixelExcel()
Dim scale_
scale_ = GetScaleColumnWidth(ActiveCell)
Debug.Print ActiveCell.ColumnWidth * scale_(1) + scale_(2)
'(ширина столбца в пикселях Excel) = (ширина в символах) * (пикселей на символ) + (поле ячейки в пикселях).
End Sub
Function GetScaleColumnWidth(r As Range) As Double()
Dim Result(1 To 2) As Double
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
Dim ws As Worksheet
Set ws = r.Parent.Parent.Worksheets.Add
x1 = CDbl(1) 'characters
x2 = CDbl(255) 'characters
ws.Columns(1).ColumnWidth = x1
y1 = ws.Columns(1).Width 'points
ws.Columns(1).ColumnWidth = x2
y2 = ws.Columns(1).Width 'points
ws.Delete
Result(1) = (y2 - y1) / (x2 - x1) 'points per character
Result(2) = y1 - x1 * Result(1) 'points
GetScaleColumnWidth = Result
End Function