2009年7月19日日曜日

セルの中身をコピペ@Excel VBA

 エクセルのクリップボードの挙動はちょっと独特で、「値だけ」とか「書式だけ」をコピペする事が出来、大変便利なのですが、純粋なテキストデータのみをコピーしたり貼り付けたりしたい時もあります。

 僕の場合は、F2,Ctrl+Shift+Home,Ctrl+c,Escと一気に操作していたのですが、手数が多くて面倒くさいので、AutoHotKeyを使用して、上記操作をCtrl+Shift+cに割り振って作業していました。

 しかし、AutoHotKeyのようなユーティリティを自由に導入できる現場ばかりではないので、同等機能をVBAで作り直す事にします。

 以下のコードをPERSONAL.XLSの標準モジュールへ記述。


Private Sub Auto_Close()
With Application
.OnKey "^+c"
.OnKey "^+v"
End With
End Sub

Private Sub Auto_Open()
With Application
.OnKey "^+c", "CopyActiveCellValue"
.OnKey "^+v", "PasteSameValue"
End With
End Sub

Private Sub CopyActiveCellValue()
With Application
.SendKeys "{F2}"
.SendKeys "^{End}"
.SendKeys "^+{Home}"
.SendKeys "^c"
.SendKeys "{Esc}"
.StatusBar = "★アクティブセルの値をコピーしました。"
End With
End Sub

Private Sub PasteSameValue()
With Application
.SendKeys "{BS}"
.SendKeys "^v"
.SendKeys "^{Enter}"
.StatusBar = "★選択セル全てに対し、同じ値を貼り付けました。"
End With
End Sub


 マクロでも、Sendkeysを使用した操作については、アンドゥが利くのがミソ。

2009年7月11日土曜日

データの個数と合計を同時に表示@Excel VBA

 Excel 2007では、ステータス・バーにオートカルクを複数同時に表示できますが、Excel 2003以前では、一つしか表示できません。
 なので、同時に表示するマクロを作ってみました。
 PERSONAL.XLSのThisWorkbookに以下のコードを書きます。
Private WithEvents xlApp As Application

Private Sub Workbook_Open()
    Set xlApp = Application
End Sub

Private Sub xlApp_SheetSelectionChange( _
                ByVal Sh As Object, _
                ByVal Target As Range _
                )

    On Error GoTo ErrProc:
    Set wf = WorksheetFunction
    xlApp.StatusBar = _
            " ■合計=" & wf.Subtotal(9, Target) & _
            " ■データの個数=" & wf.Subtotal(3, Target)
    Exit Sub

ErrProc:
    Set e = Err
    xlApp.StatusBar = _
            " ■" & e.Description & _
            " ■エラー番号:" & e.Number
End Sub
 上記は、データの個数と合計を同時に表示するコードですが、WorksheetFunction.Subtotal()の引数を変えてやれば、平均等も表示できます。
 でも、平均を表示させたらちょっと重かったです。