|
しげ さん 今日は。
>追加で説明させていただきますと
>・プロジェクト毎に転記したい情報は一行目だけで
>・プロジェクトBOOKは各担当者が各自書かれていますので、私は入力方法を変え ることができないのです。
>
>BOOK2,3,4の表と別のシートに2006年○月○日〜2007年○月○日と期間が書かれてあるので、見た目には表の10月が何年の10月かは判断できるのですが、VBAで
>判断させるとなると・・どう書いていったらよいのかに悩んでいます。
BOOK2,3,4の月が日付データで入力されていると、もっと楽にできるのですが。
できないということなので、難儀しました。
下記コードでできますが、各プロジェクトのデータは、BOOK2,3,4のSheet1に入っているものとします。
Bookの数は、Book1〜9まで対応できます。
このコードは、Book1の標準モジュールに、貼り付けて、一度保存してください。
ThisWorkbook.Path を使って、ファイル操作をしているので、BOOK1,2,3,4は、全て同じフォルダに入れてください。
これで一応できます。
Sub test()
Dim r As Range
Dim s As Worksheet
Dim i As Long, 抽出年 As Long
Dim v, vnt, vntM, myArray(1 To 13)
Dim m1 As String, m2 As String
Dim LastRow As Long, LastRow2 As Long, clmn As Long
'
ThisWorkbook.Sheets("Sheet2").Cells.ClearContents
vntM = ThisWorkbook.Sheets("Sheet2").Range("A1:M1").Value
vntM(1, 1) = "プロジェクト"
抽出年 = InputBox("抽出年", "Title", 2006)
For i = 4 To 12: vntM(1, i - 2) = 抽出年 & "/" & i: Next
For i = 1 To 3: vntM(1, i + 10) = (抽出年 + 1) & "/" & i: Next
ThisWorkbook.Sheets("Sheet2").Range("A1:M1").Value = vntM
書式設定 ThisWorkbook.Sheets("Sheet2")
'
With ThisWorkbook.Worksheets("Sheet1")
vnt = .Range("b2", .Cells(65536, 1).End(xlUp)).Value
End With
'
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For i = 1 To UBound(vnt, 1)
Workbooks.Open ThisWorkbook.Path & "\Book" & (Val(Right(vnt(i, 1), 1)) + 1) & ".XLS"
Set s = Workbooks("Book" & (Val(Right(vnt(i, 1), 1)) + 1)).Sheets("Sheet1")
myArray(1) = vnt(i, 1)
日付処理 s, vnt(i, 2)
書式設定 s
LastRow = s.Cells(65536, 1).End(xlUp).Row
For Each r In s.Range("A1", s.Cells(1, 256).End(xlToLeft))
For clmn = 2 To UBound(vntM, 2)
m1 = Format(vntM(1, clmn), "yyyy/mm")
m2 = Format(r.Value, "yyyy/mm")
If m1 = m2 Then Exit For
Next
If clmn <= UBound(vntM, 2) Then
myArray(clmn) = r.Offset(1).Value
End If
Next
'
With ThisWorkbook.Sheets("Sheet2")
LastRow2 = .Cells(65536, 1).End(xlUp).Row
.Cells(LastRow2 + 1, 1).Resize(1, UBound(vntM, 2)).Value = _
Application.Transpose(Application.Transpose(myArray))
End With
Erase myArray
Workbooks("Book" & (Val(Right(vnt(i, 1), 1)) + 1) & ".XLS").Close SaveChanges:=False
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
'
Set s = Nothing
Erase vntM: Erase myArray
ThisWorkbook.Worksheets("Sheet2").Select
End Sub
Sub 書式設定(ws As Worksheet)
With ws
.Range("C1", .Cells(1, 256).End(xlToLeft)).NumberFormatLocal = "m月"
.Range("B1").NumberFormatLocal = "yyyy/m月"
.Cells(1, 256).End(xlToLeft).NumberFormatLocal = "yyyy/m月"
End With
End Sub
Sub 日付処理(s As Worksheet, dd)
Dim myday, d, myArray()
Dim i As Integer, m As Integer, y As Integer
'
myday = Split(dd, "〜")
y = Year(myday(0))
m = Month(myday(0))
i = 0
Do
d = y & "/" & m ' & "/" & "1"
ReDim Preserve myArray(i)
myArray(i) = d
i = i + 1: m = m + 1
If m > 12 Then m = 1: y = y + 1
Loop Until DateValue(d) >= DateValue(myday(1))
s.Range("A1").Resize(1, UBound(myArray)).Value = myArray
End Sub
|
|