○第55回目 ちょっとした工夫、サブルーチン化
いろいろマクロを作りましたので、ショートカットで動くものはいいのですが、その実行が、Alt+F8から該当のマクロを選択し実行となると、後ろにあるものは、該当のものにたどり着くまで大変になってきます。手間がかかり、面倒臭くなってきます。
ショートカットも限られているのでなんとならないのか、という対応です。
対応はシンプルです。
各マクロをサブルーチン化した親マクロを作り、その中で作業区分を入力するようにすれば、ショートカットキーは最初の親マクロを呼び出すだけですみます。後は画面で、動かしたい処理の番号を入力すればいいことになります。
今まで紹介したマクロのように、他と独立したもの(変数の受け渡しがない)をサブルーチン化するのはとても簡単です。
ここでマクロを特定するのは、Sub文の後のマクロ名です。
Sub 親マクロ()
dim kubun
'処理区分の入力。
kubun = InputBox("処理区分を入れてください。" & _
"1=⇒子マクロ01の処理" & vbCrLf & _
"2=⇒子マクロ02の処理" & vbCrLf & _
"3=⇒子マクロ03の処理" & vbCrLf & _
"5=⇒子マクロ05の処理" & vbCrLf & _
"9=⇒子マクロ09の処理" ", xpos:=2000, ypos:=3000, Default:=1)
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
Select Case kubun
'子マクロ01の処理
Case "1"
子マクロ01 'マクロ名を指定します
'子マクロ02の処理
Case "2"
子マクロ02
'子マクロ03の処理
Case "3"
子マクロ03
'子マクロ05の処理
Case "5"
子マクロ05
'子マクロ05の処理
Case "9"
子マクロ05
Case Else
Exit Sub
End Select
End Sub
上記のように、Case文の次の行に、マクロの名前を書けばいいのです。
変数はそれぞれのマクロで定義しているのでそれが使われます、改めて気にする必要はありません。
こうすれば、親マクロにショートカットキーをあてがっておけばいいことになります。
vbCrLf は、メッセージボックス内の改行を表しています。ですから、各選択肢は、1行単位で表示されることになります。余り多いとメッセージボックスに表示できない場合があるようです。
メッセージボックスでの表示の感じは、マクロを全部作らなくても、上記の例で言えば、"Select Case kubun"文の前の行に、exit Sub文を入れれば、簡単にわかります。試してみてください。
※それぞれのマクロで、実行前のセル等の指定の仕方が異なる可能性が高いので、マニュアルを作るなりして間違えないようにしてください。
第47回からはじめた、"ちょっとした小物"をまとめて、サブルーチン化するのもいいのではないでしょうか。
2007年10月31日水曜日
2007年10月27日土曜日
第54回目 ちょっとした小物、その他編
○第54回目 ちょっとした小物、その他編
小物その他編です。
1.セルの結合
2.セルの結合の解除
3.文字を中央(横)にセット
4.文字を中央(縦)にセット
5.連番入力
6.エクセルで使用できるユーザー関数
1から4については、操作マクロ記録でマクロをとってください。1の場合は合わせて文字中央(横及び縦)を入れてください。通常はそのように使うはずです。
基本的なコマンドとまとめておきます
基本的なコマンド(範囲を指定した後に実行)
・セルの結合
Selection.Merge
・セルの結合を解除
Selection.UnMerge
・字を横中央に
Selection.HorizontalAlignment = xlCenter
・文字を縦中央に
Selection.VerticalAlignment = xlCenter
5.連番入力
これは指定範囲に連番を入れるマクロです。
付加機能としては、
(1)縦だけでなく横も出来る
(2)スタートの値が決められる(通常は最初のセルに入っている値を元にする)
(3)1だけでなく、任意の飛び数が決められる
詳しく説明すると
(1)指定範囲の座標によります。最初と最後で行が変わっていれば縦、列が変わっていれば横と判断します。指定範囲の座標取得、gyo1とgyo9が等しいか否かです。
(2)input関数による指定
InputBox("最初の数値を入れてください。そのままは、0", , 0)
(3)input関数による指定
InputBox("偏差を入れてください。通常は、1 ", , 1)
となります。
具体的に番号をセルにいれるのは、縦横で別処理になります。
一例として、
If flag1 = 1 Then '横方向のコピー
For i = 1 To retu_cnt
Cells(gyo11, retu11 + i) = Cells(gyo11, retu11) + i * no1
Next i
End If
6.エクセルで使用できるユーザー関数
自分で定義した関数をエクセル本体で使うということです。
関数の入力は、Alt+I+Fで呼び出します。その中で"関数の定義"の中で"ユーザー定義"を選択すると、ユーザー関数として定義したものが使用できます。
Function 加重按分01(ByVal nn1, nn0, mm, keta As Double) As Double
'nn1は個別値,nn0は合計値,mmは按分したいもの,ketaは四捨五入した時の桁
加重按分01 = Round(mm * (nn1 / nn0), keta)
End Function
というように、モジュールに書き込みます。
subからFunctionを呼び出す時は、
xx = 加重按分01(SS1,SS2,SS3,SS4)
( )内に変数を記述ということが通常のマクロとは違うところです。
四つの変数には、呼び出す前に計算の元となる数値を入れておいてください。
エクセルの中での使用の仕方は、Alt+I+Fで該当する関数を選ぶと選択形式になって簡単に記述できます。
直接、計算式を作る場合は、"=加重按分01(D21,D8,D11,D6)"とセルに書き込めばいいのです。
よく使う計算式をマクロで作って本体のエクセルで使う、という芸当が出来るようになります。オーダーメイドでかっこいい、という感じでしょうか。
筆者の場合は、列番号を列記号に変換する関数をユーザー定義関数として使っています。
しかし、エクセルの機能があまりに広いので、特別にほかに作る必要性がなかなか見つからないと思いますが、ニーズをかぎ分ける嗅覚を敏感にすると出てくるかもしれません(この方式があること自体考えたことがないというのが正直なところなのでないでしょうか。有効活用を本気になって考えてみれば宝の山…、かも知れません)。
小物その他編です。
1.セルの結合
2.セルの結合の解除
3.文字を中央(横)にセット
4.文字を中央(縦)にセット
5.連番入力
6.エクセルで使用できるユーザー関数
1から4については、操作マクロ記録でマクロをとってください。1の場合は合わせて文字中央(横及び縦)を入れてください。通常はそのように使うはずです。
基本的なコマンドとまとめておきます
基本的なコマンド(範囲を指定した後に実行)
・セルの結合
Selection.Merge
・セルの結合を解除
Selection.UnMerge
・字を横中央に
Selection.HorizontalAlignment = xlCenter
・文字を縦中央に
Selection.VerticalAlignment = xlCenter
5.連番入力
これは指定範囲に連番を入れるマクロです。
付加機能としては、
(1)縦だけでなく横も出来る
(2)スタートの値が決められる(通常は最初のセルに入っている値を元にする)
(3)1だけでなく、任意の飛び数が決められる
詳しく説明すると
(1)指定範囲の座標によります。最初と最後で行が変わっていれば縦、列が変わっていれば横と判断します。指定範囲の座標取得、gyo1とgyo9が等しいか否かです。
(2)input関数による指定
InputBox("最初の数値を入れてください。そのままは、0", , 0)
(3)input関数による指定
InputBox("偏差を入れてください。通常は、1 ", , 1)
となります。
具体的に番号をセルにいれるのは、縦横で別処理になります。
一例として、
If flag1 = 1 Then '横方向のコピー
For i = 1 To retu_cnt
Cells(gyo11, retu11 + i) = Cells(gyo11, retu11) + i * no1
Next i
End If
6.エクセルで使用できるユーザー関数
自分で定義した関数をエクセル本体で使うということです。
関数の入力は、Alt+I+Fで呼び出します。その中で"関数の定義"の中で"ユーザー定義"を選択すると、ユーザー関数として定義したものが使用できます。
Function 加重按分01(ByVal nn1, nn0, mm, keta As Double) As Double
'nn1は個別値,nn0は合計値,mmは按分したいもの,ketaは四捨五入した時の桁
加重按分01 = Round(mm * (nn1 / nn0), keta)
End Function
というように、モジュールに書き込みます。
subからFunctionを呼び出す時は、
xx = 加重按分01(SS1,SS2,SS3,SS4)
( )内に変数を記述ということが通常のマクロとは違うところです。
四つの変数には、呼び出す前に計算の元となる数値を入れておいてください。
エクセルの中での使用の仕方は、Alt+I+Fで該当する関数を選ぶと選択形式になって簡単に記述できます。
直接、計算式を作る場合は、"=加重按分01(D21,D8,D11,D6)"とセルに書き込めばいいのです。
よく使う計算式をマクロで作って本体のエクセルで使う、という芸当が出来るようになります。オーダーメイドでかっこいい、という感じでしょうか。
筆者の場合は、列番号を列記号に変換する関数をユーザー定義関数として使っています。
しかし、エクセルの機能があまりに広いので、特別にほかに作る必要性がなかなか見つからないと思いますが、ニーズをかぎ分ける嗅覚を敏感にすると出てくるかもしれません(この方式があること自体考えたことがないというのが正直なところなのでないでしょうか。有効活用を本気になって考えてみれば宝の山…、かも知れません)。
2007年10月24日水曜日
第53回目 ちょっとした小物、罫線編-2
○第53回目 ちょっとした小物、罫線編-2
とんだところに北村大膳。
よほどのところに顔を出したのでしょうね。
思わぬ展開になって前回は長くなってしまいました。当初は今回分の合わせて、1回の予定でしたのですが…。
とんだところに、"冗長性"という事務屋にとって避けたい用語が出てきたので、捨て置けずに、踏み込んでしまいました。
操作マクロ関係は、機能だけでその内容など気にしていませんでしたので、捨て置きましたが、第53回の段階においてどうだといわれると、"美しくない"という気持ちが起きてしまい、つい寄道をしてしまいました。
続きを続けます。
今回は二つです。
1.罫線ダイアログを出す
2.五飛びに横罫線を引く
です。
1.はただ単に知っているかいないかという代物です。
命令は、
Application.Dialogs(xlDialogBorder).Show
だけです。
この構文では、( )の中が命になっています。
ではほかには何があるのでしょうか。
あんちょこによると、
xlDialogPageSetup 印刷・ページセットアップ
xlDialogSort ソート
xlDialogOpen ファイルを開く
xlDialogSaveAs 名前をつけて保存
xlDialogFormatNumber 文字表示書式
xlDialogAlignment 文字配置書式
xlDialogActiveCellFormat 文字フォント書式
xlDialogBorder 罫線設定
となっています。
漠然としていますので、何かで役立ててください、ということくらいのコメントでしょうか。
次に、五飛びの横罫線(縦罫線は実線で毎列に引く)です。
まず、五飛びの罫線の引きたい範囲を与えます。=⇒実行前に指定
そして、飛び数を与えます初期値は5としています。=⇒InputBox()関数で指定
前提条件としては、範囲の一番上及び一番下の罫線は実線で引きます、ということ。
次に、必ずしも一番下がぴったりするということではないということ。
また、既存で引かれている線をクリアしておくこと。
この3点が、気をつけたい点でしょうか。
手順を求めると、
1.範囲内の既存の線をクリアする
2.範囲の枠線を引く
3.範囲内の縦線を引く
4.五飛びの行を指定して横線を引く
設定範囲の座標の取得はいいですね。何事をするにも基本命令群です。
1.は、 selection.Borders.LineStyle = xlnone
2.は、 Selection.BorderAround LineStyle := xlContinuous
3.は、 Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
4.は、最初の行がgyo1ですので、次に横線を引くのはgyo+5となります(5はパラメータで与えるので実際は変数となる)。これをgyo9を越える範囲で行なう、ということになります。
指定するセルの上に横線を引くという指定にします。
指定するセルは、
range(cells(gyo1+i-1,retu1),cells(gyo1+i-1,retu9)).select
となります(iは1から始まる)。
セルの上の線を引くのは、
Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
となります。
for next文を使い、適切なところまで横線を引いていきます。
for next文の最後は、きっちりあわなくても大丈夫です。これを越えたらおしまいですという数値をあてがえばいいことになります。
このコントロールで、商を求める必要がありますが、
商は、(a \ 5) で求められます。
5行しかない時は、一回も線は引きません(上の線はすでに引かれています)。
6-10行の時は、一回だけ線を引きます。
11-14行の時は、二回だけ線を引きます。
後は、考えればマクロを組みことが出来ます。
もう少しヒントを…
指定範囲の行数は、gyo_cntです。
すると横線を引く回数は、(gyo_cnt-1)割る5の商となります。この間をiで動かします。
横線を引くセルの行数は、gyo1+i*5となります。
一瞬にして五飛びの線が引かれます。手作業でやっていた方にとっては感動ものです。
とんだところに北村大膳。
よほどのところに顔を出したのでしょうね。
思わぬ展開になって前回は長くなってしまいました。当初は今回分の合わせて、1回の予定でしたのですが…。
とんだところに、"冗長性"という事務屋にとって避けたい用語が出てきたので、捨て置けずに、踏み込んでしまいました。
操作マクロ関係は、機能だけでその内容など気にしていませんでしたので、捨て置きましたが、第53回の段階においてどうだといわれると、"美しくない"という気持ちが起きてしまい、つい寄道をしてしまいました。
続きを続けます。
今回は二つです。
1.罫線ダイアログを出す
2.五飛びに横罫線を引く
です。
1.はただ単に知っているかいないかという代物です。
命令は、
Application.Dialogs(xlDialogBorder).Show
だけです。
この構文では、( )の中が命になっています。
ではほかには何があるのでしょうか。
あんちょこによると、
xlDialogPageSetup 印刷・ページセットアップ
xlDialogSort ソート
xlDialogOpen ファイルを開く
xlDialogSaveAs 名前をつけて保存
xlDialogFormatNumber 文字表示書式
xlDialogAlignment 文字配置書式
xlDialogActiveCellFormat 文字フォント書式
xlDialogBorder 罫線設定
となっています。
漠然としていますので、何かで役立ててください、ということくらいのコメントでしょうか。
次に、五飛びの横罫線(縦罫線は実線で毎列に引く)です。

まず、五飛びの罫線の引きたい範囲を与えます。=⇒実行前に指定
そして、飛び数を与えます初期値は5としています。=⇒InputBox()関数で指定
前提条件としては、範囲の一番上及び一番下の罫線は実線で引きます、ということ。
次に、必ずしも一番下がぴったりするということではないということ。
また、既存で引かれている線をクリアしておくこと。
この3点が、気をつけたい点でしょうか。
手順を求めると、
1.範囲内の既存の線をクリアする
2.範囲の枠線を引く
3.範囲内の縦線を引く
4.五飛びの行を指定して横線を引く
設定範囲の座標の取得はいいですね。何事をするにも基本命令群です。
1.は、 selection.Borders.LineStyle = xlnone
2.は、 Selection.BorderAround LineStyle := xlContinuous
3.は、 Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
4.は、最初の行がgyo1ですので、次に横線を引くのはgyo+5となります(5はパラメータで与えるので実際は変数となる)。これをgyo9を越える範囲で行なう、ということになります。
指定するセルの上に横線を引くという指定にします。
指定するセルは、
range(cells(gyo1+i-1,retu1),cells(gyo1+i-1,retu9)).select
となります(iは1から始まる)。
セルの上の線を引くのは、
Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
となります。
for next文を使い、適切なところまで横線を引いていきます。
for next文の最後は、きっちりあわなくても大丈夫です。これを越えたらおしまいですという数値をあてがえばいいことになります。
このコントロールで、商を求める必要がありますが、
商は、(a \ 5) で求められます。
5行しかない時は、一回も線は引きません(上の線はすでに引かれています)。
6-10行の時は、一回だけ線を引きます。
11-14行の時は、二回だけ線を引きます。
後は、考えればマクロを組みことが出来ます。
もう少しヒントを…
指定範囲の行数は、gyo_cntです。
すると横線を引く回数は、(gyo_cnt-1)割る5の商となります。この間をiで動かします。
横線を引くセルの行数は、gyo1+i*5となります。
一瞬にして五飛びの線が引かれます。手作業でやっていた方にとっては感動ものです。
2007年10月20日土曜日
第52回目 ちょっとした小物、罫線編
○第52回目 ちょっとした小物、罫線編
これはすでに出てきているものですが、操作マクロであるために、整理して紹介はしてはいませんでしたので、罫線関係ということで紹介します。
エクセルの操作(データ入力ではありません)で何が一番よく使いますか。
その中にコピー関係、印刷関係はまずあがってくるでしょう。他にはどうでしょうか。
文字の表示関係と並んで罫線関係があるのではないでしょうか。
エクセルはまずは白紙の紙ですので、いつかの段階で罫線を引く必要が出てきます。
ということで、今回からは"罫線関係"です。
まず、多いのは無条件に罫線を引いてしまえということではないでしょうか(1.)。この反対として、無条件に消してしまえ(2.)というのも、人によっては頻度が多いのかもしれません。
罫線ダイアログを出す(3.)、というのはどうでしょうか。通常は、Ctrl+1のあとタブをたぐる、という操作になります。それを一気に表示させてしまおうというものです。
これからは個人のニーズいかんになってしまいますが、
4.五とびに横線を引く(五は一例。飛び飛びに引く機能)
5.細線の横線を引く
6.太線の枠線を引く
使われるものとしては、これくらいしか考えつきません。
5と6は、1と2と同様にマクロの記録をとれば(Alt+T+M+R)、完了ですので省略します。
1として、マクロの記録をとったもの(メインの部分)を次に掲げます。
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
ちょっと冗長的ですが、考えなしにできるのが、メリットです。
このマクロは1行指定の場合はエラーが出てしまいますが、気にせず終了させてください。
冗長的、ここまでこの連載を重ねた後では気になりますね。
あんちょこを見ていたら…
Range("A1:C5").Borders.LineStyle = xlContinuous
だけで、A1:C5に格子状に実線が引かれます。
Range("A1:C5").select
と範囲を指定して、
selection.Borders.LineStyle = xlContinuous
でも大丈夫です。
ばかばかしいほど省力化ができました。
※実行に当たってはSubとEnd Subで囲んでください。
全部削除は、
selection.Borders.LineStyle = xlnone
です。
操作マクロの記録より簡単なコマンドになりますので、5と6用の変数をまとめておきます。
細線(xlHairLine)
セル範囲内の横罫線(xlInsideHorizontal)
Selection.Borders(xlInsideHorizontal).Weight = xlHairLine
セル範囲内の縦罫線(xlInsideVertical)
例は省略
※普通の実線は、 Weight = xlThin となります。
中太線(xlMedium)
枠線(BorderAround)
Selection.BorderAround LineStyle := xlContinuous
Selection.BorderAround Weight = xlThick
太線(xlThick)
例は省略
これらを使った例です(範囲を指定してからの例になります)。
Sub Line_10()
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).Weight = xlHairline
Selection.BorderAround Weight:=xlThick
End Sub
実行すると、周りが太線、内部の横線が極細線、内部の縦線が普通の太さ(細線)となります。
※一般的に、指定していない部分はデフォルト値になりますのでその点は留意してください。
これはすでに出てきているものですが、操作マクロであるために、整理して紹介はしてはいませんでしたので、罫線関係ということで紹介します。
エクセルの操作(データ入力ではありません)で何が一番よく使いますか。
その中にコピー関係、印刷関係はまずあがってくるでしょう。他にはどうでしょうか。
文字の表示関係と並んで罫線関係があるのではないでしょうか。
エクセルはまずは白紙の紙ですので、いつかの段階で罫線を引く必要が出てきます。
ということで、今回からは"罫線関係"です。
まず、多いのは無条件に罫線を引いてしまえということではないでしょうか(1.)。この反対として、無条件に消してしまえ(2.)というのも、人によっては頻度が多いのかもしれません。
罫線ダイアログを出す(3.)、というのはどうでしょうか。通常は、Ctrl+1のあとタブをたぐる、という操作になります。それを一気に表示させてしまおうというものです。
これからは個人のニーズいかんになってしまいますが、
4.五とびに横線を引く(五は一例。飛び飛びに引く機能)
5.細線の横線を引く
6.太線の枠線を引く
使われるものとしては、これくらいしか考えつきません。
5と6は、1と2と同様にマクロの記録をとれば(Alt+T+M+R)、完了ですので省略します。
1として、マクロの記録をとったもの(メインの部分)を次に掲げます。
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
ちょっと冗長的ですが、考えなしにできるのが、メリットです。
このマクロは1行指定の場合はエラーが出てしまいますが、気にせず終了させてください。
冗長的、ここまでこの連載を重ねた後では気になりますね。
あんちょこを見ていたら…
Range("A1:C5").Borders.LineStyle = xlContinuous
だけで、A1:C5に格子状に実線が引かれます。
Range("A1:C5").select
と範囲を指定して、
selection.Borders.LineStyle = xlContinuous
でも大丈夫です。
ばかばかしいほど省力化ができました。
※実行に当たってはSubとEnd Subで囲んでください。
全部削除は、
selection.Borders.LineStyle = xlnone
です。
操作マクロの記録より簡単なコマンドになりますので、5と6用の変数をまとめておきます。
細線(xlHairLine)
セル範囲内の横罫線(xlInsideHorizontal)
Selection.Borders(xlInsideHorizontal).Weight = xlHairLine
セル範囲内の縦罫線(xlInsideVertical)
例は省略
※普通の実線は、 Weight = xlThin となります。
中太線(xlMedium)
枠線(BorderAround)
Selection.BorderAround LineStyle := xlContinuous
Selection.BorderAround Weight = xlThick
太線(xlThick)
例は省略
これらを使った例です(範囲を指定してからの例になります)。
Sub Line_10()
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).Weight = xlHairline
Selection.BorderAround Weight:=xlThick
End Sub
実行すると、周りが太線、内部の横線が極細線、内部の縦線が普通の太さ(細線)となります。
※一般的に、指定していない部分はデフォルト値になりますのでその点は留意してください。
2007年10月17日水曜日
第51回目 ちょっとした小物、計算式を文字化してコピー編
○第51回目 ちょっとした小物、計算式を文字化してコピー編
(休暇のため朝一番で掲載します)
通常とは違った計算式のコピーをします。これは前(第40回)にも出てきたものですが、結構利用価値があります。
なかなか一般的な類型としての使用例は浮かばないのですが、ちょっとした時便利さを感じます。
筆者がよく使う例は、計算式のチェックのときです。
単純なものはいいのですが、他のシートのものを使っているとか、計算が複雑な場合とか、計算式を分割してチェックすることがあります。その際に使います。
チェックしたいセルの下に6行ぐらい行を挿入します。そこにチェックしたい計算式を文字化したものを複数コピーします。
コピーした文字化された計算式を、複数に分割します。それを計算式化するのです。すると、使っている数値や中途経過がわかります。分割したものでチェックして、そこが正しければ、全体の計算式が正しいということになります。
ほかの例としては、単純にそのままコピーした方が、その後で修正しやすいといった場合でしょうか。通常コピーの場合、座標が動いてしまいます。
《マクロの例》
'範囲を指定して実行する。
'計算式のあるセルの計算式に特殊な記号を付加して文字化する
Dim CCC As Object
For Each CCC In Selection
If CCC.HasFormula = True Then
CCC = "xxx" & CCC.Formula
End If
Next
※逆の処理は、第40回を見てください(通常処理の置換え処理をもとにしたものです)。
※本日もその適用事例がありました。計算式を画面に出し、画面で見て、どこで区切ったら、チェックがスムーズにいくかと分析していると疲れてしまいましたので、文字化された式をコピーしテキストに移して印刷してから取り掛かりましたが、結果的にはそれのほうが早かったです。エクセルとテキストエディタの間の行き来がスムーズにいくともっといいなあという感想でした。
通常はAlt+tabで起動している画面の一覧を出して、それから選択するという操作をしますが、もっとスムーズなものがないでしょうか。研究したいと思います。
【作業手順】
1.チェックしたいセルの下に6行ぐらい行を挿入する。
2.エクセルで計算式を文字化する。文字化したものをCtrl+C
(テキストエディタに移動)
3.Ctrl+Vでテキストエディタに張り付ける。
4.テキストエディタの中で、式を分解・加工する。この段階で計算式にしてよい。
5.式をTABで結ぶ(=計算式1[TAB]=計算式2[TAB]=計算式3[TAB]=計算式4)。全体をCtrl+C。TABで結ぶのは、一括変換をすれば簡単です。改行をタブに変えればいいのです。
(エクセルに移動)
6.エクセルに戻って、計算式を入れたい場所でCtrl+Vし、計算式を張り付ける。各セルに計算式がコピーされます。
7.各パーツの計算式の結果をチェックする。
8.範囲指定をして該当する場所を印刷(これもマクロ化すると便利)して、記録として残す。
例
xxx=($EU17-P17-EC17)*((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))*GE17
この計算式を、テキストエディタにはりつけ、チェック用に分解する。
=($EU17-P17-EC17)
=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))
=(CW17-CV17)
=(Q17-P17+CW17+EA17-EC17)
=GE17
これを、改行をTABに変換し、エクセルにコピーする。
=($EU17-P17-EC17)[TAB]=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))[TAB]=(CW17-CV17)[TAB]=(Q17-P17+CW17+EA17-EC17)[TAB]=GE17
すると、5つのセルに計算結果が表示される。
これを印刷するなりして、チェックする。
※エクセルの中ですべて行ってもかまいません。
※該当する箇所を範囲印刷する際に、改ページが挿入されている場所を含めた場合は、2ページに分かれて印刷されてしまいます。スマートではないので何とかならないのかと思っています
※この機能と前回の文字のコピーの機能を合体させて、計算式を文字化して、張り付けるという一連の処理にすることも考えられます。エクセル内で処理を行なう場合は、操作が少なくなりますので、これを目標としてマクロを作成したらどうでしょうか。
すでにコピーものと指定は終わっていますので、あとは貼付け先の指定と貼付けになります。さらに、最後に計算式化を入れて、元に戻すというのはどうでしょうか。
【手順】
(範囲を指定して実行する)
計算式のあるセルの計算式に特殊な記号を付加して文字化する
文字化したものをコピーする
貼付け先を指定し、張り付ける
元の場所に戻り、文字化したものを計算式に戻す。
このレベルになると、かなり便利になってきます。
(休暇のため朝一番で掲載します)
通常とは違った計算式のコピーをします。これは前(第40回)にも出てきたものですが、結構利用価値があります。
なかなか一般的な類型としての使用例は浮かばないのですが、ちょっとした時便利さを感じます。
筆者がよく使う例は、計算式のチェックのときです。
単純なものはいいのですが、他のシートのものを使っているとか、計算が複雑な場合とか、計算式を分割してチェックすることがあります。その際に使います。
チェックしたいセルの下に6行ぐらい行を挿入します。そこにチェックしたい計算式を文字化したものを複数コピーします。
コピーした文字化された計算式を、複数に分割します。それを計算式化するのです。すると、使っている数値や中途経過がわかります。分割したものでチェックして、そこが正しければ、全体の計算式が正しいということになります。
ほかの例としては、単純にそのままコピーした方が、その後で修正しやすいといった場合でしょうか。通常コピーの場合、座標が動いてしまいます。
《マクロの例》
'範囲を指定して実行する。
'計算式のあるセルの計算式に特殊な記号を付加して文字化する
Dim CCC As Object
For Each CCC In Selection
If CCC.HasFormula = True Then
CCC = "xxx" & CCC.Formula
End If
Next
※逆の処理は、第40回を見てください(通常処理の置換え処理をもとにしたものです)。
※本日もその適用事例がありました。計算式を画面に出し、画面で見て、どこで区切ったら、チェックがスムーズにいくかと分析していると疲れてしまいましたので、文字化された式をコピーしテキストに移して印刷してから取り掛かりましたが、結果的にはそれのほうが早かったです。エクセルとテキストエディタの間の行き来がスムーズにいくともっといいなあという感想でした。
通常はAlt+tabで起動している画面の一覧を出して、それから選択するという操作をしますが、もっとスムーズなものがないでしょうか。研究したいと思います。
【作業手順】
1.チェックしたいセルの下に6行ぐらい行を挿入する。
2.エクセルで計算式を文字化する。文字化したものをCtrl+C
(テキストエディタに移動)
3.Ctrl+Vでテキストエディタに張り付ける。
4.テキストエディタの中で、式を分解・加工する。この段階で計算式にしてよい。
5.式をTABで結ぶ(=計算式1[TAB]=計算式2[TAB]=計算式3[TAB]=計算式4)。全体をCtrl+C。TABで結ぶのは、一括変換をすれば簡単です。改行をタブに変えればいいのです。
(エクセルに移動)
6.エクセルに戻って、計算式を入れたい場所でCtrl+Vし、計算式を張り付ける。各セルに計算式がコピーされます。
7.各パーツの計算式の結果をチェックする。
8.範囲指定をして該当する場所を印刷(これもマクロ化すると便利)して、記録として残す。
例
xxx=($EU17-P17-EC17)*((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))*GE17
この計算式を、テキストエディタにはりつけ、チェック用に分解する。
=($EU17-P17-EC17)
=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))
=(CW17-CV17)
=(Q17-P17+CW17+EA17-EC17)
=GE17
これを、改行をTABに変換し、エクセルにコピーする。
=($EU17-P17-EC17)[TAB]=((CW17-CV17)/(Q17-P17+CW17+EA17-EC17))[TAB]=(CW17-CV17)[TAB]=(Q17-P17+CW17+EA17-EC17)[TAB]=GE17
すると、5つのセルに計算結果が表示される。
これを印刷するなりして、チェックする。
※エクセルの中ですべて行ってもかまいません。
※該当する箇所を範囲印刷する際に、改ページが挿入されている場所を含めた場合は、2ページに分かれて印刷されてしまいます。スマートではないので何とかならないのかと思っています
※この機能と前回の文字のコピーの機能を合体させて、計算式を文字化して、張り付けるという一連の処理にすることも考えられます。エクセル内で処理を行なう場合は、操作が少なくなりますので、これを目標としてマクロを作成したらどうでしょうか。
すでにコピーものと指定は終わっていますので、あとは貼付け先の指定と貼付けになります。さらに、最後に計算式化を入れて、元に戻すというのはどうでしょうか。
【手順】
(範囲を指定して実行する)
計算式のあるセルの計算式に特殊な記号を付加して文字化する
文字化したものをコピーする
貼付け先を指定し、張り付ける
元の場所に戻り、文字化したものを計算式に戻す。
このレベルになると、かなり便利になってきます。
2007年10月13日土曜日
第50回目 ちょっとした小物、コピー編
○第50回目 ちょっとした小物、コピー編
データの編集作業でよく使うのがコピーです。コピーにもいろいろありますが何をよく使いますか。その上位から2、3をマクロ化するととても便利です。当然ショートカットキー化もします。
しかし、全面的なコピーは、すでにショートカットキーがなされているので、マクロ化は不要です。それ以外のもので有益なものを考えてください。
筆者の例でいえば、"計算式のコピー"と"値と数値の書式のコピー"です。これはかなり使用します。
通常の処理では、範囲を指定してCtrl+C、貼り付け場所にカーソルを移してAlt+E+Sのあとに上矢印キーを二回動かして計算式の貼付けを選択、エンターキーを押すということになります。
これを、範囲を指定しショートカットキーでマクロを呼び出し(最大でもCtrl+Shift+X)、張り付け場所にカーソルを移動しエンターキーとなります。上の場合とは、"Alt+E+Sをしそのあとに上矢印キーを二回動かして"というキー操作が不要となります(計算式・書式の張り付けの場合は、上矢印キーを三回動かしてとなります)。
これはお勧めです。
処理を分解しますと、
指定座標の取得=⇒今まで結構出てきている基本処理
コピーの処理=⇒マクロの記録で把握
コピー先の座標の指定=⇒これも定番の処理
張り付けの処理=⇒マクロの記録で把握
となります。
座標はコピー元、張り付け先とも、一つのセル及び範囲セルの可能性があります。
これを分け、別々に作成するのはめんどくさいので、一つにまとめます。
'指定範囲の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
If p1 <> 0 Then
AAA1 = Left(AAA, p1 - 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = Mid(AAA, p1 + 1)
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row
Else
AAA1 = AAA
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = AAA1
retu9 = retu1
gyo9 = gyo1
End If
gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1
すべての場合に同じものを使うのは、多少無駄があるのですが、大体の処理はこれ一つでできますので、便利な道具となります。
次は、張り付け先の座標の指定です
Set セル範囲 = Application.InputBox(Prompt:="貼り付けるセル範囲を選択してください", Default:=XXX, Left:=10, Top:=2, Type:=8)
AAA2 = セル範囲.Address
※Default値は必要な場合のみ。
Dim セル範囲 As Range の定義が必要
最後は、コピー処理です("値と数値の書式"の場合)。
Range(AAA).Copy 'AAAはコピーもとの座標
Range(AAA2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False 'AAA2は張り付け先の座標
Application.CutCopyMode = False 'コピー選択を解除
これを組み立てて、ショートカットキーを当てはめれば完了です。
※筆者はこれにシートの移動機能を付加したものも使用しています。シートを越えてもコピーが出来るという売りです。デフォルト値として同一シートを指定していますので、同一シートへのコピーの場合は、最小限としてエンターキーが1回余計に必要となります。シートをかえる場合は、シート番号の入力が更に必要となります。
どちらを常用するかは、使う人の感覚ですね。(エンターキーの操作が余計になります)
データの編集作業でよく使うのがコピーです。コピーにもいろいろありますが何をよく使いますか。その上位から2、3をマクロ化するととても便利です。当然ショートカットキー化もします。
しかし、全面的なコピーは、すでにショートカットキーがなされているので、マクロ化は不要です。それ以外のもので有益なものを考えてください。
筆者の例でいえば、"計算式のコピー"と"値と数値の書式のコピー"です。これはかなり使用します。
通常の処理では、範囲を指定してCtrl+C、貼り付け場所にカーソルを移してAlt+E+Sのあとに上矢印キーを二回動かして計算式の貼付けを選択、エンターキーを押すということになります。
これを、範囲を指定しショートカットキーでマクロを呼び出し(最大でもCtrl+Shift+X)、張り付け場所にカーソルを移動しエンターキーとなります。上の場合とは、"Alt+E+Sをしそのあとに上矢印キーを二回動かして"というキー操作が不要となります(計算式・書式の張り付けの場合は、上矢印キーを三回動かしてとなります)。
これはお勧めです。
処理を分解しますと、
指定座標の取得=⇒今まで結構出てきている基本処理
コピーの処理=⇒マクロの記録で把握
コピー先の座標の指定=⇒これも定番の処理
張り付けの処理=⇒マクロの記録で把握
となります。
座標はコピー元、張り付け先とも、一つのセル及び範囲セルの可能性があります。
これを分け、別々に作成するのはめんどくさいので、一つにまとめます。
'指定範囲の取得
AAA = Selection.Address
p1 = InStr(AAA, ":")
If p1 <> 0 Then
AAA1 = Left(AAA, p1 - 1)
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = Mid(AAA, p1 + 1)
retu9 = Range(AAA9).Column
gyo9 = Range(AAA9).Row
Else
AAA1 = AAA
retu1 = Range(AAA1).Column
gyo1 = Range(AAA1).Row
AAA9 = AAA1
retu9 = retu1
gyo9 = gyo1
End If
gyo_cnt = gyo9 - gyo1 + 1
retu_cnt = retu9 - retu1 + 1
すべての場合に同じものを使うのは、多少無駄があるのですが、大体の処理はこれ一つでできますので、便利な道具となります。
次は、張り付け先の座標の指定です
Set セル範囲 = Application.InputBox(Prompt:="貼り付けるセル範囲を選択してください", Default:=XXX, Left:=10, Top:=2, Type:=8)
AAA2 = セル範囲.Address
※Default値は必要な場合のみ。
Dim セル範囲 As Range の定義が必要
最後は、コピー処理です("値と数値の書式"の場合)。
Range(AAA).Copy 'AAAはコピーもとの座標
Range(AAA2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False 'AAA2は張り付け先の座標
Application.CutCopyMode = False 'コピー選択を解除
これを組み立てて、ショートカットキーを当てはめれば完了です。
※筆者はこれにシートの移動機能を付加したものも使用しています。シートを越えてもコピーが出来るという売りです。デフォルト値として同一シートを指定していますので、同一シートへのコピーの場合は、最小限としてエンターキーが1回余計に必要となります。シートをかえる場合は、シート番号の入力が更に必要となります。
どちらを常用するかは、使う人の感覚ですね。(エンターキーの操作が余計になります)
2007年10月11日木曜日
第49回目 ちょっとした小物、印刷編3
○第49回目 ちょっとした小物、印刷編3
最後の"5.複数のシートが一括で印刷できる機能"です。
これもよく使い機能です。エクセルはシート内にいっぱい詰め込んでも可能だし、シートを分けて作っても大丈夫です。算定過程はシートに詰め込んで、結果の表などはシートを分けて細かく区分するというのが多いようです。
ですから、このシートからこのシートまでページをつけて印刷したいということがよくあるということです。特に最近は色つきが多くなっているので、カラープリンタで印刷したいということになります。プリンタの選択は前回やりましたので省略します。
入力すべきパラメータは、現在のシートを含めて印刷したいシート数と初めのページとなります。
今回のシートはグラフシートを含みますので、結構簡単になります。
以前にやりましたが、シート数は sheets.countに入っていますし、現在のシート番号は、ActiveSheet.Indexに入っています。
シート番号でシートを指定するのは、 Sheets(i).Select となります。
次のシートへのページ番号の引継ぎの仕方についてですが、現在では複数ページになる場合のそのページ数の取得の仕方がわかりません(2007のせいかもしれません)。それゆえに、1シート・1ページという前提とします。すると、次のシートを印刷する際に、初めのページ数を+1ずつしていくことになります。
複数ページへの対象は、その部分だけで印刷して、前後を分けて印刷するというやり方です。全部が複数ページだったら、この機能は意味がありません。
主な構造は、
j = InputBox("印刷したいシート数の入力 ", , 10)
:
For i = sh0 To sh0+j-1
shees(i).select
ActiveSheet.PageSetup.FirstPageNumber = 1+i-sh0
〈印刷〉
Next
:
最初から欲張らずに、少しずつ機能を追加したいったほうがいいと思います。最初は複数のシートの印刷だけ。それができたら、ページ数を入れる。それが出来たらプリンタの選択を入れる、という具合にです。
テストの段階で一シートにかなりの枚数が打ち出される場合は、前々回のやり方で、印刷ページ数を限定するといいですね。〈ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1〉
また、テスト段階は、印刷の代わりにプレビューでもうまくやれるのかもしれません。
ということで、複数シートの印刷は大変なように見えて、それほど大変ではないということがわかります。ページ数、プリンタの選択などの機能がないとしても、便利な機能だと思います。
ただし、シートにいろいろと詰め込むタイプの人の場合は、ページ数指定の印刷、指定範囲の印刷のほうが便利です。ニーズに合わせて使い分けてください。
(筆者も考えてみれば詰め込みタイプのようです)
最後の"5.複数のシートが一括で印刷できる機能"です。
これもよく使い機能です。エクセルはシート内にいっぱい詰め込んでも可能だし、シートを分けて作っても大丈夫です。算定過程はシートに詰め込んで、結果の表などはシートを分けて細かく区分するというのが多いようです。
ですから、このシートからこのシートまでページをつけて印刷したいということがよくあるということです。特に最近は色つきが多くなっているので、カラープリンタで印刷したいということになります。プリンタの選択は前回やりましたので省略します。
入力すべきパラメータは、現在のシートを含めて印刷したいシート数と初めのページとなります。
今回のシートはグラフシートを含みますので、結構簡単になります。
以前にやりましたが、シート数は sheets.countに入っていますし、現在のシート番号は、ActiveSheet.Indexに入っています。
シート番号でシートを指定するのは、 Sheets(i).Select となります。
次のシートへのページ番号の引継ぎの仕方についてですが、現在では複数ページになる場合のそのページ数の取得の仕方がわかりません(2007のせいかもしれません)。それゆえに、1シート・1ページという前提とします。すると、次のシートを印刷する際に、初めのページ数を+1ずつしていくことになります。
複数ページへの対象は、その部分だけで印刷して、前後を分けて印刷するというやり方です。全部が複数ページだったら、この機能は意味がありません。
主な構造は、
j = InputBox("印刷したいシート数の入力 ", , 10)
:
For i = sh0 To sh0+j-1
shees(i).select
ActiveSheet.PageSetup.FirstPageNumber = 1+i-sh0
〈印刷〉
Next
:
最初から欲張らずに、少しずつ機能を追加したいったほうがいいと思います。最初は複数のシートの印刷だけ。それができたら、ページ数を入れる。それが出来たらプリンタの選択を入れる、という具合にです。
テストの段階で一シートにかなりの枚数が打ち出される場合は、前々回のやり方で、印刷ページ数を限定するといいですね。〈ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1〉
また、テスト段階は、印刷の代わりにプレビューでもうまくやれるのかもしれません。
ということで、複数シートの印刷は大変なように見えて、それほど大変ではないということがわかります。ページ数、プリンタの選択などの機能がないとしても、便利な機能だと思います。
ただし、シートにいろいろと詰め込むタイプの人の場合は、ページ数指定の印刷、指定範囲の印刷のほうが便利です。ニーズに合わせて使い分けてください。
(筆者も考えてみれば詰め込みタイプのようです)
2007年10月6日土曜日
第48回目 ちょっとした小物、印刷編2
○第48回目 ちょっとした小物、印刷編2
前回で残ったものの内の
2.印刷において、ヘッダー、フッタなどを抑止・非抑止の選択ができる機能
3.カラープリンタでの印刷か通常のプリンタでの印刷かの選択が出来る機能
4.ページ番号を印刷するかどうかが指定できる機能
6.任意のページ数から印刷できる機能
を考えてみます。
このグループは、マクロを作るというより、操作マクロで得たものを張り付けながらまとめあげるといったものになります。
2でいえば、マクロの記録をオン(Alt+T+M+R)にして、印刷ダイアログのヘッダのタブで、表示したいものを入れたり、それらを削除したりして記録をとってください。
そして外から与えた情報で、二つの選択肢を選んでください。マクロの記録ではいろんな情報が取れますが、関係ないと思われるものは削除してください。そうすれば、既存のものにある一部を置換えといった処理になります。全部生かしてしまいますと全部とっかえということになって、関係しないところまで変わってしまうのです。
"変えたいところだけ変える、それ以外のところはいままでのまま"、という考えのマクロにしてください。
例えば、2については、
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = "&D;&T"
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = "&9&Z&F&A"
End With
としますと、右ヘッダと右フッタ以外は何もなくなってしまいます。
現在のものを生かすとして、右ヘッダと右フッタ以外の記述は削除するほうがいいでしょう。
ページ数は、中央フッタになると思いますので、次の通りとなります。
With ActiveSheet.PageSetup
.CenterFooter = "&P"
End With
(一つなのでwith構文は不要かと思われます。
ActiveSheet.PageSetup.CenterFooter = "&P" となります
ページ数を印刷しない場合は、=""となります)
始まりのページ番号の設定は、次の通りとなります。
ActiveSheet.PageSetup.FirstPageNumber = jj
プリンタの設定は、次のようになります。
Application.ActivePrinter = "XXX Color Writer 789C on Ne01:"
基本構造は、それぞれのパラメータの入力(inputbox関数)とその条件わけということになります。
※上記は重要部分のみの記述なので、印刷の設定でマクロの記録をとり、自分のパソコンにあったものにしてください。2007と2003でのコマンドの差に最近戸惑っています。
※基本的な機能ですので、通常の操作とそれほど変わりません。ショートカットを活用し、操作を単純にしないと、何をしたのかわからなくなってしまいます。
例えば、プリンタの選択は、通常処理の場合、Ctrl+P、プリンタのプルダウンメニューからプリンタを選択し、エンターキーを押す、という操作なので、コンパクトな操作にしないと、マクロで操作する意味が薄れます(この例の場合は、キーボード派の度合いが強くないと、通常の操作より快適にはならないでしょう)。
前回で残ったものの内の
2.印刷において、ヘッダー、フッタなどを抑止・非抑止の選択ができる機能
3.カラープリンタでの印刷か通常のプリンタでの印刷かの選択が出来る機能
4.ページ番号を印刷するかどうかが指定できる機能
6.任意のページ数から印刷できる機能
を考えてみます。
このグループは、マクロを作るというより、操作マクロで得たものを張り付けながらまとめあげるといったものになります。
2でいえば、マクロの記録をオン(Alt+T+M+R)にして、印刷ダイアログのヘッダのタブで、表示したいものを入れたり、それらを削除したりして記録をとってください。
そして外から与えた情報で、二つの選択肢を選んでください。マクロの記録ではいろんな情報が取れますが、関係ないと思われるものは削除してください。そうすれば、既存のものにある一部を置換えといった処理になります。全部生かしてしまいますと全部とっかえということになって、関係しないところまで変わってしまうのです。
"変えたいところだけ変える、それ以外のところはいままでのまま"、という考えのマクロにしてください。
例えば、2については、
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = "&D;&T"
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = "&9&Z&F&A"
End With
としますと、右ヘッダと右フッタ以外は何もなくなってしまいます。
現在のものを生かすとして、右ヘッダと右フッタ以外の記述は削除するほうがいいでしょう。
ページ数は、中央フッタになると思いますので、次の通りとなります。
With ActiveSheet.PageSetup
.CenterFooter = "&P"
End With
(一つなのでwith構文は不要かと思われます。
ActiveSheet.PageSetup.CenterFooter = "&P" となります
ページ数を印刷しない場合は、=""となります)
始まりのページ番号の設定は、次の通りとなります。
ActiveSheet.PageSetup.FirstPageNumber = jj
プリンタの設定は、次のようになります。
Application.ActivePrinter = "XXX Color Writer 789C on Ne01:"
基本構造は、それぞれのパラメータの入力(inputbox関数)とその条件わけということになります。
※上記は重要部分のみの記述なので、印刷の設定でマクロの記録をとり、自分のパソコンにあったものにしてください。2007と2003でのコマンドの差に最近戸惑っています。
※基本的な機能ですので、通常の操作とそれほど変わりません。ショートカットを活用し、操作を単純にしないと、何をしたのかわからなくなってしまいます。
例えば、プリンタの選択は、通常処理の場合、Ctrl+P、プリンタのプルダウンメニューからプリンタを選択し、エンターキーを押す、という操作なので、コンパクトな操作にしないと、マクロで操作する意味が薄れます(この例の場合は、キーボード派の度合いが強くないと、通常の操作より快適にはならないでしょう)。
2007年10月3日水曜日
第47回目 ちょっとした小物、印刷編
○第47回目 ちょっとした小物、印刷編
印刷に関した便利機能を考えて見ます。
すべではその人のニーズになりますが、こんなものもあるのかという程度でも参考になるかもしれません。
どんなニーズがあるんでしょうかね…
不評を買っているのですが、エクセルは非常に複雑でいろいろなものがあっという間に出来てしまうので、パス名またはファイル名は必須だと思っていますので、必ずフッタにパス名、シート名を表示するようにしています。見る人がみるとなんだこれとなってしまうのですが…。
そこで、
1.標準的なヘッダー、フッタを設定するという機能
ほかにも、
2.印刷において、ヘッダー、フッタなどを抑止・非抑止の選択ができる機能
3.カラープリンタでの印刷か通常のプリンタでの印刷かの選択が出来る機能
4.ページ番号を印刷するかどうかが指定できる機能
5.複数のシートが一括で印刷できる機能
6.一つのシート内の一部のページが印刷できる機能
7.無条件に即印刷してしまう機能(ダイアログの表示がない)
8.指定した範囲のみを印刷する機能
9.印刷のダイアログを簡単に表示する機能(2007では若干面倒になった)
10.プリンタの切り替え機能
などが考えられます。
これを有効性、可能性などから整備していけばいいのではないでしょうか。
このうち、1,7,8,9は操作マクロそのものです。非常に簡単です。
よく使うものについて、ショートカットキーをつけて有効活用しましょう。
ショートカットキーの設定は、マクロの実行の指示の画面(Alt+F8の直後)で、オプションというキーから行ないます。Ctrl+及びCtrl+Shiftの二種類のキーセットが出来ます。1はヘッダーなのでCtrl+Shift+Hとか、7は印刷ですのでCtrl+Shift+Pとか、8は範囲はレンジですのでCtrl+Shift+Rとかです。
他の機能と重ならないないように、覚えやすいように、設定・管理していったらどうでしょうか。
特に操作マクロは、通常の操作でも複雑ではないので、簡単な操作にしないとメリットがありません。
今回は、"6.一つのシート内の一部のページが印刷できる機能"を取り上げてみましょう。
この機能の核は、指定したページを印刷するというコマンドです。これは操作マクロ記録で簡単にわかります。
2007では次のとおりです。
ActiveWindow.SelectedSheets.PrintOut From:=p1, To:=p9
p1及びp9を外から指定すればいいということになります。
簡単ですね。
指定の仕方です。
0…全部
2-5…2から5ページ
3…3ページのみ
4-…4ページ以降全部
-5…1から5ページ
(飛び飛びページの印刷は、通常の処理で行なってください)
この指定内容から、p1、p9を求めればいいのです。最後までの時は例えばp9=999でいいです(1000ページを越える場合はダメですが…)。
分類すると
-がある→一桁目にある =⇒-5のパターン
→一桁目にない→最後にある =⇒4-のパターン
→最後にない =⇒2-5のパターン
-がない→値は0である =⇒0のパターン
→値は0でない =⇒3のパターン
となりますので、InStr( )、len( )、left( )、mid( )の関数で、p1、p9を求めてください。具体的には各自で考えてください。
入力値は文字になっていますので、最後あたりで数値に直してp1及びp9に代入してください(val( )関数)。
印刷に関した便利機能を考えて見ます。
すべではその人のニーズになりますが、こんなものもあるのかという程度でも参考になるかもしれません。
どんなニーズがあるんでしょうかね…
不評を買っているのですが、エクセルは非常に複雑でいろいろなものがあっという間に出来てしまうので、パス名またはファイル名は必須だと思っていますので、必ずフッタにパス名、シート名を表示するようにしています。見る人がみるとなんだこれとなってしまうのですが…。
そこで、
1.標準的なヘッダー、フッタを設定するという機能
ほかにも、
2.印刷において、ヘッダー、フッタなどを抑止・非抑止の選択ができる機能
3.カラープリンタでの印刷か通常のプリンタでの印刷かの選択が出来る機能
4.ページ番号を印刷するかどうかが指定できる機能
5.複数のシートが一括で印刷できる機能
6.一つのシート内の一部のページが印刷できる機能
7.無条件に即印刷してしまう機能(ダイアログの表示がない)
8.指定した範囲のみを印刷する機能
9.印刷のダイアログを簡単に表示する機能(2007では若干面倒になった)
10.プリンタの切り替え機能
などが考えられます。
これを有効性、可能性などから整備していけばいいのではないでしょうか。
このうち、1,7,8,9は操作マクロそのものです。非常に簡単です。
よく使うものについて、ショートカットキーをつけて有効活用しましょう。
ショートカットキーの設定は、マクロの実行の指示の画面(Alt+F8の直後)で、オプションというキーから行ないます。Ctrl+及びCtrl+Shiftの二種類のキーセットが出来ます。1はヘッダーなのでCtrl+Shift+Hとか、7は印刷ですのでCtrl+Shift+Pとか、8は範囲はレンジですのでCtrl+Shift+Rとかです。
他の機能と重ならないないように、覚えやすいように、設定・管理していったらどうでしょうか。
特に操作マクロは、通常の操作でも複雑ではないので、簡単な操作にしないとメリットがありません。
今回は、"6.一つのシート内の一部のページが印刷できる機能"を取り上げてみましょう。
この機能の核は、指定したページを印刷するというコマンドです。これは操作マクロ記録で簡単にわかります。
2007では次のとおりです。
ActiveWindow.SelectedSheets.PrintOut From:=p1, To:=p9
p1及びp9を外から指定すればいいということになります。
簡単ですね。
指定の仕方です。
0…全部
2-5…2から5ページ
3…3ページのみ
4-…4ページ以降全部
-5…1から5ページ
(飛び飛びページの印刷は、通常の処理で行なってください)
この指定内容から、p1、p9を求めればいいのです。最後までの時は例えばp9=999でいいです(1000ページを越える場合はダメですが…)。
分類すると
-がある→一桁目にある =⇒-5のパターン
→一桁目にない→最後にある =⇒4-のパターン
→最後にない =⇒2-5のパターン
-がない→値は0である =⇒0のパターン
→値は0でない =⇒3のパターン
となりますので、InStr( )、len( )、left( )、mid( )の関数で、p1、p9を求めてください。具体的には各自で考えてください。
入力値は文字になっていますので、最後あたりで数値に直してp1及びp9に代入してください(val( )関数)。
登録:
コメント (Atom)
