как сделать одну колонку той-же ширины, что и несколько друг

Программирование на Visual Basic for Applications
atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 09.03.2010 (Вт) 13:16

Доброго времени суток!

Как сделать в Excel'е одну колонку той-же ширины, что и несколько других идущих подряд колонок?

Суммировал ColumnWidth и присваивал результат в ColumnWidth требуемой колонке.
Полученная ширина почему-то меньше, чем надо (глазами вижу)

Всем заранее спасибо.
Последний раз редактировалось atom_nb 09.03.2010 (Вт) 14:31, всего редактировалось 1 раз.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение Денис » 09.03.2010 (Вт) 13:47

Проверьте единицы измерения, в которых задаете ширину.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение alibek » 09.03.2010 (Вт) 14:01

Нужно учитывать границы (по два пиксела) и разделители.
Lasciate ogni speranza, voi ch'entrate.

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 09.03.2010 (Вт) 14:28

alibek писал(а):Нужно учитывать границы (по два пиксела) и разделители.

Я тоже так подумал, вопрос только, как. :) По справке (VBAXL10.CHM) это совсем неочевидно :(

Чтобы не было недоразумений приведу примерный код:
Код: Выделить всё
Sub Макрос1()
'
    Dim i, w, count
    w = 0
    count = 30
    For i = 1 To count
        w = w + Worksheets(1).Columns(i).ColumnWidth
    Next
   
    Worksheets(1).Columns(count + 1).ColumnWidth = w
End Sub


atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 10.03.2010 (Ср) 15:18

:o очень грустно, что так никто путем и не отвечает... :(

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 11.03.2010 (Чт) 4:52

Может возникнуть вопрос, а зачем делать "в Excel'е одну колонку той-же ширины, что и несколько других идущих подряд колонок"?
Заранее отвечу:

Делаю отчет в Excel, в котором колонка таблицы захватывает несколько колонок листа (так надо).
При этом автоподбор высоты строк не работает. :(
При всем моем уважении к Microsoft, не понимаю, что мешало сделать, чтобы работало??? :shock:

Придумал, как победить: делаю на другом (служебном) листе колонки, равные по ширине колонкам выводимой таблицы.
Перед выводим в рабочий лист вывожу данные в служебный, а там автоподбор высоты работает:!:
Ну и затем проставляю строке на рабочем листе высоту, считанную из строки в служебном листе.
Все работает прекрасно, даже классы написал, упрощающие формирование отчетов с итогами и подытогами.
Одна проблема:
как сделать на другом (служебном) листе колонки, равные по ширине колонкам выводимой таблицы :?:
при этом в выводимой таблице колонки захватывают по нескольку (от 5 до 20) колонок листа

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 11.03.2010 (Чт) 5:02

К данному моменту макрос трансформировался до такого
Код: Выделить всё
Sub Макрос1()
    ' Определяем коэффициент пропорциональности
    ' между Column.ColumnWidth и Column.Width
    Worksheets(1).Columns(1).ColumnWidth = 200
    Dim k
    k = Worksheets(1).Columns(1).ColumnWidth / (Worksheets(1).Columns(1).Width + 1)
   
    Dim i, w, count
    w = 0
    count = 30
    For i = 1 To count
        ' Column.Width точнее отражает ширину колонки, чем ColumnWidth
        ' но писать в Column.Width нельзя :(
        w = w + Worksheets(1).Columns(i).Width * k
    Next
   
    Worksheets(1).Columns(count + 1).ColumnWidth = w
End Sub

Ширина колонки задается теперь точнее, но все таки остается небольшая погрешность, особенно заметная при увеличении числа колонок. :(

Поэтому еще раз задаю вопрос знатокам
как сделать на другом (служебном) листе колонки, равные по ширине колонкам выводимой таблицы
при этом в выводимой таблице колонки захватывают по нескольку (от 5 до 20) колонок листа :?:


Всем заранее спасибо

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение Alec » 11.03.2010 (Чт) 19:47

atom_nb писал(а):Делаю отчет в Excel, в котором колонка таблицы захватывает несколько колонок листа (так надо). При этом автоподбор высоты строк не работает.

Как вариант, использовать вместо объединения ячеек форматирование "по центру выделения". Тогда автоподбор высоты работает! Но только если объединяются ячейки в одной строке.
Иногда лучше вовремя остановиться...
И начать заново!

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 12.03.2010 (Пт) 4:42

Alec писал(а):Как вариант, использовать вместо объединения ячеек форматирование "по центру выделения". Тогда автоподбор высоты работает! Но только если объединяются ячейки в одной строке.
Не сразу въехал, что имелось в виду :lol:.
Надо примерно так
Код: Выделить всё
Sub Макрос3()
    Range("A1:J1").Select
    With Selection
        .HorizontalAlignment = xlCenterAcrossSelection
        .WrapText = True
        .MergeCells = False
    End With
    ActiveCell.FormulaR1C1 = _
        "sdadsa sadsadsa asdsadsad sadsa dsads ad asda dsad as"
End Sub
Или так
Код: Выделить всё
Sub Макрос4()
    With Range("A1:J1")
        .HorizontalAlignment = xlCenterAcrossSelection
        .WrapText = True
        .MergeCells = False
    End With
    Cells(1, 1).FormulaR1C1 = _
        "sdadsa sadsadsa asdsadsad sadsa dsads ad asda dsad as"
End Sub
Спасибо! Вполне нормальное решение!
Правда, вопрос с суммированием ColumnWidth, все-таки, остается открытым :wink:

Che
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 27.11.2009 (Пт) 13:33

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение Che » 15.03.2010 (Пн) 15:24

For i = 1 To Count
a = a + Columns(i).ColumnWidth
Next i
Columns(xxx).ColumnWidth = a + Count / 2

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 16.03.2010 (Вт) 10:46

А с чего
Che писал(а):+ Count / 2
Это получено в результате эвристического анализа? :wink:

Che
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 27.11.2009 (Пт) 13:33

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение Che » 16.03.2010 (Вт) 12:15

В идеале нужно определить толщину каждой правой границы ячеек (столбцов), ширину которых ты сумируешь, просуммировать и добавить к полученной сумме. По умолчанию толщина границы 0.5 отсюда Count/2. Да, свойства ".ColumnWidth" и ".Width" имеют разную размерность, посему имеет смысл пользовать одно, а не оба сразу (конечно если нет сильного желания посидеть за приведением размерностей к одному значению).

atom_nb
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 06.03.2010 (Сб) 4:43

Re: как сделать одну колонку той-же ширины, что и несколько друг

Сообщение atom_nb » 16.03.2010 (Вт) 13:13

Che писал(а):По умолчанию толщина границы 0.5 отсюда Count/2.
А как можно получить толщину границы? (Через какие объекты, методы, свойства...)


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList