損益分岐点分析
前回、2次方程式をやったので、その応用として損益分岐点分析をやってみます。
今回はウインドウを作ります。
今回のプロジェクト
次に以下のプログラムをコピーします。
#include<vcrt71.sbp>
'計算ボタンをクリック
Sub MainWnd_BT_KEISAN_Click()
Dim buf[200] As Byte'汎用バッファ
Dim mes[1000] As Byte'出力文字
Dim uriage As Double , kotei As Double , hendou As Double , kosuu As Double
Dim all_uriage As Double , cvp_uriage As Double
Dim per_kouken As Double , per_hendou As Double , per_anzen As Double
GetWindowText(GetDlgItem(hMainWnd , EB_kotei) , buf , 200)
kotei = Val(buf)
GetWindowText(GetDlgItem(hMainWnd , EB_hendou) , buf , 200)
hendou = Val(buf)
GetWindowText(GetDlgItem(hMainWnd , EB_uriage) , buf , 200)
uriage = Val(buf)
GetWindowText(GetDlgItem(hMainWnd , EB_kosuu) , buf , 200)
kosuu = Val(buf)
all_uriage = uriage * kosuu'現在の売上高
per_kouken = (uriage - hendou) * kosuu * 100 / all_uriage'貢献利益率
per_hendou = hendou * 100/ uriage'変動費率
cvp_uriage = kotei *100 / per_kouken'損益分岐点売上高
per_anzen = (all_uriage - cvp_uriage) * 100 / all_uriage
sprintf(mes , Ex"損益分岐点売上高=%12.0f円\r\n" + _
Ex"現在の売上高=%12.0f円\r\n貢献利益率=%4.2f%" + _
Ex"\r\n変動費率=%4.2f%\r\n安全率=%4.2f%\r\n" , _
cvp_uriage , all_uriage , per_kouken , per_hendou , per_anzen)
SetWindowText(GetDlgItem(hMainWnd , KEKKA) , mes)
'グラフ
Dim scale As Double
Dim hDC As HDC
Dim hMemDC As HDC
Dim hBmp As HBITMAP
Dim hBrush As HBRUSH
Dim hPen[2] As HPEN
scale = 200 / all_uriage
hDC = GetDC(GetDlgItem(hMainWnd , ImageBox1))
hMemDC = CreateCompatibleDC(hDC)
hBmp = CreateCompatibleBitmap(hDC , 200,200)
SelectObject(hMemDC , hBmp)
DeleteObject(hBrush)
hBrush = CreateSolidBrush(RGB(190 , 255 , 190))
SelectObject(hMemDC , hBrush)
Rectangle(hMemDC , 0,0,200,200)
hPen[0] = CreatePen(PS_SOLID , 1 , RGB(0,0,0))
hPen[1] = CreatePen(PS_SOLID , 1 , RGB(160,0,0))
hPen[2] = CreatePen(PS_SOLID , 1 , RGB(255,0,0))
'収益線
SelectObject(hMemDC , hPen[0])
MoveToEx(hMemDC , 0,200,ByVal NULL)
LineTo(hMemDC , 200 , 0)
'総費用線
SelectObject(hMemDC , hPen[1])
MoveToEx(hMemDC , 0 ,200 - kotei * scale ,ByVal NULL)
LineTo(hMemDC , 200 , 200 - (kotei + hendou * kosuu) * scale)
'固定費
SelectObject(hMemDC , hPen[2])
MoveToEx(hMemDC , 0 ,200 - kotei * scale ,ByVal NULL)
LineTo(hMemDC , 200 , 200 - kotei * scale)
DeleteObject(hPen[0])
DeleteObject(hPen[1])
DeleteObject(hPen[2])
BitBlt(hDC , 0,0,200,200,hMemDC , 0,0,SRCCOPY)
DeleteObject(hBmp)
DeleteDC(hMemDC)
ReleaseDC(GetDlgItem(hMainWnd , ImageBox1) , hDC)
End Sub
完成品
実行結果は以下のようになります。
グラフの右上が現在の売上高になるようにしています。