データの流れを意識する、情報の探し方など
[VBA系メニューへ] 
[質問掲示板] 
[バックナンバー目次] 
こんにちは、三流プログラマーKen3です。
今回はデータの流れについて、偉そうに語ってみます。
今回作成したテストプログラム
http://www.ken3.org/p/lzh/off003.lzh
に
Book-003.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
 * 1.データの流れ
*/
システム化する時は、
やりたいことをはっきりさせる
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
のが、まずはポイントなんですが、
その次が、
データの流れをイメージすることです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教科書的な考え方は、
入力 -- 処理 -- 出力のデータの流れです
^^^^^^^^^^^^^^^^^^^^^^^^
/*
 * 2.復習?
*/
フォルダーを選択させ、シートにファイル名を書き込む処理を作りました。
まずメインの制御処理ですが、
~~~~~~~~~~~~~~~~~~~~~~~~~~~
フォルダー選択関数から、フォルダー名を受け取る入力があって、
キャンセル判断の処理、
データ表示処理を呼ぶ出力となってます。
*入力が無かったり、処理だけってパターンもあるけど、
 これは、処理にはまっているかなぁ。
入力 -- 処理 -- 出力 -- 出力結果によって処理 ...と流れはいろいろあるけど、
基本は、何か入力されて、処理して、結果を出力、、です。
Sub Main()
    Dim strFolder As String '選択されたフォルダーを格納
    'フォルダーを選択させる
    strFolder = getFOLDER()  'フォルダーの選択関数を呼ぶ
    'キャンセルだったら処理を抜ける
    If strFolder = "キャンセル" Then
       Exit Sub
    End If
    '選択されたフォルダーを表示関数に渡し表示する
    Call setFILELIST(strFolder)  'データのセット
End Sub | 
strFolderの変数の流れに注目すると、なんとなくわかると思います。
処理の関数側では、
Set objShell = CreateObject("Shell.Application")
オブジェクトから、
objShell.BrowseForFolder
メソッドを使い、フォルダーの選択。(入力)
選択結果を処理して、
結果をリターン値で返してます(出力)
'フォルダー選択ダイアログを表示して、リターン値で選択場所を返す
'キャンセルの時は文字列キャンセル、
'デスクトップの時は文字列を返す
Function getFOLDER() As String
    Dim objShell  As Object 'Shell
    Dim objFolder As Object 'Shell32.Folder
    Const strTitle = "フォルダを選択してください。"
    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")
    'フォルダー参照に設定
    Const lngRef = &H1
    'ルートフォルダーをデスクトップに設定
    '5でMy Documents、6でFavoritesなど
    Const fldRoot = &H0
    
    Set objFolder = _
            objShell.BrowseForFolder(0, _
                strTitle, lngRef, fldRoot)
    
    'フォルダー名を取出し、リターン値をセット
    If objFolder Is Nothing Then 'キャンセルチェック
        getFOLDER = "キャンセル"  'リターン値にキャンセルをセット
    Else
        If objFolder.ParentFolder Is Nothing Then
            getFOLDER = "デスクトップ"
        Else
            getFOLDER = objFolder.Items.Item.Path 'パスをセットする
        End If
    End If
    Set objFolder = Nothing
    Set objShell = Nothing
End Function | 
シートにデータをセットする部分では、
パラメーターでフォルダーを受け取り(入力)
ファイル名を見つけ
データをシートにセットしてます。
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
    'A列をクリアする
    Range("A1:A9999").Value = ""  '1行〜9999行に空文字を代入
    Dim strFileName As String  'ファイル名
    Dim nYLine      As Integer '行カウンタ
    '最初のファイル名を取る
    strFileName = Dir(strFolder & "\*.*", vbNormal)
    
    'ファイルが見つからなくなるまでループしてデータをセットする
    nYLine = 1
    Do While strFileName <> ""   ' ループを開始します。
        Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
        nYLine = nYLine + 1      ' カウントアップする
        strFileName = Dir        ' 次のファイル名を返します。
    Loop
End Sub | 
データの流れねぇ、、、なんとなくわかったけど、
だから?なに?って感じだよね。
/*
 * 3.水路の水の流れを変えるように....
*/
データの流れを意識して、とか言ってたけど、
わかり易く言うと、水の流れを変えるようにかなぁ。
データをセットしている部分に、
Workbooks.Add   '新しいブックを追加
を追加する命令を書くと、
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
    Workbooks.Add   '新しいブックを追加
    Dim strFileName As String  'ファイル名
    Dim nYLine      As Integer '行カウンタ
    '最初のファイル名を取る
    strFileName = Dir(strFolder & "\*.*", vbNormal)
    
    'ファイルが見つからなくなるまでループしてデータをセットする
    nYLine = 1
    Do While strFileName <> ""   ' ループを開始します。
        Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
        nYLine = nYLine + 1      ' カウントアップする
        strFileName = Dir        ' 次のファイル名を返します。
    Loop
