社内SEの徒然なる日記

Excelでセル結合無しで範囲内に中央にする

■ 文字位置の調整

Excelで文字をセルの中央にしたい場合、単純に縦横の位置を中央にすれば良いのですが、書式によっては複数のセルに跨るケースが多いと思います(Excel方眼紙とか、ね)。

これまでは、セルを結合して中央に寄せていました。

範囲を選択して、「セルを結合して中央揃え」をクリック。
Excelで範囲内で中央 - 2

無事に、中央に寄りました。
Excelで範囲内で中央 - 1

これしか無いと思っていたのですが、そうでもないようです。

■ 選択範囲内で中央

さっきと同じで、中央寄せしたい範囲を選択します。セルの書式設定から、「配置」タブを表示して、横位置を「選択範囲内で中央」にします。
Excelで範囲内で中央 - 3

すると、これこの通り。セル結合がされていないのに、文字が中央に寄りました。
Excelで範囲内で中央 - 4

セル結合を多用した表って、再利用したり、コピペしようとするとエラーになったりと不自由なので、これは良い手を知りました。

残念なのは、これが機能するのは横位置だけで、縦についてはダメみたいです。縦も出来れば良いんですけどね。

■ 後書き

まぁ、これ以外の方法として、文字自体を工夫するってのもありますかね。

前後に半角スペースを上手くいれて、それらしく見せると。フォントも「MSゴシック」「MS明朝」のように、サイズが一定になるものを上手く使えば、そこそこ良い感じに仕上がります。

ただ、私は使いません。時々、人の作った資料で見かけるのですが、それをメンテナンスすることになった時の編集が大変。自分が嫌なことは、人にもしないということです。

・・・まぁ、そもそもExcelってそういうものじゃないっていわれると困りますけどね。

最新の記事:http://harikofu.blog.fc2.com/
投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end — スポンサードリンク

PageTop

Excelの複数のシートを両面印刷する方法(出来た!)

■ ブック全体を印刷

Excelで、複数のシートにまたがって作成した資料を両面印刷したいケースがあります。

例えば、1枚目を表紙、2枚目以降に詳細、最後のページに変更履歴、そんな作り方をした場合、書式がバラバラになるのでシートを分けて作成することがあります。

サンプルとして、2つのシートを作ってみました。
Excelの両面印刷 - 1

Excelの両面印刷 - 2

これをまとめて印刷する場合、印刷対象を変更することで可能ではあります。

印刷したいシートを全て選択(Shiftキー or Ctrlキーを押しながらシート見出しをクリック)して、印刷対象を「選択したシート」とする方法が一つ。
Excelの両面印刷 - 3

Excelの両面印刷 - 4

もう一つは、印刷対象を「ブック全体」にするですね。
Excelの両面印刷 - 5

Excelの両面印刷 - 6

ここまでは簡単なのですが、やりたいのは両面印刷なのです。

■ 両面印刷

上記の設定方法でブック全体を印刷することは可能になるのですが、印刷時に両面印刷を指定しても、シートの切り替わる箇所で両面印刷が途切れてしまって、途中で片面印刷になってしまいます。

最近のExcelは、標準機能でPDFに出力出来るので、PDFに出力して、そこから両面印刷するようにしていました。これしか出来ないと思っていたのですが、そうでも無いようです。

一つのシートを表紙として、もう一つのシートに詳細を書いていくような資料を作っていたのです。これを印刷する時に、表紙のシートは片面印刷にして、詳細を書いたシートは両面印刷にしたいと思って、前述の方法で印刷したら、何事もなく両面印刷されてしまいました。

・・・流石に、ここで気がつきました。

■ 両面印刷

そもそも、Excelの印刷設定ってシートごとに設定する性質があって、両面印刷についても同じです。

なので、印刷したいシートを選択して印刷対象を「両面印刷」にする。これを両面印刷したい全てのシートに設定してから、ブック全体を印刷すれば、複数のシートであっても途切れずに両面印刷が可能です。

印刷画面のプレビューでページを切り替えていくと、シートが変わったタイミングで印刷設定も変わるので、そこで設定しても良いかと思います。

サンプルだと、こうですね。印刷対象をブック全体にして両面印刷にします。
Excelの両面印刷 - 7

印刷プレビューで2ページ目(2シート目)を表示すると、片面印刷に戻っています。
Excelの両面印刷 - 8

