解析結果として得られた大量のテキストファイルを1つのエクセルファイルに読み込むマクロを作る
目的とフローチャート
今回の目的は,前回(>XFLR5で二次元翼を解析して結果を出力する)で出力した大量のテキストファイルを1つのエクセルファイルに読み込むことである
テキストファイルの中身はこんな感じ
最初の数行にファイルの説明があって,それ以下にスペース区切りでデータが入力されている
xflr5 v6.43
 Calculated polar for: DAE31
 1 1 Reynolds number fixed          Mach number fixed         
 xtrf =   1.000 (top)        1.000 (bottom)
 Mach =   0.000     Re =     0.100 e 6     Ncrit =   9.000
  alpha     CL        CD       CDp       Cm    Top Xtr Bot Xtr   Cpmin    Chinge    XCp    
 ------- -------- --------- --------- -------- ------- ------- -------- --------- ---------
  -9.800  -0.2128   0.13213   0.12747  -0.0500  0.9789  0.0569  -1.3124   0.0000  -0.0078
  -9.700  -0.2097   0.13112   0.12646  -0.0507  0.9774  0.0575  -1.3107   0.0000  -0.0147
  -9.600  -0.2060   0.13007   0.12541  -0.0517  0.9760  0.0581  -1.3141   0.0000  -0.0244
  -9.500  -0.2023   0.12906   0.12440  -0.0532  0.9747  0.0586  -1.3268   0.0000  -0.0365
  -9.400  -0.1991   0.12813   0.12348  -0.0551  0.9736  0.0589  -1.3504   0.0000  -0.0503
  -9.300  -0.1970   0.12709   0.12245  -0.0552  0.9719  0.0591  -1.3435   0.0000  -0.0537
  -9.200  -0.1920   0.12580   0.12116  -0.0554  0.9705  0.0596  -1.3205   0.0000  -0.0626
  -9.100  -0.1870   0.12461   0.11997  -0.0561  0.9692  0.0601  -1.3065   0.0000  -0.0745
  -9.000  -0.1817   0.12345   0.11880  -0.0571  0.9680  0.0608  -1.3019   0.0000  -0.0896
  -8.900  -0.1764   0.12228   0.11764  -0.0586  0.9670  0.0616  -1.3054   0.0000  -0.1077
    :       :        :         :         :       :       :        :        :        :    
  18.900   1.6401   0.11388   0.10755  -0.0790  0.0766  1.0000  -6.1234   0.0000   0.2624
  19.000   1.6434   0.11462   0.10825  -0.0791  0.0749  1.0000  -6.1735   0.0000   0.2620
  19.100   1.6363   0.11708   0.11086  -0.0801  0.0740  1.0000  -6.1546   0.0000   0.2626
  19.200   1.6338   0.11880   0.11265  -0.0808  0.0727  1.0000  -6.1657   0.0000   0.2628
  19.300   1.6412   0.11885   0.11260  -0.0805  0.0708  1.0000  -6.2426   0.0000   0.2621
  19.400   1.6331   0.12152   0.11543  -0.0817  0.0702  1.0000  -6.2143   0.0000   0.2629
  19.500   1.6277   0.12376   0.11779  -0.0828  0.0693  1.0000  -6.2035   0.0000   0.2634
  19.600   1.6412   0.12274   0.11658  -0.0818  0.0671  1.0000  -6.3208   0.0000   0.2622
  19.700   1.6319   0.12566   0.11967  -0.0833  0.0666  1.0000  -6.2826   0.0000   0.2631
  19.800   1.6237   0.12842   0.12259  -0.0848  0.0661  1.0000  -6.2505   0.0000   0.2640
  19.900   1.6176   0.13087   0.12515  -0.0861  0.0654  1.0000  -6.2310   0.0000   0.2648
  20.000   1.6190   0.13194   0.12623  -0.0865  0.0643  1.0000  -6.2641   0.0000   0.2647
この手法は,学生実験などの結果がテキストファイルで与えられたときなどにも役立つと思うのでぜひ参考にしてほしい
マクロのフローチャートを以下に示す

- 変数を宣言する
 - 必要な値をシートから読み込む
 - 読み込んだ値からテキストファイルのファイル数を計算し,ループを始める
 - ファイル名を生成する
 - ファイルを開く
 - 1つのセルに1つのデータが入るようエクセルシートをいじる
 - テキストファイル内のデータの個数を計測する
 - さらにループを回してすべての必要なデータを配列に格納する
 - ファイルを閉じる
 - すべてのファイルについて上の処理が終われば,配列をエクセルシートに貼り付ける
 
