プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
0bjfsoとMsgBoxの組み合わせ
投稿日時: 17/04/29 08:49:30
投稿者: hisayanxp

ファイルを探しに行ってそのファイルが存在したら、削除するかどうかのメッセージボックスを表示させます。Yesがクリックされたら削除が実行され、それ以外は「そのファイルは存在しません」、というメッセージを出したいと思い下記のようにtryしました。
どこを直していいのかわかりません。よろしくお願いします。
 
Option Explicit
Dim objfso
Dim ans
 
Set objfso = Wscript.CreateObject("Scripting.FileSystemObject")
If objfso.FileExists("C:\Users\pc1\Documents\AAA\bbb.txt") Then
MsgBox "削除しますか",vbYesNo
ans = MsgBox "削除しますか",vbYesNo
ElseIf ans = vbYes Then
objfso.DeleteFile("C:\Users\pc1\Documents\AAA\bbb.txt")
Else
MsgBox "そのファイルは存在しません"
End If

回答
投稿日時: 17/04/29 11:00:14
投稿者: simple

    If ファイルがあれば
        ans = MsgBox("削除しますか", vbYesNo)
        If ans = vbYes Then
            ファイルを削除
        End If
    Else
        MsgBox "そのファイルは存在しません"
    End If
ということではないですか?
考え方だけ書いています。

回答
投稿日時: 17/04/29 11:09:21
投稿者: simple

いくつかの過去ログを拝見しての感想を書きます。
 
以下の点から、私はVBSではなく、VBAに絞って学習することを薦めます。
 
(1)VBAのほうがコード作成支援機能、デバッグ支援機能が優れている。
  (あくまで相対的。ベストと申し上げているわけではない)
   
   ・警告、エラーの表示が親切
 
   ・デバッグ機能が格段にVBEのほうが上です。以下のとおり。
   ・ステップ実行やブレークポイントの設定等、各種機能が利用可能
   ・エラー時の各変数の内容確認もVBAのほうがずっとやりやすいです。
    (変数名にカーソルを持って行けば値がポップアップしたり、
     ローカルウインドウで、オブジェクト変数の全プロパティの確認すらできます)
 
   ・コード作成時のインテリセンスや自動補完機能、
   ・ヘルプの利用しやすさ
   (F1キーを押すだけで、そのカーソルにある事項のヘルプが見られます)
    
   これらが備わったVBAを使わない手はありません。
 
(2)「VBSを学ぶことで、基礎から学びたいのですというのも間違い」
   VBAはVBSを基礎に作られたものではないです。親戚ではあるが。
   VBSの変数はVariant型しかないし、言語仕様も異なります。
 
(3)VBAのほうが書籍が豊富で、学習環境は整っているはずです。
   一方で、VBScriptの書籍は限られます。
   あなたは、何をもとにしてVBSを学習されていますか?教えてください。
   VBScriptの基礎から説き起こした定評あるテキストは無い(控えめにいっても
   ごく少数)んじゃないかな。
    
(4)機能的にもVBSにできてVBAでできないことは余りないはずです。
   (ドラッグ&ドロップによるコード起動くらいかなあ)
 
つまり、学習するにはVBAのほうが格段に便利なはずです。
(もっと別の言語の選択肢は否定しませんが)

回答
投稿日時: 17/04/29 11:19:49
投稿者: simple

その他、掲示板利用にあたってのお願い。
 
http://www.moug.net/faq/viewtopic.php?t=75607
で オプション設定で、Option Explicitの自動挿入が可能という話をしました。
その後、また 変数宣言漏れによるエラー発見の遅れを話題にした質問を
されているが、オプション設定を実行してもらっていますか?
 
他人の助言を上の空で聞いてもらっては困ります。
きちんと受け止めてください。
 
また、質問に対する回答があったとき、
>SpecialCellsをもっと研究してみます。
だとか、
>CurrentRegionのことも調べてみます。
だとかで直ぐに閉じてしまうのはもったいない。
 
CurrentRegionの意味なんて、それほど深遠なものでもないでしょう。
調べてみて、「わかった」とコメントするか、
調べても意味が不明なら、再度説明を求めるとか、
質疑を有効に活かすようにしていただきたい。
スレッドが長引くことはなんら問題ないと思います。
 
