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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2018-02-03 最終更新日:2018-02-03

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


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


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

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

VBA マクロ 画像

VBA マクロ 画像

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

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


標準スタイルの設定操作

VBA マクロ 画像

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

VBA マクロ 画像

書式設定

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技術解説」の記事

フォルダー・ファイル・ブック・シートの文字制限
Excel2013におけるScreenUpdatingの問題点
Dir関数の制限について
よくあるVBA実行時エラーの解説と対応
Application.Goto使用時の注意
ScreenUpdating=False時にエラー停止後にシートが固まったら
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる
VBAでエラー行位置(行番号)を取得できるErl関数
WorksheetFunction.Matchで配列を指定した場合の制限について
VBAでシート関数使用時の配列要素数制限


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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