• ベストアンサー

エクセルVBA(初心者)

Sub 練習() a = InputBox("だれ") MsgBox a End Sub 「a =」よりも「InputBox("だれ")」が最初に実行されるのは、どのような文法の決まりからでしょうか? Sub 練習() InputBox "だれ" a = InputBox("だれ") MsgBox a End Sub この場合、InputBox が2回でてきてしまうのですが・・・?

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

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

a = InputBox("だれ") とは変数aの中にInputBoxからの戻り値を代入するという意味になります。 つまり a=2+3 だったらaの中には5が入ります。 「a=」は何か実行するというような意味はありません。 視覚的に分かりやすくするなら a←2+3 というような感じです。 2段目の例文は まず InputBox "だれ" が実行されますが、これは戻り値を受け取っていないのでただ表示させているだけです。 続いてa = InputBox("だれ") でaに代入され 最後に MsgBox a でaの値が表示されています。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

(1) a = b が等しいかどうかという式であるか代入であるかは文脈で決まります。 質問文の場合、代入であろうというわけですね。 if a = InputBox("誰") then … の場合、等しいかというテストが実行され代入はされません。 BASIC言語では、昔から代入と等値検査の記号が同じなので紛らわしいですが、それは、文法的な伝統なのでしょうがないです。 もともと文法的には、代入は Let a = InputBox("who") のようにLET を使って表すのですが、LETは伝統的に省略できます。 (2) InputBox "だれ" は、値を返す関数ではなく処理の実行のために実行するものです。 call InputBox("だれ") の省略されている形ですね。 InputBox "だれ" のような引数に( )を付けない形はcall だとして処理されます。 また、( )を付ける形はcall を付けないとFunction(つまり値を返す関数)だとして処理されます。 InputBox は、本来入力されたものを返す関数ですが、 InputBox "だれ" のような場合は、単純に返した値は(代入されるところがないので)捨てられます

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

