トップに戻る

クラスモジュールを利用することで、一度作ったコードは、何度も利用

パソコンのプログラムする人は、一度書いたコードを何度も、繰り返し書くことを嫌います。
一度作った、プログラムコードは、とことん使いまくる事が基本です。
クラスモジュールで、作っておき、オブジェクトとしてコードを利用すると
何度も書き直す手間を、減らすことができます。
今回は、
1.数値積分(シンプソン法)
2.各物質の定圧モル比熱基礎式
3.エンタルピーを、算出に必要な、積分される式
この三つのクラスモジュールを使います。ソースコードは、以下のようなものを使いました。
1 数値積分(シンプソン法)************************************************************
Option Explicit
Function sinpson(x1 As Double, x2 As Double, FF As Object) As Double

Dim dd As Integer
Dim i As Integer
Dim dd2 As Integer
Dim H As Double
Dim an As Double
Dim an1 As Double
Dim y As Double
Dim j As Integer
Dim x As Double
sinpson = 0
If x1 = x2 Then
Exit Function
End If

i = 2
dd2 = 2
H = (x2 - x1) / 2
an = (FF.f(x1) + 4 * FF.f(x1 + H) + FF.f(x2)) * H / 3
an1 = an * 0.9
Do While (Abs((an1 - an) / an) * 100 > 0.000000001)
an = an1
dd = dd2 * i
H = (x2 - x1) / dd
y = FF.f(x1)
x = x1
For j = 1 To i

    x = x + H
    y = y + 4 * FF.f(x)
    x = x + H
    y = y + 2 * FF.f(x)
    
Next j

y = y - FF.f(x2)
an1 = y * H / 3
i = i + 1
Loop
sinpson = an1

End Function

2定圧モル比熱の基礎式Cp************************************************************
Option Explicit
Dim aa As Double
Dim bb As Double
Dim cc As Double

Public Function cp(t As Double)

cp = aa * t ^ 2 + bb * t + cc

End Function

Public Property Get a() As Double

a = aa

End Property

Public Property Let a(ByVal vNewValue As Double)

aa = vNewValue

End Property

Public Property Get b() As Double

b = bb

End Property

Public Property Let b(ByVal vNewValue As Double)

bb = vNewValue

End Property

Public Property Get c() As Double

c = cc

End Property

Public Property Let c(ByVal vNewValue As Double)

cc = vNewValue

End Property
3-1積分される式dHNH3* アンモニアの場合*******比熱の単位は(J/mol K)**********
Option Explicit


Public Function f(x As Double) As Double
Dim cpN2 As New cp
Dim cpH2 As New cp
Dim cpNH3 As New cp

cpN2.a = -0.04 * 10 ^ -7
cpN2.b = 5.2 * 10 ^ -3
cpN2.c = 27.3

cpH2.a = 20# * 10 ^ -7
cpH2.b = -0.84 * 10 ^ -3
cpH2.c = 29.1

cpNH3.a = -31# * 10 ^ -7
cpNH3.b = 33# * 10 ^ -3
cpNH3.c = 25.9

f = cpNH3.cp(x) - cpN2.cp(x) / 2# - cpH2.cp(x) * 3# / 2#

Set cpN2 = Nothing
Set cpH2 = Nothing
Set cpNH3 = Nothing

End Function
3-2積分される式dHCO2*二酸化炭素の場合********比熱の単位は(cal/mol K) **********
Option Explicit


Public Function f(t As Double) As Double
Dim cpCO As New cp
Dim cpO2 As New cp
Dim cpCO2 As New cp

cpCO.a = 0
cpCO.b = 0.001
cpCO.c = 6.5

cpO2.a = 0
cpO2.b = 0.001
cpO2.c = 6.5

cpCO2.a = -1.86 * 10 ^ -6
cpCO2.b = 0.0071
cpCO2.c = 7

f = cpCO2.cp(t) - cpCO.cp(t) - cpO2.cp(t) / 2#

Set cpCO = Nothing
Set cpO2 = Nothing
Set cpCO2 = Nothing

End Function
クラスモジュールの名前は、右のようにしました。
化学関係に関心がない人は、何のことかわからないと思います。
しかし、数値計算で、クラスモジュールを利用した例として、捉えれば良いかと思います。
この計算の意味を、書くと、各物質には、
の式で表される定圧モル比熱があります。
物質によって、a,b,cの定数が、異なります、ここに、まず一つの規則です。
これで、クラスモジュールを一つ作りました。
次に
アンモニアの生成エンタルピーの場合
式から解るように窒素、水素、アンモニアの定圧モル比熱を、利用して、標準状態の温度から、指定の温度まで、積分して、
標準エンタルピーをたす事になる。
求める温度の生成エンタルピーになる。
ここで、数値積分をするクラスモジュール、積分する式のクラスモジュールが、必要になることがわかります。

これで、三つのクラスモジュールができました。
定圧モル比熱の式を、クラスモジュールにすることにより、定数をいろいろ変えることにより、
簡単に、様々な、物質に対応できるし、クラスモジュールなので、オブジェクトを増やすことにより、
簡単に、成分数を増減すことが出来るようになります。
また、シンプソンの数値積分のクラスモジュールは、一度作っておくと、今後、様々な、積分を必要とする、プログラムに再利用が簡単です。
また、積分をする式を独自のクラスモジュールにすることにより、積分する式が、沢山あるときには、一つの、シンプソンのクラスモジュールと
複数の積分する式のクラスモジュールで、対応ができます。

以下に、標準モジュールで、クラスモジュールを利用した、プログラムと、計算結果を示します。
************************標準モジュール******************************************
Option Explicit


Public Sub dH()
'シンプソンのオブジェクト
Dim a As New csinpson
'積分するアンモニアのオブジェクト
Dim cp As New dHNH3
'積分する二酸化炭素のオブジェクト
Dim cp1 As New dHCO2

'標準状態が298℃で、723℃の時のアンモニアエンタルピー変化////2009/8/6修正
'標準状態が298Kで、723Kの時のアンモニアエンタルピー変化
'比熱の単位は(J/mol K)
'エンタルピーの単位は(KJ/mol)
Debug.Print -46.19 + a.sinpson(298, 723, cp) / 1000#

'標準状態が239℃で、573℃の時の二酸化炭素のエンタルピー変化
'標準状態が298Kで、573Kの時の二酸化炭素のエンタルピー変化
'比熱の単位は(cal/mol K)
'エンタルピーの単位は(cal/mol)
Debug.Print -67950 + a.sinpson(293, 573, cp1)
Debug.Print -67950 + a.sinpson(298, 573, cp1)


Set a = Nothing
Set cp = Nothing
Set cp1 = Nothing

End Sub
************************計算結果**********************************************
結果修正

なを、クラスモジュールは、他のエクセルファイルで、利用するとき、
コピーアンドペーストで、移さなくとも、クラスモジュールをインポート、
エキスポートできます
結構、これも、便利です。