• ベストアンサー

VB プログラミング

' @summary g円を利率r%でt年間預けたときの利息を求める ' @param g 元金 ' @param r 利率(%) ' @param t 期間 ' @z 元利合計 ' @pre g >= 0 And r >= 0.0 And t >= 0 ' @post z >= g Function risoku(g As Long, r As Double, t As Integer) As Long End Function このプログラムを完成させたいのですが完成した形を教えてください よろしくお願いします

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

  • ベストアンサー
noname#245936
noname#245936
回答No.1

然るに。 んー、 ' @z 元利合計 ' @pre g >= 0 And r >= 0.0 And t >= 0 ' @post z >= g …ここの意味がよく判りません。 多分、こんな感じかと思いますが。 きっちりテストしてませんので、ばぐったらすいませんね。 Private Sub Command1_Click() Debug.Print "利息は、" _ & CStr(Calc_Risoku(1000000, 20, 1)) & "円" Debug.Print "利息は、" _ & CStr(Calc_Risoku(1000000, 20, 10)) & "円" Debug.Print "利息は、" _ & CStr(Calc_Risoku(1000000, 10.5, 5)) & "円" End Sub Private Function Calc_Risoku _ (ByVal crrGankin As Currency _ , ByVal dblRate As Double _ , ByVal intYear As Integer) As Currency Dim intI As Integer Dim crrTotal As Currency crrTotal = crrGankin For intI = 1 To intYear '注意:切り上げ切り捨ては考慮しません 'Rateは%入力です crrTotal = crrTotal * CDbl((100 + dblRate) / 100) Debug.Print CStr(intI) & " 年目の総額=" & CStr(crrTotal) Next intI Calc_Risoku = crrTotal - crrGankin End Function

