見出し画像

マクロのある暮らし(1回目) - セルを参照する

今回からExcel含め、VBAをつかったマクロについて投稿していきたいと思います。いつまで続くかわかりませんが、よろしくお願いします。
今回はExcelのセルを題材にしてみたいと思います。

よくある例

みなさんはセルにある値を取り出すとしたら、どんな感じにしてますか?
こんな感じにしてますよね?

Sub note_mu()
  MsgBox ActiveSheet.Range("B2")
End Sub

これで実行すると、選択しているワークシートのB2セルに「こんにちは」と記入されていたらメッセージボックスで「こんにちは」と表示されるでしょう。こんな感じになりますよね。

では、もしも選択されたワークシートが違っているとしたら…
例えば先ほどのワークシートは「Sheet1」だった、そしていま選択されているワークシートは「Sheet2」でB2セルには「12」と記入されていたとします。すると、次のような結果になってしまいます。

これは想定した動作でしょうか?いや、違う!という場合はまずいですね。
何かしらワークシートを特定したいですよね。そうしたら、ワークシートを特定してみましょう。名前が「Sheet1」なのですから、それをチェックしてからB2セルのデータを取り出すようにします。

Sub note_mu()
  If ActiveSheet.Name = "Sheet1" Then
    MsgBox ActiveSheet.Range("B2")
  End If
End Sub

選択されているシートの名前が「Sheet1」だったらメッセージボックスを表示するようにしています。これで「Sheet2」が選択されていたら何も起きなくなりました。

でもでも。シート名の「S」が小文字に変えられてしまうと・・・お目当てのシートが選択されていても何も起こらなくなってしまいます。

では、今度は大文字小文字を無視して特定できるようにしましょう。

Sub note_mu()
  If UCase(ActiveSheet.Name) = "SHEET1" Then
    MsgBox ActiveSheet.Range("B2")
  End If
End Sub

これで小文字であってもすべて大文字としてチェックするので大丈夫ですね!それでも待ってください!シート名がガンガンに変えられてしまっていたとしたら…どうにもなりませんよね?

こういうときでも、シートには実体を表すオブジェクトの名前があります。固定して1つ目のシートのB2セルを参照するようにしてみましょう。

Sub note_mu()
  MsgBox Sheet1.Range("B2")
End Sub

やりました!これでシート名がガンガンに変えられてしまってもなんとでもなりますね。

でも…そういえばA列を削除してしまったんですよね。

げーーーっ!!メッセージボックスは表示されたのに、何も表示されなくなってしまいました。もうB2だったセルはいつでも参照したいのでセルの範囲に名前をつけてしまいましょう!

こうしてやれば、コードからも名前でアクセスすることができます。

Sub note_mu()
  MsgBox Sheet1.Range("あいさつ")
End Sub

まとめ

・セルの値を使うときにはワークシートを特定する必要がある

・ActiveSheetは選択されているワークシートへの参照が入っている

・ワークシートの名前を付けたり取り出すにはワークシートオブジェクトのnameプロパティを使う

・大文字小文字を区別せずに何かをしたいときはUCase関数(小文字にするときはLCase関数)を使う

・ワークシートにはシート名のほかにそのものを表すオブジェクトの名称がある

・セルおよび範囲には名前を定義することができ、名前が付くとセル位置が変わっても参照できる


次回もよろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?