ExcelマクロVBA技術解説 | 標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる | ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2018-02-03

標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる


VBAでスタイルの標準フォントが違うブック間のコピー等の処理では、

列幅や行高の違いが問題となる場合があります。

列幅や行高は、標準スタイルの 1 文字分を基本としているためです。






上の画像は、標準フォントが違うブックにおいて、
同じ列幅20の時の、列幅の表示です。
125ピクセル207ピクセル、大きく違っています。
実際の見た目の幅も大分違います。

マクロVBAで、列幅や行高を設定している場合、
これでは作成されるシートの見た目が大きく違ってしまいます。


標準スタイルの設定操作



ホーム→セルのスタイル→標準を右クリック→変更



書式設定



ここで、各種設定を行います。



VBAでの列幅、行高の設定

列幅の設定

Columns(1).ColumnWidth = 20

行高の設定

Rows(1).RowHeight = 15

先に説明した通り、
この数値は標準スタイルの 1 文字分を基本としているため、
実際のピクセル数は、それぞれのブックに依存することになります。



Styleオブジェクト

StyleオブジェクトはStylesコレクションのメンバーです。

Styleを追加する時は、StylesコレクションのAddメソッドで行います。
本記事では、既に登録されているStyleオブジェクトについてのみ扱います。

Styleオブジェクトのメソッド

名前 説明
Delete オブジェクトを削除します。

Styleオブジェクトのプロパティ

名前 説明
AddIndent セル内の文字列の配置で縦または横位置を均等に割り付けるときに、文字列を自動的にインデントするかどうかを示すバリアント型 (Boolean) の値を取得、または設定します。
Application 対象となるオブジェクトが指定されない場合は、Excel アプリケーション (Application オブジェクト) を返します。
対象となるオブジェクトが指定された場合は、指定されたオブジェクトを作成した Application オブジェクトを返します。
OLE オートメーションを使っていて、オブジェクトのアプリケーションにアクセスするときなどに、このプロパティを使います。値の取得のみ可能です。
Borders スタイルまたはセル範囲 (条件付き書式の一部として定義された範囲を含む) の罫線を表す Borders コレクションを取得します。
BuiltIn True の場合、オブジェクトは組み込みオブジェクトです。値の取得のみ可能です。
ブール型 (Boolean) の値を使用します。
Creator 現在のオブジェクトが作成されたアプリケーションを示す 32 ビットの整数を取得します。
値の取得のみ可能です。長整数型 (Long) の値を使用します。
Font 指定したオブジェクトのフォントを表す Font オブジェクトを取得します。
FormulaHidden シートが保護されているときに、数式を非表示にするかどうかを示すバリアント型 (Boolean) の値を取得、または設定します。
HorizontalAlignment 指定されたオブジェクトの水平方向の配置を表す XlHAlign クラスの定数を取得または設定します。
IncludeAlignment True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、配置の設定 (AddIndent プロパティ、HorizontalAlignment プロパティ、VerticalAlignment プロパティ、WrapText プロパティ、IndentLevel プロパティ、および Orientation プロパティ) を含みます。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。
IncludeBorder True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、罫線の設定 (Color プロパティ、ColorIndex プロパティ、LineStyle プロパティ、および Weight プロパティ) を含みます。
値の取得および設定が可能です。ブール型 (Boolean) の値を使用します。
IncludeFont True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、フォントの設定 Background、Bold、Color、ColorIndex、FontStyle、Italic、Name、Size、Strikethrough、Subscript、Superscript、および Underline プロパティ) を含みます。値の取得および設定が可能です。
ブール型 (Boolean) の値を使用します。
IncludeNumber True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、表示形式の設定 (NumberFormat プロパティ) を含みます。値の取得および設定が可能です。
ブール型 (Boolean) の値を使用します。
IncludePatterns True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、塗りつぶし属性 (Color プロパティ、ColorIndex プロパティ、InvertIfNegative プロパティ、Pattern プロパティ、PatternColor プロパティ、PatternColorIndex プロパティ) を含みます。値の取得および設定が可能です。
ブール型 (Boolean) の値を使用します。
IncludeProtection True の場合、選択されているセルまたはセル範囲のスタイルとして定義されている書式は、保護の設定 (FormulaHidden プロパティ、Locked プロパティ) を含みます。値の取得および設定が可能です。
ブール型 (Boolean) の値を使用します。
IndentLevel 指定されたスタイルのインデントのレベルを表す長整数型 (Long) の値を取得、または設定します。
Interior 指定されたオブジェクトの塗りつぶし属性を表す Interior オブジェクトを取得します。
Locked オブジェクトのロック状態を表すバリアント型 (Boolean) の値を取得、または設定します。
MergeCells True の場合、スタイルに結合セルが含まれます。値の取得および設定が可能です。
バリアント型 (Variant) の値を使用します。
Name オブジェクトの名前を表す文字列型 (String) の値を返します。
NameLocal コード実行時の言語でオブジェクトの名前を設定します。値の取得のみ可能です。
文字列型 (String) の値を使用します。
NumberFormat 指定されたオブジェクトの表示指定されたオブジェクトの表示形式を表す文字列型 (String) の値を取得、または設定します。
NumberFormatLocal 指定されたオブジェクトの表示形式をコード実行時の言語の文字列で表すバリアント型 (String) の値を取得、または設定します。
Orientation 文字の向きを表す XlOrientation クラスの値を取得または設定します。
Parent 指定されたオブジェクトの親オブジェクトを取得します。値の取得のみ可能です。
ReadingOrder 指定されたオブジェクトを読み取る順序を設定します。使用できる定数は、xlRTL (右から左)、xlLTR (左から右)、xlContext のいずれかです。
値の取得および設定が可能です。長整数型 (Long) の値を使用します。
ShrinkToFit 使用可能な列幅に収まるように自動的に文字列を縮小するかどうかを表すブール型 (Boolean) の値を取得、または設定します。
Value 指定されたスタイルの名前を表す文字列型 (String) の値を返します。
VerticalAlignment 指定されたオブジェクトの垂直方向の配置を表す XlVAlign クラスの値を取得または設定します。
WrapText オブジェクト内のテキストを折り返すかどうかを表すバリアント型 (Boolean) の値を取得、または設定します。

