2012-02-14 9 views
1

2つのExcelスプレッドシートがあり、1つはさまざまな人物のデータを含み、もう1つはより多くのインデックスです。別のスプレッドシートを使用してExcelデータを置換する

「インデックス」スプレッドシートは、以下のようにレイアウトされています(例として)。

 A  B 
1 [person:][pID: ] 
2 [Mark ][1 ] 
3 [James ][2 ] 
4 [John ][3 ] 
5 [David ][4 ] 
n [ ... ][n ] 

「データ」スプレッドシートは次のように(例として)レイアウトされています。

 A 
1 [pID: ][ ... 
2 [David ][ ... 
3 [David ][ ... 
4 [David ][ ... 
5 [James ][ ... 
6 [Mark ][ ... 
7 [David ][ ... 
n [ ... ][ ... 

私は何をしたいのは、おそらくVBAを使用して、「インデックス」スプレッドシートの対応するインデックスで、「データ」のスプレッドシートの列Aを交換です。

結果は次のようになります。

 A 
1 [pID: ][ ... 
2 [4  ][ ... 
3 [4  ][ ... 
4 [4  ][ ... 
5 [2  ][ ... 
6 [1  ][ ... 
7 [4  ][ ... 
n [ ... ][ ... 

私は、switchステートメントを使用して、いくつかの静的なアプローチを見てきましたが、私は本当に別のスプレッドシートからデータをインポートできるようにしたいと思います。 コピー貼り付けと「すべて置き換え」に頼らざるを得ません。

ありがとうございます!

+0

VBAなしでExcelから直接VLOOKUP()を試してみてください。 – ja72

答えて

4

これを試してみてください:

Sub HTH() 

    With Sheets("Data") 
     .Columns(2).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 
     .Cells(1, "B").Value = .Cells(1, "A").Value 
     With .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Offset(, 1) 
      .Formula = "=VLOOKUP(A2,Index!A:B,2,FALSE)" 
      .Value = .Value 
     End With 
     .Columns(1).Delete 
    End With 

End Sub 

説明:

Sub HTH() 

    With Sheets("Data") 
     '// Insert a new column with same format 
     .Columns(2).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 
     '// Copy the header 
     .Cells(1, "B").Value = .Cells(1, "A").Value 
     '// Work with the used range of column A 
     With .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Offset(, 1) 
      '// Use a formula to replace the names with corresponding values 
      .Formula = "=VLOOKUP(A2,Index!A:B,2,FALSE)" 
      '// Replace formula with value 
      .Value = .Value 
     End With 
     '// Delete the old column 
     .Columns(1).Delete 
    End With 

End Sub 

注:個人的に

は、私があるとして生データシートを残し、見上げるプレゼンテーションシートを使用しますデータシートとインデックスシートを作成し、それをどのように表示するかを示します。それでは、必ずしもコードは必要ありません。コードを使いたい場合は、コードをもっと簡単にすることができます。あなたはja72のソリューションに代わる

など画面の更新をオフにして、エラー処理を使用するようにコードを追加する必要があります。

Sub HTH() 
    Dim vNames As Variant, vResult As Variant 
    Dim lLoop As Long 

    vNames = Sheets("Index").UsedRange.Columns(1).Resize(, 2).Value2 
    vResult = Sheets("Data").UsedRange.Columns(1).Value2 

    With CreateObject("Scripting.Dictionary") 
     For lLoop = 2 To UBound(vNames, 1) 
      .Add vNames(lLoop, 1), vNames(lLoop, 2) 
     Next lLoop 

     For lLoop = 2 To UBound(vResult, 1) 
      vResult(lLoop, 1) = .Item(vResult(lLoop, 1)) 
     Next lLoop 

     Sheets("Data").Range("A1").Resize(UBound(vResult, 1), 1).Value = vResult 
    End With 

End Sub 

その速く、あまりにも静かに自信を持って;)

+0

+1も最も速いと主張しています! – ja72

1

でこれを試してみてくださいVBA:

Public Sub FindPID() 
    Dim i As Integer, N As Integer 
    Dim r_index As Range 
    ' Find start of index 
    Set r_index = Sheets("Index").Range("A2") 
    ' Count rows in index 
    N = r_index.Worksheet.Range(r_index, r_index.End(xlDown)).Rows.Count 
    ' Expand range with all values 
    Set r_index = r_index.Resize(N, 2) 
    Dim vals As Variant 
    ' Move values into array 
    vals = r_index.Value2 
    ' Create a lookup collection 
    Dim lup As New Collection 
    For i = 1 To N 
     ' Add each pID to collection with name as key 
     lup.Add vals(i, 2), vals(i, 1) 
    Next i 

    Dim r_data As Range, M As Integer 
    ' Find start of data 
    Set r_data = Sheets("Data").Range("A2") 
    ' Count rows in data 
    M = r_data.Worksheet.Range(r_data, r_data.End(xlDown)).Rows.Count 
    ' Expand range with all values 
    Set r_data = r_data.Resize(M, 1) 
    ' Move values into array 
    vals = r_data.Value2 
    For i = 1 To M 
     ' Replace first column with lookup pID 
     vals(i, 1) = lup(vals(i, 1)) 
    Next i 
    ' Assign values from array back to cells. 
    r_data.Value2 = vals 
End Sub 

これは最も速く動作します。

+1

"これはすべての中で最も速く動作します。"チャレンジのように聞こえます; – Reafidy

+0

このルーチンではセルの数は不明であるため、コードを遅くする必要があります。さもなければ、それはちょうどメモリ内のループであり、私の経験にはそれは超高速です。 – ja72

+0

私はワープされたユーモアを見て嬉しいです!チャレンジを設定するための+1。 ;) – Reafidy

1

VBAがこの問題の最適な解決策であるとは思われません。単純なVLOOKUPは、あなたがする必要があるものを正確に達成します。

=VLOOKUP(Data!$A1, Index!$A$2:$A$5, 1, FALSE) 

あなたが探している結果が得られますか?

関連する問題