• ベストアンサー

VBAでln関数の計算

VBAでln関数から以下のようなプログラムを組みましたが、 オーバーフローします。どこが原因でしょうか? 初心者なので初歩的なところで間違えていると思います。 Sub log関数() Dim i As Double Dim t As Double i = 2 Do i = i + 1 t = Log(i) Loop While (t > 10) MsgBox (i & "はin(x)が最初に10を超える数字です") End Sub 値として最初の数字の3でとまってしまいます。 ぜひとも間違いご指摘ください。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

オーバーフローは関係ないと思いますけど.... Loop While (t > 10) → Loop Until (t > 10) に変更して下さい。 Do ~ Loop While(条件句): 条件句が True である限りループする。逆に言えば条件句が False に なればループが終了する。 > i = 2 > Do >   i = i + 1     '<--- i=3 >   t = Log(i)    '<--- t= 1.09861228866811 > Loop While (t > 10)  '<--- (t > 10) で 評価 False でループ終了 Do ~ Loop Until(条件句): 条件句が True になるまでループする。逆に言えば条件句が False の 限りループが継続する。 違いの詳細はヘルプで。

dadao
質問者

お礼

なるほど、わかりました。FalseからTrue,TrueからFalseにの条件見極めが必要なわけですね。もっと試して理解できるようになりたいと思います。

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

その他の回答 (2)

回答No.3

Do Loop While (****) は「*****」が真の間ループを廻ります。条件をお確かめになって下さい。私が試しに「****」箇所を修正したところ、ちゃんと動作しました。私もマクロ初心者です。お互い、頑張りましょう!

dadao
質問者

お礼

不等式を逆にすればできましたね。まだまだ理解不足ですね。 実用できるプログラムを作るまでは時間がかかりそうです。 今回はポイント対象外とさせていただきますが、今回は3人ともわかりやすい回答で悩みました。おそらくこういう質問をたくさんしていくことになると思うので機会があればよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

Loop While t>10 こいつは「tが10より大きい間はループを回せ」ですから、 ずっとループを回ってtがオーバーフローするんじゃ? Loop Until t>10 じゃないかと。

dadao
質問者

お礼

できました。まだまだ理解が足りないですね。 もっと試してみます。

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

