miau's blog?

Excel VBA まわり

久々に仕事で使ったので、いくつか。


○シートにボタンを貼り付ける方法

 いつも調べる度に忘れるのでメモ。
 「表示(V)」→「ツールバー(T)」→「フォーム」でツールバー出して、適当に貼り付け。

 ちなみに Alt + ドラッグでグリッドにスナップ可。


○シートの保護+マクロ操作

 マクロで計算を行う場合、レイアウト変更されると計算結果がおかしくなったりして困るわけで。
 そこでシートの保護を使うわけですが、ロックされたセルはマクロからも操作できなくなったりして。

 ユーザは編集不可だけどマクロからは編集可にする方法とかないのかなー?と調べてみると、やっぱりあった。

Excel豆知識39-2:エクセル:シートの保護をマクロで
Office TANAKA - VBA講座:ファイルの操作(保護/解除する)

 このへんを参考に、

Private Sub Workbook_Open()
' シートの保護(ユーザによる操作のみを保護)
Sheet1.Protect UserInterfaceonly:=True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
' シートの保護を解除
Sheet1.Unprotect
End Sub

 こんな感じで OK。


○Worksheet_Change ハンドラ

 わざわざ計算ボタン押さずに済むように、Worksheet の Change イベントで処理したいような場合。
 とりあえず何も考えずに Worksheet_Change に計算式書けばいいんですが。
 
 でもそれだとパフォーマンス低下しまくりそうなので、「A1 か B2 か C3 が変更されたときだけ動く」みたいな処理がやりたいわけで。
 とりあえず、

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Union(Range("A1"), Range("B2"), Range("C3"))) Then
'なんかやりたい処理
End If
End Sub

 みたいにすれば OK。もっといいやり方あるかも。


○循環抑制

 Change イベント内でセルの値を変更した場合、そこからさらに Change イベントが発生したりして、無限ループになってしまうことがあります。
 これは、
 

'イベントの抑止
Application.EnableEvents = False

'なんかやりたい処理

'イベントの抑止解除
Application.EnableEvents = True

 みたいにすればいいらしいです。(未検証)


○範囲名

上のを色々調べてる過程で、セルや範囲に別名つけられることを思い出した。
これだとレイアウトの変更とかにも強いし、お客さんに出すようなものなら、これくらいのことはやっておくべきかな、とか思ったりもした。
posted at 08:02:55 on 2005-07-06 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。