VBAの算数とプログラミングの式の違い
- VBAにおいて算数とプログラミングの式は異なる扱いとなります。
- 算数では左から右に計算が進みますが、VBAでは式の逆順で計算されます。
- したがって、VBAの式では「i + 1」のように逆順で書く必要があります。
- ベストアンサー
VBAって算数とは式が逆なんですか?
算数では 1+1=2 と言う書き方をしますよね。(左から右) だけど、 Sub サンプル1() Dim i As Long i = 1 i +1 = i MsgBox i End Sub をしようとすると、 「+」マークが消えてしまい、 i 1 = iになっちゃいます。 そして、サンプル1を動かすことができません。 Sub サンプル2() Dim i As Long i = 1 i = i + 1 MsgBox i End Sub なら、無事動かせました。 私の頭の中では、 1+1=2(左から右) の感覚しかないので、 サンプル2の動きが不気味なのですが 「プログラミングとはそういうものだ」と割り切るしかないのでしょうか?
- XJKPRKSWT
- お礼率100% (8/8)
- オフィス系ソフト
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>i=1 は、変数iに1を入れる。 >i +1 = i あなたの解釈では、「i+1を変数iに入れる」で、先のi=1と処理の方向が逆です。だめですね。
その他の回答 (3)
- chayamati
- ベストアンサー率41% (254/607)
あなたは小学生 すごいですね 中学になったら算数でなく、数学という学問に変わります。 中学では A=2+5 のような表現になります。 = 両側に 演算記号を付けて 2×3=2+2+2 のようにも表現します。 この表現は外国でも同じです。
お礼
ありがとうございました。
- keithin
- ベストアンサー率66% (5278/7940)
>算数では >1+1=2 >と言う書き方をしますよね 算数のその式は、「1+1の結果は2と等しい(2です)」と言ってます。 「2に1+1を入れている」つもりは、どこにもありません。2に入れる??ってそもそも意味不明ですよね。 アナタのマクロをちょいと修正するなら… sub macro1() dim i, j i = 2 j = 3 msgbox 1 + 1 = i msgbox 1 + 1 = j end sub 実行すると「TRUE」そして「FALSE」という結果が現れます。 最初の結果は、1+1は2と等しい、です。算数と同じですね。 次の結果は、1+1は3と等しくない、です。算数なら1+1≠3といった具合です。 で。 そもそも「変数」や「代入」の概念は、小学校の算数には出てきません。なので小学校の算数では、「左に右の値を代入する」を説明できないんです。 代入の概念は中学校の数学以降で初めて勉強します。 y=a×x+b といったのをやったのを、もう忘れちゃいましたかね。これが「右の結果を左に代入する」、つまりVBAのマクロの値の代入の式です。
お礼
ありがとうございました。
- unacyo
- ベストアンサー率51% (35/68)
VBAは左に入れ物(変数)を用意し、その中身はこれを入れる(直値か計算式か変数)、と指定するので、右から左ですね。 (VBA、VB、Java、JavaScript、C言語、C++、Perl、昔のPCのBASICなど、私がやってきた言語は大抵右から左です。 ただし、やっていない言語も多々あるので、絶対右から左、とは断言できませんが…。 アセンブラ言語の場合、CPUで異なり、右から左や左から右があります。以上参考まで)
お礼
基本的にプログラミング言語は右から左だけど、絶対なわけではないようですね。 もっと色々勉強してみます。ありがとうございました。
関連するQ&A
- プロシージャーの外で宣言した変数の値の破棄の仕
プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。
- ベストアンサー
- Visual Basic
- Excel2007VBAプロシージャの引数について
●質問の主旨 下記コードのうち、 buf = buf & msg & vbCrLfについて 1.右辺の変数bufはどんな役割があるのでしょうか? 2.右辺のbufを省略したら、メッセージボックスに 表示される「Excel」の文字は3つから1つになります。 これはなぜでしょうか? ご存知の方ご教示よろしくお願いします。 ●コード Sub Sample8() Call Sample9("Excel", 3) End Sub Sub Sample9(msg As String, n As Long) Dim i As Long, buf As String For i = 1 To n buf = buf & msg & vbCrLf Next MsgBox buf End Sub
- ベストアンサー
- Visual Basic
- VBA 100億になると#が自動で付く
下記のコードを見てください。 Option Explicit Sub test1() Dim i As Long i = 1000000000 End Sub Sub test2() Dim i As Long i = 10000000000# End Sub test2の#は私が付けたものではありません。 test1より一つ多く0を付けたら勝手に付きました。 どうしてなのでしょう? 不思議です。
- ベストアンサー
- オフィス系ソフト
- エラーメッセージはコピペできないのでしょうか?
MsgBoxはctrl+cでコピペできるのですが エラーメッセージはコピペできないのでしょうか? Sub Sample() Dim i As Long i = "a" End Sub でエラーを発生させて、コピーしてみても何も起こりません。
- ベストアンサー
- Excel(エクセル)
- 奇数・偶数の判断 VBA
Sub Macro1() Dim i As Long i = 1 For i = 1 To 10 If i = ? Then '偶数ならと言うコード MsgBox "偶数です" Else MsgBox "奇数です" End If Next End Sub ここまでは自分で作れたのですが、iが奇数か偶数かを判断するコードがわかりません。 ご教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- vbaで配列に値を格納する場合
vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?
- ベストアンサー
- オフィス系ソフト
- VBAのプログラムでCheckboxの使い方
すみません。教えてください。 チェックボタンオブジェクト名を配列に格納したいのですが、可能でしょうか。 <内容> 例えば、チェックボタンオブジェクト名がcheckbox1~checkbox4まで在ったとき、"checkbox & 変数" にしたいのです。 <Sample> Sub CHECKBOX() Dim i As long For i = 1 To 4 With Worksheets(Sheet_No) On_Off(i) = .Controls("CheckBox" & i).Value End With Next i MsgBox (On_Off(2)) End Sub
- ベストアンサー
- Visual Basic
- VBAのシートイベントで教えてください
シートのN4以下で、既に同じ番号があれば「既に同じ番号があります」 と表示するようにしたく、下のように書きましたが、肝心な部分 の、どのように同じ番号をみつけるようにすのかわかりませんでした。 教えていただけないでしょうか。宜しくお願いします。 Private Sub worksheet_change(ByVal target As Range) Dim 範囲左 As Integer Dim 範囲右 As Integer Dim 範囲上 As Integer 範囲左 = 1 範囲右 = 16 範囲上 = 4 With target 'if '指定した範囲の列Nに既に同じ番号や文字列があれば MsgBox "既に同じ番号があります。" End If End With End Sub
- ベストアンサー
- オフィス系ソフト
- エラーが発生した場合は VBA
Sub Sample() On Error GoTo Err1 Dim i As Integer i = "あ" '←ココで構文エラーとなる。 MsgBox "あ" Debug.Print "無事終了します" Exit Sub Err1: Debug.Print "エラーになりました" i = 1 Resume Next 'エラーの発生した次の行から処理を続行します。 End Sub このようなエラー処理で エラーが発生した場合は MsgBox "あ" ではなく i = "あ" '←ココで構文エラーとなる。 に戻る事は出来ないのでしょうか?
- ベストアンサー
- オフィス系ソフト
- EXCEL VBA2010 MsgBox
Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。
- ベストアンサー
- Excel(エクセル)
お礼
やはりだめですね。ありがとうございました。