テンプレートファイルのダウンロード
エクセルシートの配置などの参考になるようにテンプレートファイルを添付しておく
※数式やマクロはすべて削除してあり,値も適当である
プログラムの解説
それでは実際に解説していく
使用する変数
マクロに使用する変数を以下に示す
Dim file_number As Integer 'ファイル数
Dim data_number As Integer 'データ数
Dim last As Integer 'データが入っている最終行
Dim Re_min  As Double '最小Re数
Dim Re_mas As Double '最大Re数
Dim Re_delta As Double 'Re数刻み
Dim foil_name As String '翼型名
Dim file_name As String 'ファイル名
Dim data(30000, 4) As Double 'データ格納用配列
'カウンター
Dim i As Integer
Dim j As Integer
データ数data_numberは最後に配列をシートに貼り付けるときのみ使用
データ格納用配列data()を動的配列にしてもよかったが,面倒なのでやめた.データ数は30000もあれば十分だろう
ほしいデータの種類はα,CL,CD,Cm,Reなので,data(0:30000, 0:4)で宣言した
前準備
(>Excel VBA/マクロ について知っておいてほしいこと)でも言ったとおり,プログラムの最初に,マクロを使うにあたって,次のコードを入れておく
ActiveWorkbook.Save '上書き保存
Application.ScreenUpdating = False '画面更新の非表示
Application.DisplayAlerts = False '警告画面の非表示
警告画面というのは,Excelファイルを閉じるときの「変更内容を保存しますか?」みたいなやつのこと
これから書くすべてのマクロの先頭にこのコードを入れるので,次回以降特に説明はしない
値の読み込み・ファイル数の計算
まず,今回のマクロに必要な値をシートから読み込む
'値の読み込み
Re_min = Cells(4, 24) '最小Re数
Re_max = Cells(4, 25) '最大Re数
Re_delta = Cells(4, 26) 'Re数刻み
foil_name = Cells(5, 24) '翼型名
読み込みに使うのはRangeでもCellsでもいいが,両方使えるときはCellsのほうが少し早いらしい
解析に使用した最小Re,最大Re,およびRe数の刻みから,解析結果のファイル数は次のように計算できる
'ファイル数の計算
file_number = (Re_max - Re_min) / Re_delta + 1
ファイルのループ開始
ファイルのループを開始する
data_number = 0
For i = 0 To file_number - 1 'すべてのファイルのループ
	(各ファイルについての処理)
next i
データ数data_numberは,配列に格納しながら数えていくので,ループが始まる前に初期値の0を入れておく
ファイル名の生成
それぞれのファイルについて,まず開きたいファイル名を生成する
i番目のファイルのファイル名をfile_nameに格納するコードは次のようになる
'開きたいファイル名を作る
file_name = foil_name & "_T1_Re" & Format((Re_min + Re_delta * i) / 1000000, "0.000") & "_M0.00_N9.0.txt"
&は複数の文字列の結合で,Format(数値,書式)を使えば,指定した桁数で数値を文字列に変換できる
ファイルを開く
ファイルを開くには,Workbooks.Openを使い,ファイルがある場所(パス)とファイル名を指定する必要がある
'設計シートと同じフォルダにあるテキストファイルを開く
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & file_name
ThisWorkbook.Pathはむちゃくちゃ便利な奴で,マクロが書かれているエクセルシートと同じ場所を指定してくれる
こうすれば,だれがどのパソコンで使おうと,2つのファイルが同じフォルダにありさえすればいいので使いやすい
データの処理
ためしにここまでのプログラムを実行してみる(ループの開始の部分はコメントアウトした状態で)

このように,テキストファイルがエクセルで開くが,A行にすべてのデータが貼り付けられているのでマクロで値を読み取ることができない.
1つのセルに1つのデータが入るようにするコードを書くのはとても面倒なので,ここでは「マクロの記録」を利用する
まず,「Ctrl+space」でA行を選択し,「Alt→A→E」で「区切り位置」を選択

「次へ」→「次へ」→「完了」で1つのセルに1つのデータが入る


これを,「マクロを記録」で記録したコードは次のようになる
'「データ」→「区切り」からスペースでデータを区切る
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
	FieldInfo:=Array(Array(0, 1), Array(8, 1), Array(17, 1), Array(27, 1), Array(37, 1), _
        Array(46, 1), Array(54, 1), Array(62, 1), Array(71, 1), Array(81, 1)), _
        TrailingMinusNumbers:=True
正直何が書いてあるかさっぱりわからないが,これでいいらしい
データを格納
必要なデータを配列に格納するために,まずはデータがシートの何行目まで入っているか調べる必要がある
指定した列の,データが入っている最終行を取得するには次のコードがある
last = Cells(Rows.Count, 1).End(xlUp).Row '座標データの最終行を取得
上のコードでは,第1列(=A列)のデータが入っている最終行を取得する
これを用いて配列にデータを格納していく
For j = 12 To last
            data(data_number, 0) = Cells(j, 1)
            data(data_number, 1) = Cells(j, 2)
            data(data_number, 2) = Cells(j, 3)
            data(data_number, 3) = Cells(j, 5)
            data(data_number, 4) = Re_min + Re_delta * i
            data_number = data_number + 1
Next j
ファイルを閉じる
ファイルを閉じるには次のコードを使えばいい
ActiveWindow.Close
ここで警告画面を非表示にしておかないとすべてのファイルで「保存しますか?」というメッセージが出てきてしまう
値の貼り付け
すべてのファイルについてのループを終了すれば,最後にデータを設計シートに貼り付ける
'値の貼り付け
Range(Cells(12, 1), Cells(12 + data_number - 1, 5)) = data()
配列の貼り付けはこれでできる
くれぐれもセル1つずつに数千回貼り付けを行うようなことはしないように
これでコードは終了である
プログラムの実行
今回作成したプログラムを実際に実行してみる

46個のファイルを読み込んで実行時間は約14秒だった
まとめ
「マクロを記録」の機能はエクセルシートの処理をするうえでとても便利なのでぜひ使いこなせるようになってほしい
上の説明でわからないことがあればグーグルで検索してみよう.きっと答えはそこにあるはず
↓最新の高速版はこちら
↓次の記事
↓ひとつ前の記事
↓記事一覧
  
  
  
  





コメント