[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/08/09(Thu) 11:29
投稿者名:yama
Eメール:
URL :
タイトル:
条件文で悩んでいます。
皆様には大したことがないかも知れないですが、
昨々晩からず〜っと考えてても答えがでません。
ズバッとお答え頂きたく投稿させていただきました。

※やりたいこと
・数個のファイルの存在が全て確認できればある処理をしたいのですが
  ファイル数が毎回決まっていれば下記の様なものでもいいと思うのですが
 毎回ファイルの数が変わるので今回困っています。
 バカな私にはわかりません。どうかお助けください。
  
TargetFileCapacity:ファイルの数(数は不定)
TargetFilePath:ファイルの格納Path
TargetFileOK:ファイルの有無を判断する変数

For r = 0 To TargetFileCapacity
 RealTargetFileName(r) = Dir(TargetFilePath(r))
  If Len(RealTargetFileName(r)) > 1 Then
  TargetFileOK(r) = True

   If TargetFileOK(r) = True Then
    If TargetFileOK(r + 1) = True Then
     If TargetFileOK(r + 2) = True Then
          …
        MsgBox "必要なファイルが揃いました。", vbOKOnly, "ファイルが揃いました"
          …
     End If
        End If
      End If
    End If
Next

投稿時間:2007/08/09(Thu) 11:41
投稿者名:yama
Eメール:
URL :
タイトル:
Re: 条件文で悩んでいます。
間違いに気づきました
>    If TargetFileOK(r) = True Then
>     If TargetFileOK(r + 1) = True Then
>      If TargetFileOK(r + 2) = True Then

このIf文のrは別の変数にしないとダメですね!!

投稿時間:2007/08/09(Thu) 13:05
投稿者名:
Eメール:
URL :
タイトル:
Re^2: 条件文で悩んでいます。
このサイトの左側メニューにあるサンプル

指定フォルダー以下の全ファイルを列挙
http://hanatyan.sakura.ne.jp/vbhlp/fso14.htm

を工夫すればできると思いますよ。
FileSystemObjectを使わなくてもDir関数で実現することもできます。

投稿時間:2007/08/09(Thu) 13:49
投稿者名:yama
Eメール:
URL :
タイトル:
Re^3: 条件文で悩んでいます。
琴さん回答ありがとうございます。

ファイルの存在確認に特化せずFor文やDo〜Loop文、If文等の組み合わせで
出来ないでしょうか?
実に今直面している問題を例にとってあげたのですが、今後もこの様な
「全ての条件が成立したら処理を実行する」制御が多々出てくると考えています。
もし宜しければFor、Do、If等の制御文の組み合わせで解決方をご教示頂けたら
幸いです。宜しくお願いいたします。
文章下手で申し訳ございません。

投稿時間:2007/08/09(Thu) 14:03
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: 条件文で悩んでいます。
If 文を何度もネストさせると、可読性は落ちてしまいますね。

> ファイルの存在確認に特化せずFor文やDo〜Loop文、If文等の組み合わせで
> 出来ないでしょうか?

できると思いますよ。内容によって細かい書き方は異なりますが、
配列やコレクションに入れておいて、ループで回すだけという点では一緒かと。


あと、最初の例であれば、『必要なファイルが揃った』ことを調査したいだけなので、
一個でも揃っていなければ、途中で調査を打ち切れることができるはずです。

'-------
 Dim notFound As Boolean
 notFound = False
 For r = 0 To TargetFileCapacity
  If Dir(TargetFilePath(r), attr) = "" Then
   notFound = True
   Exit For  'ファイルが存在していなければ調査を打ち切る
  End If
 Next
 If notFound Then
  MsgBox "揃ってなかった"
 Else
  MsgBox "必要なファイルが揃っていた"
 End If
'-------

投稿時間:2007/08/09(Thu) 14:09
投稿者名:y4yama
Eメール:
URL :
タイトル:
Re^4: 条件文で悩んでいます。
> ファイルの存在確認に特化せずFor文やDo〜Loop文、If文等の組み合わせで
> 出来ないでしょうか?
> 実に今直面している問題を例にとってあげたのですが、今後もこの様な
> 「全ての条件が成立したら処理を実行する」制御が多々出てくると考えています。

同じyamaのヨシミで・・・
Dim okCnt
For 〜〜
   If 条件がTrueなら okCnt=okCnt + 1
Next
If okCnt=望んでいる数 なら条件が成立した!

でも、簡単には、
Dim ngFlag = False
For 〜〜
   If 条件がFalseなら ngFlag=True
Next
If ngFlag = False なら条件が成立した!

て感じでどうでしょうか

投稿時間:2007/08/09(Thu) 14:20
投稿者名:yama
Eメール:
URL :
タイトル:
Re^5: 条件文で悩んでいます。
魔界の仮面弁士さん、y4yamaさん、回答ありがとうございました。

私も実は無い脳みそグルグル回してFor文内でファイルが1つ有ればカウントし、
そのカウント数とTargetFileCapacity + 1が同じであれば全てのファイルが揃った
(条件成立)となるものが出来ました。

y4yamaさんのと同じ方法でした。今から魔界の仮面弁士さんが作ってくれはった
制御文も動かしてみます。

琴さん、魔界の仮面弁士さん、y4yamaさんお手数お掛けしありがとうございました。
本当に助かりました。

投稿時間:2007/08/09(Thu) 15:58
投稿者名:yama
Eメール:
URL :
タイトル:
Re: 条件文で悩んでいます。
ついでにお聞きしたいんですが、

現在下の様な記述でcsvに書き込んでいます。
For文を使ってスマートにしたいのですが可能でしょうか?

OpenFileNum = FreeFile
Open TargetFilePath(0) For Append As #OpenFileNum
Write #OpenFileNum, frm_Input.Text1.Text, frm_Input.Text2.Text, _
                    Name(0), Code(0), Count(0), Unit(0), Note(0), _
                    Name(1), Code(1), Count(1), Unit(1), Note(1), _
                    Name(2), Code(2), Count(2), Unit(2), Note(2), _
                    Name(3), Code(3), Count(3), Unit(3), Note(3), _
                    Name(4), Code(4), Count(4), Unit(4), Note(4), _
                    Name(5), Code(5), Count(5), Unit(5), Note(5), _
                    Name(6), Code(6), Count(6), Unit(6), Note(6), _
                    Name(7), Code(7), Count(7), Unit(7), Note(7), _
                    Name(8), Code(8), Count(8), Unit(8), Note(8), _
                    Name(9), Code(9), Count(9), Unit(9), Note(9), _
                    Name(10), Code(10), Count(10), Unit(10), Note(10), _
                    Name(11), Code(11), Count(11), Unit(11), Note(11), _
                    Name(12), Code(12), Count(12), Unit(12), Note(12), _
                    Name(13), Code(13), Count(13), Unit(13), Note(13), _
                    Name(14), Code(14), Count(14), Unit(14), Note(14)
Close #OpenFileNum
ぶら下がり連続質問ごめんなさい。

投稿時間:2007/08/09(Thu) 17:30
投稿者名:旅人A
Eメール:
URL :
タイトル:
Re^2: 条件文で悩んでいます。
> ついでにお聞きしたいんですが、
>
> 現在下の様な記述でcsvに書き込んでいます。
> For文を使ってスマートにしたいのですが可能でしょうか?
>
> OpenFileNum = FreeFile
> Open TargetFilePath(0) For Append As #OpenFileNum
> Write #OpenFileNum, frm_Input.Text1.Text, frm_Input.Text2.Text, _
>                     Name(0), Code(0), Count(0), Unit(0), Note(0), _
>                     Name(1), Code(1), Count(1), Unit(1), Note(1), _
>                     Name(2), Code(2), Count(2), Unit(2), Note(2), _
>                     Name(3), Code(3), Count(3), Unit(3), Note(3), _
>                     Name(4), Code(4), Count(4), Unit(4), Note(4), _
>                     Name(5), Code(5), Count(5), Unit(5), Note(5), _
>                     Name(6), Code(6), Count(6), Unit(6), Note(6), _
>                     Name(7), Code(7), Count(7), Unit(7), Note(7), _
>                     Name(8), Code(8), Count(8), Unit(8), Note(8), _
>                     Name(9), Code(9), Count(9), Unit(9), Note(9), _
>                     Name(10), Code(10), Count(10), Unit(10), Note(10), _
>                     Name(11), Code(11), Count(11), Unit(11), Note(11), _
>                     Name(12), Code(12), Count(12), Unit(12), Note(12), _
>                     Name(13), Code(13), Count(13), Unit(13), Note(13), _
>                     Name(14), Code(14), Count(14), Unit(14), Note(14)
> Close #OpenFileNum
> ぶら下がり連続質問ごめんなさい。

書き込む文字列を
Dim WriteString As String
とかで宣言しておいて、

For文で文字列を作成。(連結)
WriteStringは書き出すときだけ使うとかで。

投稿時間:2007/08/09(Thu) 17:53
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: 条件文で悩んでいます。
> 現在下の様な記述でcsvに書き込んでいます。

Write / Input って、本来は CSV ファイル用の命令では無いですよ。

Boolean型や Date型の出力形式が特殊ですし、「"」を含んだデータの
取り扱いにも問題があるので、個人的にはあまりお奨めしません。
多少面倒でも、Print # ステートメントの方が融通は利くかと。


> For文を使ってスマートにしたいのですが可能でしょうか?
『Write #x, a, b, c』というコードは、
  Write #x, a,
  Write #x, b,
  Write #x, c
という 3 行にまたいで書くことができます。ループ処理時には良いかと。

投稿時間:2007/08/09(Thu) 18:12
投稿者名:yama
Eメール:
URL :
タイトル:
Re^2: 条件文で悩んでいます。
旅人Aさん、アドバイスありがとうございました。
魔界の仮面弁士さん、度々のアドバイス、ご指導ありがとうございます。
右も左も分からず我流でVBやり始めたもので多々不的確な部分ありますが
勉強しつつコツコツとやって行きますので今後とも宜しくお願いいたします。
ありがとうございました。