ここで、「マクロの記録」に話を戻します。
 
開発タブの「マクロの記録」を開始する時に表示されるダイアログの中に 「マクロの保存先」 とあります。 
ここが今回のポイントです。
 
 
プルダウンの中を見てみると、「個人用マクロブック」「新しいブック」「作業中のブック」があります。
 
 
 
 
それぞれの特徴は次の通りです。
 
 
「作業中のブック」にマクロを保存すると、 そのブックを開いている間は保存したマクロを使えます。
 
長所としては、マクロを保存したエクセルブックを開けば、 誰でもマクロを使えるということです。
 
短所としては、毎月ダウンロードして集計するCSVデータ等、したい操作は同じでも作業するブックが違う場合は、マクロを保存したブックを開かないとマクロを使えないという面倒があります。 
 
そうすると、開いているブックが多くなる分、 ActiveWorkbookにすべきブックを間違えて、違うオブジェクトにマクロを使ってしまう可能性が高くなってしまうかもしれません。
 
 
 
 
「個人用マクロブック」にマクロを保存すると、 同じ端末を使っている限りは、どのエクセルブックにも使えます。
 
長所としては、上記の短所を回避できるという点です。 
 
短所としては、PC本体を替える際やほかの人にマクロを渡すときには、一旦エクセルブック にマクロを保存して新しい端末に送った後、 個人用マクロブックに保存しなおさなければならないという点です。
 
 

個人用マクロブックが表示されていないという方がいたら、マクロの記録時にマクロの保存先を「個人用マクロ ブック」として、マクロを一度記録してみてください。

そうすると表示されるようになります。

 
 
 
 
 
保存場所も異なりますので、VBE画面のプロジェクトエクスプローラー(左上)で確認してみましょう。
 
 
 
例えば上の画像で、Book1.xlsmの標準モジュールを個人用マクロブックにコピーしたいときには、
Book1.xlsmの標準モジュールをPERSONAL.XLSBの赤枠の範囲にドラッグします。
これで簡単にコピーできますよ。
 
 
 
 
個人用マクロブック変更後、 VBE画面で保存せずにエクセルを閉じようとすると、 エクセルファイルの変更「”Book1.xlsm”の変更内容を保存しますか?」とは別に、 「個人用マクロ ブックの変更を保存しますか?」 と聞かれます。
 
忘れずに保存しましょう。
 
 
 
 
 
最後に、個人用マクロブックと相性がいいマクロの実行方法をご紹介します。
リボンに設置したマクロから実行する方法です。
 
以下を実行すると、どのエクセルを開いてもリボンにマクロのアイコンが表示されるので、よく使うものを設定しておくと大変便利です。
 
 
①まず、リボンの空いているスペースで右クリックします。
「リボンのユーザー設定」をクリックしましょう。
 
 
②リボンのユーザー設定が表示されたら、「コマンドの選択」のプルダウンから「マクロ」を選択します。
そうすると、その下の枠に作成したマクロ達が表示されます。
 
 
③リボンにマクロのアイコンを置くスペースを作ります。
開発を選択して、「新しいグループ」をクリックしましょう。
(☑は外さないでくださいね!!)
 
置き場所がなくなってきたら、「新しいタブ」を作って、その中に「新しいグループ」を作ってみてください。
 
 
 
④アイコンの置き場所を作ったら、そこを選択しつつ、使いたいマクロを選択して、「追加」します。
 
 
⑤アイコンのマークや名前、新しいグループの名前を変えたいときは、「名前の変更」から変更できます。
特に変えなくてもいいという方は、そのまま「OK」を押しましょう。
 
 
 
⑥これで、開発タブのリボンにマクロのアイコンが設置できました。
 
 
::::::::::::::::::::::::::::::::::::::
 
 
今回は以上です。
オブジェクトについて知識がある程度ついてからの方がイメージが湧くかと思い、このタイミングでご紹介させていただきました。
お疲れ様でした。

前回までで基本の構文は習得できたと思うので、

