• 検索結果がありません。

B 5 (2) VBA R / B 5 ( ) / 34

N/A
N/A
Protected

Academic year: 2021

シェア "B 5 (2) VBA R / B 5 ( ) / 34"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

情報基礎実践B5(20141117)

/ 34

情報基礎実践

B

5

統計処理

(2) —

補足(

VBA

R

京都大学 大学院情報学研究科 数理工学専攻/高度情報教育基盤コア準備室 關戸 啓人

(2)

情報基礎実践B5(20141117)

1

/ 34

VBA

 エクセルでは用意された関数をしようする以外に,自分でVBA (Visual

Ba-sic for Applications) を用いてプログラミングをすることもできる.開発の

タブのVisual Basicを選び,挿入,標準モジュールと行い,プログラミング

できるようになる.開発のタブがないなら,リボンを右クリックし,リボン のユーザー設定から追加してください.

VBAは,Visual Basicというプログラミング言語を基本とし,各セルの値を

読み込む,書き込む,または,セル,ワークシート,ブックなどを操作する命 令を備えたものである.

Visual Basic自体は一般の手続き型言語で,C言語など他の手続き型言語に

慣れていれば,習得は難しくない.

(3)

情報基礎実践B5(20141117)

2

/ 34

VBA

例題

   先頭の2桁の数字は解説のための行番号であり,打ち込んではならない.ま た,保存する際は,マクロ付きExcelファイル(拡張子.xlsm)で保存する. 01 Sub test() 02 Dim tmp As Double 03 tmp = Worksheets("Sheet1").Range("C4").Value 04 tmp = tmp * tmp 05 Range("E4").Value = tmp 06 Range("F4").Value = "=POWER(C4,2)" 07 MsgBox("実行しました: 値=" + CStr(tmp)) 08 End Sub 一度作れば,開発タブのマクロから実行できる.(上のマクロ名はtest)  

(4)

情報基礎実践B5(20141117)

3

/ 34

VBA

例題

   01行と08行では,Subプロシージャtestを定義している.ここに囲まれ たプログラムが1つの塊としてみなされて,testを実行してくださいと言え ばこの塊が実行される. 02行目では,Double型の変数tmpを定義している.一般的にはDim 変数 名 As 型名と書くと変数が使えるようになる.Double型というのは,tmp には自由に(有限桁に丸めた)実数を格納できるということである. 注意:実は,Dim 変数名 As 型名と書かなくてもいきなり変数を使えるの だが,(個人的に)あまりおすすめはしない.また,As 型名も省略できるの だが,これもあまりおすすめはしない.  

(5)

情報基礎実践B5(20141117)

4

/ 34

VBA

例題

   03行目では,Sheet1のC4のセルの値をtmpに代入している.ここでは, =は等しいという意味ではなく,右の値を左の変数に代入する,という意味で ある.また,プログラム中に文字列を書きたい場合は,""で囲む. 04行目では,tmpに保存されている値の2乗を計算してから,その値をtmp に代入している. 05行目では,E4のセルの値にtmpの値を代入している.つまり,E4のセル を書き換えている.ワークシートの指定を省略した場合は,現在アクティブ なワークシートのことだと補完かれる.  

(6)

情報基礎実践B5(20141117)

5

/ 34

VBA

例題

    06行目では,セルF4に"=POWER(C4,2)"という文字列を書き込んでい る.これは,エクセルの関数を書き込んでおり,書き込んだ後,値が評価さ れる. 07行目では,メッセージウインドウを作り, "実行しました: 値=" + CStr(tmp) という文字列を出力している.ここ で,文字列の足し算+とは連結のことであり,例えば,"AB"+"CD"は"ABCD" となる.また,実数を文字列に変換するためにCStr()を用いている.  

(7)

情報基礎実践B5(20141117)

6

/ 34

VBA

一般的な注意

   VBAでは大文字と小文字は区別しない. 02 Dim tmp As Double と 02 dim tmp as double は同じ意味になる. ただし,文字列においては,大文字と小文字は区別する."a"という文字列 と,"A"という文字列は等しくないとみなされる. ’以降行末まではコメントみなされ無視される.  

(8)

情報基礎実践B5(20141117)

7

/ 34

VBA

型について

   よく使われる型は以下の通り.(これで全てではない) 型名 : その形の変数が格納できるもの Integer : −215以上215未満の整数 Long : −231以上231未満の整数 Currency : −263以上263未満の整数(主に金額を扱う,挙動が独特) Single :10進数で)有効数字6桁程度の実数 Double :10進数で)有効数字15桁程度の実数 String : 文字列