ここで、両面印刷にすれば良いということです。
Excelの両面印刷 - 9

■ 後書き

なお、結果はこうなりました。
Excelの両面印刷 - 10

実のところ、Excelは使いこなしている方だと自分では思っていたのですが、こんな基本的なレベルで躓いているようでは話になりませんね。

しっかりと勉強すれば、もっと色々なことが出来そうなのですが、流石に十数年もExcelを使っていると、日常的に必要な操作については特に困ることもなく実現できているので、その気になりません。

今回の両面印刷についても、PDFに出力してから印刷する方法でも時間のロスって殆ど無い。シート数が多い場合は、早いこともあったりするので、これまた何とも・・・

なんだかなぁ。ですよ。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end — スポンサードリンク

PageTop

ExcelVBAのコーディング規約を作ってみた No.9 処理制限

■ 制限

前回の最後で書いた通り、規約としては前回までで終わっています。また、最初に書いた通り、あまり厳しい規約を作るつもりもないのですが、許してしまうと保守性が大幅に下がるだろう書き方については制限したいところです。

今回、そのあたりのことを書いて最終回としたいと思います。

■ プロシージャの使用方法

プロシージャを呼び出し時、単純にプロシージャ名を書くだけでもエラーにはなりません。なりませんが、CALLステートメントを記述するようにします。

CALL getDateTime()


書き方にもよるのでしょうが、突然プロシージャ名だけがポツンと現れると混乱すると思います。誤解を招かないためにも、きちんと書きましょうってことです。もちろん、戻り値がある場合はCALLは無くてよいですけどね。

・・・これ、呼び出す時のコメントできちんと書いておけば良いとも思いますけどね。

■ End

Endステートメントは、実行した時点でVBAを強制終了する強力な処理です。

問題なのは、Exitステートメントのように呼び出し元に戻るのでは無く「処理自体が終了する」という点です。処理の開始点からプロシージャを実行、そこから関数を呼び出し、さらに関数を呼び出し、この時点でEndステートメント実行とかされると最悪です。

良くあるのが、意図しない状況になった時にEndステートメントを発行するというものですが、そうでは無く、きちんとエラートラップするのが正しい方法だと思います。

もっとも、オブジェクト系のエラーのようにEndステートメントが必要な場合もあるでしょうから、原則論でしかないんですけどね。

■ 後書き

ExcelVBAのコーディング規約、どうだったでしょうか?

時々、情報システム部ではない部門でVBAで作ったシステムが保守でき無くて困っているという話を聞きます。彼らの本職はシステムではないので、どうしても奇妙な作り方になってしまいますが、それに対して愚痴を言ってしまうと「お前たちが何もしてくれないからだ」と反論が返ってきそうです。

現場の動きを止めるのが難しいなら、良い方向に誘導するのも一つの手ではないでしょうか。忙しくて現場対応ができなくても、コーディング規約なんかを整備して開発時の参考にして欲しいと依頼することは可能だと思います。

世界の汚いソースが、少しでも綺麗になることを祈ります。

記事の一覧

ExcelVBAのコーディング規約を作ってみた No.1 始まり

ExcelVBAのコーディング規約を作ってみた No.2 規約の基本構想

ExcelVBAのコーディング規約を作ってみた No.3 規約作成

ExcelVBAのコーディング規約を作ってみた No.4 変数

ExcelVBAのコーディング規約を作ってみた No.5 変数の命名規約

ExcelVBAのコーディング規約を作ってみた No.6 定数

ExcelVBAのコーディング規約を作ってみた No.7 プロシージャ

ExcelVBAのコーディング規約を作ってみた No.8 シート、セル

ExcelVBAのコーディング規約を作ってみた No.9 処理制限



投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end — スポンサードリンク

PageTop

ExcelVBAのコーディング規約を作ってみた No.8 シート、セル

■ シート

随分と続いた「ExcelVBAのコーディング規約を作ってみた」シリーズですが、そろそろ終わりですね。今回は、シートやセルの規約です。

ワークシートの命名規約は、変数の命名規約とほぼ同じ内容。ただし、先頭文字をSとするって感じでどうですかね。
1.先頭文字は、S(半角大文字)固定とする。
2.英数字のみ使用可能とする。
3.意味の区切りで先頭文字を大文字とし、以降を小文字とする。


