ワークデザイン02

メモ: 難しかったみたいなので後で修正

1. 前回の復習

    [問題01] 縦の並び、横の並び、どちらが行でどちらが列か?

    1. 縦の並びが行で、横の並びが列
    2. 横の並びが行で、縦の並びが列
    [問題02] 2行3列目のセルに入力されている数字を、変数bに代入するコードは、以下のうちどれか?

    1. Cells(2, 3) = b
    2. cells(2, 3) = b
    3. Cell(2, 3) = b
    4. b = Cells(2, 3)
    5. b = Cell(2, 3)
    6. Cells = (2, 3) = b
    [問題03] 変数bに代入されている数字を、2行3列目のセルに書き込むコードは、以下のうちどれか?

    1. Cells(2, 3) = b
    2. cells(2, 3) = b
    3. Cell(2, 3) = b
    4. b = Cells(2, 3)
    5. b = Cell(2, 3)
    6. Cells = (2, 3) = b


2. エラー対応

Q.「ライセンスのない〜…」が出る。
A. excel2016を再インストールする必要があります。

Q. ボタンを押せない。
A. デザインモードをキャンセル(もう一度押す)してください。

Q. ボタンを押すと、コードの一部が黄色くなる。
A. コードにエラーがあります。エディタの上の方に、青色の四角形ボタンがあるので、それを押してください。

Q. コードの一部の左に、濃い茶色の丸マークがつく。
A. その丸マークをクリックすると消えます。


3. エディタの開き方

1. 開発タブを選択
2. 挿入タブ
3. ActiveXコントロール欄の左上のボタンマークをクリック
4. エクセル画面にボタンを展開
5. デザインモードが濃いグレーになっていることを確認し、ボタンをダブルクリック


4. 配列

配列とは、属性の同じ数字(例えば、10人分の身長、300台の車の重量など)を一括して管理できるように用意された、変数の集合である。配列を用意するには、エディタ上で以下のように書くと良い。

'
Private Sub CommandButton1_Click()

    Dim A(3) As Double
    
    A(1) = 10
    A(2) = 15.1
    A(3) = 2000
    
    Cells(1, 1) = A(1)
    Cells(1, 2) = A(2)
    Cells(1, 3) = A(3)
    
End Sub

「Dim A(3) as Double」と書かれている部分、これは、A(1)、A(2)、A(3)という、3つの変数のセットを用意するという意味がある。実際にその下で、A(1)に10を、A(2)に15.1を、A(3)に2000を代入している。そしてそれを、1行1~3列目のセルに書き出すという意味がある。

問題01: B(1)~B(10)、合計10個の変数を用意し、1行1列目~10行1列目のセルにあらかじめ入力されている数字をB(1)~B(10)に代入するコードを記述せよ。


5. For文

この問題の正解は、以下の通りである。変数Bに対してセルに入っている数字を入れたいので、左が変数、右がセルとなる。

'
Private Sub CommandButton1_Click()

    Dim B(10) As Double
    
    B(1) = Cells(1, 1)
    B(2) = Cells(2, 1)
    B(3) = Cells(3, 1)
    B(4) = Cells(4, 1)
    B(5) = Cells(5, 1)
    B(6) = Cells(6, 1)
    B(7) = Cells(7, 1)
    B(8) = Cells(8, 1)
    B(9) = Cells(9, 1)
    B(10) = Cells(10, 1)
    
End Sub

ただし、これはなかなか大変だと思う。今回は10だからギリギリできたかもしれないが、300台の車の重量を分析したいときなどに、これを300個並べることはあまり望ましくない。
このような繰り返し処理を簡便に描く方法として、ほとんどすべてのプログラミング言語にfor文という機能が備わっている。以下のコードは、上のコードと全く同じ機能を持つ。

'
Private Sub CommandButton1_Click()

    Dim B(10) As Double
    
    For i = 1 To 10
    
        B(i) = Cells(i, 1)
        
    Next i
    
End Sub

6行目と10行目に、「i = 1 To 10」と「Next i」がある。これは、iを1から10まで1ずつ増やしながら、「B(i)=Cells(i, 1)」を実行せよ、という意味がある。すなわち、

B(1)=Cells(1, 1)
B(2)=Cells(2, 1)
B(3)=Cells(3, 1)

B(10)=Cells(10, 1)

という意味となる。これをより詳しく理解するため、以下のコードをうってみてほしい。

'
Private Sub CommandButton1_Click()

    Dim B(10) As Double
    
    For i = 1 To 10
    
        B(i) = Cells(i + 1, 1)
        Cells(i + 5, 2) = B(i)

    Next i
    
End Sub

この出力画面は以下のようになる。入力の10個の数字のみ、自分で入れる必要がある。

入力に数字を入れボタンを押すと、2列目で5行分下がって出力がでていることがわかる。この挙動は、iに具体的な数字をいれて、8, 9行目を読み直してみるとなんとなくわかると思う。例えば、

i=1のとき:
B(1) = Cells(2, 1) -> 2行1列目の数字をB(1)に代入
Cells(6, 2) = B(1) -> B(1)を6行2列目に書き込み

i=2のとき:
B(2) = Cells(3, 1) -> 3行1列目の数字をB(2)に代入
Cells(7, 2) = B(2) -> B(2)を7行2列目に書き込み

という処理が、i=10になるまで続いていく。ゆえに、画像のような出力となる。このように、代入したり書き出したりするセル番号をずらしたい場合には、Cells(i+1, 1)などのように、セル番号にアクセスする座標を足したり引いたりしてずらすことが必要である。


6. 今日の課題

ある生産ラインで同じ製品を6点製造し、この製品の長さを測定したデータがあるものとする。for文と配列を用いて、VBAによりこれらの長さの総和と平均値を算出するソフトウェアを開発せよ。以下が開発するソフトウェアの外見である。なお、ユーザの入力はC列であり、ソフトウェアの出力はF列である。

できた人は紙にこの答えを書いて、提出してください。提出者は帰っていいです。
以下、全体を対象とするにはやや難易度が高いので、評定を高くしたい人だけ取り組んでください。


7. 応用的な話

総和を算出するには以下のように組めば、一応、求められなくもありません。

'
s = B(1) + B(2) + B(3) + B(4) + B(5) + B(6)

ただしこの書き方は、横にずらずら書かなくてはいけないので、数が増えると大変困難です。この問題を解消するには、以下のように書けばokです。

'
s = 0
For i = 1 To 6
     s = s + B(i)
Next i

なぜこれが「s = B(1) + B(2) + B(3) + B(4) + B(5) + B(6)」と同じ意味を持つのか、その理由を説明できる人は、紙の裏面に書いてください。正しければ最終評定に何点か加点します。