アットウィキロゴ

sample > btob-1

Option Explicit

Sub 数値代入(カテゴリ As Variant, フラグ As Variant, 範囲 As Variant, 対象列 As Integer)

   Dim i As Integer, j As Integer, k As Integer, sRange As Range, sName As String
 
'該当月に関数代入(PJPLをSUMIFする)
   Workbooks(カテゴリ).Activate
   If フラグ = 1 Then
       j = 7
   Else
       j = 3
   End If

'「○」から「●」までのシートで関数代入~値化~合計関数戻し
   For i = j To Worksheets.Count - 1
      
       Worksheets(i).Activate
       With Worksheets(i)
'※$ZZ$8は十分値により修正の可能性有
           .Cells(4, 対象列).Formula = "=SUMIF(" & 範囲 & "!$C$6:$ZZ$6,$B$2," & 範囲 & "!$C8:$ZZ8)"
           .Cells(4, 対象列).Copy
           .Range(Cells(4, 対象列), Cells(108, 対象列)).PasteSpecial Paste:=xlFormulas
           .Range(Cells(4, 対象列), Cells(108, 対象列)).Copy
           .Range(Cells(4, 対象列), Cells(108, 対象列)).PasteSpecial Paste:=xlValues
       End With
      
       For k = 1 To 105
           Select Case k
               Case 12, 16, 29, 49, 53, 54, 55, 62, 67, 80, 81, 86, 89, 92, 93, 96, 100, 101, 105
                   Cells(k + 3, 対象列).Select
                   Selection.FillRight
           End Select
       Next
       'カーソルをA1セルに移動
       Range("A1").Select
   Next
  
   Worksheets.Add(Before:=Worksheets(1)).Name = "temp"

   For i = j + 1 To Worksheets.Count - 1
       Cells(i, 1) = Worksheets(i).Name
   Next
  
   Set sRange = Cells(j + 1, 1).CurrentRegion
   With ActiveSheet.Sort
       .SortFields.Clear
       .SortFields.Add Key:=Cells(j + 1, 1), SortOn:=xlSortOnValues, Order:=xlAscending
       .SetRange sRange
       .Apply
   End With
  
   For i = 1 To sRange.Rows.Count
       sName = Worksheets("temp").Cells(i + j, 1)
       Worksheets(sName).Move after:=Worksheets(i + j - 1)
   Next
  
   Application.DisplayAlerts = False
   Worksheets("temp").Delete
   Application.DisplayAlerts = True
  
End Sub

Sub グループ判定(GP As String, FILE As String, AM1部 As String, AM2部 As String, MM室 As String, IMS合計 As String)

   If GP = "アカウントマネジメント1部" Then
       FILE = AM1部
   ElseIf GP = "アカウントマネジメント2部" Then
       FLE = AM2部
   ElseIf GP = "メディアマーケティング室" Then
       FILE = MM室
   Else
       FILE = IMS合計
   End If

End Sub

Sub BtoB_PJPL作成マクロ()


'エラーの際は「エラー処理」へ
On Error GoTo エラー処理

'変数定義
   Dim SHEET_元帳 As Variant, SHEET_ピボット As Variant, SHEET_PJ列別PL As Variant
   Dim SHEET_存在判定 As Variant, SHEET_追記用PL As Variant, SHEET_ST管理表 As Variant
   Dim FILE_AM1部 As Variant, FILE_AM2部 As Variant, FILE_MM室 As Variant, FILE_IMS合計 As Variant, FILE_MACRO As Variant
   Dim ARRAY_追記ラベル As Variant
  
   Dim RANGE_ピボット As Variant, RANGE_ST管理表 As Variant, PATH_PJ列別PL_外部用 As Variant, PATH_データ格納 As Variant
   Dim COUNT_PJ As Variant, COUNT_行 As Variant, COLUMN_ST管理表 As Variant
   Dim COUNT_NEWPJ As Variant, SHEET_NEWPJPL As Variant, START_NEWPJ As Variant, END_NEWPJ As Variant
  
   Dim i As Variant, j As Variant, COLUMN_MONTH As Integer
   Dim xPCach As PivotCache, xPTbl As PivotTable
   Dim BEFORE_GP As String, AFTER_GP As String, JUDGE_GP As String
   Dim BEFORE_FILE As String, AFTER_FILE As String, FILE As String