調べてみますなどとして、理解に至らないままのほうが回答者としては困るのです。

回答
投稿日時: 17/04/29 15:45:58
投稿者: simple

プログラミングをするときにまず守るべきルール、
それはインデントをしっかりつけることです。
インデントをつけることにより、作ったコードの構造が明確にわかるようになります。
 
(1)インデントの有無の比較

今回のものを並べてみてください。(条件分岐の部分だけ取り出します)
貴君のもの

If objfso.FileExists("C:\Users\pc1\Documents\AAA\bbb.txt") Then 
 MsgBox "削除しますか",vbYesNo 
 ans = MsgBox "削除しますか",vbYesNo 
 ElseIf ans = vbYes Then 
 objfso.DeleteFile("C:\Users\pc1\Documents\AAA\bbb.txt") 
 Else 
 MsgBox "そのファイルは存在しません" 
End If

インデントをつけたもの。
    If objfso.FileExists("C:\Users\pc1\Documents\AAA\bbb.txt") Then
        ans = MsgBox("削除しますか", vbYesNo)
    ElseIf ans = vbYes Then
        objfso.DeleteFile ("C:\Users\pc1\Documents\AAA\bbb.txt")
    Else
        MsgBox "そのファイルは存在しません"
    End If

後者のほうがずっと見やすいはずです。
 
後者のコードの意味を解釈してみてください。
ファイルが存在したときは、
        ans = MsgBox("削除しますか", vbYesNo)
という式を実行したあと、End Ifに飛んでしまうはずです。
これはいかにもまずいよね、と頭で考えることもできます。
 
(2)ステップ実行の薦め
さらに、objfsoを生成する部分を追加して(VBAならWscript.は不要)、
これをExcelVBAのコードとして"ステップ実行"してみると、
実行中の行が黄色くなって、一行ずつ進行していきますから、
「実際にどのステートメントが実行されるか」を
自分の目で見て確かめられます。
直感的に感じ取ることができます。
 
コードを頭だけで考えず(意図と異なる動きになっているときは特に)
ステップ実行しながら、自分の目で確認することが大切です。
こうした積み重ねが必要です。
頭だけでコードを理解しようとしても慣れないと難しいでしょう。

投稿日時: 17/04/29 22:00:29
投稿者: hisayanxp

simpleさん
確かにスレが長くなるといけないなという気持ちがありました。
また早く返事を書かなきゃいけないな、という気持ちもありました。
今度から気を付けます。
Option Explicitはご指摘の後EXCELの設定は変えました。
VBSはファイル管理をしたいからです。VBAも並行しています。本は確かにVBSは少ないですね。実感しています。
VBAは初心者なので徐々に慣れようとしています。
 
さてご指摘いただいたように書き直しました。
ところが間違いなく下記のパス(パスはコピーしました)の通りなのですが、”そのファイルは存在しません”と表示されます。おかしいところがあるでしょうか?
 
Option Explicit
Dim objfso
Dim ans
  
Set objfso = Wscript.CreateObject("Scripting.FileSystemObject")
  If objfso.FileExists("C:\Users\ayapc\Documents\AAA\bbb.txt") Then
     ans = MsgBox("削除しますか", vbYesNo)
  ElseIf ans = vbYes Then
     objfso.DeleteFile("C:\Users\ayapc\Documents\AAA\bbb.txt")
  Else
     MsgBox "そのファイルは存在しません"
  End If

回答
投稿日時: 17/04/29 22:27:49
投稿者: simple

誤解があります。
17/04/29 15:45:58 に書いたコードは内容がこれでよい、
と申し上げているものではありません。
単にインデントをつけるとこうなる、ことを示すものですよ。
 
コード修正に関しては、投稿日時: 17/04/29 11:00:14 の指摘をよく読んで下さい。
 
また、私の提案は、こうしたデバッグ(コードの誤りの訂正)は、
VBAでやったほうが格段にやりやすい、というものです。
なのに、VBSにこだわって、なぜデバッグ作業をしようとしないのですか?
 
VBAであれば、こうしたときのためにステップ実行というものがあります。
(Q1)ステップ実行したら、どの行たちが実行されていますか?
(Q2)If objfso.FileExists("C:\Users\ayapc\Documents\AAA\bbb.txt") Then の結果は、
  どうなっていますか?Trueと判断されたのか、Falseだったのですか?
(Q3)そのファイルが実在して間違いないかどうか確認して下さい。

回答
投稿日時: 17/04/29 22:36:16
投稿者: WinArrow
投稿者のウェブサイトに移動

横から失礼
 
>おかしいところがあるでしょうか?
  
おおありです。
意図したような結果が得られない時は、
おかしと思ってもよいでしょう。
  

引用:

Set objfso = Wscript.CreateObject("Scripting.FileSystemObject")
If objfso.FileExists("C:\Users\ayapc\Documents\AAA\bbb.txt") Then
    ans = MsgBox("削除しますか", vbYesNo) '@
ElseIf ans = vbYes Then  'A
    objfso.DeleteFile("C:\Users\ayapc\Documents\AAA\bbb.txt")
Else
    MsgBox "そのファイルは存在しません"
End If

 
@で得た、ans をなぜ、検査しないんですか?
 
↓修正版
Set objfso = Wscript.CreateObject("Scripting.FileSystemObject")
If objfso.FileExists("C:\Users\ayapc\Documents\AAA\bbb.txt") Then
    If vbYes = MsgBox("削除しますか", vbYesNo) Then '@
        objfso.DeleteFile("C:\Users\ayapc\Documents\AAA\bbb.txt")
    End If
Else
    MsgBox "そのファイルは存在しません"
End If
 
 
※私もVBSを使っていますが、
まず、VBAで作成します。デブッグしてから、VBSにコピペしてから、必要があれば修正します。
この方が、早く出来上がります。

回答
投稿日時: 17/04/30 00:10:06
投稿者: MMYS

私もVBSのプログラムは まずVBAで作ります。
実用の的ものをVBS単体で作成している人は居ないと思いす。
https://www.ka-net.org/blog/?p=2260
 
他の方も行っているとおり、VBAの習得が先です。
 
ところで、プログラム習得で一番大事な点はなんだと思いますか。
それは、文法や命令文も必要ですが、もっと重要なことがあります。
処理手順(アルゴリズム)です。
なんか難しく聞こえますが、仕事や日常生活でやってます。
 
例えば、ラーメンを作るには
 1.いつ食べるかを決める
 2.何人分必要かを決める
 3.必要な材料を購入に行く
 4.時間まで待つ
 5.作り始める
となります。いきなり5から初めたら材料が無かったので店に行く。なんて事に。
まず、目的があって、目的を達成する手順を頭の中で考えます。
 
処理手順(アルゴリズム)の方法ですが、それは手作業での操作を箇条書きにします。たとえば先の例なら
・エクスプローラーを起動する
・該当フォルダを開く
・該当ファイルを探す
・ファイルがある場合・・・をする
・ファイルがない場合・・・をする
手作業ではこんな感じ。これをプログラム言語に置き換えます。
これをアルゴリズム化ものは simpleさんが書かれています。

simple さんの引用:

    If ファイルがあれば
        ans = MsgBox("削除しますか", vbYesNo)
        If ans = vbYes Then
            ファイルを削除
        End If
    Else
        MsgBox "そのファイルは存在しません"
    End If

さらに動作するように具体化は WinArrowさんが書かれてます。
WinArrow さんの引用:

Set objfso = Wscript.CreateObject("Scripting.FileSystemObject")
If objfso.FileExists("C:\Users\ayapc\Documents\AAA\bbb.txt") Then
    If vbYes = MsgBox("削除しますか", vbYesNo) Then '@
        objfso.DeleteFile("C:\Users\ayapc\Documents\AAA\bbb.txt")
    End If
Else
    MsgBox "そのファイルは存在しません"
End If

投稿日時: 17/04/30 07:53:50
投稿者: hisayanxp

simpleさん、 WINARRowさん MMYSさん
みなさんありがとうございました。
VBAをメインにすすめます。
今後はVBAで作成してVBSにコピーしてみます。