- ベストアンサー
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 このプログラムを完成させたいのですが完成した形を教えてください よろしくお願いします
- yuta61
- お礼率11% (2/17)
- Visual Basic
- 回答数1
- ありがとう数0
- みんなの回答 (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 ○○○○にどのように入れればいいのかわかりません なので方法を知っている方いれば教えていただきたいです
- 締切済み
- Visual Basic
- 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) どうぞ宜しくお願い致します。
- 締切済み
- Visual Basic
- 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側を直すしかないのですが、どのようにすればアドレスの受け渡しが できるのでしょうか。
- 締切済み
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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 どうしてもここから分からないので、お助けいただきたいです。 よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- 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のコードを見てくださいますようお願いします。
- ベストアンサー
- Excel(エクセル)
- 中心極限定理をエクセルで確かめる問題(まとめ方)
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
- 締切済み
- 数学・算数