'名称代入
   SHEET_元帳 = "元帳"
   SHEET_ピボット = "ピボットテーブル"
   SHEET_PJ列別PL = "PJPL"
   SHEET_存在判定 = "存在シート判定"
   SHEET_追記用PL = "追記用PL"
   SHEET_ST管理表 = Worksheets(Worksheets.Count).Name
  
   FILE_AM1部 = "アカウントマネジメント1部.xlsx"
   FILE_AM2部 = "アカウントマネジメント2部.xlsx"
   FILE_MM室 = "メディアマーケティング室.xlsx"
   FILE_IMS合計 = "IMS事業部(BtoB)合計.xlsx"
   FILE_MACRO = ActiveWorkbook.Name
  
   ARRAY_追記ラベル = Array("事業部コード", "事業部", "部室コード", "部室名", "グループコード", "グループ名")
  
   PATH_データ格納 = ActiveWorkbook.Path
   PATH_PJ列別PL_外部用 = "[" & FILE_MACRO & "]" & SHEET_PJ列別PL
  
'変数の値代入
   COUNT_行 = Worksheets(SHEET_元帳).Range("A1").End(xlDown).Row
'※$AG$2000は十分値により修正の可能性有
   RANGE_ST管理表 = "'" & SHEET_ST管理表 & "'!$A$12:$AG$2000"
   COLUMN_MONTH = Range("L3").Value
   COLUMN_ST管理表 = Range("I4").Value
  
'各種ファイルオープン(AM1・AM2・MM・合計)⇒マクロシートに戻す
   Workbooks.Open PATH_データ格納 & "\" & FILE_AM1部
   Workbooks.Open PATH_データ格納 & "\" & FILE_AM2部
   Workbooks.Open PATH_データ格納 & "\" & FILE_MM室
   Workbooks.Open PATH_データ格納 & "\" & FILE_IMS合計
   Workbooks(FILE_MACRO).Activate


'//--元帳操作
   With Worksheets(SHEET_元帳)
       .Activate
       .Range("Q1").Value = ARRAY_追記ラベル(0)
       .Range("R1").Value = ARRAY_追記ラベル(1)
       .Range("S1").Value = ARRAY_追記ラベル(2)
       .Range("T1").Value = ARRAY_追記ラベル(3)
       .Range("U1").Value = ARRAY_追記ラベル(4)
       .Range("V1").Value = ARRAY_追記ラベル(5)

       .Range("Q2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & "-5,0)"
       .Range("R2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & "-4,0)"
       .Range("S2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & "-3,0)"
       .Range("T2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & "-2,0)"
       .Range("U2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & "-1,0)"
       .Range("V2").Formula = "=VLOOKUP($K2," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & ",0)"

       .Range("Q2:V2").Copy
       .Paste Range(.Range("Q2"), .Cells(COUNT_行, 17))
   End With

   Set RANGE_ピボット = Worksheets(SHEET_元帳).Range("A1", Cells(COUNT_行, "V"))       '範囲設定
   Worksheets.Add Before:=Worksheets(SHEET_元帳)
   ActiveSheet.Name = SHEET_ピボット

'//--ピボットテーブル作成
'①ピボットキャッシュ作成
   Set xPCach = ActiveWorkbook.PivotCaches.Create _
           (SourceType:=xlDatabase, SourceData:=RANGE_ピボット)

'②ピボットキャッシュを元にピボットテーブルを作成
   Set xPTbl = xPCach.CreatePivotTable _
           (TableDestination:=Range("A3"), TableName:="Pivot1")

'③ピボットテーブルの行・列・値などにフィールドを配置
   With ActiveSheet.PivotTables("Pivot1")
       '行フィールド設定
       .AddFields RowFields:=Array("PL番号", "PL科目")

       '列フィールド設定
       With .PivotFields("プロジェクトコード")
           .Orientation = xlColumnField
            .Position = 1
       End With
       With .PivotFields("プロジェクト名称")
            .Orientation = xlColumnField
            .Position = 2
       End With

       'データフィールド設定
       With .PivotFields("金額")
            .Orientation = xlDataField
            .Function = xlSum
            .NumberFormat = "#,##0_ "
       End With
       '集計行非表示
       .PivotFields("PL番号").Subtotals(1) = False
       .PivotFields("プロジェクトコード").Subtotals(1) = False

       .InGridDropZones = True
       .RowAxisLayout xlTabularRow

   End With

   ActiveSheet.Range("C6").Select
   ActiveWindow.FreezePanes = True


'//--PJPLシート追加~PJコードペースト
   Worksheets.Add Before:=Worksheets(SHEET_ピボット)
   ActiveSheet.Name = SHEET_PJ列別PL

   Worksheets(1).Activate
   ActiveSheet.Range("B8", "D117").Copy
   ActiveSheet.Paste Worksheets(SHEET_PJ列別PL).Range("A3")
   Worksheets(SHEET_PJ列別PL).Range("A:B").Columns.AutoFit

   With Worksheets(SHEET_ピボット)
       .Activate
       COUNT_PJ = .Range("A5").End(xlToRight).Column
       .Range("C4", Cells(5, COUNT_PJ)).Copy
       .Paste Worksheets(SHEET_PJ列別PL).Range("C6")
       .Range("C8").Select
' Worksheets(SHEET_ピボット).Activate
' COUNT_PJ = ActiveSheet.Range("A5").End(xlToRight).Column
' ActiveSheet.Range("C4", Cells(5, COUNT_PJ)).Copy
' ActiveSheet.Paste Worksheets(SHEET_PJ列別PL).Range("C6")
   End With

   ActiveWindow.FreezePanes = True
   ActiveWindow.Zoom = 85


'//--関数代入~PJPL全体の完成(関数のまま)※Case文使う方がわかりやすい
   With Worksheets(SHEET_PJ列別PL)
'※$ZZ$50は十分値により修正の可能性有
       .Activate
       .Range("C8").Formula = "=IF(ISERROR(MATCH($A8,ピボットテーブル!$A$6:$A$100,0)),0,INDEX(ピボットテーブル!$C$6:$ZZ$100,MATCH($A8,ピボットテーブル!$A$6:$A$100,0),MATCH(C$6,ピボットテーブル!$C$4:$ZZ$4,0)))"
       .Range("C8").Copy
       For i = 1 To 105
           Select Case i
               Case 12, 16, 29, 49, 53, 54, 55, 62, 67, 80, 81, 86, 89, 92, 93, 96, 100, 101, 105

               Case Else
                   .Paste Cells(i + 7, "C")
           End Select
       Next
       .Range("C8", "C112").Copy
       .Paste Range(.Range("C8"), .Cells(112, COUNT_PJ))
   End With


'//--存在シート判定
'※6月作成後、起点セル変更H3⇒I3 2011/7/14
   Worksheets(SHEET_ピボット).Activate
   COUNT_PJ = ActiveSheet.Range("A5").End(xlToRight).Column
   ActiveSheet.Range("C4", Cells(5, COUNT_PJ)).Copy


   With Worksheets(SHEET_存在判定)
       .Activate
       .Range("I3").PasteSpecial Paste:=xlValues, Transpose:=True
       COUNT_PJ = .Range("I3").End(xlDown).Row
       START_NEWPJ = .Range("B3").End(xlDown).Row + 1
       END_NEWPJ = START_NEWPJ

'※$B$1000は十分値により修正の可能性有
       .Range("K3").Formula = "=IF(ISERROR(VLOOKUP($I3,$B$3:$B$1000,1,0)),""NG"",""OK"")"
       .Range("K3").Copy
       .Paste Range(.Range("K3"), .Cells(COUNT_PJ, "K"))

       For i = 3 To COUNT_PJ
           If .Cells(i, "K").Value = "NG" Then
               COUNT_NEWPJ = .Range("B3").End(xlDown).Row + 1
               .Range(.Cells(i, "I"), .Cells(i, "J")).Copy
               .Cells(COUNT_NEWPJ, "B").PasteSpecial Paste:=xlValues
               .Cells(COUNT_NEWPJ, "D").Formula = "=SUBSTITUTE(LEFTB(CONCATENATE(IF(B" & COUNT_NEWPJ & ">=1000,B" & COUNT_NEWPJ & ",0&B" & COUNT_NEWPJ & "),C" & COUNT_NEWPJ & "),30),""/"","" "")"
               .Cells(COUNT_NEWPJ, "E").Formula = "=VLOOKUP($B" & COUNT_NEWPJ & "," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & ",0)"
               END_NEWPJ = END_NEWPJ + 1
           End If
       Next
      
       .Range("F3").Formula = "=VLOOKUP($B3," & RANGE_ST管理表 & "," & COLUMN_ST管理表 & ",0)"
       .Range("G3").Formula = "=IF($E3=$F3,""OK"",""NG"")"
       .Range("F3", "G3").Copy
       .Paste Range(.Range("F3"), .Cells(END_NEWPJ - 1, "F"))
      
   End With


'//--新規PJのPLシート追加
'テスト用
' START_NEWPJ = 225
' END_NEWPJ = 226

'新規PJPLに関する情報を追記用PLに代入
   For j = START_NEWPJ To END_NEWPJ - 1
       With Worksheets(SHEET_追記用PL)
           .Range("B2") = Worksheets(SHEET_存在判定).Cells(j, "B").Value
           .Range("E2") = Worksheets(SHEET_存在判定).Cells(j, "C").Value
           SHEET_NEWPJPL = Worksheets(SHEET_存在判定).Cells(j, "D").Value
           JUDGE_GP = Worksheets(SHEET_存在判定).Cells(j, "E").Value

       'グループ判定
           グループ判定 JUDGE_GP, FILE, FILE_AM1部, FILE_AM2部, FILE_MM室, FILE_IMS合計

           If JUDGE_GP = "アカウントマネジメント1部" Then
               FILE_追記 = FILE_AM1部
           ElseIf JUDGE_GP = "アカウントマネジメント2部" Then
               FILE_追記 = FILE_AM2部
           ElseIf JUDGE_GP = "メディアマーケティング室" Then
               FILE_追記 = FILE_MM室
           Else
               FILE_追記 = FILE_IMS合計
           End If

       '新規PJPL追加
           .Copy Before:=Workbooks(FILE_追記).Worksheets("●")
       End With

   'シート名を変更して、マクロシートに戻る
       ActiveSheet.Name = SHEET_NEWPJPL
       Workbooks(FILE_MACRO).Activate
   Next
      
'PJの部門が変更になったシートを移動させる
   With Worksheets(SHEET_存在判定)
        For j = 3 To START_NEWPJ - 1
           If Cells(j, "G") = "NG" Then
               BEFORE_GP = .Cells(j, "E").Value
               AFTER_GP = .Cells(j, "F").Value
              
               グループ判定 BEFORE_GP, BEFORE_FILE, FILE_AM1部, FILE_AM2部, FILE_MM室, FILE_IMS合計
               グループ判定 AFTER_GP, AFTER_FILE, FILE_AM1部, FILE_AM2部, FILE_MM室, FILE_IMS合計
  
'BEFOREファイル呼び出し
'該当シート捜索
'AFTERシートに移動




'//--各データで数値代入※合計データのみフラグ「1」を立てる
   数値代入 FILE_AM1部, 0, PATH_PJ列別PL_外部用, COLUMN_MONTH
   数値代入 FILE_AM2部, 0, PATH_PJ列別PL_外部用, COLUMN_MONTH
   数値代入 FILE_MM室, 0, PATH_PJ列別PL_外部用, COLUMN_MONTH
   数値代入 FILE_IMS合計, 1, PATH_PJ列別PL_外部用, COLUMN_MONTH


'//--IMS合計の総計PL金額とマクロのPJ列別PLの各行合計と一致するか確認する

   With Workbooks(FILE_MACRO).Worksheets(SHEET_PJ列別PL)
       .Activate
       COUNT_PJ = .Range("A7").End(xlToRight).Column
       .Cells(7, COUNT_PJ + 1).Value = "PJ合計"
       .Cells(7, COUNT_PJ + 2).Value = "IMS合計PLより"
       .Cells(7, COUNT_PJ + 3).Value = "差異"
       .Cells(8, COUNT_PJ + 1).Formula = "=SUM(C8:" & Cells(8, COUNT_PJ).Address(0, 0) & ")"
       .Cells(8, COUNT_PJ + 3).Formula = "=" & Cells(8, COUNT_PJ + 2).Address(0, 0) & "-" & Cells(8, COUNT_PJ + 1).Address(0, 0)
       .Range(Cells(8, COUNT_PJ + 1), Cells(8, COUNT_PJ + 3)).Copy
       .Paste Range(Cells(8, COUNT_PJ + 1), Cells(112, COUNT_PJ + 1))
   End With
   
   Workbooks(FILE_IMS合計).Worksheets(1).Activate
   Range(Cells(4, COLUMN_MONTH), Cells(108, COLUMN_MONTH)).Copy
     
   Workbooks(FILE_MACRO).Worksheets(SHEET_PJ列別PL).Activate
   ActiveSheet.Cells(8, COUNT_PJ + 2).PasteSpecial Paste:=xlValues

Exit Sub


'エラー発生時の処理
エラー処理:
   MsgBox Err.Number & ":" & Err.Description

End Sub
最終更新:2011年08月02日 10:57