今回は複数のシート・ブックを扱えるよう知識を広げていきましょう。

 

 

ワークシートやワークブックを指定する時には、いくつか方法があります。

 

① ワークシート

ActiveSheet

Worksheets (番号)

Worksheets("名前")

※たいていの場合「Worksheets」は「Sheets」としても大丈夫です。

 

② ワークブック

ThisWorkbook

ActiveWorkbook

Workbooks ("ブック名")

Workbooks.open "パス"

 
 
ワークシートやワークブックを指定する際に、上記を文ごとに毎回入力していると、長文になり見にくいです。
また、ActiveSheetやActiveWorkbookは特に、操作するオブジェクトを間違いやすいのでオブジェクト変数に格納して使用することをおススメします。
 
是非分かりやすい変数名を付けてあげてくださいね。
 
オブジェクト変数の使い方は、ActiveSheetやActiveWorkbookの項目を参考にしてみてください。
 
::::::::::::::::::::::::::::::::::::::
 
まずは、①ワークシートから見ていきましょう。
 
 
ActiveSheet
 
選択状態になっているシートのことです。「アクティブシート」とも言います。
※ちなみに選択状態のセルを「アクティブセル」といいます。
 
 ActiveSheet.Range("A1").Select
 
 
複数のシートを扱う際、 プロシージャの内容によってはActiveSheetが入れ替わり、別シートを操作してしまう可能性があるため、 注意が必要です。
オブジェクト変数に格納して使うと間違えにくいです。
 
 
オブジェクト変数の使い方は覚えているでしょうか?
ワークシートなので変数の型はWorksheetで、オブジェクトを変数に入れるときはSetを付けるんでしたね。
 
 Dim Asheet As Worksheet
 Set ASheet = ActiveSheet
 ASheet.Range("A1").Select
 
 
 
 
Worksheets (番号)
 
選択状態になっている(アクティブ)ブックの左端のシートを1として、左から何番目のシートか示すものです。 該当のシートが無いと、エラーになります。
 

 Worksheets(2).Range("A1") = "Sheet2"

 

 

3シート目を開いている状態でマクロを起動しましたが、2シート目を開くとちゃんと指定した通り文字入力されています。

 

 

 

 

Worksheets("シート名")

 

選択状態の(アクティブ)ブックのシート名で指定できます。 該当のシートが無いと、エラーになります。

 

 Worksheets("Sheet3").Range("A1") = "Sheet3"

 

 

こちらもシート番号の時と同様、違うシートを開いてマクロを起動しましたが、3シート目に指定した通り文字入力されています。

 
 
 
 
 
次に②ワークブックを見てみましょう。
 
 
ThisWorkbook
記載したサブプロシージャが保存されているワークブックを指定します。
 
 
例えば、Book1.xlsmとBook2.xlsmがあり、Book2.xlsmに下記をコーディングしているとします。
すると、Book1.xlsmをアクティブにしてマクロを実行しても、Book2.xlsmを操作できるのです。
 
 ThisWorkbook.Worksheets(1).Range("A1") = "A1"
 
 
つまり、通常は、ワークシートやワークブックなどのオブジェクトを省略すると、アクティブブックのアクティブシートに対して操作するようになっていますが、
 
ThisWorkbookを使うと、誤って違うブックをアクティブにしてマクロを起動してしまっても、記載したサブプロシージャが保存されているブックに対して操作できるので、間違いを抑制できます。
 
エクセルブックを複製すれば、自動的にブックに保存しているマクロも複製されるので便利です。
 
ただし、CSVデータをダウンロードしてデータ加工をするような場合は、毎回Subプロシージャをコピペする必要が出てきてしまうため、別の指定の仕方の方がよいでしょう。
 
 
 
 
ActiveWorkbook
現在選択されているワークブックを指定します。
ブック名が毎回変わって予測できないときなどは、ActiveWorkbookを使って指定します。
 
 ActiveWorkbook.ActiveSheet.Range("A1") = "A1"
 
 
