Access VBA質問箱 IV

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

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


329 / 2272 ツリー ←次へ | 前へ→

【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 お礼[未読]

【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
 
説明がへたくそで申し訳ありませんが、よろしくお願い致します。

【12122】Re:同じならば更新しない
質問  ちん  - 12/2/2(木) 11:09 -

引用なし
パスワード
   ▼rvr さん:こんにちわ、ちんといいます。
質問ですが、
Header.会社コード やHeader.運送コード などの
ヘッダー情報は、テーブルに登録してますか?
同一のヘッダーの時、作業指示NOは、同じものを使用すると、ありますが?

【12123】Re:同じならば更新しない
回答  rvr  - 12/2/3(金) 7:52 -

引用なし
パスワード
   ちんさま
返信ありがとうございます。


>Header.会社コード やHeader.運送コード などの
>ヘッダー情報は、テーブルに登録してますか?

はいそれぞれテーブルに登録してあります。


また私自身初心者なので質問の仕方がうまくありません。
何か少しでも足りない部分がありましたら、なんでも言って頂きたいです。
よろしくお願い致します。

【12125】Re:同じならば更新しない
発言  ちん  - 12/2/3(金) 9:14 -

引用なし
パスワード
   ▼rvr さん、おはようございます。ちんです。
あまり、ACCESSは得意でないです。
普段は、ACCESSをDBとして使用しているだけなので。
ヘッダー情報マスタの読み込み処理がないですよね。
Excelのヘッダーを読み込み、Header.会社コード ・Header.運送コードの
登録チェックを行う。
1.ヘッダーが存在した時は、作業指示Noをマスタより取得する。
2.ヘッダーが存在したとき、T_作業指示を読み込み、MoveLastで
T_作業指示を最終データを読み込み、i行を取得する。
マスターのレイアウトとか構成がわからないので、想像で・・・


    sqlstr = "SELECT * FROM Header"
    sqlstr = sqlstr + " WHERE Header.会社コード ='" + Format(ws.Cells(lRowH + CST_ROW_会社コード, lColH + CST_COL_会社コード).Value
, "00000") + "'"
    sqlstr = sqlstr + " and Header.運送コード ='" + Format(ws.Cells(lRowH + CST_ROW_運送区分, lColH + CST_COL_運送区分).Value
, "00000") + "'"
    Set dbRes2 = dbWB.OpenRecordset(sqlstr, dbOpenDynaset)
    If dbRes2.RecordCount > 0 Then
     '**** ヘッダーマスター発見
      '*** T_作業指示を読み込む

    Else
     '**** ヘッダーマスターなし、新規登録
     
    End If


ExcelのVBAからのサンプルですが、ACCESSでも応用できると思いますが、
違ってたら、ACCESSの上級者たちが、回答してくれるかもです。
以上、

【12126】Re:同じならば更新しない
お礼  rvr  - 12/2/3(金) 9:57 -

引用なし
パスワード
   ちん さんおはようございます。

返信ありがとうございます。

ヘッダー情報マスタの読み込み処理のロジック抜けてました。
すいません。

    If rstT.Fields("運送区分").Value = 1 Then   '自社
      rstT.Fields("運転者コード").Value = Header.運転手コード
      rstT.Fields("車両コード").Value = Header.車番
      wInt = Nz(rstT.Fields("車両コード").Value, 0)
      プレートNo = Format(wInt, "00-00")
      rstT.Fields("プレートNo").Value = プレートNo

  ElseIf rstT.Fields("運送区分").Value = 2 Then  '傭車

    If Nz(rstT.Fields("傭車先コード").Value, 0) = 0 Then
      rstT.Fields("傭車先コード").Value = Null
    End If
    
      rstT.Fields("プレートNo").Value = Header.車番
     If Nz(rstT.Fields("プレートNo").Value, 0) = "" Then
      rstT.Fields("プレートNo").Value = Null
     End If
      rstT.Fields("傭車先コード").Value = Header.会社コード
      rstT.Fields("傭車先名").Value = Header.会社名
      rstT.Fields("傭車先発地コード").Value = Meisai.発地コード
      rstT.Fields("傭車先発地名").Value = Meisai.発地名
      rstT.Fields("傭車先着地コード").Value = Meisai.行先コード
      rstT.Fields("傭車先着地名").Value = Meisai.行先名
    End If
      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

以下略

これが本来の取り込みのコードです。
ご迷惑おかけして申し訳ありません。
これでもう一度ご指導よろしくお願い致します。

【12128】Re:同じならば更新しない
発言  ちん  - 12/2/3(金) 14:27 -

引用なし
パスワード
   ▼rvr さん、こんにちわ、ちんといいます。