基本的に=の右側の「値」や「関数が実行されて結果が値」になったあとで、その値が左辺の変数1つに代入されます。 手続き型言語はそういう約束で記述します。 文法といえば文法なのでしょうが、もっと基礎(本)的な約束ごとです。 ーーーーー Sub 練習() InputBox ("誰") '付け加えた InputBox "だれ" a = InputBox("だれ") MsgBox a MsgBox ("誰だ") End Sub 最初2つは、これは関数が実行されるが、受ける変数がないので あとでその値を使うことができず、徒労に終わる。だからそんな 使い方はしない。 MsgboxはMsgbox関数ですが、関数の戻り値を無視する場合は()カッコは必要ないことになっていて、()をつけるとエラーになりますと書いた本もあったがエラーにならなかった。 普通は()を書きません。最後の例も関数の戻り値を無視していますが、こちらの使い方も結構よく使います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 初心者です。エクセルVBAの質問なのですが・・・

    エクセルのVBAで 例えば・・・IF関数を使いたい時に Public Sub 練習() 年齢 = InputBox("あなたは何歳ですか。数字だけを入力して下さい。") If 年齢 < 20 Then MsgBox "未成年ですね" ElseIf 年齢 < 30 Then MsgBox "20代ですね。" Else MsgBox "その他の年代ですね" End If End Sub                            のようなものを作って、実行をしたときに、数字を入れてOKボタンではなく、ダイアログボックスのキャンセルや閉じるボタンを押したときに、「その他の年代ですね」が出てきますが、それを出てこないようにすることはできますか?(例えば、キャンセルボタンのような役割をさせるなど・・・)  結構難しいですかね? 教えて下さい。お願いします。

  • エクセルVBA、入力しないと閉じないInputBox

    必ず何かを入力しないと閉じないInputBoxを作ろうと思います。 以下のコードで入力がなければ閉じないというか、Line:に戻るので、何度でも現れるInputBoxになるようですが、このやり方は正しいですか? 通常はどうやるのでしょうか? Sub test() Dim a line: a = Application.InputBox("必ず入力して下さい。", "Input!") If Len(a) = 0 Or a = False Then GoTo line MsgBox "有難う。" & a & " ですね。", , "(o。_。)oペコッ" End Sub

  • エクセル2010のvbaについて

    Sub abc() Dim a Set a = Selection If a.Width * 4 / 3 <> 90 And a.Height * 4 / 3 - 1 <> 120 Then MsgBox ("120x90px以外の画像以外は挿入できません") End If End Sub 上のコードを実行するとなぜか120×90以外でも メッセージが表示されなくなります (Msgbox a.Width * 4 / 3は90 Msgbox a.Height * 4 / 3は120と正しく表示されます) 更に高さが1px多くなってしまいます(-1) (高さを調べても121pxではなく120pxでした) たまにvbaをしている時にあるので 回答と原因もお願いします

  • エクセルVBA Inputboxについて教えてください。

    InputBoxの使い方について教えてください。 テストで下記のように書いてみました。 Sub input_test2() ans = InputBox("質問!適当に数字を入れてね") MsgBox Application.WorksheetFunction.IsNumber(ans), vbInformation, "入力判定" If Application.WorksheetFunction.IsNumber(ans) Then If ans = 0 Then MsgBox "入力されたのは、 0", vbInformation, "回答" If ans = 1 Then MsgBox "入力されたのは、 1", vbInformation, "回答" If ans = 2 Then MsgBox "入力されたのは、 2", vbInformation, "回答" If ans = 3 Then MsgBox "入力されたのは、 3", vbInformation, "回答" If ans >= 4 Then MsgBox "入力されたのは、 4以上", vbInformation, "回答" Else MsgBox "入力は数字でしてください!", vbExclamation, "お願い" End If End Sub 1.入力が数値ならTRUEがかえると思ったのですが、何を入れてもFALSEしかかえりません。どこがまずいのでしょうか? 2.表示されるInputBoxのサイズが随分横に長いのですが、サイズを変える方法はあるのでしょうか? 3.MsgBoxの"入力判定"や”回答”ようにInputBoxにも最上行に日本語を表示させる方法はないでしょうか? 以上、よろしくお願いいたします。

  • vbaでCountIf関数を使いたい(エクセル)

    A1セルにa-a-aがはいっています。 この場合aは3つですよね。 これをvbaで取得するコードを作っているのですがうまくできません。 Sub test() Dim myStr As String myStr = "a" MsgBox WorksheetFunction.CountIf(Cells(1, 1), "*" & myStr & "*") End Sub これをすると、なぜか1が返ってきます。 Aは3つあるのになぜ1が返るのでしょうか? A1にaaaaaを入れて実行しても1が返ります。

  • エクセルVBAでBeep音は?

    エクセル2000、Win2000です。 VBAで音を出そうと、下記のマクロを記述しました。 ところが、「MsgBox i & "回実行しました。」の部分を、コメントブロックしたら一回しか鳴りません。ビー、ビー、ビーと三回鳴ると思ったのですが、どうしてでしょうか? Sub sound() Dim i As Integer For i = 1 To 3 Beep 'MsgBox i & "回実行しました。" Next i End Sub

  • Excel VBA 実行されないのはなぜ

    いつもお世話になっております。 VBAの練習で以下のような構文を作成し実行すると 構文のサンプルを並べているシートでのみエラーが表示されます。 新規シートでは実行されるので、なぜなのかと思います。 変数名が重複しているということもありません。 思い当たる点がありましたら教えてください。 よろしくお願いいたします。 Sub InputBoxメソッドで選択した範囲を取得する() Dim myselect As Range 'On Error Resume Next Set myselect = Application.InputBox("セル範囲を選択します。", Type:=8) If myselect Is Nothing Then Exit Sub myselect.Value = "test" End Sub

  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

  • vba なぜこうなるのか・・・。

    こんばんは、よろしくお願いします。 A1セルにデータが入っている状態で、以下の変数を使いA列の最終データが入っている行を調べると、(65536)が表示されます。なぜ、(1)にならないのでしょうか? ためしにA1及びA2セルにデータを入れマクロを実行すると、正確に2が表示されました。 Sub 練習() dim maxrow as long maxrow = Sheets(1).Range("a1").End(xlDown).Row   msgbox maxrow End Sub EXCEL2000を使用しています。よろしくお願いします。  

  • VBAについて

    こんばんは、VBA初心者で勉強をはじめたばかりで、自分で例題を作り調べながら途中まで作成しましたが、行き詰ったのでご教授をお願いします。ECXEL2000を使用しています。 ○やりたいこと。 ・INPUTBOXを表示させ、年齢を入力してもらう。 ・年齢が、18~64歳までならA2セルに入力年齢を表示させる。     17以下は「就職前」、65歳以上は「退職済」とBOXで表示させ、セルには表示させない。 ・A2セルに入力したら、A3セルをセレクトする。 ・INPUTBOXを表示させ、再度年齢入力をしてもらい、既にA2セルに年齢が入力済みであれば、A3に表示する。これをA10セルまで行えるようにする(その都度マクロの実行で実施) ○作成したマクロです。・・・やりたいことがすべて記述できていません。 Sub 年齢入力() 'INPUTBOXに入力される年齢の変数   Dim r As Integer 'データの最終行を代入する変数 Dim k As Long r = InputBox("年齢入力") k = Rows.Count Range("a2").Select If 17 < r And r < 65 Then MsgBox ("入力します") Range("a2") = r ElseIf r >= 65 Then MsgBox ("退職済") ElseIf r <= 17 Then MsgBox ("就職前") End If Cells(k, 1).End(xlUp).Offset(1).Select End Sub 以上のマクロのどこを変更すれば、私のやりたいことができるようになりますでしょうか?よろしくお願いします。