<箇条書きで必要部品を洗い出し単体テストする>
こんにちは、三流プログラマーのKen3です。 今回は、フローは書かないんだけど、 箇条書きのコメントで、流れを書き、 単体テストで部品を作る、部品の精度を高める、 そんな話を書いてみたいと思います。 ※たいしたことないんだけどね(笑)/* * 1. 今回のキッカケ */
VBScriptでTextからExcelシートへのデータをセットする、 そんな処理の依頼を受けました。 依頼内容を勘違いをしつつ、まとめまた話は下記を見て笑ってもらって、 今回は、私の作成方法を軽く書いてみたいと思います。 依頼内容: No.140 ヒアリング、プログラム時にほしい情報をもらい設計する http://www.ken3.org/backno/backno_vba29.html#140 で、 処理概要 xxxx.vbsをダブルクリックしたら、 xxxx.txt 入力ファイル名を入力(できたら選択) xxxx.xls 出力ファイル名を入力(できたら選択) シートへのデータセット処理を開始する。 入力ファイル仕様 sheet_1 A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1.・・・ A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2.・・・ A3,B3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3.・・・ A4,B4,C4,D4,E4,F4,G4,H4,I4,J4,K4,L4.・・・ ・ ・ ・ sheet_2 A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1.・・・ A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2.・・・ 先頭6文字がsheet_の行は、シート名の行で、ここでシートを切り替える その他の行は、データで、A1〜L4へセットする。 とまとめました。(ほぼ、質問そのままなんだけど(オイオイ))/* * 2.作り始める、フローは書かないで箇条書き程度で */
さてと、いきなり作り始める人は、居ないと思います。 そんな話はいつも、聞き飽きたよ、 三流プログラマーのアンタだったらどうするの? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ドキッ、、、人の批判は好きなんだけど、自分のことを話すのはイヤなんだけど、 なんて言ってないで、正直に書くと、 最近は、フローチャートなんてものは、書いてないですね。 ※納品時にほしいって言われたら、プログラムが出来てから、 ソースファイルを見ながら書く、そんな感じか、 ソースからフローチャートを作るツールを会社に買ってもらうとか。 えっ、フローチャート書かないの?(ダカラ三流プログラマーなんだよ) 作り方も知らないんですか?(これだから素人なんだよ三流君は) 学校では、要求仕様書・基本設計書でシステム内容、システム化の目的を理解して、 詳細設計書でプログラムの構成を理解する、 プログラマーは、プログラムを組む前にフローチャートを作成する そんな感じのことを聞いてたんですけど(フローも書けないの三流君は?) あっ、そうなの?それもありだけど、 面倒なので、流れを箇条書きしようよ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ それか、Sub〜End Subに’でコメントを書くとか --- 余談 --- 日光が斜めから射すので、まっすぐに伸びない? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 植物の成長って、日光に向かって伸びるんですよね。 太陽の光がナナメからだったら、ナナメに伸びる・・・ (上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) 実は、自分に対する栄養の与え方って重要なんですよ。 私のメルマガ見て、そこを目指して進むと、斜めに育つかもしれないので、 いろいろな参考書や有益なHPから正しい光(栄養)を補給してね。 ※ナナメに伸びてから、まっすぐに矯正するのは大変なので、 参考程度に読んでね。。。。 ------------ 流れを箇条書き?’でコメントを書く? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (↑何言ってんのこの人?頭大丈夫?フロー書けよ) えっと、こんな感じかなぁ。
Sub aaa() 'xxxx.txt 入力ファイル名を入力(できたら選択) 'xxxx.xls 出力ファイル名を入力(できたら選択) 'シートへのデータセット処理を開始する。 End Sub |
Sub aaa()
'xxxx.txt 入力ファイル名を入力(できたら選択)
'xxxx.xls 出力ファイル名を入力(できたら選択)
'シートへのデータセット処理を開始する。
'入力ファイルのオープン
'出力ファイルのオープン
'入力ファイルがなくなるまでループ
'1行読み込む
'データ行の判断
'If 左から6文字が"sheet_"か判断する
'出力シートの切り替え、シートを選択する
'カウンタを1行目へ
'Else
'データのセット
'セット位置を増やす
'後始末
'入力ファイルクローズ
'出力ファイルクローズ
End Sub |
↑test.vbsファイルの作成とテスト
ここから、必要な機能(部品)を探っていく。
ファイル名の入力方法を探る
^^^^^^^^^^^^^^^^^^^^^^^^^^
'xxxx.txt 入力ファイル名を入力(できたら選択)
'xxxx.xls 出力ファイル名を入力(できたら選択)
なんて、日本語で書くと楽だよね。
VBscriptで書くとどうなるのか、調べてテストする。
InputBoxが使えるので、
値=InputBox(メッセージ,タイトル,初期値)
と値を返してくれるので、
strPATH = InputBox("ファイル名を入力してね","入力ファイル","d:\work\a.txt" )
MsgBox strPATH & "を入力しました。"
でテストしました。
↑InputBoxのテスト
なんとか、使えそうですね。
次は、
テキストファイルを開いてみますか。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
VBAのOpenステートメントは使えなくて、FileSystemObjectでアクセスするみたいです。
↑私がASPでやったことあったので、サクっと書けるけど、
初めてVBScriptやった人は、ここからの調査になる。
※知識のアリ、無しは別にして、1つ1つつぶしていく。
ASP系の解説 ( http://www.ken3.org/asp/ で、書いてます)
^^^^^^^^^^^
No.10 テキストファイルからデータを読む
http://www.ken3.org/backno/backno_asp03.html#10
.ReadLine テキストファイルから1行データを読み込む
http://www.ken3.org/cgi-bin/test/test010-1.asp
.AtEndOfStream でファイルの終端をチェックする
http://www.ken3.org/cgi-bin/test/test010-2.asp
上記の解説を参考にして、
行数の少ないファイルでテストする、プログラムを作成。
~~~~~~~~~~~~(いきなり本番データ使わないで、小さなデータで)
ファイル操作のオブジェクトを作成して、
データを読み込み、行数と内容をMsgboxで表示してみました
------
' FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = CreateObject("Scripting.FileSystemObject")
' e:\work\a.txt を読取専用モードで開く
Set ts = objFS.OpenTextFile("e:\work\a.txt", 1, True)
n = 1
Do While ts.AtEndOfStream = False '*6ファイルの終端になってない間ループ
strDATA = ts.ReadLine 'ファイルからデータを一行を読む
Msgbox n & "行目:" & strDATA '読み込んだデータを表示
n = n + 1 '行カウンタをUPする
Loop
ts.close '使ったファイルは閉じようよ
-----
ポイントは、
~~~~~~~~~~~~
CreateObject("Scripting.FileSystemObject")
でファイル関係にアクセスするオブジェクトを作成、
Set ts = objFS.OpenTextFile("e:\work\a.txt", 1, True)
で、ファイルを開き、
Do While ts.AtEndOfStream = False
と、.AtEndOfStreamでファイルの終端をチェックしつつ、
.ReadLineを使い、
strDATA = ts.ReadLine
データを読み込みます。
↑FileSystemObject,.AtEndOfStream,.ReadLineのテスト結果
テキストファイルが読めそうなので、
次は、
ExcelファイルをOpenして、シート切り替え、保存して閉じる。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
それがテストできればOKかなぁ。
オブジェクトを作成して、
b.xlsを開き、シートcを選択、データ代入、保存
そんなシンプルな機能のサンプルを作ってみます。
'test.vbs
'^^^^^^^^^
Dim oApp
Set oApp = CreateObject("Excel.Application")
oApp.Visible = False '不可視にする
oApp.UserControl = True
'Excelファイルを開く
oApp.Workbooks.Open "E:\work\b.xls"
'シートを切り替える
oApp.Sheets("CCC").Select
oApp.Cells(2,3) = "テストデータ"
oApp.Sheets("DDD").Select
oApp.Cells(2,3) = "シートDDDへ書き込む"
'ファイルの保存
oApp.ActiveWorkbook.Save
'ブックを閉じ、アプリも終了
oApp.ActiveWindow.Close
oApp.Quit
MsgBox "書き込み終了、確認してね"
'-------------
シートの切り替えや、保存が出来ました。
※ここで1つ疑問?
選択したシートが無かったら?
入力ファイル仕様
sheet_1
A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1.・・・
で、sheet_1が無かったら?シートを勝手に作る?それとも?
あと、もともとあったデータは消してしまう?それとも?
こんな感じで、単体で作成していると、仕様の新たな疑問点が発生したりする。
作成前に疑問点や制約事項がわかると、対応がハヤイのでOKかなぁ。
カンマの区切りデータを分ける方法を探る
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1.・・・
と、カンマ区切りのデータをもらうことが出来ます。
このデータをバラす方法は?
ここもASP系のメルマガの力を借りて(オイオイ)
Split関数のサンプルを解説
http://www.ken3.org/cgi-bin/test/test024-1.asp
で、
strBOX = Split("Ken3,ASP不得意,VBA少しできる", ",")
と分解元文字列と区切り文字を渡すと、結果がstrBOXに配列で返ります。
結果
strBOX(0) -- Ken3
strBOX(1) -- ASP不得意
strBOX(2) -- VBA少しできる
と、カンマ区切りの文字列から配列を作成できるみたいです。
作成された配列の要素数を知りたいので、
Split関数とUBound関数のサンプルを解説
http://www.ken3.org/cgi-bin/test/test024-2.asp
で、使っていた、
strBOX = Split(strMOTO, " ") '区切り文字にスペース指定
For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ
のUBoundが使えそうです。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
|
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]