列の幅と行の高さを変更する(1)
前回の「見積書の雛形をエクセルVBAで作ろう!(Part 1)」では新規ブックを作成し、先頭のシート名を”見積書表紙”に変更しました。その続きをやっていきましょう。
まずは保存しておいた「VBA練習1」のブック(エクセルファイル)を開いて、VBEを起動してください。この画面が出ましたか? ↓
「見積書表紙」という名前のシートが出来ましたのでこのシートを見積書の形に成形していきましょう。
まずは列の幅を変更し、次に行の高さを変更していきます。↓
列の幅を変更する単位は「文字数」しかないのだが。。。
エクセルの列の幅は”A”や”B”など列見出しを右クリックすると出てくるメニューの中にある「列の幅」で確認することが出来ます。↓
この見積書のB列の幅の数値は4でした。ただ、この4という数字は「私の今使っているエクセル」の場合です。ほかのバージョンのエクセルや、標準フォントが違うエクセルの場合は変わります。
この数字は「エクセルに今設定されている標準フォントの半角数字”0”の文字が何文字入るか」を表す数字です。ですから残念ながら皆さんが共通で使える絶対値として読む事が出来ません。列の幅をVBAで設定する場合は非常に厄介な問題となります。私の環境の「列の幅:4」と他のかたの「列の幅:4」は違う幅になる可能性が高いのです。。。
ほかに列の幅を確認する方法として列見出しの境界線上にマウスを持っていき、ボタンを押したままにする方法があります。この方法だと先ほどの4という「文字数」のほかにカッコ内に55ピクセルという表示が出ています。↓
A列の幅が「55ピクセル」だとわかるのですが残念ながら「ピクセル」を使って設定変更をすることが出来ません。VBAで列幅を変更しようとする場合は先ほど言いました「文字数」で幅を指定する方法しかないようです。。。そこで「55ピクセル」という手掛かりからさまざまなエクセル環境での「文字数」を調べてから列幅を変更しようと思い、いろいろ検索して調べながら何日かかけて試行錯誤しました。
いろいろなサイトを検索して拝見しましたが、この列幅の「文字数」設定を割り出すのは難関なようで、どうしても「ズレ」が出来てなかなか解消出来ませんでした。
最終的には「ピクセル」を使った列幅変更はあきらめ、行の高さ変更に使っている単位と同じ「ポイント」の値で高さ変更を行うことにしました。
列幅の「ポイント」値を調べる
まずは私が持っている見積書雛形のブック(エクセルファイル)でA列からI列の幅のポイント値を調べます。 これはオリジナルをもっている私の仕事(笑)ですので、ご参考として見てください。↓
新しいシートを最後尾に追加して「列幅ポイント値調査」と名前をつけ、そこに調査した列幅のポイント値を書き込んでいます。↓
Option Explicit
Sub 列幅のポイント値を調べる()
' 新しいシートを最後尾に追加してリネーム
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "列幅ポイント値調査"
' 見積書シートのA列からI列の列幅を取得して「列幅ポイント値調査」のシートへ記入
Dim S1 As Worksheet '列幅調査対象のシート
Dim S2 As Worksheet '結果を記入するシート
Dim i As Long 'カウンターの数字
Set S1 = Worksheets("表紙(雛形)") 'ワークシートを代入
Set S2 = Worksheets("列幅ポイント値調査") 'ワークシートを代入
For i = 1 To 9 'カウンターの数字をセット
S2.Cells(1, i).Value = S1.Cells(1, i).Width '列幅ポイントを別シートへ記入
Next
End Sub
結構シンプルに書けたのでこれも解説いたします。 このSubプロシージャには6つの要素があります。↓
① ワークシートを最後尾に追加する ② ワークシートの名前を変更する ③ 変数の宣言をする ④ 宣言した変数に代入する ⑤ For~Next構文で繰り返し処理をする ⑥ セル指定の書き方
① まず最初にワークシートを最後尾に追加しています。
Worksheets.Add after:=Worksheets(Worksheets.Count)
黄色部分は以前新規ブックを作成したWorkbooks.Addと同じメソッド構文ですね。「Workbooks」が「Worksheets」に変わっただけです。 今回は「最後尾に追加」するために青色部分after:=Worksheets()を追記しています。これだけではどのワークシートのafter(後ろ)にしたいのか判りませんのでカッコ内に赤色部分Worksheets.Countが入っています。
ワークシートの集合体(コレクション)「Worksheets」の持っている「プロパティ」のひとつ「.Count」は「カウント」のことで、現在いくつのワークシートがあるのかが判ります。つまり仮に3つのワークシートがあるのならば「Worksheets.Count」は「3」ということです。
ですから赤色部分は「3」となり、after:=Worksheets(3) ということになります。 左から3番目、最終シートのafter(後ろ)にシート追加を指定したことになりました。
② 次に追加したシートの名前を変更しました。
ActiveSheet.Name = "列幅ポイント値調査"
いま追加したばかりなのでアクティブになっている「ActiveSheet」の数あるプロパティの中から「.Name」名前を指定して「=”列幅ポイント値調査”」で値を代入しました。
以前も書きましたが決まりとして、
=(イコール)の左側は情報を受け取る側で、右側は情報を渡す側です。
③ 次は「変数の宣言」です。
Dim S1 As Worksheet '列幅調査対象のシート Dim S2 As Worksheet '結果を記入するシート Dim i As Long 'カウンターの数字
これは「変数」と呼ばれるものを作る宣言です。「変数」は入れ物のようなイメージで良いかと思います。何という名前の入れ物を作るのか、その型は何にするのかを宣言します。
なぜ入れ物を作るのかというと、今回の私の場合は「書き込む文字数を減らしたかったから」と「カウンターの数字を作りたかったから」の2つです。 変数の宣言の書き方はまず、Dimと書いて、半角スペース、「変数名」、半角スペース、As、「データの型」を書きます。↓
Dim S1 As Worksheet
「S1」という名前の変数(入れ物)を作りました。データ型はオブジェクト型です。「Worksheet」と書いてワークシートを入れる宣言をしました。 このほかにも「S2」と「i」という変数を作っています。全部で3つです。 データ型については別の記事でご紹介させていただきます。
④ 次に宣言した変数(入れ物)に中身を入れます。
Set S1 = Worksheets(“表紙(雛形)”) ’ワークシートを代入
Set S2 = Worksheets(“列幅ポイント値調査”) ’ワークシートを代入
Set S1 = Worksheets("表紙(雛形)") 'ワークシートを代入 Set S2 = Worksheets("列幅ポイント値調査") 'ワークシートを代入
オブジェクト型の変数にオブジェクトを入れるときは先頭に「Set」と書くきまりがあります。 「S1」という変数(入れ物)にワークシート「Worksheets(“表紙(雛形)”)」を入れました。 「S2」も同様にワークシート「Worksheets(“列幅ポイント値調査”)」をいれました。
⑤ For~Next構文で繰り返し処理をする。
これから「表紙(雛形)」シート上の「A1セル」の列幅のポイント値を取得して、「列幅ポイント値調査」シート上の「A1セル」に取得した値を書き込みます。
次に「表紙(雛形)」シート上の「B1セル」の列幅のポイント値を取得して、「列幅ポイント値調査」シート上の「B1セル」に取得した値を書き込みます。
次は「C1セル」「D1セル」「E1セル」「F1セル」「G1セル」「H1セル」「I1セル」で同じ処理を行います。 もうおわかりかと思いますが何度も同じ処理を書かなくてはなりません。いやですよね。。
そこで「For~Next構文で繰り返し処理をする」ことにします。
For i = 1 To 9 S2.Cells(1, i ).Value = S1.Cells(1, i ).Width Next
何度も書かなくてはならなかったはずの処理がこの短い3行で終わりました。なんて便利なのでしょう。 はじめに「For」半角スペース、繰り返す回数カウンター(1から9まで)を書いています。ここに先程宣言してあった「 i 」という変数が出てきました。For~Next構文のカウンターに使うために作った変数(入れ物)です。「1 to 9」を代入しました。1から始まり9で終わるカウンターです。 次の行には変数「S1」と「S2」も出てきました。この2つの変数にはすでに「Worksheets(“表紙(雛形)”)」と「Worksheets(“列幅ポイント値調査”)」が代入してあります。
For~Next構文はカウンターを指定し、処理を行い、Nextまできたらカウンターを+1してまたForに戻って同じ処理を繰り返します。Nextまで来るたびにカウンターを+1して繰り返し、カウンターが指定した最後の9を超えて10になったとき処理をやめて終了します。
⑥ For~Next構文の中に書いてあるセル指定の書き方
「S1」と「S2」にワークシートが代入されているのはわかって頂けたかとおもいます。 次につづく「Cells(1, i )」ですが、セルを表しています。カッコ内の「1」は1行目を意味し、「 i 」はカウンターにしていますが何番目の列かを意味しています。 お気づきかもしれませんが、「A1セル」から「 I 1セル」を指定しています。 セルを指定する場合はいくつかの書き方がありますが、カウンターを使って複数の列を処理した場合はこの「Cells(1, i )」の書き方が非常に便利です。この書き方でカッコ内の左側が行番号、右側が列番号になります。仮に「B1セル」を表す場合は「Cells(1, 2 )」となります。
記事が長くなってきましたのでこの辺で休憩にしましょう。