関連するQ&A

  • 元号と年から西暦年を求める関数

    エクセルを利用しています。 元号と年から西暦年を求める関数がわかりません。 VBEで関数を作成したいのですが ' @summary 元号gと年yから西暦年を求める ' @param g 元号 ' @param y 年 ' @z 西暦年 ' @pre g = /^(明治|大正|昭和|平成)$/ And y >= 1 ' @post z >= 1868 Or z = -1 (エラー時) Function toSeireki(g As String, y As Integer) As Integer ○○○○ End Function ○○○○にどのように入れればいいのかわかりません なので方法を知っている方いれば教えていただきたいです

  • VBからのDLL呼び出しでエラー発生

    お世話になります。 Cで作成したDLLをVB6から呼び出した時にエラーが発生します。エラー内容は「実行時エラー'49'DLLが正しく呼び出せません。」です。 いろいろ試してみると、DLL側にパラメータを指定した場合にエラーが発生しているということが分かったのですが、対処方法は分かりませんでした。 以下にソース内容を記述致しますので、何処が悪いのかをご指摘頂けませんでしょうか。 <DLL側(aaa.dll)> __declspec(dllexport) int MyFunction1() { return 4; } __declspec(dllexport) int MyFunction2(int x) { return x * 2; } <VB側> 共通.bas Public Declare Function MyFunction1 Lib "aaa.dll" () As Long Public Declare Function MyFunction2 Lib "aaa.dll" (ByVal a As Long) As Long 実際の使用箇所 Dim param As Long Dim returnCode As Long MsgBox MyFunction1() param = 3 MsgBox MyFunction2(param) どうぞ宜しくお願い致します。

  • 数列について

    数列の問題がわからないので教えてください。 毎期末に利息を元金にくりいれる複利法で、1期の利率がrである時、元金a円に対して1期後の元利合計はa(1+r)円、2期目の終わりの元利合計はa(1+r)^2円となる。 (1)元金a円に対してn期目の終わりの元利合計はいくらになるか? (2)毎期の初めに一定の金額a円を預ける時、n期後の元利合計はいくらになるか? (3)年利率2%の複利で、毎年始めに10万円ずつ預ける時、5年目の終わりに元利合計はいくらになるか? (1.02^5=1.104081とする) どれか一つでもいいので回答よろしくお願いします。

  • VB6からVCで作成したDLLへのvoidポインタの受け渡し

    VB6でVCで作成されたDLLの関数から戻り値としてvoidポインタを受け取り、 それをDLLの別の関数を呼び出す際に引数として渡すプログラムを作成しようとして 詰まっています。以下サンプルです。 ===VB側 Public Type Param   sStr As String   lNum As Long End Type Declare Function Create Lib "test.dll" (ByRef tParam As Param) As Long Declare Function Free Lib "test.dll" (ByVal pSt As Any) As Long Dim pSt As Long Dim lRet As Long Dim tParam As Param With tParam   .sStr = "test" & Chr(0)   .lNum = 10 End With pSt = Conn(tParam) lRet = Free(pSt) ===VC側 typedef struct stParaA {   char * aaa;   char * bbb; } PARAM_A; typedef struct stParaB {   char * ccc;   int iNum; } PARAM_B; extern "C" void * __stdcall Create(PARAM_B* stParaB) {   PARAM_A stParaA;   //stParaAの各メンバ領域をMallocで確保   return((void*)stParaA); } extern "C" int __stdcall Free(void* stParaA) {   //stParaAの各メンバ領域をfree   return 0; //正常終了の場合 } VC側でデバッグしてみたところ、stParaBの各メンバの値はVC側で取得できているので、 DLLの呼び出し自体には問題はないようですが、Create()でreturnする時と、Free()に 入ってきたときではstParaAのアドレスが変わってしまい、異常終了します。 VC側はソースはあるのでデバッグは可能なのですが、DLLの修正自体は不可となって いるため、VB側を直すしかないのですが、どのようにすればアドレスの受け渡しが できるのでしょうか。

  • VBでShell○なのにShellExecute×

    http://support.microsoft.com/kb/170918/ja 等を参考に、コンソールアプリからHTMLファイルを呼び出すだけのEXEをVB(Visual Basic 2008 Express Edition)で作ったところ、 Shell関数ではHTMLがIEで起動されるのに対し、ShellExecute関数ではダメでした。 HTMLへのファイルパスが正しいことはMsgBoxで確認しました。 また、ほぼ同じソースをbasにしてExcelから起動すると、ShellExecuteでも起動しました。 以下がソース(抜粋)になりますが、原因が分かる方がおられましたら、ヒントだけでも、ご教示いただけると幸いです。 よろしくお願いいたします。 - - - - - - - - - - - - - - - - - - - - - - Option Explicit On Module Module1 Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long 'エラーコード宣言略 Function StartDoc(ByVal DocName As String) As Long Dim Scr_hDC As Long Scr_hDC = GetDesktopWindow() 'こちらだと成功 StartDoc = Shell("explorer.exe" & " " & DocName, vbNormalFocus) StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _ "", "C:\", SW_SHOWNORMAL) End Function Sub Main() Dim r As Long, msg As String r = StartDoc(CurDir() & "\target.html") 'エラーハンドリング省略 End Sub End Module

  • matchプロパティを取得できません…と出ます。

    いつもお世話になっております。 エクセルVBA初心者なので、分かりやすく教えていただきたいのですが、今下記のようなコードを書いています。 Public Function FindData(key As String, ByRef st As Long, ByRef ed As Long) As Long On Error GoTo FindData_Error Dim z As Long Sheets("T_保存").Select If Range("A2").Value = "" Then z = 1 Else z = Range("A1").End(xlDown).Row End If st = Application.WorksheetFunction.Match(key, Range("A1:A" & z), 0) ed = Application.WorksheetFunction.Match(key, Range("A1:A" & z), 1) FindData_exit: FindData = 0 Exit Function FindData_Error: FindData = -1 End Function keyは年度で、入力シートからT_保存シートに値でコピーするVBAを組んでいます。 シート上でのMATCH関数では認識しますが、st = ~のところで、「MATCHプロパティを取得できません」と出てしまい、検索結果は「該当なし」なってしまいます。いろいろと調べても見たんですが、どうしても原因が分かりません。 なるべく詳しく教えていただければ・・・と思います。 (初心者のため、ここを伝えなければ、回答できないという項目があれば追加で記入させていただきます。key,zには正常な値が入っています) よろしくお願いいたします。

  • Active Basic でGOTOのジャンプ先が不正となってしまいます

    色の分析をActive Basicでおこなっています。 IFで条件に当てはまった場合gotoで途中の計算を飛ばしたいのですが、 ジャンプ先が不正となってしまいます。 ご指摘よろしくお願いいたします。 プログラムです ↓↓↓↓ #include "t.idx" #include "s.sbp" #N88BASIC ' ↓ ここからプログラムが実行されます Dim a As String, FileName As String Dim hBmp As Long Dim nRed as Long, nGreen as Long, nBlue as Long, Dim R as Single, G as Single, B as Single Dim max as Single, min as Single Dim H as Single, S as Single, V as Single Dim Ha as Long, Sa as Single, Va as Single Dim Hb as Long, Sb as Single, Vb as Single Dim Hc as Long, Sc as Single, Vc as Single Dim Hd as Long, Sd as Single, Vd as Single Dim He as Long, Se as Single, Ve as Single Dim Hf as Long, Sf as Single, Vf as Single Dim nflame As Long Dim x As Long, y As Long, r As Long Dim hh as string for nflame=1 to 2 ' ←この数字を、分析する画像ファイル数に変える FileName="c:\ab\"+Str$(nflame)+".bmp" 'c:\ab\ というフォルダに、分析する画像を、1.bmp、2.bmp・・と保存しておく BLoad(FileName , hBmp ) PutBmp( 1,1, hBmp ) GetBmp( 1,1,382 ,215, hBmp ) 'ここにx、y解像度をいれる a="c:\ab\"+"ironobori1.txt" '色のデータ open a as #1 cls '1列か1枚ごとに数値を0に戻す Ha=0:Hb=0:Hc=0:Hd=0:He=0:Hf=0:Sa=0:Sb=0:Sc=0:Sd=0:Se=0:Sf=0:Va=0:Vb=0:Vc=0:Vd=0:Ve=0:Vf=0 for x=1 to 382 'この320が、画像解像度のx成分 for y=1 to 215 'この240が、画像解像度のy成分 r = Point( x, y ) nRed = ( r And &HFF ) nGreen = ( r And &HFF00 ) / &H100 nBlue = ( r And &HFF0000 ) / &H10000 R=nRed/255 G=nGreen/255 B=nBlue/255 If R=0 and G=0 and B=0 then goto 104 If R=90 and G=100 and B=100 then goto 104 ********************************** ここでgotoできません。 ********************************** If R => G and R=> B then max=R If G => R and G => B then max=G If B => R and B =>G then max=B If R <= G and R <= B then min=R If G <= R and G <= B then min=G If B <= R and B <= G then min=B If max=R then H=60*(G-B)/(max-min) If max=G then H=60*(B-R)/(max-min)+120 If max=B then H=60*(R-G)/(max-min)+240 S=(max-min)/max V=max If H=>0 and H<60 then Ha=Ha+1 Va=Va+V Sa=Sa+S End If If H=>60 and H<120 then Hb=Hb+1 Vb=Vb+V Sb=Sb+S End If If H=>120 and H<180 then Hc=Hc+1 Vc=Vc+V Sc=Sc+S End If If H=>180 and H<240 then Hd=Hd+1 Vd=Vd+V Sd=Sd+S End If If H=>240 and H<300 then He=He+1 Ve=Ve+V Se=Se+S End If If H=>300 and H<=360 then Hf=Hf+1 Vf=Vf+V Sf=Sf+S End If Ha=Ha+0 Hb=Hb+0 Hc=Hc+0 Hd=Hd+0 He=He+0 Hf=Hf+0 Sa=Sa+0 Sb=Sb+0 Sc=Sc+0 Sd=Sd+0 Se=Se+0 Sf=Sf+0 Va=Va+0 Vb=Vb+0 Vc=Vc+0 Vd=Vd+0 Ve=Ve+0 Vf=Vf+0 Next y Next x print x,y,Ha,Hb,Hc,Hd,He,Hf write #1,Ha,Hb,Hc,Hd,He,Hf FinishBmp( hBmp ) Next nflame close #1 End

  • VB6のコードをVB.NETに移したいのですが

    WEBで見つけたVB6のサンプルコードをVB.NET用に書き直して いるのですが、なんとか波線のエラーはなくなったものの 実行すると、思った結果が得られません。 正しい訂正方法を教えて頂きたいです。 サンプルコードは下記のサイトにありました。 http://vbnet.mvps.org/index.html?code/internet/findfirstcacheentry.htm インターネットキャッシュに関するものです。 文字数の関係で全部は書けないのですが、現在は↓のようになっています。 その他の訂正箇所は 全部のAs Any を As Objectに変更していて、 ComboBoxのアイテムに数値が設定できないようなので、 Select Caseで判断するようにしています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim numEntries As Long Dim cacheType As Long Select Case ComboBox1.SelectedIndex Case Is = 0 cacheType = &H1S Case Is = 1 cacheType = &H8S Case Is = 2 cacheType = &H10S Case Is = 3 cacheType = &H20S Case Is = 4 cacheType = &H40S Case Is = 5 cacheType = &H10000 Case Is = 6 cacheType = &H100000 Case Is = 7 cacheType = &H200000 Case Is = 8 cacheType = URLCACHE_FIND_DEFAULT_FILTER End Select Label1.Text = "Working ..." Label1.Refresh() ListBox1.Items.Clear() ListBox1.Visible = False numEntries = GetCacheURLList(cacheType) ListBox1.Visible = True Label1.Text = VB6.Format(numEntries, "###,###,###,##0") & "files found" End Sub Private Function GetCacheURLList(ByRef cacheType As Long) As Long Dim ICEI As INTERNET_CACHE_ENTRY_INFO Dim hFile As Long Dim cachefile As String Dim nCount As Long Dim dwBuffer As Long Dim pntrICE As Long dwBuffer = 0 hFile = FindFirstUrlCacheEntry(vbNullString, 0, dwBuffer) If (hFile = ERROR_CACHE_FIND_FAIL) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) If pntrICE Then CopyMemory(pntrICE, dwBuffer, 4) hFile = FindFirstUrlCacheEntry(vbNullString, pntrICE, dwBuffer) If hFile <> ERROR_CACHE_FIND_FAIL Then Do CopyMemory(ICEI, pntrICE, Len(ICEI)) If (ICEI.CacheEntryType And cacheType) Then cachefile = GetStrFromPtrA(ICEI.lpszSourceUrlName) ListBox1.Items.Add(cachefile) nCount = nCount + 1 End If Call LocalFree(pntrICE) dwBuffer = 0 Call FindNextUrlCacheEntry(hFile, 0, dwBuffer) pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) CopyMemory(pntrICE, dwBuffer, 4) Loop While FindNextUrlCacheEntry(hFile, pntrICE, dwBuffer) End If End If End If Call LocalFree(pntrICE) Call FindCloseUrlCache(hFile) GetCacheURLList = nCount End Function どうしてもここから分からないので、お助けいただきたいです。 よろしくお願いいたします。

  • 64ビットエクセルでのAPI宣言/PtrSafe

    エクセルのInputboxで、入力された文字列を自動的にアスタリスクで隠すようにする方法を探し http://okwave.jp/qa/q2371878.html の回答No1のコードがまさに最適なコードで、これまで非常に助かっていました。 ところが、64bitのエクセルでは動かないことがわかりました。 表示されたエラーメッセージの言葉から調べて、PtrSafeという言葉を入れなければならないようなのでAPI宣言を以下のようにしてみました。 #If VBA7 And Win64 Then '64ビット版 Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long #Else '32ビット版 Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long #End If ところが、回答No1のコードで Sub Report_Open() を実行すると Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _ Optional YPos, Optional HelpFile, Optional Context) As String のところがハイライトされてエラーになります。 どう直せば良いのでしょうか? 全文のコードを乗せると字数制限に引っかかりますので、申し訳ありませんが宣言以外の部分は http://okwave.jp/qa/q2371878.html の回答No1のコードを見てくださいますようお願いします。

  • 中心極限定理をエクセルで確かめる問題(まとめ方)

    1.まずX1+X2+…+X8の分布を畳み込みの方法により求めるマクロをVBAを用いて作る。 VBAに以下のものを入力する。 Function f(x As Double) If x >= 1 And x <= 6 Then f = 1 Else f = 0 End If End Function Function g(z As Double) Dim x As Double, k As Double k = 0 For x = 1 To z k = k + f(x) * f(z - x) Next x g = k End Function Function h(z As Double) Dim x As Double, k As Double k = 0 For x = 1 To z k = k + g(x) * g(z - x) Next x h = k End Function Function u(z As Double) Dim x As Double, k As Double k = 0 For x = 1 To z k = k + h(x) * h(z - x) Next x u = k End Function 2.エクセルワークシートで実行する。そのためにA1のセルにxを入力し、A2からA42のセルにX1+X2+…+X8の取る値としての8~48を入力する。 3.B1のセルにu(x)を入力し、B2からB42のセルに関数u(x)の値を求める。そのためにB2の説に=u(A2)を入力し、オートフィルの方法で求める。 4.(X1+X2+…+X8)/8 = Xのバー の取る値をx/8=zで表すことにする。そこでC1のセルにzを入力し、C2のセルに=A2/8を入力し、C2からC42のセルをオートフィルの方法で満たす。 5. 3.で求めたu(x)の値を6^8で割り、それをΔz=1/8で割った値、即ち8倍した値を密度関数g(z)とする。そこでD1のセルにg(z)を入力し、D2のセルに=B2/6 8*8を入力し、オートフィルの方法で求める。 6.平均値と分散が等しい正規分布N(3.5,35/(12*8))の密度関数と比較する。C2からC42にあるzの値に対応するN(3.5,35/(12*8))の密度関数の値をE2からE42のセルにエクセルのNORMDIST関数で用いて満たす。 という問題ですが、以下のようにエクセルで作成してみましたが、合っていますでしょうか。 また、最終的にどのようなところまで持って行き、どのようにまとめれば良いのでしょうか。 x u(x) z g(z) 確率密度 8 1 1 4.76299E-06 0.000125166 9 8 1.125 3.81039E-05 0.000288691 10 36 1.25 0.000171468 0.000637921 11 120 1.375 0.000571559 0.001350479 12 330 1.5 0.001571788 0.002739026 13 792 1.625 0.003772291 0.005322208 14 1708 1.75 0.008135193 0.009907745 15 3368 1.875 0.016041762 0.017670353 16 6147 2 0.029278121 0.030192771 17 10480 2.125 0.049916171 0.049425163 18 16808 2.25 0.080056394 0.077514085 19 25488 2.375 0.121399177 0.116466366 20 36688 2.5 0.174744704 0.167651637 21 50288 2.625 0.239521414 0.231207786 22 65808 2.75 0.313443073 0.3054812 23 82384 2.875 0.392394452 0.386681952 24 98813 3 0.470645671 0.468932891 25 113688 3.125 0.541495199 0.54482229 26 125588 3.25 0.598174821 0.606438017 27 133288 3.375 0.63484987 0.646703706 28 135954 3.5 0.647548011 0.660711187 29 133288 3.625 0.63484987 0.646703706 30 125588 3.75 0.598174821 0.606438017 31 113688 3.875 0.541495199 0.54482229 32 98813 4 0.470645671 0.468932891 33 82384 4.125 0.392394452 0.386681952 34 65808 4.25 0.313443073 0.3054812 35 50288 4.375 0.239521414 0.231207786 36 36688 4.5 0.174744704 0.167651637 37 25488 4.625 0.121399177 0.116466366 38 16808 4.75 0.080056394 0.077514085 39 10480 4.875 0.049916171 0.049425163 40 6147 5 0.029278121 0.030192771 41 3368 5.125 0.016041762 0.017670353 42 1708 5.25 0.008135193 0.009907745 43 792 5.375 0.003772291 0.005322208 44 330 5.5 0.001571788 0.002739026 45 120 5.625 0.000571559 0.001350479 46 36 5.75 0.000171468 0.000637921 47 8 5.875 3.81039E-05 0.000288691 48 1 6 4.76299E-06 0.000125166

専門家に質問してみよう