このように多数のプロパティが存在します。

今回は、Fontについて以下にて扱います。



標準スタイルのフォントをブック間でコピーする

Book2の標準フォントをBook1にコピーします。

 Sub sample1()
  Dim wb1 As Workbook
  Dim wb2 As Workbook
  Dim myFont As Font
  Dim myCols As New Collection
  Set wb1 = Workbooks("Book1.xlsm")
  Set wb2 = Workbooks("Book2.xlsm")
  
  With myCols
    wb2.Activate
    Set myFont = wb2.Styles("Normal").Font
    .Add Item:=myFont.Name, Key:="Name"
    .Add Item:=myFont.Size, Key:="Size"
    .Add Item:=myFont.Bold, Key:="Bold"
    .Add Item:=myFont.Italic, Key:="Italic"
    .Add Item:=myFont.Underline, Key:="Underline"
    .Add Item:=myFont.Strikethrough, Key:="Strikethrough"
    .Add Item:=myFont.ThemeColor, Key:="ThemeColor"
    .Add Item:=myFont.TintAndShade, Key:="TintAndShade"
    .Add Item:=myFont.ThemeFont, Key:="ThemeFont"
    
    wb1.Activate
    Set myFont = wb1.Styles("Normal").Font
    myFont.Name = myCols("Name")
    myFont.Size = myCols("Size")
    myFont.Bold = myCols("Bold")
    myFont.Italic = myCols("Italic")
    myFont.Underline = myCols("Underline")
    myFont.Strikethrough = myCols("Strikethrough")
    myFont.ThemeColor = myCols("ThemeColor")
    myFont.TintAndShade = myCols("TintAndShade")
    myFont.ThemeFont = myCols("ThemeFont")
  End With
End Sub

少々回りくどいVBAコードとなっていますが、
アクティブブックでなければ、スタイルを正しく取得することが出来ません。

上のVBAでは、Collectionオブジェクトを使っています。
配列やDictionaryでも同じことが出来ます。

Book2をアクティブにして、標準フォントの情報をCollectionに格納
そして、
Book1をアクティブにして、格納されているCollectionを使って標準フォントを設定しています。



標準フォントが違うブック間の列幅・行高をピクセルで合わせる

Sub sample2()
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim dblCal As Double
  Set ws1 = Workbooks("Book1.xlsm").Worksheets(1)
  Set ws2 = Workbooks("Book2.xlsm").Worksheets(1)
  Do Until Abs(1 - dblCal) < 0.01
    dblCal = (ws2.Columns(1).Offset(, 1).Left - ws2.Columns(1).Left) _
        / (ws1.Columns(1).Offset(, 1).Left - ws1.Columns(1).Left)
    ws1.Columns(1).ColumnWidth = ws1.Columns(1).ColumnWidth * dblCal
  Loop
End Sub

Sub sample3()
  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim dblCal As Double
  Set ws1 = Workbooks("Book1.xlsm").Worksheets(1)
  Set ws2 = Workbooks("Book2.xlsm").Worksheets(1)
  Do Until Abs(1 - dblCal) < 0.01
    dblCal = (ws2.Rows(1).Offset(1).Top - ws2.Rows(1).Top) _
        / (ws1.Rows(1).Offset(1).Top - ws1.Rows(1).Top)
    ws1.Rows(1).RowHeight = ws1.Rows(1).RowHeight * dblCal
  Loop
End Sub

sample2が列幅をピクセルで合わせています。
sample3が行高をピクセルで合わせています。

Do〜Loopで誤差が0.01以下になるまで、繰り返すようにしています。
元々の差異が大きい場合、
一回の実行では、数値誤差で同じピクセル数にならないからです。



Excelには、各種の標準設定を変更できる機能があります。
しかし、
スタイルだけではなく、各種の標準設定はあまり変更すべきではありません。
・複数の人でExcelファイルを共有する場合
・複数のブックを同時に扱う場合
このような場合は、標準を変更してしまう事はトラブルの元となります。

Excelでは、標準を変更しなくても同じことはできるようになっています。
標準を変更して使うメリットは、シート作成時の省力化ですが、
・1セルに設定したら、それを他のセルにコピペ
・1シートに設定したら、それを他のシートにコピペ
結果として、それほどの作業時間の違いはありません。

もちろん、
自分専用で使うExcelなら、好きなようにすれば良いことは言うまでもありません。




同じテーマ「マクロVBA技術解説」の記事

入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)
実行時にトラップ可能なエラー番号一覧
フォルダー・ファイル(ブック)・シートの文字制限
Excel2013におけるScreenUpdatingの問題点
Dir関数の制限について
よくあるVBA実行時エラーの解説と対応
Application.Goto使用時の注意
ScreenUpdating=False時にエラー停止後にシートが固まったら
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる

新着記事 ・・・新着記事一覧を見る

数値範囲で表検索するVLOOKUP近似一致|エクセル関数超技(10月5日)
エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.定数と型宣言文字(Const)|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.繰り返し処理(For Next)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • 標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

    本文下部へ

    ↑ PAGE TOP