VBAで始める働き方改革~複数シート(sheet)やブック(Book)の値を転記④~

それでは、最後のセルの移動を覚えて一覧表への転記を完了させましょう。

5) 繰り返すたびに転記するセル(Cell)を移動する方法を覚える

前回までのプログラムを再度確認します。

Visual Basic

Sub sample()
    ‘シート数分繰り返す
    For i = 1 To Sheets.Count–1
        ‘個別シートの転記
        Worksheets(“サマリー”).Range(“C4”).Value = Sheet(i+1).Name
        Worksheets(“サマリー”).Range(“D4”).Value = _
                Worksheets(i+1).Range(“D5”).Value
        Worksheets(“サマリー”).Range(“E4”).Value = _
                Worksheets(i+1).Range(“D6”).Value
        Worksheets(“サマリー”).Range(“F4”).Value = _
                Worksheets(i+1).Range(“D7”).Value
    ‘ここまで繰り返す(iを1増加させる)
    Next i
End Sub

そしてその結果でしたね。

前回の説明を再度確認しますと、サマリーシート(sheet)の一覧表に書く行が固定されているので、同じところに上書きしている状況でした。上記のプログラムで固定されている部分を「変数化」しなければいけないわけです。どこの固定部分が対象になるでしょうか。

答えはこちら

サマリーシート(sheet)のセル(Cell)の指定部分です。ちなみに、個人シート(sheet)のセル(Cell)はシート(sheet)そのものが変更されているので、セル(Cell)の位置は変わりません。

各個人シートの記述位置は同じ

それでは「変数化」するためにどうすればよいでしょうか。

上記は名前を転記するプログラム部分ですが「Range(“C4”)」の部分を個別シート(sheet)が変わるたびに 「Range(“C4”) ➡ Range(“C5”) ➡ Range(“C6”)」 と変えていく必要があります。

つまり、変化が必要と思われるのは指定文字列の数値部分となります。ここを変更するためにはどうすればいいでしょうか。これまでの流れで行けは、やはり繰り返すごとに値が変化する「i」を使って表現できればうまくいくと考えられないでしょうか。

繰り返し中の「i」と「C4」「C5」「C6」の関係を考えてみましょう。
i=「1」のとき、C「4」
i=「2」のとき、C「5」
i=「3」のとき、C「6」

どうでしょうか。この関係を下記のように書き直すことはできないでしょうか。
i=「1」のとき、C「 i+3 」➡ 1+3 ➡ 4
i=「2」のとき、C「 i+3 」➡ 2+3 ➡ 5
i=「3」のとき、C「 i+3 」➡ 3+3 ➡ 6
こうすれば、「i」が繰り返すたびに増加していくので”C”の後に続く数値もひとつずつ増加してくれます。

文字列の結合方法

うまく「i」を使ってセルの位置を指定できるようになったのですが、これをプログラムで表すにはどうすればいいかを考えていきましょう。変数や数字が入るとごちゃごちゃするので、文字列と文字列を結合する方法から考えていきましょう。

例えば、「おはよう」と「ございます」を結合したいときです。

これは正常に動きます。これを分割してみましょう。

赤い文字に代わりエラーとなりました。このままではダメそうです。そこで合わせるとい意味では数値と同じように「+」ではどうでしょうか。

うまくいきました。そこで、”C”とi+3を結合してみましょう。

変数「i」という箱を作って1を代入後、”C”とi+3を結合します。括弧()が付いているのは、計算の順番を明確にするためです。この場合、i+3 = 4としてから、”C” + 4という計算を行う順序で進めたいからです。

さて、実行すると実はエラーになります。

このエラーは「文字列”C”に数値の4を足してくれと言われても、どうしていいか分からないよ」と言われているようなものです。もう少し具体的にいえば「結合すればいいのか、合算すればいいのかわからない」と捉えることが出来ます。

「文字列+文字列」なら、文字列通しなので結合するしかありません。「数値+数値」も通常は足し算です。同じ型であれば、どんな処理をすればいいのか迷う必要はありませんが、「文字列+数値」では、どちらの処理をすればいいのか分かりませんと言われているわけです。

「文字列の足し算なんてできないんだから、結合に決まっているじゃないか」と考えるかもしれませんが、もしかしたら「文字と数値を足し合わせてほしい」という意味だったらどうでしょうか。少々ひねくれた考え方かもしれませんが、「絶対」ではありません。どっちかハッキリしてくださいという事です。

この場合、文字列でも数値でも”結合”してくださいという書き方があります。それが「&」です。皆さんは「アンド」と言っている記号です。正式には「アンパサンド」と言います。この記号を使うと全部”結合”するので、以下のような形で処理されます。
① “おはよう”&”ございます” ➡ “おはようございます”
② 123 & 456 ➡ 123456
③ “C” & 4 ➡”C4″

②の数値と数値でも結合になるというのがポイントです。

少し、脇道にそれてしまいましたが、やりたかったことは「Range(“C4”)」を変数化することでした。試行錯誤の結果、これまでの内容を加味すると以下のようなプログラムになりそうです。

変更前
変更後

中央当たりのRange部分の記述が変更になっています。”C”は固定で数字を変数化したんですね。その二つを”&”で”結合”しています。

上記のプログラムは「名前」を記述する部分でした。全体での変更点を考えてみてください。先頭のプログラムを見ながら修正点を考えましょう。

※ ※ ※ すぐ下に答えがあるので、考えている方はスクロースしないほうがいいですよ ※ ※ ※

では、正解です。

Visual Basic

 Sub sample()
        ‘シート分繰り返す
        For i = 1 To Sheets.Count – 1
            ‘個別シートの転記
            Worksheets(“サマリー”).Range(“C” & (i + 3)).Value = Sheets(i + 1).Name
            Worksheets(“サマリー”).Range(“D” & (i + 3)).Value = _
                    Worksheets(i + 1).Range(“D5”).Value
            Worksheets(“サマリー”).Range(“E” & (i + 3)).Value = _
                    Worksheets(i + 1).Range(“D6”).Value
            Worksheets(“サマリー”).Range(“F” & (i + 3)).Value = _
                    Worksheets(i + 1).Range(“D7”).Value
        ‘ここまで繰り返す(iを1増加させる)
        Next i
    End Sub

サマリーシート(sheet)のセル(Cell)と個別シート(sheet)を「変数化」したことで、For~nextで繰り返しされる毎に「i」を使って固定ではなく”動的に”対応できるようになりました。

ちなみに仮に「林(仮名)さん」というシート(sheet)を追加したとしても、このプログラムで4行出力できます。つまり、従業員の退社、増員があってもプログラムには手を加える必要がないという事です。

これで、一覧表のプログラムは終了です。お疲れさまでした。と言いたいところなのですが、覚えているかどうかわかりませんが、今回は3ステップで進める予定のステップ1が終了しただけでした。

次回のステップ2は結果のサマリ表の作成をVBAでプログラミングしてみましょう。

②の部分ですね。では、次回も頑張りましょう。

この記事の著者

, 」カテゴリの記事