Comments
Description
Transcript
情報基礎A 第9週 プログラミング入門 マクロ基本文法3
1 情報基礎A 第9週 プログラミング入門 マクロ基本文法3 配列・FOR~NEXT 全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野 配列 2 同じデータ型は配列としてまとめて扱う 大量のデータを扱う時や複数のデータを次々と自動的 に読み出したい時に配列を利用する 水色の箱は整数の箱 (Integer型) b e c d a x(0) x(1) 要素 箱をx(0),x(1)・・・ x(2) x(3) x(4) f x(5) インデックス番号 配列の名前 配列の宣言(一般的な方法) 3 x(1) x(2) x(3) インデックス 番号は「0」か ら始まる x(4) x(5) 整数型変数を入れる6つの箱 ( 箱の名前はx ,箱の番号は0~5) x(0) x(1) x(2) x(3) x(4) Dim x (5) As Integer 配列名 x(6) インデックス番号 の最大値 データ型 x(5) x(5):名前がx の整数型の 箱を6個用意 配列の宣言(一般的な方法) 4 学籍番号1番 100点 学籍番号3番 学籍番号5番 76点 61点 学籍番号2番 学籍番号4番 学籍番号6番 65点 87点 99点 socre(0) socre(1) socre(2) socre(3) socre(4) socre(5) score(0) = 100 score(1) = 65 score(2) = 76 score(3) = 87 score(4) = 61 score(5) = 99 配列の宣言(インデックス番号指定) 5 整数型変数を入れる6つの箱 ( 箱の名前はx,箱の番号は1~6 ) x(1) x(2) x(3) x(4) x(5) x(6) インデックス番号 要素 箱をx(1),x(2)・・・, x(6) Dim x (1 to 6) As Integer 配列名 配列の名前 データ型 インデックス番号の範囲 配列の宣言: すべてのデータを順番に出力 6 学籍番号 成績 1 100 2 65 3 76 4 87 5 61 6 99 Sub hairetsu1() Dim score1(5) As Integer score1(0) = 100 score1(1) = 65 score1(2) = 76 score1(3) = 87 score1(4) = 61 score1(5) = 99 Msgbox(score1(0)) Msgbox(score1(1)) Msgbox(score1(2)) Msgbox(score1(3)) Msgbox(score1(4)) Msgbox(score1(5)) End Sub 配列の宣言 7 Sub hairetsu2() Dim score2(5) As Integer Dim bangou As Integer ‘参照したい学籍番号を入れておく変数 score2(0) = 100 score2(1) = 65 score2(2) = 76 score2(3) = 87 score2(4) = 61 score2(5) = 99 学籍番号 成績 1 100 2 65 3 76 4 87 5 61 6 99 bangou = InputBox(“学籍番号1番から6番までの6人分 の成績を参照できます.知りたい学籍番号を 入力してください”) Msgbox(“学生番号” & bangou & “番の成績は” & score2( bangou - 1) & “点です.”) End Sub For~ Next 8 繰り返す回数を指定して処理を行う カウンターという変数を用意し,その範囲を指定し,繰 り返す回数を決める カウンタ変数名 : i i=0 繰り返し回数:6回 iの値を1つ増やす i+1をiに代入 i : カウンター変数名 カウンターの初期値 カウンターの最大値 i=i+1 i<=5 false true 動作1 For i = 0 To 5 Step 1 動作1 Next i カウンタの増分設定 カウンター 0 9 Dim i As Integer カウンター変数名は i=0 自分で決める。 カウンター変数名 : i i = i +1 i+1 の値を i に代入する iの値を1つ増やす i + 1 0+1 i i 10 i = i +1 i + 1 i = i +1 i 2 1 3 0 i i 1+1 + 1 i = i +1 i 0+1 i 2+1 + 1 i Sub hairetsu3() ‘For ~ Next を使い6人分の成績を順番に表示(6回繰り返す) ‘score3:配列名、 i:カウンタ名 11 Dim score3(5) As Integer Dim i As Integer score3(0) = 100 score3(1) = 65 score3(2) = 76 score3(3) = 87 score3(4) = 61 score3(5) = 99 For i = 0 To 5 Step 1 MsgBox( score3(i) ) Next i End Sub 学籍番号 成績 1 100 2 65 3 76 4 87 5 61 6 99 Sub hairetsu4() 12 ‘For ~ Next を使い6人分の学籍番号,名前,成績を ‘順番に表示(6回繰り返す) ‘score4:点数の配列名、 name1:名前の配列名、 i:カウンタ名 Dim score4(5) As Integer Dim name1(5) As String Dim i As Integer score4(0) = 100 score4(1) = 65 score4(2) = 76 score4(3) = 87 score4(4) = 61 score4(5) = 99 学籍番号 名前 成績 1 田中浩二 100 2 阿部弘 65 3 伊藤明子 76 4 鈴木一郎 87 5 加藤貴子 61 6 木村潤平 99 13 name1(0)=“田中浩二” name1(1)=“阿部弘” name1(2)=“伊藤明子” name1(3)=“鈴木一郎” name1(4)=“加藤貴子” name1(5)=“木村潤平” 学籍番号 名前 成績 1 田中浩二 100 2 阿部弘 65 3 伊藤明子 76 4 鈴木一郎 87 5 加藤貴子 61 6 木村潤平 99 For i = 0 To 5 Step 1 MsgBox (“学生番号” & i +1 & “番” & name1(i) & “さんの成績は” & score4(i) &“点です.”) Next i End Sub 6人分の合計を計算 14 socre(0) socre(1) socre(2) socre(3) socre(4) socre(5) i=0, goukei=0 goukei i=i+1 i<=5 i i=0 の時 goukei =goukei+score(0) goukei=goukei+score(i) 6人分の合計を計算 初期値: 0 i 1回目 100 0 goukei 2回目 100 goukei 76 87 61 99 socre(0) socre(1) socre(2) socre(3) socre(4) socre(5) goukei 0 65 + + 100 score(0) 65 score(1) 100 goukei 165 goukei 1 i 2 i 6人分の合計を計算 16 3回目 165 goukei 6回目 389 goukei + + 76 score(2) 99 score(5) 241 goukei 488 goukei 3 i 6 i Sub keisan() ‘For ~ Next を使い6人分の成績の合計・平均を計算 ‘配列名:score5、カウンタ名:i、合計の変数:goukei1 17 Dim score5(5) As Integer Dim i As Integer Dim goukei1 As Integer goukei1 = 0 score5(0) = 100 score5(1) = 65 score5(2) = 76 score5(3) = 87 score5(4) = 61 score5(5) = 99 For i = 0 To 5 step 1 goukei1 = goukei1 + score5(i) Next i MsgBox ( i & “人の成績合計は” & goukei1 & “点です.”) MsgBox ( “平均は” & goukei1 / i & “点です.”) End Sub 演習 18 hairetsu4() のプラグラムを拡張し成績の合否の 判定も出力するプログラムを作成してください プログラム名 hyouka() 実行例 学籍番号1番田中浩二さんの点数は100点で合格です. 学籍番号順に表示する(6人分)、MsgBoxが6回実行される. 合否の基準 80点以上は「合格」、80点未満は「不合格」 ヒント hairetsu4()のFor~Next文とseiseki1() のIf ~Then ~Else文 を応用 For~Next文の中にIf ~Then ~Else文を入れる 19 2次元配列・Excel データ利用 配列(1次元、2次元) 整数2次元配列 a(9,2) x(9) y(9) z(9) 整数配列 x(9) 整数配列 y(9) 整数配列 z(9) x(0) y(0) z(0) a(0,0) x(0) a(0,1) y(0) a(0,2) z(0) x(1) y(1) z(1) a(1,0) x(1) a(1,1) y(1) a(1,2) z(1) x(2) y(2) z(2) a(2,0) x(2) a(2,1) y(2) a(2,2) z(2) x(3) y(3) z(3) a(3,0) x(3) a(3,1) y(3) a(3,2) z(3) x(4) y(4) z(4) a(4,0) x(4) a(4,1) y(4) a(4,2) z(4) x(5) y(5) z(5) x(5) a(5,0) y(5) a(5,1) a(5,2) z(5) x(6) y(6) z(6) a(6,0) x(6) a(6,1) y(6) a(6,2) z(6) x(7) y(7) z(7) a(7,0) x(7) a(7,1) y(7) a(7,2) z(7) x(8) y(8) z(8) a(8,0) x(8) a(8,1) y(8) a(8,2) z(8) x(9) y(9) z(9) a(9,0) x(9) a(9,1) y(9) a(9,2) z(9) 20 2次元配列(一般的な方法) 21 配列名(行のインデックスの最大値, 列のインデックスの最大値) a(0,0) a(0,1) a(0,2) a(1,0) a(1,1) a(1,2) a(2,0) a(2,1) a(2,2) a(3,0) a(3,1) a(3,2) a(4,0) a(4,1) a(4,2) a(5,0) a(5,1) a(5,2) a(6,0) a(6,1) a(6,2) a(7,0) a(7,1) a(7,2) a(8,0) a(8,1) a(8,2) a(9,0) a(9,1) a(9,2) 10行 3列の 2次元配列 配列の名前 a 箱の数(10×3=30個) a(9,2):名前がa の整数型の箱 を30個用意 Dim a (9,2) As Integer 配列名 インデックス番号 の最大値 データ型 2次元配列(インデックス番号指定) 22 配列名(行のインデックス番号指定, 列のインデックス番号指定) a(1,1) a(1,2) a(1,3) a(2,1) a(2,2) a(2,3) a(3,1) a(3,2) a(3,3) a(4,1) a(4,2) a(4,3) a(5,1) a(5,2) a(5,3) a(6,1) a(6,2) a(6,3) a(7,1) a(7,2) a(7,3) a(8,1) a(8,2) a(8,3) a(9,1) a(9,2) a(9,3) a(10,1) a(10,2) a(10,3) 10行 3列の 2次元配列 配列の名前 a 箱の数(10×3=30個) Dim a (1 to 10, 1 to 3) As Integer 配列名 インデックス指定 データ型 エクセルデータ利用 23 cells(行のインデックス, 列のインデックス) A1 B1 C1 cells(1,1) cells(1,2) cells(1,3) A2 B2 C2 cells(2,1) cells(2,2) cells(2,3) A3 B3 C3 cells(3,1) cells(3,2) cells(3,3) A4 B4 C4 cells(4,1) cells(4,2) cells(4,3) A5 B5 C5 cells(5,1) cells(5,2) cells(5,3) A6 B6 C6 cells(6,1) cells(6,2) cells(6,3) A7 B7 C7 cells(7,1) cells(7,2) cells(7,3) A8 B8 C8 cells(8,1) cells(8,2) cells(8,3) A9 B9 C9 cells(9,1) cells(9,2) cells(9,3) A10 B10 C10 エクセルのセルの行と列の 番号は1から始まる cells(10,1) cells(10,2) cells(10,3) エクセル上のセル書式 24 セル番号:C2 VBAでは Range(“C2”) 又は Cells(2,3) Range (“列番号行番号”) Cells(行番号,列番号) プロシージャ 25 「Sub」から「End Sub」までのコードの集まりが1つのプロ シージャ(マクロ) Sub exercise1() ThisWorkbook.Worksheets("Sheet1").Range("A:A").Value = 1 End Sub Sub exercise2() ThisWorkbook.Worksheets("Sheet1").Range("A:A").Interior.ColorIndex = 4 End Sub Sub exercise3() ThisWorkbook.Worksheets("Sheet1").Range("A:A"). Delete End Sub オブジェクト 26 「もの」「対象」の意味。VBAでは操作対象となるものを オブジェクトと呼ぶ。 このブック の ワークシート「Sheet1」 の セルの範囲A列 ThisWorkbook . Worksheets("Sheet1") . Range("A:A") . Interior.ColorIndex = 4 K ThisWorkbook . Worksheets("Sheet1") . Range("A:A") . Delete ThisWorkbook . Worksheets("Sheet1") . Range("A:A") . Value = 1 オブジェクト オブジェクトどうしを結ぶピリオド メソッド 27 オブジェクトが操作する「Delete」「Open」などの言葉を まとめてメソッドと呼ぶ このブック の ワークシート「Sheet1」 の セルの範囲A列 を 削除する K . Range("A:A") . Delete ThisWorkbook . Worksheets("Sheet1") メソッド オブジェクトとメソッド結ぶピリオド プロパティ 28 「属性」の意味。オブジェクトの後ろにつなげてオブジェ クトの外観を設定 このブック の ワークシート「Sheet1」 の セルの範囲A列 の塗りつぶしを (色)設定する 赤 K ThisWorkbook . Worksheets(“Sheet1”) . Range(“A:A”) . Interior . ColorIndex = 3 代入 プロパティ オブジェクトとプロパティを結ぶピリオド セルの参照方法 29 セルの参照方法 Range Cells セルA1の値10に設定 以下はまったく同じ動作をする Sub Example_Range1() ActiveSheet.Range(“A1”).Value = 10 End Sub Sub Examlpe_Cells1() ActiveSheet.Cells(1, 1).Value = 10 End Sub Rangeプロパティ 30 任意の1つのセル,又はセルの範囲を参照するプロ パティ 値の読み出し 設定などを行う Range(“セル”) Sub Example_Range2() ‘セルに値を入れる ActiveSheet.Range(“A1”).Value = 15 ActiveSheet.Range(“A2”).Value = 5 ActiveSheet.Range(“B1:B10”).Value=10 End Sub Cellsプロパティ 31 単体セルを参照する Cells(RowIndex,ColIndex) Sub Example_Cells2() ‘セルに値を入れる ActiveSheet.Cells(1,5).Value = 25 ActiveSheet.Cells(2,5).Value = 5 End Sub Cellsプロパティ 32 セルF1~F100にセルの行番号を書き込むプログラム プロパティ「.value」を省略 Sub Example_Cells3() ‘セルF1~F100にセルの行番号を書き込むプログラム Dim i As Integer For i = 1 to 100 step 1 Cells( i , 6 ) = i Next i End Sub セルA1とA2の合計 33 Rangeを使ってセルA1とA2の合計をA3に出力 Sub Example_Range3() Range(“A3”) = Range(“A1”)+ Range(“A2”) End Sub Cellsを使ってセルA1とA2の合計をA4に出力 Sub Example_Cells4() Cells(4,1) = Cells(1,1) + Cells(2,1) End Sub セルB1からB10までの合計 34 Rangeを使ってB1からB10までの合計をB11に出力 Sub Example_Range4() Range(“B11”) = Range(“B1”) + Range(“B2”) + Range(“B3”) + Range(“B4”) + Range(“B5”) + Range(“B6”) + Range(“B7”) + Range(“B8”) + Range(“B9”) + Range(“B10”) End Sub セルB1からB10までの合計 35 Cellsを使ってB1からB10までの合計をB11に出力 Sub Example_Cells5() Dim i As Integer Dim goukei2 As Integer goukei2=0 For i = 1 to 10 step 1 goukei2 = goukei2 + Cells(i, 2) Next i Cells( i , 2) = goukei2 End Sub セルB1からB10までの平均 mcroenshu.xlsm Sheet1 36 • Example_Cells5()のプログラムに平均を追加して下さい – B1からB10までの平均をB12に出力 Sub Example_Cells5() ‘カウンター : cnt Dim i As Integer Dim goukei2 As Integer Dim cnt As Integer cnt = 0 goukei2= 0 For i = 1 to 10 step 1 goukei2 = goukei2 + Cells(i, 2) cnt = cnt + 1 Next i Cells( i , 2 ) = goukei2 Cells( i+1 , 2 ) = goukei2/cnt End Sub 36 mcroenshu.xlsm For ~ Next 文 Sheet2 37 行番号を書くプログラム (A1~A10 に行番号) 列番号を書くプログラム (A1~J1に列番号) Sub gyou() Dim i As Integer Worksheets("Sheet2").Activate Sub retsu() Dim j As Integer Worksheets("Sheet2").Activate For i = 1 to 10 step 1 cells( i , 1 ) = i Next i For j = 1 to 10 step 1 cells( 1 , j ) = j Next j End sub End sub 2重ループ:For文を入れ子構造で使用 38 1行~10行, A~J列までセルに「行番号*列番号」の計算結果を を”Sheet2”に出力するプログラム Sub dual() Dim i As Integer 行:i Dim j As integer Worksheets("Sheet2").Activate For i = 1 to 10 step 1 For j = 1 to 10 step 1 cells(i, j) = i * j Next j Next i End sub mcroenshu.xlsm Sheet2 列:j