|
エクセルのシートが、Worksheets(入力1)、(入力2)、(出力)の三枚あり、三枚目の出力のシートに計算というコマンドをつくりそこに以下のようなコードを記しています。
入力1のシートには、
二次元弾性解析(入力1)
弾性係数 ポアソン比 計算フラグ(0(平面応力) / 1(平面ひず み) で指定)
2.10E+04 0.3 0
節点の数 要素の数
18 22
番号 座標X 座標X 番号 節点1 節点2 節点3
1 0 0 1 1 2 5
2 40 0 2 1 5 4
3 60 0 3 2 6 5
4 0 40 4 2 3 6
5 40 40 5 3 7 6
6 60 20 6 5 6 8
7 80 20 7 6 9 8
8 60 40 8 6 7 9
9 80 40 9 7 10 9
10 100 40 10 4 12 11
11 0 60 11 4 5 12
12 40 60 12 5 13 12
13 60 60 13 5 8 13
14 100 60 14 8 9 13
15 0 100 15 9 14 13
16 40 100 16 9 10 14
17 60 100 17 11 16 15
18 100 100 18 11 12 16
19 12 17 16
20 12 13 17
21 13 18 17
22 13 14 18
入力2のシートには
二次元弾性解析(入力2)
荷重の数 拘束の数
4 7
Y方向はマイナス Y方向はマイナス
節点番号 荷重 節点番号 拘束変位
-15 20 1 0
-16 30 -1 0
-17 30 -2 0
-18 20 -3 0
4 0
11 0
15 0
出力シートには
二次元弾性解析(計算・出力)
変位 反力 歪み 応力
節点 X Y 節点 反力 要素 εx εy εz γxy σx σy σz γxy
があり、またコマンドボタンがひとつあります。それをクリックすると以下のプログラムが実行されます。
コードはデータ入力(計算フラグ)・ バンド幅計算(バンド幅)・ 剛性行列(バンド幅, 計算フラグ)・境界・連立計算(バンド幅)・結果(計算フラグ)・結果出力の7個から構成されています。データ入力(計算フラグ)では、入力1,入力2のシートの値を読み込んでいます。そして剛性行列では、aSub(三角形要素面積の計算),bSub(3×6の行列の各成分),dSub(3×3の行列の各成分),tSub(要素剛性行列の計算)を使って、8×8の全体剛性行列をつくっています。その行列に境界を代入して、連立計算で未知数を求めていきます。求めた未知数を式に代入して、結果が得られます。それを結果出力で出力シートに表示させます。
そのようなコードの中で、入力1のシートによって弾性係数がひとつ与えられているのですが、それを各要素によってそれぞれ変えて与えたいと考えています。そこで、弾性係数を読み取るときに
Const Max要素=200
Dim 弾性係数(Max要素)
弾性係数(i)=Range("_弾性係数").OFFSET(I,0)
としたのですが、結局一番最後の要素番号の弾性係数の値ですべて計算されてしまい、うまくいきません。どうしたら、各要素に与えられた弾性係数でこのプログラムの計算を無事に終えることができるでしょうか??よろしくお願いします。
Private Sub CommandButton1_Click()
Dim 計算フラグ, バンド幅
Call データ入力(計算フラグ)
Call バンド幅計算(バンド幅)
Call 剛性行列(バンド幅, 計算フラグ)
Call 境界
Call 連立計算(バンド幅)
Call 結果(計算フラグ)
Call 結果出力
End Sub
Private Sub データ入力(計算フラグ)
Dim I
With Worksheets(入力シート名1)
計算フラグ = .Range("_計算フラグ")
弾性係数 = .Range("_弾性係数")
ポアソン比 = .Range("_ポアソン比")
節点の数 = .Range("_節点の数")
For I = 1 To 節点の数
座標(I) = .Range("_座標X").Offset(I, 0)
座標(節点の数 + I) = .Range("_座標Y").Offset(I, 0)
Next I
要素の数 = .Range("_要素の数")
For I = 1 To 要素の数
要素節点(I, 1) = .Range("_要素節点1").Offset(I, 0)
要素節点(I, 2) = .Range("_要素節点2").Offset(I, 0)
要素節点(I, 3) = .Range("_要素節点3").Offset(I, 0)
Next I
End With
With Worksheets(入力シート名2)
荷重の数 = .Range("_荷重の数")
For I = 1 To 荷重の数
荷重節点(I) = .Range("_荷重節点").Offset(I, 0)
荷重(I) = .Range("_荷重").Offset(I, 0)
Next I
拘束の数 = .Range("_拘束の数")
For I = 1 To 拘束の数
拘束節点(I) = .Range("_拘束節点").Offset(I, 0)
拘束変位(I) = .Range("_拘束変位").Offset(I, 0)
Next I
End With
End Sub
Private Sub バンド幅計算(バンド幅)
Dim J, M, Imin, Imax
バンド幅 = 0
For J = 1 To 節点の数
Kanl(2 * J - 1) = J
Kanl(2 * J) = J + 節点の数
Next J
For M = 1 To 要素の数
Imin = 要素節点(M, 1)
Imax = 要素節点(M, 1)
For J = 2 To 3
If Imin > 要素節点(M, J) Then Imin = 要素節点(M, J)
If Imax < 要素節点(M, J) Then Imax = 要素節点(M, J)
Next J
If Imax - Imin > バンド幅 Then バンド幅 = Imax - Imin
Next M
バンド幅 = 2 * (バンド幅 + 1)
If (バンド幅 > MAXバンド幅) Then
MsgBox "計算メモリオーバー", vbCritical + vbOKOnly
End
End If
End Sub
Private Sub 剛性行列(バンド幅, 計算フラグ)
Dim I, J, M, Ix, Iy, Jx, Jy, Kx, Ky, K, Tt, S
Dim bb(3, 6), sds(3, 3)
For I = 1 To 2 * 節点の数
For J = 1 To バンド幅
Syk(I, J) = 0#
Tky(I, J) = 0#
Next J
Next I
For M = 1 To 要素の数
Call aSub(M, Ix, Iy, Jx, Jy, Kx, Ky, S)
Call bSub(Ix, Iy, Jx, Jy, Kx, Ky, S)
Call dSub(計算フラグ)
For J = 1 To 3
For I = 1 To 3
sds(I, J) = S * Dsep(I, J)
Next I
Next J
For I = 1 To 3
For K = 1 To 6
Tt = 0#
For J = 1 To 3
Tt = Tt + sds(I, J) * B(J, K)
Next J
bb(I, K) = Tt
Next K
Next I
For I = 1 To 6
For K = 1 To 6
Tt = 0#
For J = 1 To 3
Tt = Tt + B(J, I) * bb(J, K)
Next J
elk(I, K) = Tt
Next K
Next I
Call tSub(Ix, Iy, Jx, Jy, Kx, Ky)
Next M
For I = 1 To MAX要素
For J = 1 To MAXバンド幅
Tky(I, J) = Syk(I, J)
Next J
Next I
End Sub
|
|