【UFT】ユーティリティまとめ　～データテーブル編～

テスト自動化ツールである、UFT(Unified Functional Testing)
データテーブルメソッド(Datatabel Method)について
公式リファレンスを参考にしながら使い方などをまとめたいと思います。

※公式リファレンスは英語のみです。日本語記事がないので、作成をしてみました。

この記事の最後に、今回紹介したメソッドを使ったサンプルコードを記述しています。
興味のある方は参考にしてみてください。


# DataTable object

UFTでは、内部に[ **データテーブル** ] と呼ばれる、Excelのようなものがあります。
このデータテーブル(データシート)に対して操作をするメソッドがDataTableメソッドとなります。
<img width="268" alt="0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/61fd8c60-980f-9b68-3721-3af3c4313ce4.png">


## 1.シートを追加する
このメソッドを使用して、1つの新しいシートを実行時 データテーブル に「追加」することができます。 

``` VB:AddSheet
'構文
DataTable.AddSheet "シート名" 

'例：UserData という名前のシートを作成する
DataTable.AddSheet "UserData" 
```

## 2.シートを削除する
このメソッドを使用して、指定した1つのシートを「実行時データ」テーブルから「削除」することができます。 

``` VB:DeleteSheet
'構文：
datatable.DeleteSheet(Sheet_ID)

'例：1.AddSheetで追加したシートを削除する
datatable.DeleteSheet("UserData") 
```
## 3.GetSheetCount 
このメソッドを使用して、ランタイムデータテーブルのシート数をカウントできます。 

``` VB:GetSheetCount
'構文： 
datatable.GetSheetCount 

'例:シート数を取得して、メッセージボックスに表示する
msgbox datatable.GetSheetCount
```

## 4.GetRowCount 
このメソッドを使用して、シートの行数をカウントできます。
()内に指定がない場合は最初のシート(Global)の行数を取得します。

``` VB:GetRowCount
'構文：
datatable.GetRowCount(Sheet_ID)

'例：Globalシートの行数を取得し、メッセージボックスに表示する
msgbox datatable.GetRowCount()
```

## 5.GetSheet 
このメソッドを使用して、指定されたシートを実行時データテーブルから返すことができます。 

``` VB:GetSheet
'構文：GetSheetで操作したいデータテーブルを指定する。()のあとに[ . ]をTypeすることで、更にメソッドが使用できる。
datatable.GetSheet(SheetID)

'例：UserDataシートを操作対象として指定。行数を取得しメッセージボックスに表示する。
msgbox DataTable.GetSheet(UserData).GetRowCount 
```

## 6.Value
このメソッドを使用して、指定したパラメータとデータテーブルの現在の行にあるセルの値を設定または取得できます。 


``` VB:Value
'構文：
datatable.Value(Parameter_ID,Sheet_Name) = "値または変数" '入力
hoge = datatable.Value(Parameter_ID,Sheet_Name) '取得

'例：UserDataシートのカラム１にActiveになっているセルに値または変数入れる。
DataTable.Value("カラム１","UserData") = "parameter"

' 下記のコードは変数にいれた値を、データテーブル(Global)の1つ目(一番左側のカラム)に入力する
Dim hoge : hoge = "sample"
DataTable.Value(1,"Global") =  hoge

```

データを取得するには 

``` VB:Value
'構文
Dim param
param = datatable.Value(Parameter_Name,Sheet_Name)
'または
param = DataTable(Parameter_Name,Sheet_Name)
``` 

## 7.SetCurrentRow 
このメソッドを使用して、指定された行を実行時データテーブルの現在の行として取得することができます
(デフォルトでは1番目のシートの1行目です) 

``` VB:SetCurrentRow 
'構文：
datatable.SetCurrentRow(Row_Number) 
'例：
hoge = "param"
DataTable.GlobalSheet.SetCurrentRow 1    ' Globalシートの現在の一行目をActiveにする
datatable.Value(1,"Global")= hoge        ' Globalシートの1番左のカラムのActiveになっているセルにhogeが入力される
```

## 8.SetNextRow 
このメソッドを使用して、現在の行の後の行を「実行時データ」テーブルの「新しい現在の行」として使用できます。 
下の行に移動をさせたいときに使います。

``` VB:SetNextRow
'構文：
datatable.SetNextRow 

'例：
hoge = "gcreddy" 
datatable.SetCurrentRow(3).datatable.SetNextRow
datatable.Value(1,1)= hoge
```

## 9.SetPrevRow 
このメソッドを使用して、現在の行の前の行を「実行時データ」テーブルの「新しい現在の行」として取得できます。 
上の行に移動をさせたいときに使います。


``` VB:SetPrevRow 
'構文：
datatable.SetPrevRow 
'例：
hoge = "gcreddy" 
datatable.SetCurrentRow(3)datatable.SetPrevRow
datatable.Value(1,1)= hoge
```

## 10.Import 
このメソッドを使用して、Microsoft Excelファイルをランタイムデータテーブルにインポートすることができます(すべてのシートを含む) 

``` VB:Import 
'構文：
datatable.Import "ファイルのパス" 
'例：
datatable.Import "D:\Inputdata.xls"    'これで "Inputdate.xls"にあるシートが全てデータテーブルにインポートされます
```

