- 締切済み
エクセルのvbaが変数を使用すると上手く動作しない
ものすごく初歩的な質問で恐縮ですが、教えて下さい。 やりたいことは、 「a」を変数として設定して、Cells(1, 1)を「a」に格納して、 セル番地A1に山という文字を入力しようとしています。 <test>の方は上手く動作してセル番地A1に山という文字列を入力できるのですが、 <test2>の方は、セル番地A1に入力してくれません。 おそらく変数の使い方がおかしいのだと思います。 a = Cells(1, 1)ではなく、test2のように、変数を使ってコードを記載したいのですが良い方法はありませんでしょうか? *************************************************************** Sub test () a = Cells(1, 1) Cells(1, 1) = "山" End Sub **************************************************************** Sub test2 () a = Cells(1, 1) a = "山" End Sub
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
- rukuku
- ベストアンサー率42% (401/933)
はじめまして 以下のサンプルで説明します。 まず、「Let」は見慣れないと思いますが、これは「省略可能」なので、通常は省略されます。 「これは左辺の“変数”や“プロパティ”を右辺の値にしなさい」と言う命令です。 詳しくは、ヘルプで確認してください。 5行目で出てくる「Set」は「Let」とは意味が異なります。 Set b = Cells(1, 1) と書いたらこれは、「プログラムの中で“b”」と書いたら“Cells(1, 1)”を表します」と言う指示です。 bはセルの“値”ではなく、“セルそのもの”を指します。 従って、6行目の Let b.Value = "山" は Let Cells(1, 1).Value = "山" と書いたのと同じになります。 これも詳しくは、ヘルプで確認してください。 Set と Let の動作の違いは、 Setはセルそのものを指しますので、bは呼び出されたときは「今の値」を示します。 Letはセルの値を記憶していますので、aは「格納された時点での値」になります。 …Msgboxの結果を確認してください。 Sub test3() '1 Let Cells(1, 1).Value = "川" '2 Let a = Cells(1, 1).Value '3 Let Cells(1, 1).Value = "海" '4 Set b = Cells(1, 1) '5 Let b.Value = "山" '6 MsgBox a, , "aの値" '7 MsgBox b.Value, , "bの値" '8 End Sub '9
- DOUGLAS_
- ベストアンサー率74% (397/534)
先ず、 >やりたいことは、 >「a」を変数として設定して、Cells(1, 1)を「a」に格納して、 >セル番地A1に山という文字を入力しようとしています。 とお書きですが、「Cells(1, 1)」と「セル番地A1」とは同じことですので、「やりたいこと」とお書きの内容に矛盾があるように見受けられます。 VBE(Visual Basic Editor) で、例えば、「Sub test ()」の中の「Cells(1, 1)」を範囲選択して右クリック [ウォッチ式の追加(A)] します。 同様に「a」の部分も [ウォッチ式の追加(A)] します。 次に [F8] キーを押下して、ステップ イン デバッグ (VBAのステートメントを1行ずつ実行)します。 すると、[ウォッチ] ウィンドウ に「Cells(1, 1)」と「a」の値が表示されているのが分かりますね。 「セル番地A1」には予め「海」が入っていたものとして、お示しの「Sub test ()」と「Sub test2 ()」について、実行開始時(緑色)から終了時(水色)までの「Cells(1, 1).value」と「a の値」の変化について見ていくと図のようになります。 ここで、 1.変数「a」に「山」を格納し 2.「セル番地A1」に変数「a」の値を表示する という段取りで考えてみると、「Sub test3()」のようなことになります。 でも、実際に「やりたいことは、」もっと複雑なことではなかろうかと存じますので、上記のような簡単なことでは片付かないような気もいたしますね。
- soixante
- ベストアンサー率32% (401/1245)
test2 で、test1 と同じ動作をしたいということでしょうか。 イコールの役割を誤解されているように感じます。 いわゆる数学で言う「等しい」ではなくて、 「左辺のものに、右辺のものを代入する」と言う意味ですから、 >a = Cells(1, 1) ・・・変数a にA1セルの値を代入せよ >a = "山" ・・・変数a に 「山」という文字を代入せよ ということしかやってないことになりますから、A1セルに「山」とは表示されません。 Sub test3 () a = "山" '変数a に山を格納 Cells(1, 1).value=a 'A1セルにaを格納 End Sub
- okormazd
- ベストアンサー率50% (1224/2412)
省略できるんで書いてないが、Cells(1, 1).Valueなんだ。 Sub test () a = Cells(1, 1)'←これは何の意味も無い Cells(1, 1) = "山" End Sub 下でいい。 Sub test () Cells(1, 1)).Value = "山" End Sub Sub test2 () a = Cells(1, 1).Value'←これは何の意味も無い a = "山" End Sub aにCells(1, 1)の中身をいれただけ。aがセルになったわけではない。 そのあとでaに"山"をいれた。セルに入れているわけではない。 オブジェクト変数にする。 Sub test2() Set a = Cells(1, 1) a.Value = "山" End Sub