2017-01-12 6 views
1

こんにちは私はデータを移動する以下のコードを持っています。これは、デフォルトのシート名が使用されている場合に問題ありません。しかし、シートに別の名前(sheet1、sheet2ではなく)を使用すると、「Object required」エラーが発生します。ユーザー名を宣言しているときにVBAでオブジェクトにエラーが発生しました

ここで、「待ち時間」はsheet1であり、「TP」はsheet2である。

誰かが私にそれを修正する方法を教えてもらえますか?

Sub sbMoveData() 
Dim lRow As Integer, i As Integer, j As Integer 
'Find last roe in Sheet1 
lRow = Latency.Cells.SpecialCells(xlLastCell).Row 
j = 1 
For i = 1 To lRow 
If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then 
Sheets("Latency").Range("M" & i).Copy Destination:=Sheets("TP").Range("A" & j) 
j = j + 1 
End If 
Next 

End Subの

+2

*レイテンシー*は明らかにワークシートですが、このサブの範囲内では**ディミット**または**セット**ではありません。 –

+0

私は@ Garyの生徒が上で書いたことを言ってみよう、ここではこのSubでは 'Dim Latency as Worksheet'、そして後で' Set Latency = Worksheets( "Yoursheetname") '?後で 'Sheets(" Latency ")' –

答えて

1

、あなたは右のライン

Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 

でそれをやったが、それは目的であったかのようにあなたがLatencyを使用し、前それはちょうど名前ですが。その名前でシートオブジェクトを取得するには、あなたがSheet1.Rangeを行う場合は、必ずsheets("name")、またはWorksheets("name")

Sub sbMoveData() 
    Dim lRow As Integer, i As Integer, j As Integer 
    'Find last roe in Sheet1 
    With Worksheets("Latency") 
     lRow = .Cells.SpecialCells(xlLastCell).Row 
     j = 1 
     For i = 1 To lRow 
      If UCase(.Range("E" & i)) = "COMPATIBLE" And UCase(.Range("O" & i)) = "Pass" Then 
       .Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 
       j = j + 1 
      End If 
     Next 
    End With 
End Sub 
+0

これを試しましたが、実行中にエラーはありませんでした。しかし、結果もありませんでした。コードは動作しませんでした。 –

+0

@walterwhile次に、別の間違いがあります。おそらくワークシートのデータにあります。コードにステップインし、一致するものが見つかったかどうかを確認します。 FWIWは、この問題の問題を解決しました。 –

0

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

If UCase(Latency.Range("E" & i)) = "COMPATIBLE" And UCase(Latency.Range("O" & i)) = "Pass" Then 
Worksheets("Latency").Range("M" & i).Copy Destination:=Worksheets("TP").Range("A" & j) 
j = j + 1 
End If 
+0

で正しく使用していますが、 'lRow = Latency.Cells.SpecialCells(xlLastCell).Row'と同じerror.pointが出力されます。 –

+0

シートの表示名を変更するだけで、実際のシート名なので、latency.range()をWorksheets( "Latency")に置き換えてみてください。範囲() –

4

を使用するには、VBAが自動的に宣言するグローバルスコープWorksheetオブジェクトを参照しています。その "フリー"オブジェクトはデフォルトでThisWorkbook.Worksheets("Sheet1")を指しており、Worksheetsコレクションからまったく同じオブジェクトリファレンスをフェッチするのではなく、それを使用することは非常に良いアイデアです。あなたがそのSheet1ワークシート「レイテンシー」とラベルされた場合

は今、あなたはそのNameを設定ではなく、そのCodeNameてきた - そしてそれは、VBAを使用すると、コード内で使用できるグローバルな識別子を作成するために使用しますCodeNameです。あなたはプロパティ toolwindow(F4)でそれを変更することができます

Properties

お知らせ(Name)(最初の)プロパティには、まだ "シート1" と言いますか? Latencyにそれを変更し、今、このコードが有効になる:

lRow = Latency.Cells.SpecialCells(xlLastCell).Row 

Properties

を今、あなたはLatencyグローバル識別子を使用して起動したら、はどこにでもそれを使用する - 行くとまったく同じのフェッチを開始しません。 ActiveWorkbook.WorksheetsまたはActiveWorkbook.Sheetsコレクションのワークシート参照これに代えて

は:

Sheets("Latency").Range("M" & i).Copy 

あなたはそれを行う:

Latency.Range("M" & i).Copy 

も、他のシートについても同じ操作を行います。 Sheetsコレクションには、ワークシートだけでなく、チャートを含めることができます。を実行すると、コレクションからワークシートオブジェクト参照を取得できます(たとえば、実行時に作成したワークシートから)。コレクションを使用する必要があります。

また、適切にindenting(免責事項:このリンクは私のペットプロジェクトのウェブサイトを指しています)のコードも見てください。

+0

FWIW私は 'Latency'と' TP'の代わりに 'LatencySheet'と' TpSheet'を使います。 –

関連する問題