なお、ここで言っている名称は、ワークシートの名前ではなく、ワークシートのコード名のほうです。さらに、シート参照ではコード名を使用するように限定します。

こういうことですかね。
正:Scsv.Cells(1,1).value = 0
誤:Sheets("CSV作成シート").Cells(1,1).value = 0


シート名でプログラムを書くと、使用者にそれを変更されて動かなくなることが良くあります。そこで、コード名でプログラミングするように規定するのです。

まぁ、それはそれで別の問題が起きそうですが、壊された時の原因調査が楽になるのは間違いないと思います。

■ セル

セルについては、これまでに何回か書いた通りです。つまり、セルへの参照は定数を使用するってことですね。

Public Const C_ROW As Integer = 4
Public Const C_COL As Integer = 7

Private Sub test()
ActiveSheet.Cells(C_ROW, C_COL) = "123456"
End Sub


理由は、これまで書いた通り。参照位置が変わった時の保守性ですね。

■ 後書き

規約としては、今回で終了しても良かったのですが、あと1回だけ続けます。VBAを使うにあたって、止めたほうが良い(と思う)記述方法を制限します。

前回:ExcelVBAのコーディング規約を作ってみた No.7 プロシージャ
次回:ExcelVBAのコーディング規約を作ってみた No.9 処理制限

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end — スポンサードリンク

PageTop

ExcelVBAのコーディング規約を作ってみた No.7 プロシージャ

■ プロシージャ

今回はプロシージャの規約を考えました。考えたと言っても、ここまで定義してきた規約の流れをプロシージャにも適用するだけなんですけどね。

そもそも、今回はロジック部分に強い縛りを入れる予定はないので、命名規約が中心になるのは仕方のないところではないでしょうか。

■ 命名規約

結局、こんな感じに落ち着きますかね。
1.先頭文字は英字の小文字。
2.半角英数字と全角文字のみ使用する。
3.記号は使用しない
4.意味の区切りで先頭文字を大文字、以降を小文字


もうちょっと縛れますが、この程度が無難だと思います。実際には変数の命名規約とほとんど同じですが、先頭文字を縛るのはやめました。

ルールは可能な限り少ないほうがよく、変数とプロシージャを読み間違えるほうが難しいという判断です。

■ 引数

引数の命名規約は前々回(ExcelVBAのコーディング規約を作ってみた No.5 変数の命名規約)で規定していますが、使い方は書いていませんでした。まぁ、使い方といっても、引数の受け取り方くらいですかね。

引数の受け取りには、値渡しと参照渡しがあり、VBAの場合はプログラミング上で明記することが可能です。引数の前にByRefとつければ参照渡し、ByValとつければ値渡しになり、省略した場合は参照渡しでしたかね。

今回の規約では「原則として参照渡しを使用」「渡し方(参照渡し、値渡し)を明記する」としました。

Private Sub test(ByRef pTe As Integer, ByVal pTime As String)


■ コメント

放っておくと、コメントを一切書かない奴が出るので、コメントの記述は規約で強制することにしました。書く内容はケースバイケースでしょうが、機能、引数、返り値、概要、この程度があれば十分でしょうね。

' 機能      : 配列の次元数を調べる関数
'
' 返り値 : Integer型 配列の次元数
'
' 引き数 : pTbl - 配列
'
' 機能説明 : 引数として指定された配列の次元数を返却します
'
' 備考 :
'

Function getTableDimension(ByRef pTbl) As Integer


■ 後書き

私がVBAで気に入っているのは、値渡しと参照渡しをプログラマーが自分で設定できるところです。私は10年近くjavaでプログラミングをしていますが、未だにこの辺りでハマることがあります。

この辺り、「javaは値渡しだけ・・・」「参照型が・・・」とか色々と長い話になりそうですが、私に言わせるとプログラマーにそこまで求める言語仕様に問題を感じます。重要なのは「呼び出し先で引数の値を変更できるのか?」であって、内部的な動作なんてどうでも良い気がしてなりません。

・・・・・・・長い話(愚痴)になりそうなので、ここまでにします。

何にせよ、値渡しと参照渡しが分かりやすいのはVBAの良いところだと思います。

前回:ExcelVBAのコーディング規約を作ってみた No.6 定数
次回:ExcelVBAのコーディング規約を作ってみた No.8 シート、セル

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end — スポンサードリンク

PageTop