配列を使用し、同じヘッダー情報だったら、前の作業指示NOを使用するで、
どうでしょうか?
サンプルとして、
>'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
↑の処理をやめて、以下の処理にしてください。

 '*** テーブル 16ページ×3シート分のテーブルを用意
 Dim dataExcel_TBL       As Integer
 Dim TBL_運送区分(1 To 48)   As Integer
 Dim TBL_会社CD(1 To 48)    As Integer
 Dim TBL_会社名(1 To 48)    As String
 Dim TBL_車番(1 To 48)     As Integer
 Dim TBL_社員(1 To 48)     As Integer
 Dim TBL_社員名(1 To 48)    As String
 Dim TBL_日付(1 To 48)     As Date
 Dim TBL_作業指示NO(1 To 48)  As Long
 Dim TBL_行(1 To 48)      As Long
 Dim i1        As Integer  '*** ヘッダーテーブル使用位置番号
 
 '*** 同じヘッダーが既に登録済みかをチェックする。
 For i1 = 1 To dataExcel_TBL
  If (TBL_会社CD(i1) = ws.Cells(lRowH + CST_ROW_会社コード, _
               lColH + CST_COL_会社コード).Value) And _
  (TBL_会社名(i1) = ws.Cells(lRowH + CST_ROW_会社名, _
                lColH + CST_COL_会社名).Value) And _
  (TBL_車番(i1) = ws.Cells(lRowH + CST_ROW_車番, _
                lColH + CST_COL_車番).Value) And _
  (TBL_社員(i1) = ws.Cells(lRowH + CST_ROW_運転手コード, _
                 lColH + CST_COL_運転手コード).Value) And _
  (TBL_社員名(i1) = ws.Cells(lRowH + CST_ROW_運転手名, _
               lColH + CST_COL_運転手名).Value) Then
  '*** 同じヘッダーを発見しました。
   Exit For
  End If
 Next i1
 If i1 > dataExcel_TBL Then
  '*** 同じヘッダーがない。新規作業指示NO 取得
  dataExcel_TBL = i1
  TBL_会社CD(i1) = ws.Cells(lRowH + CST_ROW_会社コード, _
               lColH + CST_COL_会社コード).Value
  TBL_会社名(i1) = ws.Cells(lRowH + CST_ROW_会社名, _
                lColH + CST_COL_会社名).Value
  TBL_車番(i1) = ws.Cells(lRowH + CST_ROW_車番, _
                lColH + CST_COL_車番).Value
  TBL_社員(i1) = ws.Cells(lRowH + CST_ROW_運転手コード, _
                 lColH + CST_COL_運転手コード).Value
  TBL_社員名(i1) = ws.Cells(lRowH + CST_ROW_運転手名, _
               lColH + CST_COL_運転手名).Value
  
  '作業指示No取得
  l作業指示No = Get作業指示No

  '作業指示No更新
  Call upd作業指示No(l作業指示No)
  '*** 作業指示NOをテーブルへ保存
  TBL_作業指示NO(i1) = l作業指示No

  '指示書行No更新
  i行 = 1
  '*** i行をテーブルへ保存
  TBL_行(i1) = i行
 Else
  '*** 同じヘッダーがありました。
  '*** 作業指示NOをテーブルへ保存
  l作業指示No = TBL_作業指示NO(i1)
  '指示書行No更新
  i行 = TBLSET(i1).KEY_行 + 1
 
 End If


※注意として、i行 = i行 + 1 の次の行に、必ず、
  TBLSET(i1).KEY_行 = i行 を記述してください。

以上、参考までに・・・

【12130】Re:同じならば更新しない
質問  rvr  - 12/2/3(金) 14:52 -

引用なし
パスワード
   ちんさん

返信ありがとうございます。

早速教えて頂いたロジックで実行してみました。

そしたら
i行 = TBLSET(i1).KEY_行 + 1の
TBLSETのところで
「subまたはFunctionが定義されていません」
とエラーが出てしまいました。

これはどこを直せばよろしいのでしょうか?
よろしくお願い致します。

【12131】Re:同じならば更新しない
発言  ちん  - 12/2/3(金) 16:34 -

引用なし
パスワード
   ▼rvr さん:こんにちわ、ちんです。
>
>返信ありがとうございます。
>
>早速教えて頂いたロジックで実行してみました。
>
>そしたら
>i行 = TBLSET(i1).KEY_行 + 1の
>TBLSETのところで
>「subまたはFunctionが定義されていません」
> とエラーが出てしまいました。
>
>これはどこを直せばよろしいのでしょうか?
>よろしくお願い致します。

失礼しました。記述ミスです。

>i行 = TBLSET(i1).KEY_行 + 1  <− は、間違いで、
i行 = TBL_行(i1) + 1

が、正解です。

また、注意書きのところも間違いで、
>※注意として、i行 = i行 + 1 の次の行に、必ず、
>  TBLSET(i1).KEY_行 = i行 を記述してください。 <− は、間違いで、
>
TBL_行(i1) = i行
に修正ください。

以上、参考までに・・・

【12132】Re:同じならば更新しない
お礼  rvr  - 12/2/3(金) 17:22 -

引用なし
パスワード
   ちんさんへ

ありがとうございます!
ちんさんのおかげで無事思い通りの取り込みができました。
助かりました。
ほんとに感謝です!
ありがとうございます!!

329 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078191
(SS)C-BOARD v3.8 is Free