End Sub | 
新規のブックを開いて、データがセットされます。
データのセット先、行き先を変えてあげるだけで、
それなりの動きをします。
/*
 * 4.まとめ
*/
プログラムを作る時は、要求事項をまずまとめます。
その次は、
入力 -- 処理 -- 出力を意識して、
データの流れを考えます。
なんて思考すると、
このデータをこんな感じで出力したいけど処理がわからない、
など、質問する時や作る時、イメージが沸きやすいと思います。
そんなカッコイイこといってますが、
作りながら出力イメージ変えたり、いろいろと試行錯誤してたりするんですが。。。
教科書的言葉だと、よいシステムは良い設計から...なんて目にしたことあります。
/*
 * 5.その次は情報収集?単体機能の探し方(三流君の方法)
*/
プログラムが組める人、と、組めない人の差っていろいろあるんだけど、
その1つが情報の探し方だと思います。
インターネットになんでもあるなんてことは無いけど、
http://www.google.co.jp/
に
キーワードを入れて検索すると、よくヒットします。
簡単に、ネットで探せよとボケ、FAQ見たのかコラって話を聞くけど、
探しきれないのも事実です。
~~~~~~~~~~~~~~~~~~~~~~~~
私が探した方法を毎回、書いて行けたらなぁと思ってます。
*実際は、目的地まで誘導してもらって、迷わないで行くよりも、
 方向だけ教えてもらい、迷いながら進むほうが道を覚えるんだけど。
 そのへんのバランスに注意したいですね。
http://www.ken3.org/vba/select.html
に、情報の探し方、少し書いてあるので、こっちもヨロシクです。
/*
 * 6.プロパティ、メソッドを探る方法
*/
次に、よく聞く言葉が、
ヘルプを見ろ、そこに書いてあるだろ、目は付いてるのかよ、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
なんて、冷たいお言葉を先輩からいただきます。
※ひどいのは、日本語はわかるよねぇボク?と幼稚園児扱い。
 (まぁ、そんな最悪の関係もありだったりしてね、、、)
確かにおっしゃる通りなのですが、あんまりですよね。
もっとF1を押してヘルプを表示させてみたら、、、
とやさしく言ってくれてもいいのにね。
でも、冷たい、優しいなんて、抜きにして、
覚えて自分のものになったもん勝ちですよ。
そんなの気にしないで、どんどん、まわりに聞きまくりましょう。
っと、その前に、やはりヘルプは見たほうが良いので、
http://www.ken3.org/vba/excel-help.html
にヘルプの引き方を少し書いてあるので、ヨロシクです。
F1、ただ、押せばいいってもんでもなくて、
調べたい単語やキーワードにカーソルがある状態で押してね。
/*
 * 7.実行時エラーの時、変数の確認方法
*/
エラーが発生すると、
~~~~~~~~~~~~~~~~~~~~
どこで?
どんな値?
変数の中身は?
パラメーターは?
など、いろいろと聞かれると思います。
※ウソつくな、オレ様のルーチンは完璧だ、パラメータがおかしい、
 環境がおかしい、OSだろ、ウイルスだキットと騒ぐ先輩も中には居るので、
 落ち着いて証拠を押さえてから先輩のところに持って行きましょう。
 万引きの誤認逮捕って最悪ですよ、私を犯人扱いにして・・とかなりマズイよ。
 とどこかのコンビに店長が言ってたよ(笑)
そんな時は、あわてないで、
http://www.ken3.org/vba/debug.html
実行時エラー発生時、あわてないでデバックを押す方法
と
http://www.ken3.org/vba/iwind.html
イミディエイト ウインドウ と Debug.Print
に
簡単なデバック時の確認操作を載せているので、参考にしてみて下さい。
デバックで見る前に、頭の中で流れを整理しろ、、、
と
キツイ一言を先輩からもらったりもするんだけどね。
解説って、完成品を見せるのが普通なんだけど、
エラーもたまには載せようと思います。
*単純なスペルミスとか載せないけど、
 私が転んだ場所(エラーヶ所)など、恥ずかしいけど載せて行きたいです。
最近私がやったのは、ASP VBScriptだけど、
Microsoft VBScript コンパイル エラー エラー '800a0409' 
終了していない文字列型の定数です。 
/cgi-bin/g/g009-main.asp, 行 37 
Response.Write "<INPUT TYPE='text' NAME='UNAME'><br>
----------------------------------------------------^
なんてことはない、”が後ろ抜けてただけ。。。
こんなのは、メール行数の無駄なので、載せないけど、
価値あるエラー?は、載せてみたいです。
/*
 * 8.終わりの挨拶
*/
拾い読みして、
1つでも何かの参考となれば幸いです。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってるけど、
なかなかうまくは行かないよね。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
三流君のHP主な飛び先
VBA系のメルマガで書いた解説を項目ごとにまとめてます
[VBAでAccessを操作(一般)]
[VBAでAccessのレポートを操作]
[VBAでAccessのUserForm/サブフォームを操作]
[VBA Access から Excel 連携]
[VBA でExcel オブジェクト/プロパティ/メソッド/一般]
[VBA でExcel UserForm(ユーザーフォーム)を操作する]
[VBA ExcelからAccessを操作する]
[VBA Outlookの操作]
[VBA IEの操作]
[VBA テキストファイル(*.txt,*.html,*.csv)の操作]
[VBA標準関数関係とその他解説]
ASP系の解説を項目ごとにまとめてみました
[ASP Form等を使用したデータのやり取り]
[ASP その他処理サンプル]
[ASP テキストファイル処理]
[ASP VBScript関数関係の説明]
[ASP ADOでMdbファイルを使う]
[ASP ADOでExcelと接続してみた]