エクセルで楽々校務

学校現場で使えるエクセルファイルや小技の紹介をしています。掘り出し物があるかもしれません。あと、今までの実践での疑問点もつぶやきます。

VBA:指定範囲で「数式が壊されていないか」をチェックできるマクロ

通信簿を点検していると、評価や評定の数式を無視して手入力している場合があります。

これをチェックするには、エクセルの数式メニュータブの「数式の表示」でできますが、ずらっと数式が表示されるので、ちょっとダサいような気がします。

こんな処理もマクロでできます。

f:id:exeladmin:20200812211833p:plain

青ボタンを押して実行すると、

数式ではないセルが赤く塗りつぶされ、メッセージが表示されます。

判定は、セル内容の「左端が=ではないセル」で行います。

サンプルシートは例によって、最後に置いています。よかったらご覧になってみてください。案外、探しても無かったんですよ。ここまでチェックできるシート。

でも、このサイトを参考にさせていただきました。結構、学校現場でも使えそうな実用的なコードが多かったです。

vbabeginner.net

 --------------------------------------------

で、今回備忘録したいのは、

配列も、セルに書いた値で指定できるというところです。

学校現場で、VBAのコードを書き換えながら使える人は、今の職場では

いません。できるだけ、使用する人に優しい設計にしたいなと思い、校務用システムの開発に取り組んでいます。

 

【書いたコード】

Sub 配列をセルの値で指定し赤塗りとメッセージで表示()

Dim col As Range 'セル範囲
Dim adrs As Variant 'セル位置
Dim msg As Variant '出力メッセージ
 On Error Resume Next

'★1行目を指定範囲から外す
If Range(Range("C1")).row = 1 Or Range(Range("E1")).row = 1 Then
 Exit Sub
End If

'★まず赤塗りをクリア
For Each col In ActiveSheet.UsedRange
 If col.Interior.ColorIndex = 3 Then
  col.Interior.ColorIndex = 0  '白
 Else
 End If
Next

Dim rng1, rng2 As String
Dim rng As Variant

Dim r As Range 'セル範囲

 rng1 = Range("C1").Value  '範囲スタート
 rng2 = Range("E1").Value  '範囲ゴール
 rng = Range(rng1, rng2).Address

'入力セル範囲をループ
For Each r In Range(rng)
 r.Interior.ColorIndex = 3 '赤塗り
 adrs = r.Address(False, False)  '絶対参照$を省略
 msg = msg & adrs & ","  '改行での表示形式
Next
'メッセージボックスに出力
Call MsgBox("設定範囲で" & vbCr & "以下のセルが配列です。" & vbCr & "↓表示無しなら配列はありません。" & vbCr & msg)

On Error GoTo 0

End Sub

-----------------------------------------

ポイントは、セル値はStringで指定し、それを組み合わせたrngはVariantで指定します。そして、rngを配列に入れるときには、Range(rng)とし、rをRangeとして取り出すことです。

 

この手法を使って、「数式が壊されていないか」チェックするマクロも、

実行範囲をセルの値で指定できるようにしてみました。

実際に使ってるんですが、チェックが結構楽になりました。

マクロは嘘つかない。

 

↓サンプルブックです。(備忘録)

 

では、また(^^)/