## 11.importSheet
このメソッドを使用すると、指定されたMicrosoft Excelシートをランタイムデータテーブル にインポートでき ます。 

``` VB:importSheet
'構文：
datatable.ImportSheet "ファイルパス","シート名" 
'例：
datatable.ImportSheet "D:\sample.xls","sheet1"
```

## 12.Export
このメソッドを使用して、ランタイムデータテーブルのコピーを別の場所にエクスポートできます(すべてのシートを含む) 

``` VB:Export
'構文：
datatable.Export "ファイルパス" 
'例：
datatable.Export "D:\sample.xls"    'Exportする先のファイルが存在しないとエラーがでます。
```
## 13.ExportSheet
このメソッドを使用して、指定されたランタイムデータテーブルを既存のExcelファイルまたは新しいExcelファイルにエクスポートできます。 

``` VB:ExportSheet
'構文：
datatable.ExportSheet "ファイルのパス", "シート名/ソースシート" 
'例：
datatable.ExportSheet "D:\sample.xls","Action1"
```

# サンプルコード
前提条件：
１．Cドライブ直下にはData.xlsxというファイルが存在する。内容は以下の通り
(sheet1)は以下の表があり、Sheet2以降は空

|name|age|city|
|:-:|:-:|:-:|
|kosaka|18|Osaka|
|takamoto|21|kanagawa|
|kanemura|18|saitama|

コードの説明：
1.UFT側のデータテーブルに"sample"シートを追加する
2."sample"シートにData.xlsxのをインポートする
3.Data.xlsxのデータが"sample"にインポートされたか行数を取得し確認
4.行数分ループ処理を行い、インポートされたデータをプリント出力し確認する
5.インポートしたデータに、データを追加する
6.追加したデータが入っているか、4と同じ処理を行い確認する
7.追加したデータをCドライブ直下にData2.xlsxという形でエクスポートする
8.最後にUFTにある"sample"シートを削除する

``` VB:ここまでのメソッドを使ったサンプルコード
' ここでは変数宣言はしません！のでコピペしても動かない場合があります。

DataTable.AddSheet("sample")

DataTable.ImportSheet "C:\Data.xlsx","Sheet1","sample"

' sample にある行数を取得する
row_count = DataTable.GetSheet("sample").GetRowCount()

' ループ処理でSampleシートにある値を取得する

ReDim arryName(row_count)	' name　を入れる配列を用意する
ReDim arryAge(row_count)	' age　 を入れる配列を用意する

' データテーブルの行数分ループ処理を行う。0だとカラム名になるので1からにしています。
For i = 1 To row_count
	arryName(i) = DataTable.Value("name","sample")	'name を取得
	arryAge(i)  = DataTable.Value("age","sample")	'age  を取得

	print "名前： "	&	arryName(i)	&  "  年齢： "	&	arryAge(i)	& "歳"
	' 次の行に移動する
	DataTable.SetNextRow
Next

' 現在の行を取得する
now_row = DataTable.GetCurrentRow()

' 3行目に新しい値を入力します
If now_row = 3 Then
	DataTable.Value("name","sample") = "miku"
	DataTable.Value("age","sample") = "17"
	DataTable.Value("city","sample") = "saitama"	
Else
	Reporter.ReportEvent micFail, "現在の行数が期待値と一致していません", "現在指定している行数は " & now_row & " 行目です"
End If

' 再度、sampleシートの中身をすべて取得して、Printしてみます。今度はcityも取得します

row_count = DataTable.GetSheet("sample").GetRowCount()


ReDim arryName(row_count)	' name　を入れる配列を用意する
ReDim arryAge(row_count)	' age　 を入れる配列を用意する
ReDim arryCity(row_count)	' city　 を入れる配列を用意する

For r = 1 To row_count
	DataTable.SetCurrentRow(r)	
	arryName(r) = DataTable.Value("name","sample")	'name を取得
	arryAge(r)  = DataTable.Value("age","sample")	'age  を取得
	arryCity(r) = DataTable.Value("city","sample")	'city  を取得
	
	print "2回目：" & "名前： "	&	arryName(r)	&  "  年齢： "	&	arryAge(r)	& "歳" & "　出身地： " & arryCity(r) 
	' 次の行に移動する(Forの最初でSetCurrentRow(r)を記述しているので、なくても動きます）
	DataTable.SetNextRow
Next

' データを追加したsampleシートをCドライブの直下に[ data2.xlsx ] という形でExportします
DataTable.ExportSheet "C:\data2.xlsx","sample"    'Cドライブ直下だと、セキュリティの都合で保存できない場合があります。その場合はデスクトップなど別の場所を指定してください。


' データテーブルのsampleシートを削除します
DataTable.DeleteSheet "sample"

```

*********************** 
# 参考・参照
・UFT One Object Model Reference（公式ページ）
https://admhelp.microfocus.com/uft/en/15.0-15.0.1/UFT_Help/Subsystems/OMRHelp/Content/OV_Supp_Util/Utility_ReservedObj.htm?tocpath=Object%20Model%20Reference%20for%20GUI%20Testing%7CUtility%20Objects%7C_____0