アクティブブックもアクティブシートと同様に、操作する中で切り替わってしまうことがあるので、オブジェクト変数に入れておきましょう。
 
 Dim ABook As Workbook
 Set ABook = ActiveWorkbook
 ABook.Worksheets(1).Range("A1") = "A1"
 
 
ちなみに、3つ以上のブックを使うときは、ThisWorkbookとActiveWorkbookを駆使するとしても、ブック名が予測できないブックを指定するのは困難です。
 
毎回ブック名を書き直して指定するしかありません。
そういった手間はできるだけ省きたいものですね。
 
 
 
 
Workbooks ("ブック名")
ワークブック名で指定できます。
開いているワークブックの中に指定した名前のものが無いとエラーになります。
 
 Workbooks("Book1.xlsm").ActiveSheet.Range("A1") = "A1"
 
ブック名が毎回同じ時はブック名で指定できます。
 
 
 
日付など一部だけブック名が変わる場合は、InputBoxと組み合わせるなど工夫すれば、簡単にブック名を指定できます。
 
例えば、「○○Book1.xlsm」の○○が日付になっているブックをよく使う場合、
 
 Dim 日付 As String
   日付 = InputBox("日付を入力してください")
   Workbooks(日付 & "Book1.xlsm").ActiveSheet.Range("A1") = "A1"
 
とすれば、下記のようなInputBoxに都度日付を入力するだけで、ブックを指定できます。
コードの手直しがいりません。
 
 
 
 
 
 
Workbooks.open "パス"
ワークブックが格納されている場所を示すパスを指定すれば、ワークブックを閉じていても操作できます。
 
フォルダ内の全ブックに同じ操作をしたいときなどに便利です。
 
 
 
パスを確認する方法は、
アドレスバー(赤枠のあたり)をクリックするか
 
エクセルブックを右クリックして、プロパティから見れます。
 
上記の場合、このように書けます。
 
 Workbooks.Open "C:\Users\ユーザー名\Desktop\Book1.xlsm"
 ActiveWorkbook.ActiveSheet.Range("A1") = "A1"
 
 
 
::::::::::::::::::::::::::::::::::::::
 
 
ここまでの内容を使えるようになれば、 あなたは大抵のことをマクロで出来るようになったはずです。
 
今後の練習問題をこなしていく中で、徐々に自在に使えるようにしていきましょう。
そのうち、どれを使ったらやりやすいか分かってくると思います。
 
後は、細かいテクニックや変則的なデータ等にどうやって対応していくのかを身に着ければ、より実践的になります。
 
お疲れ様でした。
前回は A Like "*B*" で文字列の場合分けについて例を出しましたので、
今回は数値を使った場合分けを練習してみます。
 
 
 
練習①
シートには教科毎にテスト結果が入力されています。
下記を参考に評価を入力してみましょう。
 
点数     評価
0-59    不可
60-69   可
70-79   良
80-89   優
90-100   秀

(その他)  無効の値

 

 

 

 

::::::::::::::::::::::::::::::::::::::

 

回答例

 

Sub テスト評価①()

  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 7

  For 行 = 上端 To 下端
  
    If 0 <= Cells(行, 2) And Cells(行, 2) <= 59 Then
      Cells(行, 3) = "不可"
      
    ElseIf 60 <= Cells(行, 2) And Cells(行, 2) <= 69 Then
      Cells(行, 3) = "可"
      
    ElseIf 70 <= Cells(行, 2) And Cells(行, 2) <= 79 Then
      Cells(行, 3) = "良"
      
    ElseIf 80 <= Cells(行, 2) And Cells(行, 2) <= 89 Then
      Cells(行, 3) = "優"
      
    ElseIf 90 <= Cells(行, 2) And Cells(行, 2) <= 100 Then
      Cells(行, 3) = "秀"


    Else
        Cells(行, 3) = "無効の値"
    End If
    
  Next 行

End Sub

 

 

 

 