関連するQ&A

  • ACCESS VBAが分からない!この問題ですが

    ACCESS VBAの勉強をはじめました。 下のプロシージャを実行するとメッセージボックスに「2018/08/30」と出るようですが、なんでそうなるのかが分からないんです。 ちなみに Loop は繰り返しでWhileは~間という意味は分かるのですが。。。 よろしくお願いいたします。 Sub Lesson() Dim ret As Date, i As Long ret = #8/29/2018# Do ret = ret + 1 i = i + 1 Loop While i > 3 MsgBox ret 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で取得したい

    vbaなのですが、フォルダにgifファイルがたくさんはいっていますが、 その数を数えるコードを教えてください。 今は、 Sub Macro7() Dim File As String Dim i As Long File = Dir("C:\*.*", vbDirectory) Do While File <> "" File = Dir i = i + 1 Loop MsgBox "ファイル数は" & i & "です" End Sub のように、全てのファイル数をカウントして求めています。

  • VBA ループ文

    お手数ですが、回答お願いします。 VBAでループ文を勉強しております。 最初のfor 文で1000行、1000列に文字を入力、 次のdo 文でその文字を全部消したいのですが、うまくいきません。 またfor 文で1000行、1000列で文字を入力しているのですが、 時間がかかるのは仕方がないことなのでしょうか? お手数ですが、ご教授お願いします。 Sub 文字入力() Dim i As long Dim t As long For i = 1 To 1000 For t = 1 To 1000 Cells(i, t) = "wooo" Next t Next i End Sub ================================================================= Sub 文字入力消し() Dim i As long Dim t As long i = 1 Do t = 1 Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 Loop Until Cells(i, t) = "" End Sub

  • EXCEL VBA WEEKDAY関数

    weekday関数について質問です。 Sub test() MsgBox Weekday(#2/19/2009#) End Sub 上記プログラムを参考に2009年2月i日の曜日を返すように 下記プログラムを作成したのですが、うまくいきません。 変数iの箇所に原因があると思うのですがどのようにしたら 解決できますでしょうか?? Sub test() dim i as string i=15 MsgBox Weekday(#2/i/2009#) End Sub 解決策、できましたら参考となるプログラムをお教えください。 よろしくお願いいたします。

  • マクロでの複素関数の計算

    ExcelのVBAマクロで時間をtとおいて、exp(ti)=cost+isin(t)の実部と虚部を表示するプログラムを作成したいと思っています。 ソースは以下のようになっています。 Sub z() Dim t As Double, tmax As Double Dim dt As Double Dim x As Double Dim count As Integer t = 0 tmax = 1 dt = 0.0001 count = 1 x = 0 While t < tmax With Sheet1 .Cells(count, 1) = t '時刻t .Cells(count, 2) = WorksheetFunction.ImReal(x) '実部 .Cells(count, 3) = WorksheetFunction.ImReal(x) '虚部 End With count = count + 1 '書き込む行を更新 x = Exp(t * i) t = t + dt '時刻を一ステップ更新 Wend End Sub これを実行すると、2列目にcos(t),3列目にsin(t)が表示されると思ったのですが、2列目には1が永遠に並び、3列目には0が並びます。複素数の設定をしていないのが原因なのか何か分からないのでもし表示される方法が分かられるかたがいらっしゃいましたらご教授お願いいたします。

  • VBA inputbox関数について

    質問をさせてください。 VBA inputbox関数にて 数字を入力をし、その数字を元に挿入を行うというものを施しています。 そして下記の内容で実際は動くのですがどうしても疑問点が浮かんできます。 それはinputbox関数には宣言をしないと文字列として処理されますよね? なので、宣言をlongにして整数化をしています。 しかし、If "1" <= buf1 <= "65536" Thenの部分で 数字に""(ダブルコーテーション)を入れないとうまく作動しません。 例えば「0」を入力しても正の処理へ行います。 ダブルコーテーションで囲んでいる数値は文字列として認識されるはず・・ 入力は数値として宣言をしているのだからダブルコーテーションはいらないのではないんでしょうか? また、もし数字ではなく、記号などを入力をしてしまった場合の偽の処理へいくにはどうすれば いいでしょうか? 恐れ入りますがよろしくお願いいたします。 Sub test() Dim buf1 As Long buf1 = InputBox("コピー先の列番号を入力してください") If "1" <= buf1 <= "65536" Then Cells(buf1, 1).EntireRow.Insert Else MsgBox "正しい列番号を入力してください" Exit Sub End If End Sub

  • エクセルvba 値渡しのsubプロシージャ

    お世話になります。 エクセルVBAにて、loop処理中にCALLかけている subが最初の一度だけしか呼べません。 なにか、特別にしなければならないことがあるのでしょうか。 こんな感じです。 dim i as integer sub main()   i = 1   max = 5   do     if day1 = day2 then 処理1 データ1, データ2     end if     i = i + 1 loop until i = max    end sub sub 処理1(Byval 引数1 as variant, 引数2 as variant)    msgbox("引数1" & 引数1)    msgbox("引数2" & 引数2) end sub データ1 及び データ2、 DAY1 DAY2は、必要に応じて 転送処理等やっています。

  • Excel2007VBA時間の書式とLen関数

    ●質問の主旨 文字列の長さを返すLen関数の引数に 時間を設定すると戻り値が一定しないのはなぜでしょうか? また下記に示すように20や17などの数字がかえってくるの でしょうか? ●質問の補足 A1セルに入力されている時間が以下の通りだとします。 例1)1:11→20 例2)13:59→17 ●コード Sub test() Dim i as String i=Range("A1") Msgbox Len(i) End Sub 以上よろしくお願いします。

  • フォルダの中のファイル数を取得するには vba

    手作業でフォルダのプロパティからファイルの数を確認することはできるのですが VBAで(FSOなど)、該当のフォルダの中に何個ファイルが入ってるかを確認するコードはありますか? Sub test() Dim MyFileName As String Dim MyFolderName As String Dim i As Long MyFolderName = "\○○\icon" MyFileName = Dir(MyFolderName & "\*.*") Do While MyFileName <> "" MyFileName = Dir() i = i + 1 Loop MsgBox i End Sub このようなコードを作ってみたのですが、 画像のように実際に目で確認したファイル数と一致しません。 正しい数が取得できるvbaコードはありますか?

専門家に質問してみよう