|    | 
     こんなのでは 
 
Option Explicit 
Option Compare Text 
 
Public Sub Main() 
 
  Dim i As Long 
  Dim wkbFrom As Workbook 
  Dim wkbTo As Workbook 
  Dim vntFrom As Variant 
  Dim vntTo As Variant 
   
  '経費計画Bookのシート名を列挙 
  vntFrom = Array("東京支店", "横浜支店") 
  '経費実績Bookのシート名を列挙 
  vntTo = Array("東京支店", "横浜支店") 
   
  Set wkbFrom = Workbooks("経費計画.xls") 
  Set wkbTo = Workbooks("経費計画.xls") 
   
  Application.ScreenUpdating = False 
   
  For i = 0 To UBound(vntFrom) 
    Post wkbFrom.Worksheets(vntFrom(i)).Range("A1"), _ 
          wkbTo.Worksheets(vntTo(i)).Range("A1") 
  Next i 
   
  Application.ScreenUpdating = True 
   
  Set wkbFrom = Nothing 
  Set wkbTo = Nothing 
   
  MsgBox "処理が完了しました", vbInformation 
   
End Sub 
 
Private Sub Post(rngFrom As Range, rngTo As Range) 
 
  '経費実績の列数(A〜B列) 
  Const clngColumns1 As Long = 2 
  '経費実績の中のKeyと成る列位置(基準列からのA列の列Offset:0列目) 
  Const clngKey1 As Long = 0 
  '転記先先頭列位置(基準列からのB列の列Offset:1列目) 
  Const clngItem1 As Long = 1 
   
  '経費計画の列数(A〜B列) 
  Const clngColumns2 As Long = 2 
  '経費計画の中のKeyと成る列位置(基準列からのA列の列Offset:0列目) 
  Const clngKey2 As Long = 0 
  '転記元先頭列位置(基準列からのQ列の列Offset:1列目) 
  Const clngItem2 As Long = 1 
 
  Dim i As Long 
  Dim j As Long 
  Dim lngRows1 As Long, lngRows2 As Long 
  Dim vntKeys1() As Variant, vntKeys2() As Variant 
  Dim vntData1() As Variant, vntData2() As Variant 
  Dim rngResult As Range 
  Dim lngStart As Long 
   
  With rngTo 
    '行数の取得 
    lngRows1 = .Offset(Rows.Count - .Row, clngKey1).End(xlUp).Row - .Row + 1 
    If lngRows1 <= 1 And .Value = "" Then 
      Exit Sub 
    End If 
    '復帰用Keyを設定 
    .Offset(, clngColumns1).EntireColumn.Insert 
    With .Offset(, clngColumns1) 
      .Value = 1 
      .Resize(lngRows1).DataSeries Rowcol:=xlColumns, _ 
          Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False 
    End With 
    'A列をKeyとして整列 
    .Resize(lngRows1, clngColumns1 + 1).Sort _ 
        Key1:=.Offset(, clngKey1), Order1:=xlAscending, _ 
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ 
        Orientation:=xlTopToBottom, SortMethod:=xlStroke 
    'Key列データを配列に取得 
    vntKeys1 = .Offset(, clngKey1).Resize(lngRows1 + 1).Value 
  End With 
  '結果用配列を確保 
  ReDim vntData1(1 To lngRows1, 1 To 1) 
   
  With rngFrom 
    '行数の取得 
    lngRows2 = .Offset(Rows.Count - .Row, clngKey2).End(xlUp).Row - .Row + 1 
    If lngRows2 <= 1 And .Value = "" Then 
      Exit Sub 
    End If 
    '復帰用Keyを設定 
    .Offset(, clngColumns2).EntireColumn.Insert 
    With .Offset(, clngColumns2) 
      .Value = 1 
      .Resize(lngRows2).DataSeries Rowcol:=xlColumns, _ 
          Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False 
    End With 
    'L列をKeyとして整列 
    .Resize(lngRows2, clngColumns2 + 1).Sort _ 
        Key1:=.Offset(, clngKey2), Order1:=xlAscending, _ 
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ 
        Orientation:=xlTopToBottom, SortMethod:=xlStroke 
    'Key列データを配列に取得 
    vntKeys2 = .Offset(, clngKey2).Resize(lngRows2 + 1).Value 
    '転記データを配列として取得 
    vntData2 = .Offset(, clngItem2).Resize(lngRows2).Value 
  End With 
   
  '経費実績を検索して見つかったその行を経費実績の「抽出データ」を転記 
  lngStart = 1 
  For i = 1 To lngRows1 
    For j = lngStart To lngRows2 
      ''経費実績のKeyが経費計画のKeyより大きければ 
      If vntKeys1(i, 1) < vntKeys2(j, 1) Then 
        'Forを抜ける 
        Exit For 
      Else 
        '経費実績のKeyと経費計画のKey等しければ 
        If vntKeys1(i, 1) = vntKeys2(j, 1) Then 
          '出力用配列に転記 
          vntData1(i, 1) = vntData2(j, 1) 
          Exit For 
        End If 
      End If 
    Next j 
    If j <= lngRows1 Then 
      lngStart = j 
    Else 
      Exit For 
    End If 
  Next i 
   
  '結果を出力 
  With rngTo 
    .Offset(, clngItem1).Resize(lngRows1, 2).Value = vntData1 
    '作業列をKeyとして整列 
    .Resize(lngRows1, clngColumns1 + 1).Sort _ 
        Key1:=.Offset(, clngColumns1), Order1:=xlAscending, _ 
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ 
        Orientation:=xlTopToBottom, SortMethod:=xlStroke 
    '作業列を削除 
    .Offset(, clngColumns1).EntireColumn.Delete 
  End With 
   
  With rngFrom 
    '作業列をKeyとして整列 
    .Resize(lngRows2, clngColumns2 + 1).Sort _ 
        Key1:=.Offset(, clngColumns2), Order1:=xlAscending, _ 
        Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ 
        Orientation:=xlTopToBottom, SortMethod:=xlStroke 
    '作業列を削除 
    .Offset(, clngColumns2).EntireColumn.Delete 
  End With 
     
End Sub 
 | 
     
    
   |