|
お世話になります。
アクセスからエクセルをアクセステーブルに取り込む処理を行っております。
エクセルのレイアウトは
運送区分 会社コード 会社名 車番 社員コード 社員名 日付 ←ヘッダー
1 0 ○○会社 33 5 △△ 1/31 ←ヘッダー項目
荷主 発地 行先 品名 単位 予定数 ←明細
■ ☆ ◎ ▼ キロ 30 ←明細項目
◆ ● ○ ▲ キロ 30
以下続く。。。
このようなエクセルファイルで1シートに最大16ページ分あります。
そして同じような項目でシートが3つあります。
この3つのシートをアクセスのフォーム状にてボタンを押してテーブルに取り込む作業をしています。(3つとも一括で一回のボタン処理で取り込んでいます)
取り込むと1ページにつき1つ作業指示Noがつくようになっております。
これを例えばシート1の1ページ目のヘッダー部分とシート2の2ページ目のヘッダー部分が同じならば作業指示Noはシート1の1ページ目の作業指示Noにしたいのです。
取込み処理もロジックは(だいぶ長いですがすいません)
'**************************************************
'* データ取込処理
'**************************************************
Private Function ImportData() As Boolean
Dim wb As Workbook 'Microsoft Excelブック。
Dim ws As Worksheet '対象セル範囲を含むワークシートを返します。
Dim vSheet As Variant
Dim sht As Variant
Dim dbs As Database
Dim rstT As Recordset
Dim lRowH As Long, lColH As Long 'ヘッダー行、列
Dim lRowM As Long, lColM As Long '明細行、列
Dim iCntH As Integer, iCntM As Integer 'ヘッダー数、明細数
Dim Header As typHaeder 'ヘッダー項目
Dim Meisai As typMeisai '明細項目
Dim l作業指示No As Long '4/2追加
Dim i行 As Long '指示書行No
Dim 運送区分 As Integer
Dim 傭車先コード As Long
Dim 傭車先名 As String
Dim プレートNo As Variant
Dim 傭車先発地コード As Long
Dim 傭車先発地名 As String
Dim 傭車先着地コード As Long
Dim 傭車先着地名 As String
Dim 傭車合計 As Currency
Dim 傭車非課税合計 As Currency
Dim 運賃合計 As Currency
Dim 非課税合計 As Currency
Dim 数量合計 As Integer
Dim 得意先コード As Long
Dim 発着地コード1 As Integer
Dim 発地コード As Long
Dim 発地名 As String
Dim 発着地コード2 As Integer
Dim 着地コード As Long
Dim 着地名 As String
Dim 品目コード As Long
Dim 品コード As Long
Dim 品名 As String
Dim 数量 As Integer
Dim 単位コード As Long
Dim 単位 As String
Dim rstM As New ADODB.Recordset
Dim rst As New ADODB.Recordset
Dim wInt As Integer '車両コード
Dim 端数 As Integer
Dim 実数 As Integer
Dim 単価 As Currency
Dim 金額 As Currency
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
Dim cl As Range
ImportData = False
'ファイルオープン
Set wb = xlApp.Workbooks.Open(ファイル名.Value)
'データベース接続
Set dbs = CurrentDb
Set rstT = dbs.OpenRecordset("T_作業指示", dbOpenDynaset)
'シート名をセット
vSheet = Array("シート1", "シート2", "シート3")
'シート名分ループ
For Each sht In vSheet
'此処でシートセット
Set ws = wb.Worksheets(sht)
'変数初期化
lRowH = 2: lColH = 1 'ヘッダー行、列
lRowM = 4: lColM = 1 '明細行、列
iCntH = 0: iCntM = 0 'ヘッダー数、明細数
i行 = 1
'ヘッダー読込
Do Until iCntH >= CST_MAX_H_CNT
'1つ前の会社コード〜運転者名が一致していたら、作業指示Noは取得しない
If (Header.会社コード <> ws.Cells(lRowH + CST_ROW_会社コード, _
lColH + CST_COL_会社コード).Value) Or _
(Header.会社名 <> ws.Cells(lRowH + CST_ROW_会社名, _
lColH + CST_COL_会社名).Value) Or _
(Header.車番 <> ws.Cells(lRowH + CST_ROW_車番, _
lColH + CST_COL_車番).Value) Or _
(Header.運転手コード <> ws.Cells(lRowH + CST_ROW_運転手コード, _
lColH + CST_COL_運転手コード).Value) Or _
(Header.運転手名 <> ws.Cells(lRowH + CST_ROW_運転手名, _
lColH + CST_COL_運転手名).Value) Then
'作業指示No取得
l作業指示No = Get作業指示No
'作業指示No更新
Call upd作業指示No(l作業指示No)
'指示書行No更新
i行 = 1
End If
'ヘッダー項目取得
Header.運送区分 = ws.Cells(lRowH + CST_ROW_運送区分, lColH + CST_COL_運送区分).Value
Header.会社コード = ws.Cells(lRowH + CST_ROW_会社コード, lColH + CST_COL_会社コード).Value
Header.会社名 = ws.Cells(lRowH + CST_ROW_会社名, lColH + CST_COL_会社名).Value
Header.車番 = ws.Cells(lRowH + CST_ROW_車番, lColH + CST_COL_車番).Value
Header.運転手コード = ws.Cells(lRowH + CST_ROW_運転手コード, lColH + CST_COL_運転手コード).Value
If Nz(rstT.Fields("運転者コード").Value, 0) = "" Then
rstT.Fields("運転者コード").Value = Null
End If
Header.運転手名 = ws.Cells(lRowH + CST_ROW_運転手名, lColH + CST_COL_運転手名).Value
Header.日付 = ws.Cells(lRowH + CST_ROW_日付, lColH + CST_COL_日付).Value
'運送区分が入力されていなかったら、処理終了
If Trim(Header.運送区分) = "" Then
Exit Do
End If
'明細読込
iCntM = 0 '明細数=0
Do Until iCntM >= CST_MAX_M_CNT 'CST_MAX_M_CNT=31 or 61 明細最大数31以上or61未満になるまで処理
'明細項目取得
Meisai.荷主名 = ws.Cells(lRowM + CST_ROW_荷主名, lColM + CST_COL_荷主名).Value
Meisai.発地名 = ws.Cells(lRowM + CST_ROW_発地名, lColM + CST_COL_発地名).Value
Meisai.行先名 = ws.Cells(lRowM + CST_ROW_行先名, lColM + CST_COL_行先名).Value
Meisai.品名 = ws.Cells(lRowM + CST_ROW_品名, lColM + CST_COL_品名).Value
Meisai.単位 = ws.Cells(lRowM + CST_ROW_単位, lColM + CST_COL_単位).Value
Meisai.予定数 = ws.Cells(lRowM + CST_ROW_予定数, lColM + CST_COL_予定数).Value
Meisai.端数 = ws.Cells(lRowM + CST_ROW_端数, lColM + CST_COL_端数).Value
Meisai.実数 = ws.Cells(lRowM + CST_ROW_実数, lColM + CST_COL_実数).Value
Meisai.単価 = ws.Cells(lRowM + CST_ROW_単価, lColM + CST_COL_単価).Value
Meisai.金額 = ws.Cells(lRowM + CST_ROW_金額, lColM + CST_COL_金額).Value
rstT.AddNew
rstT.Fields("作業指示No").Value = l作業指示No 'ヘッダー、明細にない部分を使用
rstT.Fields("指示書行No").Value = i行
rstT.Fields("伝票日付").Value = Header.日付
rstT.Fields("運送区分").Value = Header.運送区分
rstT.Fields("運賃合計").Value = 運賃合計
rstT.Fields("非課税合計").Value = 非課税合計
rstT.Fields("数量合計").Value = 数量合計
rstT.Fields("得意先コード").Value = Meisai.荷主コード
rstT.Fields("発着地コード1").Value = 発着地コード1
rstT.Fields("発地コード").Value = Meisai.発地コード
rstT.Fields("発地名").Value = Meisai.発地名
rstT.Fields("発着地コード2").Value = 発着地コード2
rstT.Fields("着地コード").Value = Meisai.行先コード
rstT.Fields("着地名").Value = Meisai.行先名
rstT.Fields("品目コード").Value = 品目コード
rstT.Fields("品コード").Value = Meisai.品コード
rstT.Fields("品名").Value = Meisai.品名
rstT.Fields("数量").Value = Meisai.予定数
rstT.Fields("単位").Value = Meisai.単位
rstT.Fields("金額").Value = 金額
rstT.Fields("概算区分").Value = 0
rstT.Fields("備考").Value = Null
rstT.Fields("請求更新FLG").Value = False
rstT.Fields("月次更新FLG").Value = False
rstT.Fields("傭車更新FLG").Value = False
rstT.Fields("入力日").Value = Date
rstT.Update
i行 = i行 + 1 '指示書行=指示書行+1
End If
iCntM = iCntM + 1 '明細数=明細数+1
lRowM = lRowM + 1 '明細行=明細行+1
Loop
iCntH = iCntH + 1 'ヘッダー数=ヘッダー数+1
'次の段へ
If iCntH Mod 2 = 1 Then
lRowH = lRowH + 35 'ヘッダー行=ヘッダー行+35
lRowM = lRowM + 4
Else
lColH = lColH + 15 'ヘッダー列=ヘッダー行+6
lColM = lColM + 15 '明細数=明細列+1
lRowM = 4 '明細行=2
lRowH = 2 'ヘッダー行=2
iCntM = 0 '明細数=0
End If
Loop
Next
説明がへたくそで申し訳ありませんが、よろしくお願い致します。
|
|