...

情報基礎A 第9週 プログラミング入門 マクロ基本文法3

by user

on
Category: Documents
9

views

Report

Comments

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
Fly UP