Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


29903 / 76738 ←次へ | 前へ→

【52108】各要素に各弾性係数を与えて計算する方法について
質問  ちゃや  - 07/10/21(日) 14:41 -

引用なし
パスワード
   エクセルのシートが、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

1 hits

【52108】各要素に各弾性係数を与えて計算する方法について ちゃや 07/10/21(日) 14:41 質問
【52109】Re:各要素に各弾性係数を与えて計算する方... ちゃや 07/10/21(日) 14:42 質問
【52110】Re:各要素に各弾性係数を与えて計算する方... りん 07/10/21(日) 15:11 発言
【52118】Re:各要素に各弾性係数を与えて計算する方... ちゃや 07/10/22(月) 7:07 質問
【52131】Re:各要素に各弾性係数を与えて計算する方... りん 07/10/22(月) 19:29 回答
【52158】Re:各要素に各弾性係数を与えて計算する方... ちゃや 07/10/25(木) 17:30 お礼

29903 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free