2017-11-24 10 views
1

VBAを使用して、一部のセルの値をコピーして同じワークブックの他のワークシートに貼り付けることを試みています。VBAで値をコピーして別のワークシートに貼り付けます

次のようにオーダーリストワークシートのフォーマットがあるで:私は数量でオーダーリストにシートをコピーして、列に示すように、関連するシートに貼り付ける必要があり

(Column A) | (Column B)   | (Column C) | (Column D) | (Column E) | (Column F) 
Product Code | Product Description | Price  | Quantity | Net Amount | Sheet Name 

F.

たとえば、製品コード AAAはです。 10とシート名 Art in オーダーリスト

Product Code | Product Description | Price | Quantity | Net Amount | Sheet Name 
AAA   ...     ...  5   ...   Art 

Iは、製品コード 10の代わりに5へアートシートにAAAの数量(列G)を交換するためのコードは、アートシートの列B内にある必要があります。

(Column B) | ...   | (Column G) 
Product Code | Other headers | Quantity 
AAA   ...    10   ' <---- REPLACE WITH 5 

私は次のように更新している:

Dim j As Long, i As Long 

j = 18 

With Worksheets("Order List") 

If Sheets("Order List").Range("F" & j) <> "" And Sheets("Order List").Range("A" & j) <> "" Then 

i = Worksheets(.Range("F" & j)).Columns("B").Find(What:=.Range("A" & j).Value, LookIn:=xlValues, LookAt:=xlWhole).Row 

Sheets("Order List").Range("D" & j).Copy Destination:=Worksheets(Worksheets("Order List").Range("F" & j)).Range("G" & i) 

j = j + 1 

End If 

をそこには、エラーメッセージが今ありませんが、どちらかのアートシートに数量を交換しません。 宛先が間違っていますか?私はそれをもう一度確認してください。多くのおかげで

+0

関連するシートと製品コードの両方が利用可能でない限り、 'j'の値を見つける必要はありません。利用可能であることを確認する前にそれらの値を使用しないでください。 – YowE3K

+0

@ YowE3K私は列を更新しました。列Aの商品コード、列Dの数量、およびシート名は、注文リストの列Fにあります。最初の行はOrder Listの18です。製品コードは、他のワークシートの列Bにあります。私はあなたが書いたコードは行番号を見つけることであり、この行番号を使って他のシート(この例ではArt Sheet)の関連する列Gを見つけることを理解しています。関連するシートと製品コードの両方を入手できるので、コードが機能するはずです。私はそれを更新し、まだ実行時エラー "9"を参照してください。それが間違っていれば私のコードを修正してください。多くのありがとう –

+0

あなたの更新されたコードは 'Sheets(" Order List ")かRange(" F "&j)<>" "かどうかをテストする前に' Worksheets(.Range( "F"&j) '。空白の場合は、名前のないワークシートを探しています。それらが利用可能であることを確認する前に値を使用しようとしないでください - 'If'ステートメント内で' i' **の計算を動かすことがわかる場所で 'If'ステートメントを動かしてください。 – YowE3K

答えて

1

はすなわち、Findコマンドを使用してみてくださいのようなもの:

Dim j As Long, i As Long 

j = 18 

With Worksheets("Order List") 
    If .Range("F" & j).Value <> "" And .Range("A" & j).Value <> "" Then 
     i = Worksheets(.Range("F" & j).Value).Columns("B").Find(What:=.Range("A" & j).Value, LookIn:=xlValues, LookAt:=xlWhole).Row 
     .Range("D" & j).Copy Destination:=Worksheets(.Range("F" & j).Value).Range("G" & i) 
     'or, if you just want to copy the value, use 
     'Worksheets(.Range("F" & j).Value).Range("G" & i).Value = .Range("D" & j).Value 
     j = j + 1 
    End If 
End With 

注:

  1. は、製品コードを使用すると、更新しようとしているシートの列Aであると仮定します。
  2. 関連するシートの列Aに製品コードが存在しない場合、これはクラッシュします。可能性がある場合は、プロパティを取得する前に、Findが成功したかどうか(すなわち、Nothingを返していないかどうか)を確認する適切なエラーチェックを含める必要があります。
+0

ありがとうございます。私はコードを更新しました。しかし、私はまだここにいくつかのエラーがあります。私をもう一度見てみてください。 –

0

おそらく、より簡単な代替ソリューションがあります。 VBAによる面倒なマルチシート注文数量検索(および "オーダーシートの新しいデータの入力")を処理する代わりに、注文リストワークシートのより使いやすいワークシート検索機能を使用して、 "get"データは他のすべてのシートから1か所に集約され、その後、単純な単一列のコピー&が貼り付けられます。

sample destination sheet

[sample data[2]

あなたは、私が "置く代わりの取得" で何を意味するかを証明するために私の[シンプル]デモXLSM from JumpShare hereをダウンロードすることができます。基本的に1つのルックアップ式がすべての検索を行います。必要なときに新しいデータをコピーするコードは2行のみです。 {マクロがオンラインビューアで動作しないことに注意してください。)

0

VBAは私の専門ではないので、私はあなたのコードを次のように分解しました。

Dim j As Long, i As Long 
Dim s As String 
Dim ws As Worksheet 

j = 18 
Set ws = Worksheets("Order List") 

s = ws.Range("A" & j).Value 
i = Worksheets(ws.Range("F" & j)).Columns("B").Find(What:=s, LookIn:=xlValues, _ 
    LookAt:=xlWhole).Row 

If ws.Range("F" & j) <> "" And ws.Range("A" & j) <> "" Then 
    ws.Range("D" & j).Copy Destination:=Worksheets("F" & j).Range("G" & i) 
    j = j + 1 
End If 

私に飛び出した一つのことは、コードの最後の本当のラインだった:

Destination:=Worksheets("F" & j).Range("G" & i) 

これは私に語っワークシートは「FX」という名前のワークブックにあります(xはここで数)。あなたがこれを意味する可能性はありますか?

Destination:=Worksheets(ws.Range("F" & j)) 
+0

ありがとうございました。代わりにWorksheet.Rangeとしてワークシートを変更しました。どうもありがとう –

関連する問題