アルツの備忘録

最近、年のせいで物忘れが激しい。
そこで、いろんなことをここに記録して行きたいと思います。

Excelで業務の自動化 その6 < Excel構成展開 >

2020年01月31日 20時39分17秒 | Excel
■ExcelやAccessに部品表と構成表を持ち、これをExcel構成展開を使い計算する。
  ※SQL文を書き直せば、SQLServer、 ORACLEなどでも活用可能
<部品表>                  <構成表>
    

            <部品構成表>
    
■Excel構成展開
  ・上記のマスタを使い展開する。

  <メニュー>
    

①DB設定ボタン
  ・対象データベースを指定
      

②展開ボタン
  ・アイテム : 展開する部品名を指定
  ・展開   : 親から子の展開は1、子から親の展開は2 を指定 
  ・数量   : 子部品の使用数を計算する。

<展開結果>
   

構成展開コード

 >[構成展開サブ]の部分を構成が終わるまで、自分自身を呼び出して展開します。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Global GL_ROW As Integer
Global GL_NO As Integer

'******************************
' 構成展開
'******************************
Function 構成展開(HinmokuCd, TKBN, CNT, SU)
     Worksheets("構成情報").Activate
     GL_NO = 0
    'シートのセル全範囲をクリア
     If CNT = 3 Then
         'シートのセル全範囲をクリア
         ActiveSheet.Cells.Clear
          'ヘッダーセット
         ActiveSheet.Cells(1, 1).Value = "グループ"
         ActiveSheet.Cells(1, 2).Value = "NO"
         ActiveSheet.Cells(1, 3).Value = "区分"
         ActiveSheet.Cells(1, 4).Value = "部品コード"
         ActiveSheet.Cells(1, 5).Value = "部品名"
         ActiveSheet.Cells(1, 6).Value = "子部品コード"
         ActiveSheet.Cells(1, 7).Value = "子部品名"
         ActiveSheet.Cells(1, 8).Value = "使用数"
         ActiveSheet.Cells(1, 9).Value = "単位"
         ActiveSheet.Cells(1, 10).Value = "数量"
         '出力行設定
         GL_ROW = 2
      Else
         GL_ROW = GL_ROW + 2
     End If
    '指定データセット
     ActiveSheet.Cells(GL_ROW, 1).Value = CNT - 2
     ActiveSheet.Cells(GL_ROW, 2).Value = GL_NO
     ActiveSheet.Cells(GL_ROW, 3).Value = "'1"
     ActiveSheet.Cells(GL_ROW, 4).Value = HinmokuCd
     ActiveSheet.Cells(GL_ROW, 10).Value = Val(SU)
構成展開サブ HinmokuCd, "1", TKBN, CNT - 2, SU
     GoTo Exit_構成展開
Err_構成展開:
     MsgBox Error$ & Chr$(10) & Chr$(13) & " 親品番 マスター等を確認して下さい。"
Exit_構成展開:
End Function

'******************************
' 構成展開サブ
'******************************
Sub 構成展開サブ(HinmokuCd, Lev, TKBN, CNT, SU)
     Dim con As New ADODB.Connection
     Dim rs As New ADODB.Recordset
     Dim USER, SERVER, DB As String
     Dim SQL As String
     Dim W_SU As Double
     Dim W_WARI As Double
     Dim Lev2 As Integer

     On Error GoTo Err_構成展開サブ
    '接続処理
     If connectionString = "" Then ConnectionString_get
     con.Open connectionString
     If GL_NO = 0 Then
        '展開アイテム名称セット
         SQL = "SELECT 部品名 FROM [部品表] WHERE 部品コード ='" & HinmokuCd & "'"
         'EXCEL用SQL変換
         If InStr(Gl_システム, "EXCEL") <> 0 Then SQL = Replace(SQL, "]", "$]")
         'レコードセットの取得
         Set rs = con.Execute(SQL)
         ActiveSheet.Cells(GL_ROW, 5).Value = rs![部品名]
'         ActiveSheet.Cells(GL_ROW, 7).Value = rs![部品名]
         Set rs = Nothing
     End If
     SQL = "SELECT "
     SQL = SQL & "A.部品コード,A.部品名 ,B.子部品コード ,C.部品名 AS 子部品名,A.単位,B.使用数 "
     SQL = SQL & "FROM [部品表] A,[構成表] B,[部品表] C "
     If TKBN = 1 Then
         SQL = SQL & "WHERE A.部品コード = B.部品コード AND B.子部品コード = C.部品コード "
         SQL = SQL & "AND A.部品コード ='" & HinmokuCd & "'"
     Else
         SQL = SQL & "WHERE B.部品コード = A.部品コード AND B.子部品コード = C.部品コード "
         SQL = SQL & "AND B.子部品コード ='" & HinmokuCd & "'"
     End If
     'EXCEL用SQL変換
      If InStr(Gl_システム, "EXCEL") <> 0 Then SQL = Replace(SQL, "]", "$]")
    'レコードセットの取得
     Set rs = con.Execute(SQL)
    '子部品チェック
     'If rs.RecordCount = Null Or rs.RecordCount = 0 Or rs.EOF Then
     If rs.EOF Then
        GoTo Exit_構成展開サブ
     End If

     Lev2 = 0
     Do Until rs.EOF
         '階層別レコード数カウントアップ
         Lev2 = Lev2 + 1
         '書出し行カウントアップ
         GL_ROW = GL_ROW + 1
        GL_NO = GL_NO + 1
         'レコード書出し
         ActiveSheet.Cells(GL_ROW, 1) = CNT
         ActiveSheet.Cells(GL_ROW, 2) = GL_NO
         ActiveSheet.Cells(GL_ROW, 3) = "'" & Lev & "-" & Lev2
         ActiveSheet.Cells(GL_ROW, 4).Value = rs![部品コード]
         ActiveSheet.Cells(GL_ROW, 5).Value = rs![部品名]
         ActiveSheet.Cells(GL_ROW, 6).Value = rs![子部品コード]
         ActiveSheet.Cells(GL_ROW, 7).Value = rs![子部品名]
         ActiveSheet.Cells(GL_ROW, 8).Value = rs![使用数]
         ActiveSheet.Cells(GL_ROW, 9).Value = rs![単位]
         If TKBN = 1 Then
              W_SU = SU * rs![使用数]
            Else
              W_SU = SU / rs![使用数]
         End If
         ActiveSheet.Cells(GL_ROW, 10).Value = W_SU
         '繰返し展開
         If TKBN = 1 Then
             '自分自身を呼び出す再帰処理  
    構成展開サブ rs![子部品コード], Lev & "-" & Lev2, TKBN, CNT, W_SU
          Else
    '自分自身を呼び出す再帰処理 
    構成展開サブ rs![部品コード], Lev & "-" & Lev2, TKBN, CNT, W_SU
         End If
         rs.MoveNext
         DoEvents
     Loop
     GoTo Exit_構成展開サブ
Err_構成展開サブ:
     MsgBox Error$ & Chr$(10) & Chr$(13) & "子品番マスター等を確認して下さい。"
     'MsgBox Err.Description
Exit_構成展開サブ:
     On Error Resume Next
     rs.Close
     Set rs = Nothing
     'Connectionの状態を確認し、クローズ
     If cn.State <> ADODB.adStateClosed Then
         cn.Close
     End If
     Set cn = Nothing
End Sub



■ダウンロードは  こちらのページ をご覧ください。


最新の画像もっと見る

コメントを投稿