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回余計に必要となります。シートをかえる場合は、シート番号の入力が更に必要となります。
 どちらを常用するかは、使う人の感覚ですね。(エンターキーの操作が余計になります)

0 件のコメント: