Excel VBA質問箱 IV

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

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


13995 / 76732 ←次へ | 前へ→

【68237】Re:VLOOKUPを使ったデータの参照
回答  UO3  - 11/2/17(木) 10:29 -

引用なし
パスワード
   ▼ケメ子 さん:

おはようございます。

D列を固定化している部分は前月ファイルのほかに今月ファイルにもありますが、
それは、それでいいとして。

直接的なエラーの原因は、この時点では oSh に、まだシートオブジェクトがセットされて
いないということです。
(その下のブロックでoBookがある場合にのみoShにセットしています)

ですから、この構成のままやるとすれば、ますます煩雑になりますが、今回手を入れられた
Select Case のところではなく、私がアップしたコードでoList、decColにセットしている
ところを、あらためてSelect Case をおいて、シートごとに異なるoList、decColをセット
するというのが、一番手っ取り早い方法です。

でも、このシートごとに異なる、旧D列にあたるものをシートごとに変数にいれておき
oList、decList生成時に、"D"という固定値ではなく、この変数を与えるほうがよろしいかと。

前月度ブック用に oKey という変数を追加します。

Sub Sample作業()
  Dim myFso As Object
  Dim myFiles As Object
  Dim myFile As Object
  Dim shn As Variant  'シート名 A,B,C,D
  Dim z As Long
  Dim xlRowMax As Long 'エクセル最大行数

  '元データ関連
  Dim bPath As String  'サーバパス
  Dim bBook As Workbook 'ブック
  Dim bSh As Worksheet 'シート
  Dim bTop As Long   'データ開始行
  Dim bCol As String  'シートごとのデータ開始列
  Dim bRows As Long   'シートごとのデータ数
  '前月度関連
  Dim oPath As String  'サーバパス
  Dim oBook As Workbook 'ブック
  Dim oSh As Worksheet 'シート
  Dim oTop As Long   'データ開始行
  Dim oCol As String  'シートごとのデータ開始列
  Dim oRows As Long   'シートごとのデータ数
  Dim oName As String  'ブック名。元データも同じ。
  Dim oKey As String  'シートごとのkeyコード列
  Dim oList As String  'keyコード列から始まるVLOOKUPリスト領域アドレス
  Dim decCol As Long  '同上領域のデコード列番号(1〜)
  '今月度関連
  Dim nPath As String  'サーバパス
  Dim nBook As Workbook 'ブック
  Dim nSh As Worksheet 'シート
  Dim nTop As Long   'データ開始行
  Dim nName As String  'ブック名
  Dim nRank As Object  'ランクデコード領域
  Dim nRows As Long   'シートごとのデータ数
  Dim nBottom As Long  'シートごとのデータ最終行
 
  Application.ScreenUpdating = False
  Set myFso = CreateObject("Scripting.FileSystemObject")

  bPath = "c:\元データ"    '実際のサーバパス名に
  nPath = "c:\今月度"     '実際のサーバパス名に
  oPath = "c:\前月度提出用"  '実際のサーバパス名に
 
  bTop = 16  '元データ開始行
  oTop = 16  '前月度データ開始行
  nTop = 6  '今月度データ開始行
 
  xlRowMax = Rows.Count

  For Each myFile In myFso.GetFolder(nPath).Files
   nName = myFile.Name  '頭に【作業】つき
   oName = Mid(nName, 5) '頭の【作業】を除く
 
   If LCase(myFso.GetExtensionName(nName)) = "xls" And _
      Left(nName, 4) = "【作業】" And _
      myFso.FileExists(bPath & "\" & oName) Then
   
     Set nBook = Workbooks.Open(myFile.Path)
'------------------------------
'元ファイルから各シートへコピー
'------------------------------
     Set bBook = Workbooks.Open(bPath & "\" & oName)
   
     For Each shn In Array("A", "B", "C", "D")
      Select Case shn
        Case "A"
         bCol = "C"
        Case "B"
         bCol = "F"
        Case "C"
         bCol = "M"
        Case "D"
         bCol = "E"
      End Select
   
      Set bSh = bBook.Sheets(shn)
      Set nSh = nBook.Sheets(shn)
      z = bSh.Range(bCol & xlRowMax).End(xlUp).Row
      If z >= bTop Then '元データにデータが存在するときのみ、当シート処理
        bRows = z - bTop + 1
        nBottom = nTop + bRows - 1
        With nSh
         .Range("B6:E" & xlRowMax).ClearContents
         .Range("A6:A" & xlRowMax).ClearContents
         .Range("F7:I" & xlRowMax).ClearContents
         .Range("B6:D6").Resize(bRows).Value = _
              bSh.Range(bCol & bTop).Resize(bRows, 3).Value
         .Range("F" & nTop & ":I" & nBottom).Formula = _
              .Range("F" & nTop & ":I" & nTop).Formula '式をコピー
         .Range("A" & nTop).Value = 1
         .Range("A" & nTop).Resize(bRows).DataSeries '連番
        End With
      End If
     Next
  
     bBook.Close False
  
'----------------------------------------
'前月ファイルから各シートへランクデコード
'----------------------------------------
     Set oBook = Nothing
     If myFso.FileExists(oPath & "\" & oName) Then _
      Set oBook = Workbooks.Open(oPath & "\" & oName)
   
     For Each shn In Array("A", "B", "C", "D")
      Select Case shn
        Case "A"
         oCol = "P"
         oKey = "E"
        Case "B"
         oCol = "O"
         oKey = "H"
        Case "C"
         oCol = "V"
         oKey = "O"
        Case "D"
         oCol = "N"
         oKey = "G"
      End Select
  
      Set nSh = nBook.Sheets(shn)
      z = nSh.Range("D" & xlRowMax).End(xlUp).Row
      If z >= nTop Then 'データが存在するときのみ、当シート処理
        nRows = z - nTop + 1
        With nSh
         Set nRank = .Range("E" & nTop).Resize(nRows)
         If Not oBook Is Nothing Then
           Set oSh = oBook.Sheets(shn)
           z = oSh.Range(oCol & xlRowMax).End(xlUp).Row
           If z >= oTop Then
            oRows = z - oTop + 1
            oList = "[" & oBook.Name & "]" & oSh.Name & "!" & _
                   Range(oKey & oTop & ":" & oCol & z).Address
            decCol = Columns(oCol).Column - Columns(oKey).Column + 1
            nRank.Formula = _
              "=VLOOKUP(" & oKey & nTop & "," & oList & "," & decCol & ",FALSE)"
            nRank.Value = nRank.Value
           Else
            nRank.Formula = "#N/A" '前月ブックの当該シートにデータがない時
           End If
         Else
           nRank.Formula = "#N/A" '前月ブックがない時
         End If
        End With
      End If
     Next
'-------------------------------
'ブック処理完了 --> 次のブックへ
'-------------------------------
     If Not oBook Is Nothing Then oBook.Close False
     nBook.Close True
   End If
  Next
 
  Set nBook = Nothing
  Set oBook = Nothing
  Set bBook = Nothing
  Set nSh = Nothing
  Set oSh = Nothing
  Set bSh = Nothing
  Set nRank = Nothing
  Set myFso = Nothing
 
  Application.ScreenUpdating = True
 
  MsgBox "処理が終了しました。"

End Sub

0 hits

【68149】VLOOKUPを使ったデータの参照 ケメ子 11/2/7(月) 0:02 質問
【68152】Re:VLOOKUPを使ったデータの参照 UO3 11/2/7(月) 11:14 発言
【68162】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/7(月) 22:43 発言
【68164】Re:VLOOKUPを使ったデータの参照 UO3 11/2/8(火) 12:45 発言
【68173】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/8(火) 22:04 発言
【68174】Re:VLOOKUPを使ったデータの参照 UO3 11/2/9(水) 11:43 発言
【68175】Re:VLOOKUPを使ったデータの参照 UO3 11/2/9(水) 12:12 発言
【68176】Re:VLOOKUPを使ったデータの参照 UO3 11/2/9(水) 12:25 発言
【68177】Re:VLOOKUPを使ったデータの参照 UO3 11/2/9(水) 13:09 発言
【68180】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/9(水) 22:11 発言
【68182】Re:VLOOKUPを使ったデータの参照 UO3 11/2/10(木) 12:26 回答
【68183】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/10(木) 23:35 発言
【68232】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/16(水) 23:15 質問
【68237】Re:VLOOKUPを使ったデータの参照 UO3 11/2/17(木) 10:29 回答
【68240】Re:VLOOKUPを使ったデータの参照 UO3 11/2/17(木) 10:43 発言
【68243】Re:VLOOKUPを使ったデータの参照 UO3 11/2/17(木) 11:02 回答
【68254】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/17(木) 22:39 発言
【68255】Re:VLOOKUPを使ったデータの参照 UO3 11/2/17(木) 23:08 発言
【68259】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/18(金) 21:14 発言
【68303】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/22(火) 0:44 質問
【68306】Re:VLOOKUPを使ったデータの参照 UO3 11/2/22(火) 9:28 発言
【68307】Re:VLOOKUPを使ったデータの参照 UO3 11/2/22(火) 9:50 発言
【68308】Re:VLOOKUPを使ったデータの参照 UO3 11/2/22(火) 10:27 発言
【68314】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/23(水) 0:19 発言
【68315】Re:VLOOKUPを使ったデータの参照 UO3 11/2/23(水) 13:32 発言
【68316】Re:VLOOKUPを使ったデータの参照 UO3 11/2/23(水) 13:36 発言
【68317】Re:VLOOKUPを使ったデータの参照 UO3 11/2/23(水) 13:38 回答
【68321】Re:VLOOKUPを使ったデータの参照 UO3 11/2/23(水) 22:04 発言
【68322】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/23(水) 22:04 質問
【68331】Re:VLOOKUPを使ったデータの参照 UO3 11/2/24(木) 11:46 発言
【68333】Re:VLOOKUPを使ったデータの参照 UO3 11/2/24(木) 11:47 発言
【68346】Re:VLOOKUPを使ったデータの参照 ケメ子 11/2/24(木) 22:46 発言
【68421】Re:VLOOKUPを使ったデータの参照2 ケメ子 11/3/3(木) 20:15 質問
【68425】Re:VLOOKUPを使ったデータの参照2 UO3 11/3/4(金) 12:32 回答
【68426】できました!! ですが・・・ ケメ子 11/3/4(金) 20:31 質問
【68429】Re:できました!! ですが・・・ UO3 11/3/4(金) 21:51 発言
【68431】Re:できました!! ですが・・・ UO3 11/3/5(土) 16:58 回答
【68432】Re:できました!! ですが・・・ ケメ子 11/3/5(土) 18:53 発言
【68441】プロシージャの追加場所 ケメ子 11/3/7(月) 21:21 質問
【68442】Re:プロシージャの追加場所 UO3 11/3/7(月) 21:59 回答
【68479】\(^o^)/ ケメ子 11/3/9(水) 20:58 お礼

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