2017-11-28 11 views
1

この作業を完了するために、過去数週間、VBAを他の提案からまとめようと過ごしましたが、今では皆さんに答えを求めています。 ws1の値iとws1の値iで始まる行に一致する値cで始まる行の列A:Kをws2からコピーしようとしています。コピーされる基準は1と0です。これは、基本的にダイナミックレンジを貼り付ける栄光に満ちたループ型のV-ルックアップです。for-eachループでのダイナミックレンジのコピー

私はループ機構を理解しましたが、選択したセルをコピーするためのコードを作成するだけでいいです。

は、ここで私がこれまで持っているものです。

For Each i In ws1.Range("A4:A26") 
    For Each c In ws2.Range("A8:A28") 
     If i.Cells.Value <> c.Cells.Value Then 
      'select columns A:K in the row with the value c in ws2 
      'open ws1 
      'paste selection to[starting at] column D in ws1 
      Exit For 

     End If 
    Next c 
Next i 
+0

?ワークシートをどこのセルにコピーしますか?基準は何ですか?あなたが情報なしで何をしようとしているのかを推測することは不可能です。コードは機能しません。 –

+0

コメントにコードを入れないでください。 [edit] –

+0

こんにちは、私はws2の範囲をコピーしようとしていますが、ws1の値iと一致する値cで始まる行の列A:Kを次のようにコピーしようとしています。 ws1の値iで始まる行。コピーされる基準は1と0です。これは基本的に栄光に満ちたループ型のV-ルックアップです。追加情報が必要な場合はお知らせください。 –

答えて

0

本当に一致が必要な場合は、一致が見つかったら、「終了」を選択します。
これは2つのワークシートで2列の値を比較するとき、あなたがApplication.Match機能を持っている

 For Each i In ws1.Range("A4:A26") 
     For Each c In ws2.Range("A8:A28") 
      If i.Value = c.Value Then 
       'select the row, columns A:K that starts with the value c in ws2 
       ws2.Range("A" & c.Row & ":K" & c.Row).Copy ws1.Range("A" & i.Row) 
       Exit For 
      End If 
     Next c 
    Next i 
0

これは、あなたが目指しているものであるかどうかわかりません。 「行を選択すると、列A:Kは値wで始まる値cで始まる」という意味を明確にすることができれば助かります。値が一致しない場合はExit Forと仮定していますが、ステートメントのすべてを実行した後に次のiに移動したいとします。

マクロの記録機能を使用すると便利です。

For Each i In ws1.Range("A4:A26") 
    For Each c In ws2.Range("A8:A28") 
     If i.Cells.Value <> c.Cells.Value Then 
      'select the row, columns A:K that starts with the value c in ws2 
      ws2.Range(Cells(c.Cells.Value, "A"), Cells(c.Cells.Value, "K")).Copy 
      'open ws1 
      ws1.Activate 
      'paste selection, starting from column D in ws1, into ws1 
      ws1.Cells(i.Cells.Value, "D").Select 
      ActiveSheet.Paste 
      Exit For 
     End If 
    Next c 
Next i 
End Sub 
+0

'ws1.Range(Cells(c、" A ")、Cells(c、" K ")) 、 "A")、セル(c、 "K"))。選択、選択、コピー。 –

+0

ws1.Range行のコードに型の不一致があります.cがすでに行と列の位置を持っているため、(c、 "A")が命名規則として機能するかどうかはわかりません。 –

+0

'c'の代わりに' c.Cells.Value'を試してください(edit参照) –

0

を活性化または選択するうちにそれをしません。時間がかかる2つのForループを持つ代わりに、Forを1つ持ち、もう1つの代わりにApplication.Matchを使用できます。また

コピー>>は、1行のコマンドで貼り付け、SelectまたはActivate何もする必要はありません。あなたは、このコードを達成しようとしているものを指定する必要が

コード

Option Explicit 

Sub CompareColumns() 

Dim ws1 As Worksheet 
Dim ws2 As Worksheet 

Dim MatchRng As Range, C As Range 
Dim MatchRow As Long 

Set ws1 = Worksheets("Sheet1") ' change "Sheet1" to your sheet's name 
Set ws2 = Worksheets("Sheet2") ' change "Sheet2" to your sheet's name 

' set the matched range 
Set MatchRng = ws1.Range("A4:A26") 

With ws2 
    For Each C In .Range("A8:A28") 
     ' use Match to see if there's a match 
     If Not IsError(Application.Match(C.Value, MatchRng, 0)) Then 
      MatchRow = Application.Match(C.Value, MatchRng, 0) + MatchRng.Row - 1 ' get the row of the match (add 4 since the range starts at row 4) 

      ' copy >> paste is a 1-line command 
      .Range(.Cells(C.Row, "A"), .Cells(C.Row, "K")).Copy Destination:=ws1.Range("D" & MatchRow) 
     End If 
    Next C 
End With 

End Sub