Страницы: 1
RSS
Визуально разные по ширине столбцы, при одинаковой указанной ширине в разных файлах Excel
 
Мое почтение, джентльмены.
Визуально разные по ширине столбцы, при одинаковой указанной ширине (14 пунктов) в прилагаемых 2х файлах.
Ширина столбца (14 пунктов), шрифт, масштаб одинаковые.
Что упустил?
«Бритва Оккама» или «Принцип Калашникова»?
 
Шрифт не везде одинаковый. Размер заголовков строк и столбцов во 2-м файле явно больше. Скорее всего книги были созданы на основании разных шаблонов. Плюс в файле 2 куча разных скрытых имен.
Изменено: Дмитрий(The_Prist) Щербаков - 11.11.2020 11:25:08
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Шрифт не везде одинаковый.
Дмитрий, а где разный, в какой ячейке?
Цитата
Дмитрий(The_Prist) Щербаков написал:
Размер заголовков строк и столбцов во 2-м файле явно больше.
это куда посмотреть нужно?
Цитата
Дмитрий(The_Prist) Щербаков написал:
Плюс в файле 2 куча разных скрытых имен.
Удалил, но это никак не повлияло на ширину столбцов.

Что нужно сделать, что бы ширина столбцов стала одинаковая?
Изменено: bedvit - 11.11.2020 11:54:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
а где разный, в какой ячейке?
это и относилось к заголовкам строк и столбцов. Стыдно не знать где это :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, я говорю про причину, а вы пишите про следствие.
Как исправить причину этих расхождений?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
это куда посмотреть нужно?
я вот на это отвечал и показал. Там визуально видно, что размер шрифта у заголовков строк и столбцов разный. Или это так выглядит вопрос про причину? А вот, кстати, причина почему разные заголовки:
Цитата
Дмитрий(The_Prist) Щербаков написал:
Скорее всего книги были созданы на основании разных шаблонов
я не знаю что еще сказать - Вам виднее откуда файлы взялись. Один, скорее всего выгрузка откуда-то. Лечить через Файл -Параметры -Общие -раздел При создании новых книг. Там и видно, что в одном файле размер 10, в другом 11...
Изменено: Дмитрий(The_Prist) Щербаков - 11.11.2020 13:38:31
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Зайдём с другой стороны:) (про размер шрифта в заголовках я видел и вас понял, но это следствие?!). Мне нужна причина, что бы поправить. Моя задача сделать столбцы одинаковой ширины и визуально и по задаваемому размеру. Это можно сделать?
Скрытый текст
Изменено: bedvit - 11.11.2020 13:44:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Мне нужна причина
ну это к экстрасенсам...Я точно не знаю откуда Вы берете эти файлы и кто их создает. Но вопросы точно лучше им задать :) Я лишь показал, где это можно посмотреть и при желании исправить
Цитата
Дмитрий(The_Prist) Щербаков написал:
Лечить через Файл -Параметры -Общие -раздел При создании новых книг
Правда, не уверен, что правка простым же макросом возможна - насколько знаю эти параметры в реестре где-то хранятся.
Изменено: Дмитрий(The_Prist) Щербаков - 11.11.2020 13:48:59
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
и кто их создает
я и сам не знаю. В компании сотрудники ваяют. Мой древний макрос по загрузке фото прислали (пришлось переделать некоторые моменты под win10, пошел по вашему пути)
Цитата
Дмитрий(The_Prist) Щербаков написал:
и при желании исправить
исправить, как я понял, как раз и не получится.

Итак обобщая:
Ширина ячеек (столбцов) измеряется в количестве символов стандартного размера, причем этот "стандарнтный размер" зависит от размера шрифта установленного в разделе при создании новых книг. Другими словами для разных книг этот размер будет разный визуально и в количестве пикселей, хоть и написано и там и там = 8,43 (ширина столбца по умолчанию в новой книге). т.е. показатель "ширина столбца" не валидный в случаях обработки разных файлов для определения размера в пикселях, так местечковая (локальная) переменная. Здесь нужно обыграть как-то этот момент для своей задачи.

Высота ячеек (строк) измеряется в пунктах. Они всегда одинаковы для разных файлов, т.е высота строки = 15 пунктов будет во всех файлах - одинаковой. На практике по замерам 1п высоты = 1 пиксель * 0,75, т.е. 10 пикселей = 7,5 пунктов высоты

Вывод 2: задать ширину столбца в пикселях, т.е. одинаковую для любого файла Excel через ширину столбца - нельзя (танцы с бубнами и с реестром не рассматриваю)
Изменено: bedvit - 11.11.2020 15:03:37
«Бритва Оккама» или «Принцип Калашникова»?
 
Здравствуйте, коллеги!
Виталий, посмотрите на стиль "Обычный" в указанных книгах, а именно на шрифт. В одной книге Calibri 12, в другой Calibri 11. Измените указанный стиль в одной из книг и выглянет солнце.

Как поменять  стиль при создании новых книг написано здесь.
Изменено: sokol92 - 11.11.2020 15:17:25
Владимир
 
sokol92, Владимир, спасибо, помогло.
Т.е. стиль "обычный" прописан в заголовках табличной части? (добавлю инфу в вывод)
Т.е. по теме ответ найден. Коллеги, благодарю.
По своей задаче, не правильным будет подход - менять стили в пользовательских файлах, видимо буду какие то костыли городить через переменную ActiveWorkbook.Styles("Normal").Font.Size, и масштабировать в зависимости от нее ширину столбца.
Не нравится мне все это...
...Как и подозревал, кроме размера шрифта влияет и сам шрифт на пункты ширины столбца, костыль не выдержит таких мучений.
Изменено: bedvit - 11.11.2020 15:27:06
«Бритва Оккама» или «Принцип Калашникова»?
 
Да, когда мы задаем свойство ColumnWidth, то единицей измерения является ширина символа "0" шрифта Normal.

Если нужна ширина в "твердой" валюте, то придется применять коэффициенты, которые можно найти эмпирическим путем. В одной из тем на форуме мы с Михаилом (БМВ) это обсуждали.
Изменено: sokol92 - 11.11.2020 15:32:38
Владимир
 
Владимир, каким образом? для каждого шрифта и размера не вариант прописывать. Нужно что-то другое.
«Бритва Оккама» или «Принцип Калашникова»?
 
Нашел эту тему - Вы в ней тоже поучаствовали. Форум - кладезь мудрости. :)  
Владимир
 
Владимир, спасибо, вспомнил былое :)
Вот накидал функцию (на основании данных по ссылке), для нужной ячейки определяет ширину столбца в пикселях 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
Изменено: bedvit - 11.11.2020 17:34:09
«Бритва Оккама» или «Принцип Калашникова»?
 
Или более универсально, получаем масштаб и далее используем по своему усмотрению.
К примеру, если хотим задать, а не получить ширину столбца в пикселях 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
Изменено: bedvit - 11.11.2020 18:01:01
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх