Access VBA質問箱 IV

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

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


1176 / 9994 ←次へ | 前へ→

【12117】同じならば更新しない
質問  rvr  - 12/1/31(火) 9:43 -

引用なし
パスワード
   お世話になります。

アクセスからエクセルをアクセステーブルに取り込む処理を行っております。

エクセルのレイアウトは

運送区分 会社コード  会社名  車番 社員コード 社員名 日付   ←ヘッダー
 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
 
説明がへたくそで申し訳ありませんが、よろしくお願い致します。
391 hits

【12117】同じならば更新しない rvr 12/1/31(火) 9:43 質問[未読]
【12122】Re:同じならば更新しない ちん 12/2/2(木) 11:09 質問[未読]
【12123】Re:同じならば更新しない rvr 12/2/3(金) 7:52 回答[未読]
【12125】Re:同じならば更新しない ちん 12/2/3(金) 9:14 発言[未読]
【12126】Re:同じならば更新しない rvr 12/2/3(金) 9:57 お礼[未読]
【12128】Re:同じならば更新しない ちん 12/2/3(金) 14:27 発言[未読]
【12130】Re:同じならば更新しない rvr 12/2/3(金) 14:52 質問[未読]
【12131】Re:同じならば更新しない ちん 12/2/3(金) 16:34 発言[未読]
【12132】Re:同じならば更新しない rvr 12/2/3(金) 17:22 お礼[未読]

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