Sub テスト評価②()

  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 7

  For 行 = 上端 To 下端
  
    Select Case Cells(行, 2)
    Case 0 To 59
      Cells(行, 3) = "不可"
      
    Case 60 To 69
      Cells(行, 3) = "可"
      
    Case 70 To 79
      Cells(行, 3) = "良"
      
    Case 80 To 89
      Cells(行, 3) = "優"
      
    Case 90 To 100
      Cells(行, 3) = "秀"
      
    Case Else
        Cells(行, 3) = "無効の値"
    End Select
    
  Next 行

End Sub

 
 
 
多少違いはあると思いますが、同じように場合分けできたでしょうか?
 

ご存じの方もいると思いますが、実は上記回答例には隙があります。

 
テスト点数のように場合分けされるものが整数だけという前提があるのであれば、上記の回答例でも問題ありませんが、小数点も含まれる可能性があるときはもう少し注意して場合分けしないといけません。
 
よく見ると、59~60、69~70、79~80など条件に隙間があり、その間の値だった場合には、すべてCase Elseの処理をされてしまうのです。
 
その辺りも考慮して次の問題を解いてみましょう。
 
 
::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::
 
 
練習②
シートには各々の体重と身長が入力されています。
下記のBMIを求める式と判定基準を基に場合分けをして、BMIと判定を入力してみましょう。
 
 
BMI = 体重kg ÷ (身長m)²
m=100cm
 
BMI値      判定
18.5未満     低体重(瘦ㄝ型)
18.5~25未満  普通体重
25~30未満   肥満(1度)
30~35未満   肥満(2度)
35~40未満   肥満(3度)
40以上     肥満(4度)
 
 
 
 
::::::::::::::::::::::::::::::::::::::
 
回答例
 
 
Sub BMI判定①()

  Dim BMI As Double
  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 16

  For 行 = 上端 To 下端

    BMI = Cells(行, 3) / (Cells(行, 2) / 100) ^ 2
    Cells(行, 4) = BMI

    If BMI < 18.5 Then
        Cells(行, 5) = "低体重(痩せ型)"

    ElseIf 18.5 <= BMI And BMI < 25 Then
        Cells(行, 5) = "普通体重"

    ElseIf 25 <= BMI And BMI < 30 Then
        Cells(行, 5) = "肥満(1度)"
 
    ElseIf 30 <= BMI And BMI < 35 Then
        Cells(行, 5) = "肥満(2度)"

    ElseIf 35 <= BMI And BMI < 40 Then
        Cells(行, 5) = "肥満(3度)"

    ElseIf BMI >= 40 Then
        Cells(行, 5) = "肥満(4度)"
    End If

  Next 行

End Sub
 
 
 
 
 
Sub BMI判定②()

  Dim BMI As Double
  Dim 行 As Integer
  Dim 上端 As Integer
  Dim 下端 As Integer

  上端 = 2
  下端 = 16

  For 行 = 上端 To 下端

    BMI = Cells(行, 3) / (Cells(行, 2) / 100) ^ 2
    Cells(行, 4) = BMI

    Select Case BMI
    Case Is < 18.5
        Cells(行, 5) = "低体重(痩せ型)"

    Case Is < 25
        Cells(行, 5) = "普通体重"

    Case Is < 30
        Cells(行, 5) = "肥満(1度)"
 
    Case Is < 35
        Cells(行, 5) = "肥満(2度)"

    Case Is < 40
        Cells(行, 5) = "肥満(3度)"

    Case Is >= 40
        Cells(行, 5) = "肥満(4度)"
    End Select

  Next 行

End Sub
 
 
::::::::::::::::::::::::::::::::::::::
 
 
If と Select Case の使い方には慣れてきましたか?
 
2つの違いといえば、複数の変数を使った条件は Select Case ではできないというところでしょうか。
 
だいたいは If と Select Case どちらでも表現でき、どちらか片方で事足りることも多いと思います。
 
お好きな方を使ったり、 併用してみたり、 見やすさを鑑みて色々試してみましょう。