選択されたセルの値を一括でX倍することが出来るマクロです。
例えば実験データをまとめる時にVをmV単位に直したいといった時に便利です。
マクロを使わない場合は、近くに1,000倍や1/0000倍するためだけの表を作ったりしますが、
この記事のマクロを使うと、処理したいセルを範囲選択してマクロを実行するだけで済みます。
※VBAでの操作はUndoのための履歴が残らないので注意して下さい。
Sub MultiplyBy1000()
Call MultiplyByX(Selection, 1000)
End Sub
Sub DivideBy1000()
Call MultiplyByX(Selection, 0.001)
End Sub
Sub MultiplyByX(ByRef R As Range, X As Double)
Dim TempValue As Variant
Dim NumberOfRows, NumberOfColumns, AreaIndex, RowIndex, ColIndex As Integer
For AreaIndex = 1 To R.Areas.Count
TempValue = R.Areas(AreaIndex).Value ' 指定の範囲の値を変数にコピーする。
' TempValue (Variant変数)に格納される値はRangeオブジェクトが指す範囲に応じて配列かスカラのどちらかになる。
' 連続した複数セルが選択されている場合は2D配列(1行や1列でも2D)
' 単一セルの場合はスカラ変数
If IsArray(TempValue) Then '複数セルの場合
NumberOfColumns = UBound(TempValue, 1)
NumberOfRows = UBound(TempValue, 2)
For ColIndex = 1 To NumberOfColumns
For RowIndex = 1 To NumberOfRows
TempValue(ColIndex, RowIndex) = TempValue(ColIndex, RowIndex) * X
Next
Next
Else '単一セルの場合
TempValue = TempValue * X
End If
R.Areas(AreaIndex).Value = TempValue
Next
End Sub
次のコードでコンテキストメニューに追加するととても便利です。
Sub AddContextMenu()
Dim myCommandBar As CommandBar
Dim myCommandBarControl As CommandBarControl
Set myCommandBar = Application.CommandBars("Cell")
myCommandBar.Reset
'↓常に必要な機能ではないのでExcelが終了したら自動で登録が解除されるようにTemporary=Trueにしています。
Set myCommandBarControl = Application.CommandBars("Cell").Controls.Add(Before:=5, Temporary:=True, Type:=msoControlPopup)
With myCommandBarControl
.Caption = "定数をかける"
With .Controls.Add
.Caption = "x1000"
.OnAction = "MultiplyBy1000"
End With
With .Controls.Add
.Caption = "1/1000"
.OnAction = "DivideBy1000"
End With
End With
End Sub
参考
VBA(Excel)高速化対策 -配列化編-
http://qiita.com/sango/items/c46a30c62e154077a0c7
右クリックメニューやサブメニューにマクロを登録/削除するには
http://www.atmarkit.co.jp/ait/articles/1408/25/news030.html