Boolean : TrueFalse

Variant : その都度,適正な他の型だと見なしてくれる.宣言時に型を

省略するとこれ

(9)

情報基礎実践B5(20141117)

8

/ 34

VBA

演算について

   よく使われる演算は以下の通り.(これで全てではない) 演算子 : 意味,例 + : 足し算.3+4は7になる.文字列の場合は連結. - : 引き算.3-4は-1になる. * : 掛け算.3*4は12になる. / : 割り算.整数の場合は最も近い整数に丸める.3/4は1になる. \ (or 円マーク) : 商.割り算した結果の整数部分.3\4は0になる. Mod : 余り.8 Mod 3は2になる. ^ : べき乗.3^2は32で9になる. 足し算より掛け算を先にやるなどの優先順位がある.自信がないときは()をつければ良い.  

(10)

情報基礎実践B5(20141117)

9

/ 34

VBA

条件分岐

(

概要

)

 条件により,処理を分岐させたい場合は,If,ElseIf,Else,End If

を用いる. 01 If 条件式A Then 02 条件式Aを満たす時の処理 03 ElseIf 条件式B Then 04 条件式Aを満たさず,条件式Bを満たす時の処理 05 ElseIf 条件式C Then 06 条件式A, Bを満たさず,条件式Cを満たす時の処理 07 Else 08 条件式A, B, Cを満たさない時の処理 09 End If ElseIfは何個あっても,0個でも良い.Elseはなくても良い.  

(11)

情報基礎実践B5(20141117)

10

/ 34

VBA

条件分岐

(

条件式

)

   条件式に用いることができるものは以下の通り. 式A = 式B : 式Aの値と式Bの値は等しいとTrue.条件式中では,=は 代入ではない. 式A < 式B : 式Aの値が式Bの値より小さいとTrue. 式A > 式B : 式Aの値が式Bの値より大きいとTrue. 式A <= 式B : 式Aの値が式Bの値以下ならTrue. 式A >= 式B : 式Aの値が式Bの値以上ならTrue. 式A <> 式B : 式Aの値が式Bと等しくないとTrue.

条件式A And 条件式B : 条件式Aと条件式Bの両方がTrueならTrue.

条件式A Or 条件式B : 条件式Aと条件式Bの少なくても一方がTrueな

らTrue.

Not 条件式A : 条件式AがTrueでないならTrue.

(12)

情報基礎実践B5(20141117)

11

/ 34

VBA

ループ処理

(For)

 Forを用いると,ループ処理をすることができる.ForとNextで囲まれた

部分は,カウンタ変数の値を変えながら,カウンタ変数の値がある値に行く まで繰り返す. 01 For カウンタ変数 = 初期値 To 変数の向かう先 Step 加算する値 02 処理 03 Next というような書き方をする.加算する値が正ならば,カウンタ変数が変数の 向かう先以下であるかぎり処理が実行され,加算する値が負ならば,カウン タ変数が変数の向かう先以上であるかぎり処理が実行される. Step 加算する値を省略したら,加算する値は1とみなされる.  

(13)

情報基礎実践B5(20141117)

12

/ 34

VBA

ループ処理

(For)

   以下でいくつかの例を示す. 01 Dim i As Integer 02 For i = 3 To 10 Step 2 03 処理 ’(i=3, 5, 7, 9で4回実行される) 04 Next 01 Dim i As Integer 02 For i = 1 To 5 03 処理 ’(i=1, 2, 3, 4, 5で5回実行される) 04 Next 01 Dim i As Integer 02 For i = 10 To 3 Step -3 03 処理 ’(i=10, 7, 4で3回実行される) 04 Next  

(14)

情報基礎実践B5(20141117)

13

/ 34

VBA

ループ処理

(For)

 Forを途中で抜けたければ,Exit Forを用いれば良い.

01 Dim i As Integer

02 For i = 3 To 10 Step 2

03 If i = 7 Then

04 Exit For ’ i=7の時Forを終了する

05 End If

06 処理 ’(i=3, 5で2回実行される)

07 Next

(15)

情報基礎実践B5(20141117)

14

/ 34

VBA

ループ処理

(Do)

   Do,Loopを用いてもループ処理ができる.途中で抜けるにはExit Doを 用いる. 01 Dim i As Integer 02 i = 1 03 Do 04 処理 ’(i=1, 2, 3, 4で4回実行される) 05 i = i + 1 06 If i = 5 Then 07 Eixt Do 08 End If 09 Loop  

(16)

情報基礎実践B5(20141117)

15

/ 34

VBA

ループ処理

(Do, While)

   Do,Loopのループ処理に対して,条件を満たす限りループ処理を行うと いう時には,Whileを付け加えると良い. 01 Dim i As Integer 02 i = 1 03 Do While i < 5 04 処理 ’(i=1, 2, 3, 4で4回実行される) 05 i = i + 1 06 Loop 01 Dim i As Integer 02 i = 10 03 Do While i < 5 04 処理 ’(この処理は1回も行われない) 05 i = i + 1 06 Loop  

(17)

情報基礎実践B5(20141117)

16

/ 34

VBA

型の変換

   型を変換するときには,以下の関数を用いる. CInt : Integer型に変換する.小数点以下は最も近い整数に丸められる. CLng : Long型に変換する CSng : Single型に変換する CDbl : Double型に変換する CStr : String型に変換する  

(18)

情報基礎実践B5(20141117)

17

/ 34

VBA

配列

   配列を用いると,1つの変数で,同じ型のデータを複数個格納できる.配列 を使うには,Dim 配列名(最終要素番号) As 各要素の型で宣言する.する と,配列名(0),配列名(1),. . .,配列名(最終要素番号)の最終要素番号+1 個の変数を使用することができるようになる. 01 Dim i As Integer

02 Dim arr(5) As Integer

03 For i = 0 To 5

04 arr(i) = i * i 05 Next

で,例えばarr(0)には0が,arr(3)には9が,arr(5)には25が代入さ

れる.

(19)

情報基礎実践B5(20141117)

18

/ 34

VBA

諸注意

 変数を宣言するとき,

01 Dim i As Integer

02 Dim arr(5) As Integer

をまとめて,

01 Dim i As Integer, arr(5) As Integer

と書いても良いが,

01 Dim i, arr(5) As Integer

と書くと,iはVariant型になる.

(20)

情報基礎実践B5(20141117)

19

/ 34

VBA

セルへのアクセス

   セルへアクセスするには,セルの名前を用いて, Worksheets("Sheet1").Range("C4").Value のようにするか,もしくは,行番号と列番号を用いて, Worksheets("Sheet1").Cells(4,3).Value とする.どちらもC4のセルにアクセスしている.Worksheets("Sheet1"). を省略するとアクティブなワークシートのセルにアクセスする.  

(21)

情報基礎実践B5(20141117)

20

/ 34

VBA

その他

   プロシージャ (Sub,Function)や,変数のスコープなど大事な概念が他 にもあるが詳細は省略する.プロシージャだけ簡単な説明をする.プロシー ジャは最初の例のSubのように,プログラムの塊を定義する.また,プログ ラムの塊には,値などを渡すことができる. 行列ABQR 分解したいのなら,QR 分解のコードを2回書くのではなく, 一般の行列をQR 分解するプロシージャを作り,そこに行列 AB をそれぞれ 渡し2回実行させれば良い.プログラムが複雑になってくると,プロシージャ を用いることで簡便なコードになり,修正なども楽になる.  

(22)

情報基礎実践B5(20141117)

21

/ 34

VBA

プロシージャ

   Subプロシージャを作成しておくと,そのプロシージャを呼び出すことで, それを実行できる.また,プロシージャには変数を引数に取ることができる. Functionプロシージャは,Subプロシージャの機能に付け加えて,値を呼 び出し元に返すことができる. 01 Sub Kaku(n As Long)

02 Dim i As Long

03 For i = 1 To n

04 Cells(i, 1) = 0

05 Next

06 End Sub

と書いておけば,好きな場所でCall Kaku(5)またはKaku 5と書くこと

で,1列目の上から5個のセルを0で埋めることができる.

(23)

情報基礎実践B5(20141117)

22

/ 34

VBA

プロシージャ

01 Function MySum(n As Long)

02 Dim i As Long, s As Long

03 s = 0 04 For i = 1 To n 05 s = s + i 06 Next 07 MySum = s 08 End Function と書いておけば,好きな場所でn = MySum(5)と書くことで,nに1+2+3+ 4+ 5で15が代入される.  

(24)

情報基礎実践B5(20141117)

23

/ 34

VBA

変数のスコープ

   大雑把な説明をすると,プロシージャの中で変数を定義したなら,そのプ ロシージャの中でのみ,その変数は使うことができる.プロシージャの外で 定義すれば,変数はどこででも使うことができる.基本的に,変数を定義し た場所,および,その中でのみ,その変数を使うことができる.  

(25)

情報基礎実践B5(20141117)

24

/ 34

R

言語の特徴

  フリーウェア,無償 オープンソフトウェア,個人が開発,改良できる プログラミング言語で,自由にロジックが記述可能,汎用性が高い 行列計算,ベクトル計算は速い.統計処理だけなら速い 統計処理するには,関数などを書かねばならず,とっつきにくい(Rコマ ンダーなどのGUIもある) 行列計算以外の処理などは速くない  

(26)

情報基礎実践B5(20141117)

25

/ 34

その他との比較

Excel 直感的な操作が可能 有償(そこまで高価ではなく,インストールされているPCも多い) 限られた処理しかできない(VBAで多少補える,また有償でアドイン が販売されていることもある) 有償ソフトウェア(SASなど) 性能は様々.基本的に良い.汎用性は様々 有償で,一般的にかなり高価 C言語など 無償,汎用性が高い.うまくプログラミングすれば高速 開発コストがとても高い  

(27)

情報基礎実践B5(20141117)

26

/ 34

変数,代入,演算

 変数は代入されることによって定義される.名前は,アルファベット,数字からなり,最初 の文字は数字であってはならない.名前は,大文字,小文字は区別される.また,以下の名前 を使用することはできない:break,else,for,function,if,in,next,repeat, return,while,TRUE,FALSE.

代入するには,<-を用いる(他にも,->,=,assignがあるが,通常<-だけで十分である). 例えば, x <- 1 とすると,変数xに1が代入される. 演算は,+が足し算,-が引き算,*が掛け算,/が割り算,**または^がべき乗を表す.例え ば, 2/3 は0.6666667となり, 2**4 は16となる.  

(28)

情報基礎実践B5(20141117)

27

/ 34

ベクトル

   ベクトル(2, 4, 7)を変数yに代入するには, y <- c(2, 4, 7) と書く.ベクトル通しの足し算などもでき, c(2, 4, 7) + c(5, 4, 3) とすると,ベクトル(7, 8, 10)となり, c(2, 4, 7) * c(5, 4, 3) とすると,ベクトル(10, 16, 21)となる.(各要素ごとに掛け算された) 長さが違うベクトル通しの演算は,長さが短いベクトルが周期的に長さが何倍かに拡張され て行われる.例えば, c(1,2,3,4,5,6) + c(100,1000) は(101, 1002, 103, 1004, 105, 1006)となるが, c(1,2,3,4,5,6,7) + c(100,1000) はエラーになる.(「長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていま せん」といわれる)  

(29)

情報基礎実践B5(20141117)

28

/ 34

ベクトル

   スカラー変数は,長さ1のベクトルと思って計算される.例えば, c(1, 2, 3, 4) * 2 は(2, 4, 6, 8)に, c(1, 2, 3, 4) + 2 は(3, 4, 5, 6)に, c(1, 2, 3, 4) ** 2 は(1, 4, 9, 16)となる. c(2:6)はc(2,3,4,5,6)と同じです.ベクトルxの長さを取得するにはlength(x)を用 います.ベクトルxのk番目の要素はx[k]で参照できます(最初の要素は1番目の要素です). 2番目の要素から,4番目の要素を取り出すには,x[2:4]で取り出せます.ベクトルxとベク トルyをつなげて,長いベクトルを作るには,append(x,y)とします.ベクトルxの中で,3 より大きい要素だけを取り出すにはx[x>3]と書きます.これは,要素数5のベクトルxの中 で,2番目と4番目の要素だけ取り出すとき,x[c(FALSE,TRUE,FALSE,TRUE,FALSE)] と書くことができ,それの省略形になります.  

(30)

情報基礎実践B5(20141117)

29

/ 34

行列

 行列を作るには,

matrix(ベクトル, nrow=行数, ncol=列数, byrow=TRUE)

とすれば,ベクトルの各要素を,(1, 1)成分,(1, 2)成分,と埋めていった行列が作られる. byrow=FALSEとすると,列について連続になるように埋めていく. 行列についても,演算は各要素ごとに行われる.行列積には%*%を用いる. 行列xの2行目を取り出してベクトルにするときはx[2,],2列目を取り出してベクトルに するときはx[,2]とする. 行列xの各行の平均を求めるときはapply(mean, 1, x),各列の平均を求めるときは apply(mean, 2, x)とする.  

(31)

情報基礎実践B5(20141117)

30

/ 34

行列

   例 > x <- matrix(c(1,2,3,4),nrow=2,ncol=2,byrow=TRUE) > x [,1] [,2] [1,] 1 2 [2,] 3 4 > y <- matrix(c(2,3,4,5),nrow=2,ncol=2,byrow=TRUE) > x * y [,1] [,2] [1,] 2 6 [2,] 12 20 > x %*% y [,1] [,2] [1,] 10 13 [2,] 22 29  

(32)

情報基礎実践B5(20141117)

31

/ 34

read.table

   read.tableはデータを表として読み込む関数である.もっともシンプルな形は,  x <- read.table("hoge.txt") とすれば,hoge.txtに記述されている内容が,列に対してはスペース区切りで表(データ フレーム型)として,xに代入される.オプションもいろいろ有り,例えば,

 x <- read.table("hoge.csv", header=TRUE, sep=",")

の意味は,header=TRUEは1行目は列のラベルが書かれているという意味であり,sep="," は列の区切り文字がコンマという意味である. また,csvファイルを読み込むときには,read.csvという関数が用意されている. 補足:リストは,どんな型でも良い変数の配列で,データフレーム型はリストの2次元版で, どんな方でも良い変数の行列を表す型である.  

(33)

情報基礎実践B5(20141117)

32

/ 34

条件分岐

   条件分岐の書き方は以下のとおりです. if(条件文){ 処理 }else if(条件文){ 処理 }else if(条件文){ 処理 }else{ 処理 }  

(34)

情報基礎実践B5(20141117)

33

/ 34

for

ループ

   forを用いてループ処理するには,以下のようにします. for(変数名 in ベクトル){ 処理 (変数にベクトルの各々の要素が代入されてこの処理がされる) } 例えば,変数iについて,1から100までループを回すには, for(i in c(1:100)){ 処理 } と書くことができます.  

(35)

情報基礎実践B5(20141117)

34

/ 34

関数

   関数(プログラムの塊)を作るには,以下のようにします. 関数名 <- function(引数){ 処理 return(関数が返す値) } 例えば,BMIを求める関数は, BMI <- function(h, w){ return( w/((h/100)^2) ) } と定義し, BMI(170,60) と呼び出すことができます.(20.76125が得られます)  

参照

関連したドキュメント

(The Elliott-Halberstam conjecture does allow one to take B = 2 in (1.39), and therefore leads to small improve- ments in Huxley’s results, which for r ≥ 2 are weaker than the result

[r]

“Breuil-M´ezard conjecture and modularity lifting for potentially semistable deformations after

S., Oxford Advanced Learner's Dictionary of Current English, Oxford University Press, Oxford

[r]

Figure 2 and Figure 3 present plan views of Floor 5 and Floor 4 of the R/B, where major structures were placed (equipment hatch cover and south corridor wall on Floor 5; IC tank,

しかし , 特性関数 を使った証明には複素解析や Fourier 解析の知識が多少必要となってくるため , ここではより初等的な道 具のみで証明を実行できる Stein の方法

また、同法第 13 条第 2 項の規定に基づく、本計画は、 「北区一般廃棄物処理基本計画 2020」や「北区食育推進計画」、