2009年6月14日日曜日

第120回目 ジャンプマクロ、違うファイル(ブック)へはできないものか

○第120回目 ジャンプマクロ、違うファイル(ブック)へはできないものか

 これまでのジャンプでは、同一シート内のある場所又は、当該ブック内の他のシート内のある場所へジャンプするというものでした。
 これと同様に、計算式等のコピーについても、同一ブック内という制約がありました。これを、開いているどのブックにも移動できるという機能を考えました。
 結果的には、たいした手間もなくできました。
 簡単にいうと、シートの時と同じように、開いているブック名を取得すれば大体は終了となります。
 あれこれ調べていたら、参考になる例示がありましたので、それを元に作成してみました。

┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ http://www.happy500z.com/YNxv252.html#8
┃  8) ブックが開いているか調べる
┃Sub ブックが開いているか調べる()
┃ ブック名 = "BBB.xls" 'BBBにはブック名を記入
┃ '※1      
┃ For Each 各ブック In Workbooks     
┃ If 各ブック.Name = ブック名 Then     
┃ MsgBox "開いています。", , ブック名    
┃ Exit Sub          
┃ End If          
┃ Next          
┃ MsgBox "開いていません。", , ブック名     
┃End Sub          
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛

□これを使いブック名を取得します。
'初期状態の情報を取得
fname1 = ActiveWorkbook.Name
shname1 = ActiveSheet.Name
ii_max = Sheets.Count
ii0 = ActiveSheet.Index
'開かれているブック名、数を取得する
b_name(0) = fname1
i = 1
For Each 各ブック In Workbooks
b_name(i) = 各ブック.Name
i = i + 1
Next
b_cnt = i - 1

□次の問題は、同一シート内のジャンプの操作の手間を少なくする工夫です。
 ブックの指定で、当該ブックの当該シートの場合は、99(デフォルト値)
 当該ブックの別のシートの場合は、0
 別のブックの別のシートの場合は、1~
 このために、ブック名の配列変数の0番目には、最初のブック名を入れています。(b_name(0) = fname1)

'ブックの移動
bk_no = InputBox("使用したいブックを指定してください。そのままは0。そのままのシートの場合は、99。 " & vbCrLf & _
"01=⇒" & b_name(1) & vbCrLf & _
"02=⇒" & b_name(2) & vbCrLf & _
"03=⇒" & b_name(3) & vbCrLf & _
【途中略】
"14=⇒" & b_name(14) & vbCrLf & _
"15=⇒" & b_name(15) & vbCrLf _
, xpos:=2000, ypos:=3000, Default:=99)
bk_no0 = bk_no
If bk_no <> 15 Then bk_no = 0

□ブックの移動後に、移動先のブックでのシート属性、名を取得

'ブックの移動
Windows(b_name(bk_no)).Activate
'移動先のブックでのシートの属性取得
ii2 = ActiveSheet.Index
ii_max2 = Sheets.Count

'シート名の取得
cc = Sheets.Count
If cc > ll100 Then cc = ll100
For i = 1 To cc 'ワークシートの数だけ繰り返す
ww(i) = Sheets(i).Name 'シート名を取得する
Next i

'現在のシート番号の取得
For ii = 1 To cc
If ActiveSheet.Name = ww(ii) Then Exit For 'シート名と同じ番号を取得する
Next ii
sheet_no = ii

□シート番号を指定して、当該シートに移動する

msg00 = "飛び先のシート番号を入れてください。 "
h1 = InputBox(msg00 & Str(cc) & "以下。 キャンセルは999。そのままのシートの場合は、0。" & vbCrLf & msg01, "シート ジャンプ", 0)
h2 = Val(h1)
If h2 = 0 Then h2 = sheet_no '当該シートの場合
Sheets(h2).Select
※msg01には、シート番号とシート名をつなげて入れておきます。

※セルへの移動は、第25回を参照してください。

 以上はジャンプ関係の処理ですが、圧倒的にはコピー機能でつかうほうが多いので、コピー機能の中に、他のブックに飛べるような機能を追加してください。コマンドをコピーだけでほとんどマクロは完成します(コピーの場合は、最後の"セルへの移動"の機能は省いてもいいと思います)。
 筆者のコピー関係のマクロは、計算式のコピーと、値のコピーの二種類です。これをワンタッチ(Ctrl+QまたはCtrl+W)で動かすことができます。処理の範囲を開いているブック全部に広げたおかげで、だいぶ操作が楽になりました。
 このところ他のブックを参照しながらの仕事が多くなったからだと思います。

 ※更なる改善点
 ・指定した情報を持っておき、次の指示の時の初期値としておく。次の処理も同じブックへコピーする場合、非常に便利。
 ・コピーの場合、コピー元の座標を指定するが、コピー先の別のブックのシートでも、同じ座標にするかどうかを聞く機能。同じ形式のシートになっている場合は、非常に便利。
 ・コピー終了後、コピー元に戻るかの指定
 ・逆指定によるコピー。コピー先から指定し、次にコピー元を指定する。
 
 ※コピー機能は、非常によく使うものです。そこで、上記のように他のブックにコピーできるもののほかに、同一シート内のコピーのみに特化したマクロも持っておくと便利です。他のブックへコピー、その次は、同一シート内にコピー、次は他のブックという場合もありますので、指示情報を生かすためです。
 
 次回は、印刷属性のコピーを取り上げます。もちろん他のブックのシートまでコピーは可能です。この機能も便利の一言です。

0 件のコメント: