BizRobo!の変数～初心者あるある～

私は、SEからRPAエンジニアにキャリアチェンジしました。
RPAエンジニアの初現場で、RPAツールのBizRobo!を使用しています。BizRobo!eーニングのおかげで、ロボットを1人で開発できるようになりました。
しかし、BizRobo!を使い始めてから半年、BizRobo!開発で悩み、BizRobo!ナレッジベースで色々と検索しています。

今回は、現場に配属されてからBizRobo!を知った私が、BizRobo!の変数について解説します。

※間違っている箇所や不適切な表現があるかもしれませんが、その時は都度修正いたしますので、ご指摘いただけると幸いです。

## プログラミングにおける変数とは
RPAを開発していく中で、変数はよく使用されます。
それは、RPAも特定のプログラミング言語を用いて開発されたものであり、変数の概念が組み込まれているからです。プログラミングレベルでの変数の知識がRPAでも必要になるとは思いませんが、IT業界に携わる者として、知っておいて損はないでしょう。ここでは、プログラミングにおける変数の概念を紹介します。

### 変数
初心者がプログラミングを学ぶ際、よく見る変数の説明は以下の通りです。
・変数とは、データを格納する箱です。箱にはいろいろなデータを入れることができますが、中身のデータに合わせて、専用の箱を用意する必要があります。それをデータ型と呼びます。

上記でも問題ないのですが、本格的な基幹システム開発や組込み系のシステム開発だと上記説明ではバグを発生させることがあります。そのため、下記まで理解している人もいます。（下記説明でも、不適切な表現かもしれません。）
・プログラム言語の変数は、数学の変数と同じであること
・変数の宣言はメモリを確保すること
・変数へ代入されるデータサイズが、型によって、異なること
1つ目はそのままの意味ですので、2つ目と3つ目を詳細に説明します。

##### 変数の宣言はメモリを確保すること
RPAでは、変数を作成する機能が用意されていますが、プログラミングでは、プログラミング言語で記入しないといけないので、変数を用意するために、変数の宣言を行う必要があります。

変数の宣言とは、下記のようなものを指します。
``` 
Dim a As Integer
```
上記は、.NETの場合です。どのプログラミング言語でも、変数の宣言はあり、それによって、メモリを確保しているのです。
今回の場合、コンピュータ内のメモリのうち、4byte分を確保することを指しています。

##### 変数へ代入されるデータサイズが、型によって、異なること
RPAでは、データ型は数値型やExcel型、html型などデータの種類を決めるためのものですが、プログラミングでは、上記の理解だけでは足りないことがあります。

下記のようなコードがあったとします。
```
Dim a As Integer
a = 1
```
変数aに1が代入するという意味になります。
しかし、実際は1ではありません。「00 00 00 01」が入っているのです。変数の宣言で、Integerを指定したため、4byte分の領域がメモリに確保されています。メモリには、空き領域を作れないため、「00 00 00 01」となります。

もし、Integer型からByte型に変更した場合、どうなるのでしょうか。
```
Dim a As Byte
a = 1
```
Byte型は、メモリに1byte分を確保する型になります。そのため、変数aには、「01」が格納されます。

組込み系システム開発では、一般用のノートパソコンとは違い、より少ないメモリで動作させるケースが多くあります。また、C言語などでは、メモリアドレスを書き換えることができます。
組込み系のシステム開発では、C言語などを用いて、メモリ管理を意識したプログラミングが求められます。そのため、上記の理解までしておく必要があるのです。
（データ型変数と参照型変数の違いやCPUとメモリの関係、メモリアドレスなどの説明は、今回割愛します。）

### スコープ
変数には、スコープという概念が存在します。スコープとは、変数が使用できる範囲を指します。
例えば、下記のようにC言語で書かれたコードがあります。
```
#include <stdio.h>
　int a;　・・・(1)
void main(){
　int b;　・・・(2)
　printf("a = %d¥n", a);
　printf("b = %d¥n", b);
}
void func(int c){
　printf("a = %d¥n", a);　・・・(3)
　printf("b = %d¥n", b);　・・・(4)
}
```
(1)と(2)でint型の変数が作成されます。(1)はソースコード全体で使用できますが、(2)はmain関数だけしか使用できません。そのため、(3)はOKですが、(4)はNGです。

プログラミングで変数を作成する際、一般的にスコープは下記がいいとされています。
・スコープは狭くする
スコープが広くなると、どこで変更されたか把握しづらくなるため、バグの原因になります。


## BizRobo!での変数とは
BizRobo!における変数は、初心者用の説明で十分です。
・変数とは、データを格納する箱です。箱にはいろいろなデータを入れることができますが、中身のデータに合わせて、専用の箱を用意する必要があります。それをデータ型と呼びます。

RPAでは、プログラミングで用意されている型よりも数多くの型が存在しています。BizRobo!では、Integer型やBoolean型だけでなく、JSON型やPDF型、XML型のような型も用意されています。

また、BizRobo!では、作成した変数を用途ごとにまとめて1つのファイルにすることができます。それをタイプファイルと言い、「.type」という拡張子でファイルを作成して、ロボットで活用することができます。


## BizRobo!でよくやる変数での失敗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/adb9583c-c119-c341-984b-783c66d3dd6b.png)
BizRobo!での開発は、プログラミングと同様に、変数のスコープという概念があります。しかし、BizRobo!では、ブランチという概念があるため、他のプログラミング言語とはスコープの捉え方が変わります。

BizRobo!では、変数を作成した場合の有効範囲は、上図の1,2,3までしかありません。そのため、4や5に進んだ場合、変数の値が消えてしまいます。

例えば上図の場合、ループでデータを抽出し、5のステップでファイルに書き出そうとしても、中身が空になってしまいます。それを防ぐため、変数作成時に、全体で使用可能なグローバル設定をチェックする必要があります。グローバル変数とすることで、4,5,6に進んだとしても、値が保持されるようになります。

ただし、グローバル変数を多用すると、スコープが広くなり、バグの原因となるため、グローバル変数の多用はオススメしません。


## 最後に
BizRobo!の変数について、解説いたしました。BizRobo!のeラーニングで変数の概念を理解していました。しかし、実際の現場の開発をすると、変数のスコープの大切さがよくわかりました。実際の現場による経験がいかに大事かが身に沁みました。

BizRobo!では、樹形図のように書くことができるため、スコープを意識しないと、予想外の値が入ってしまい、正しい出力がされなくなります。今回の記事を読んで、BizRobo!における変数を理解し、実際の現場に役立ててほしいと思います。

また、今後もBizRobo!開発に役立つような記事を書いていきます。