Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5167 / 13644 ツリー ←次へ | 前へ→

【52230】足し算 kan 07/11/1(木) 22:34 質問[未読]
【52231】Re:足し算 かみちゃん 07/11/1(木) 22:57 発言[未読]
【52279】Re:足し算 kan 07/11/4(日) 23:09 質問[未読]
【52281】Re:足し算 りん 07/11/5(月) 0:55 発言[未読]
【52282】Re:足し算(おまけ) りん 07/11/5(月) 1:06 発言[未読]
【52284】Re:足し算 じゅんじゅん 07/11/5(月) 10:51 発言[未読]
【52234】Re:足し算 じゅんじゅん 07/11/2(金) 8:11 発言[未読]
【52291】Re:足し算 kan 07/11/5(月) 19:50 お礼[未読]

【52230】足し算
質問  kan  - 07/11/1(木) 22:34 -

引用なし
パスワード
   2つの変数を与え、それぞれに100という数字を入力しました。
そして、その2つの変数を足し合わせる計算をさせたのですが、出力された結果は「100100」でした。
100+100=100100になってしまったのはなぜでしょうか?

【52231】Re:足し算
発言  かみちゃん  - 07/11/1(木) 22:57 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>100+100=100100になってしまったのはなぜでしょうか?

コードを提示しないと、なぜかを説明することができません。
変数の宣言か演算子に原因があると思われます。

MsgBox "100" & "100"

MsgBox 100 + 100
の違いを確認してみてください。

【52234】Re:足し算
発言  じゅんじゅん  - 07/11/2(金) 8:11 -

引用なし
パスワード
   ▼kan さん:
>2つの変数を与え、それぞれに100という数字を入力しました。

変数の宣言がどうなっているのか?によるかも知れないです。

Sub test()
Dim a As Integer, b As Integer
Dim c As String, d As String
a = 100: b = 100
c = 100: d = 100

MsgBox a + b
MsgBox c + d
End Sub

例えばこんな違いが起きているとか?

【52279】Re:足し算
質問  kan  - 07/11/4(日) 23:09 -

引用なし
パスワード
   こんにちは。かみちゃんさん、じゅんじゅんさん。返信ありがとうございます。
下にコードを表示しておきます。
問題が起きた部分だけを表示してあります。問題が起きたのはa2の部分です。変数は全てdoubleです。k1とk2にそれぞれ100を入力したんですが、100100と出力されます。
Sub ex3b()
Dim a1, a2, a3, t, i, y1, y2, k1, k2, m1, m2, te, dt, y10, y20, y1m, y2m As Double

k1 = InputBox("ばね定数k1[N/m]")
k2 = InputBox("ばね定数k2[N/m]")
a2 = k1 + k2

MsgBox a2

End Sub

【52281】Re:足し算
発言  りん E-MAIL  - 07/11/5(月) 0:55 -

引用なし
パスワード
         kan さん、こんばんわ。

>問題が起きた部分だけを表示してあります。問題が起きたのはa2の部分です。変数は全てdoubleです。

ヘルプより引用
Dim ステートメントのTypeはそれぞれに型を宣言をする必要があります。
引用開始==============================================
Dim ステートメント
Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .

type 省略可能です。<<中略>> As type 節は宣言する各変数に対して個別に指定します

データ型やオブジェクトの種類の指定がなく、さらにモジュール内で Deftype ステートメントが記述されていない場合、変数は既定のバリアント型 (Variant) になります
引用終了==============================================

>Dim a1, a2, a3, t, i, y1, y2, k1, k2, m1, m2, te, dt, y10, y20, y1m, y2m As Double

ということで、これだとy2mのみがDoubleで、残りはVariantということになります。

また、InputBoxは、

引用開始==============================================
InputBox 関数
文字列型 (String) の値を返します。
引用終了==============================================

なので、InputBoxの戻り値をVariantで受けると文字列になります。

Dim a1 As Double, a2 As Double, a3 As Double, t As Double, i As Double, _
  y1 As Double, y2 As Double, k1 As Double, k2 As Double, m1 As Double, _
  m2 As Double, te As Double, dt As Double, y10 As Double, y20 As Double, _
  y1m As Double, y2m As Double

こうですね。
(見づらくなったので改行しました)

【52282】Re:足し算(おまけ)
発言  りん E-MAIL  - 07/11/5(月) 1:06 -

引用なし
パスワード
   kan さん、こんばんわ。

DefDbl(Double設定)をかませば、省略しても大丈夫です。

'↓Subの外に書く
DefDbl A-Z '変数のデフォをDoubleに変更
Sub test()
  Dim a1, a2, a3, t, i, y1, y2, k1, k2, m1, m2, te, dt, y10, y20, y1m, y2m
  k1 = InputBox("ばね定数k1[N/m]")
  k2 = InputBox("ばね定数k2[N/m]")
  a2 = k1 + k2
  '
  MsgBox a2, vbInformation
End Sub

ただし、モジュール内の変数等の宣言をきちんと行っていなければ、いままでは大丈夫だった部分がエラーになることもあるので注意が必要です(特に文字列関連)。
どっちが便利かはよくわかりません。

【52284】Re:足し算
発言  じゅんじゅん  - 07/11/5(月) 10:51 -

引用なし
パスワード
   ▼kan さん:
>こんにちは。かみちゃんさん、じゅんじゅんさん。返信ありがとうございます。
>下にコードを表示しておきます。
>問題が起きた部分だけを表示してあります。問題が起きたのはa2の部分です。変数は全てdoubleです。k1とk2にそれぞれ100を入力したんですが、100100と出力されます。

InputBox メソッド
を使用されてみては?
ヘルプより抜粋
---------------------------------------------------
expression.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)
Type  省略可能です。バリアント型 (Variant) の値を使用します。返されるデータの型を指定します。この引数を省略すると、ダイアログ ボックスは文字列 (テキスト) を返します。次に示す値の中から 1 つまたは複数の値の合計値を指定します。
値 意味
0 数式
1 数値
2 文字列 (テキスト)
4 論理値 (True または False)
8 セル参照 (Range オブジェクト)
16 #N/A などのエラー値
64 数値配列
---------------------------------------------------

【52291】Re:足し算
お礼  kan  - 07/11/5(月) 19:50 -

引用なし
パスワード
   ▼りん さん、じゅんじゅんさん:
よく分かりました。
それぞれの変数にdoubleを指定することで、確かに改善されました。
みなさん本当にありがとうございます。m(_ _)m

5167 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free