• ベストアンサー

VBSが分かりにくい

こんにちは。今、仕事でVBScirptを書いています。 今まではPerlやJava,Shell等を書いたことはあるのですが、VB系は初めてです。 ・・・で微妙にVBが嫌いになり始めています。なぜかって、VB系プログラムの仕様って意味不明じゃないですか? たとえば、 ・関数を呼び出すときはCallを使う(Callは省略可) ・・・って省略化なら作らなきゃいいじゃん! ・Subプロシ-ジャは値を返さないがFunctionプロシ-ジャは値を返す ・・・ってFunctionあればSubなんていらないじゃん! まぁ、基本的なことなんでしょうけど、こういう意味不明な仕様って他にもあるんでしょうか?あるのでしたら教えてください。 また、自分は今までいろんな人が初心者はVBがとっつき易いといっているのを見てきましたが、自分にはそう思えなかった理由がこういうところにあるんじゃないかと思ってきました。皆さんはどう思いますか?

  • dd44
  • お礼率94% (395/419)

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

LET ステートメントだっけ… LET A = 10 は A = 10 と同じ。 OPEN "HOGE.DAT" FOR INPUT AS #1 ってな書き方は不毛だ。 FOR とかAS って書く必要が有るの? 他の予約語とかぶってるし(笑) 他にも色々あると思うけど、今日はもう眠いので… まぁ確かに、慣れない言語で悪戦苦闘するのってストレスが溜まるもんですが、所詮、言語仕様なんてのは些事にしか過ぎません。要は「中身」だって割り切りませう。 #言語仕様っていう観点からすると、Perlも大概、無茶苦茶じゃありません?

dd44
質問者

お礼

>言語仕様なんてのは些事にしか過ぎません。要は「中身」だって割り切りませう。 そうなんですけどねー。なんか気になりますよね。まぁ最初だけかも知りませんね。 Perlは結構スラスラと納得できたんですよ。変数に型がなくてコンテキストに依存する、というのも「Perlは自然言語を参考に作られた」と聞くと、素直にへぇ~と思ってしまったり。なんというか、「多分こう書けばいいんだろう」という期待を裏切られることが少ないんですよね 。 でもJavaはけっこうイマイチな仕様が多くて最初は分かりにくいなと思ってました。 ありがとうございました。また何か教えてください。

その他の回答 (2)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

古い仕様を引きずったのと、中途半端なオブジェクト指向

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=307309
dd44
質問者

お礼

いいアドレスを教えてもらってありがとうございました。いま、WSH5.6からVBScriptを使ってるのですが、WSHは結構きちんと作ってあるなと思うんですがねー。 ところでWSH5.6でVBScriptを使うと,VBScriptのバージョンはVBで言えばどれにあたるんだろう…WSHとは関係ないのかな?

  • mi-si
  • ベストアンサー率35% (200/567)
回答No.1

VBS/Visual Basicは、BASIC言語を無理矢理拡張した言語なので、言語設計や仕様に無理があります。 言い換えれば、大元のBASICと互換を有る程度保ちながらバージョンアップごとに機能拡張を行った来た為にその場しのぎで無理のある仕様拡張が多いのが特徴と言えます。 元がBASICを基本としたマクロ言語なだけに使い方だけを覚えて使うのは比較的簡単なのですが、言語仕様がつぎはぎだらけでスマートでは無いので理屈や理論で覚えようとすると破綻します。 (言い過ぎかな?)

dd44
質問者

お礼

>言語仕様がつぎはぎだらけでスマートでは無いので理屈や理論で覚えようとすると破綻します。 そうなんですよねー。体系的に憶えていこうとすると、なんか例外やらイマイチ納得いかない。先に他の言語を覚えてしまうと余計にそう感じるんですよね。 ありがとうございました。

関連するQ&A

  • VBScriptで引数を省略したい場合

    VBScript の Function、Sub プロシージャで引数を省略したい場合、Optional キーワードが使えないので、空文字を渡すようにしていますが、これは言語仕様的に正しいやり方でしょうか? Sub MyProc(ByVal a, ByVal b) . . . End Sub Call MyProc(a, "")   '← 引数 b は状況に応じて省略したい。 よろしくお願いします。

  • exe実行後、プロセスが残ってしまう

    VB初心者(初日)です。 よろしくお願いします。 あるアプリケーションで「アプリケーションの連動」 の設定があります。 私はperlをキックしてほしいのですが、 VBのexeしか指定できません。 なので、VBのexeを作ることにしました。 ただperlをキックしたいだけのexeです。 Private Sub Form_Load() Ret = Shell("E:\Perl\bin\perl.exe G:\InetPub\wwwroot\cgi-bin\test.cgi", vbAbort) End Sub うまくキックしてくれるのですが、タスクマネージャーで 確認すると、プロセスが残ってしまいます。 shell実行後、完全に終了するにはどうしたらよいですか?

  • 関数呼び出しについて

    VB6.0でSubとFunctionの使い分けに迷っています。 ・関数呼び出しの使い分けについて教えていただけますか? ・どちらもcallで呼び出せるのでしょうか? ・関数はcallを使わなければならないのでしょうか?

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

  • ExcelVBA内のVBSで別ブックを開いたとき

    ブック1で、誰のPCからでもセキュリティの警告を出さないようにブック2を開くVBSを実行し、ブック1で使用した変数xの値をブック2に渡すということをやりたいのですが、上手くいきません...。 ブック2を開く所まではできたのですが、ブック2のセルに変数xの値を入れようとすると、エラー「インデックスが有効範囲にありません。」が発生し、そもそもブック2をアクティブにできません。 ファイル名・パス等は絶対に間違えていないと思います。 原因とどう修正すれば良いか、教えて頂けないでしょうか。 下記が簡略化したプログラムになります。 Book1のプログラム Sub Book1() Dim x As String x = "aaa" CreateObject ("Shell.Application") CreateObject("Shell.Application").ShellExecute "○○.vbs" Workbooks("Book2.xlsx").Sheets("Sheet1").Range("A1") = x End Sub ---------------------------------------------------------------------------------------------------------- VBSのプログラム Dim strExcFileName Dim objExcApp strExcFileName ="○○¥Book2.xlsx" Set objExcApp = WScript.CreateObject("Excel.Application") objExcApp.Visible = True Call objExcApp.Workbooks.Open(strExcFileName,,True) objExcApp.DisplayAlerts = False WScript.Quit 以上、宜しくお願い致します。

  • vbsでループさせる

    vbsでループさせる http://nagabuchi.jugem.jp/?eid=237 で作ったバッチで常駐ソフト(自分はSkydriveとかのクラウドサービス)の起動を遅らせる事ができるようになり、めでたしめでたしなんですが、 セキュリティソフト(KasperskyInternetSecurity2013)より先に常駐ソフトが立がるのは問題だろうと思い、 上記URLで作成する.vbsを改良しようと思いました。 http://q.hatena.ne.jp/1203153427 を参考に以下に示すような感じに変更してみたものの、CreateObjectの行がうまくいきません。 KasperskyInternetSecurity2013 (実行ファイルはC:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe) が起動した後にstartup.batを起動するにはどうすればいいでしょうか? wait9s.batの中身 ping -n 9 127.0.0.1 > nul 問題の.vbsファイル Sub StartAfterKaspersky() Const program_name = "avp.exe" Dim x For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next MsgBox "27秒も待ったのに、Kasperskyが起動しません。強制起動します。" CreateObject("WScript.Shell").Run program_name End Sub '//------------------------------------------------ ' プロセスが動いているかチェックする関数 '//------------------------------------------------ Function processCheck( pName ) '//------------------------------------------------ processCheck = False Dim objPWMI On Error Resume Next Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Err.Clear On Error GoTo 0 If Err.Number <> 0 Then Exit Function '接続できなかったら、終了 Dim colProc Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'") If colProc.Count > 0 Then processCheck = True End Function

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • function openwinについて

    Java scriptの「openwin」についてご質問させていただきます。 function openwin1(){window.open("○○.html"...[以下省略] function openwin2(){window.open("○○.html"...[以下省略] function openwin3(){window.open("○○.html"...[以下省略] function openwin4(){window.open("○○.html"...[以下省略] とfunction openwinを1つづつ指定する作業がとても面倒です。 まとめて同じ動作を指示することはできないのでしょうか? (1つにまとめられたとしても開くhtmlは全て別にできるのでしょうか?) 勉強不足でお恥ずかしいです。 あと、意味がわからない方はご質問してください。 (日本人なのですが日本語が下手なので...)

  • ボタンの飛び先を一つにして、押したボタンのプロパティを変更するには?(超初心者)

    VBじゃないかもしれませんが・・・ HTMLファイルに、VBScriptで次のように書いたのですが、 <html> <head>   ////省略/// <SCRIPT>   ////省略/// Sub Button1_OnClick   ////省略///   Call XXXX EndSub Sub Button2_OnClick   ////省略///   Call XXXX EndSub Sub Button3_OnClick   ////省略///   Call XXXX EndSub  :  :  : Sub XXXX   ---ここで、押したボタンのいろんなプロパティを 変更したいのですが・・・変更の内容はどのボタンを押しても同じなので、ここでひとつにまとめたいんですが。たとえば、そのひとつとして、ボタンの画像を変えるとして・・・   Button(押したボタンの).Src = "sampleX.gif" End Sub </SCRIPT> </head> <body>   <input id="button1" type="button" name="button1" src="sample1.gif">   <input id="button2" type="button" name="button2" src="sample2.gif">   <input id="button3" type="button" name="button3" src="sample3.gif">  :  :  : つまり、押したボタンが何であったかを判別して、 維持することができないでしょうか? 素人です。よろしくお願いします。 ボタンは配列にできればしてもかまいません。 見当違いのスクリプトで、ほかにもっとよいスクリプトがあったら教えてください。

  • Perlにfunctionってないんですか?

    超初歩的な質問ですみません。 今までJavaScriptやPHPを使ってきたので、関数はfunctionで記述していました。 今回Perlも覚えようと思って勉強していたらsubという見たことのない文字を見つけまして。 調べて見るとJavaScriptやPHPのfunctionと同じような働きをしているような印象を受けました。 そこでふとPerlにfunctionって無いのだろうかと思い、調べてみると以下のサイトを発見しました。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k04.htm これによるとfunctionはあるそうなのですが、ここに書いてある通りに記述してみるとエラーになりました。ちなみにGoogle検索で「Perl function」と入れるとこのサイトがトップに来ましたが、それ以下の検索結果でそれらしいものは出てきませんでした。 Perlでfunctionは存在するのでしょうか? するとしたらどのように使い、またsubとの違いはどのようなものなのでしょうか? 質問攻めで恐縮ですが、何卒宜しくお願い致します。

    • ベストアンサー
    • Perl