2017-05-22 17 views
1

サブストリング値に応じて、6番目のシートの範囲を1番目または3番目のシートにコピーしようとしています。私はこのコードを使用しようとすると "ランタイムエラー '1004'"が表示されます。私は解決策を見つけようとしました - 唯一の可能な答えはThisWorkbook.Saveを追加していましたが、結果は変わりませんでした。VBA:値をコピーするランタイムエラー1004

Dim LastRow As Long 

'Finds last row 
With ActiveSheet 
    LastRow = .Cells(.Rows.count, "A").End(xlUp).Row 
End With 

'Iterates through rows in column A, and copies the row into proper sheet depending on "H" or "L" 
For i = 4 To LastRow 
    If InStr(1, Range("A" & i), "L") <> 0 Then 
     ThisWorkbook.Worksheets(1).Range(Cells(i, 9), Cells(i, 48)).Value = ThisWorkbook.Worksheets(6).Range(Cells(i, 1), Cells(i, 40)).Value 
    ElseIf InStr(1, Range("A" & i), "H") <> 0 Then 
     ThisWorkbook.Worksheets(3).Range(Cells(i, 9), Cells(i, 48)).Value = ThisWorkbook.Worksheets(6).Range(Cells(i, 1), Cells(i, 40)).Value 
    End If 
Next i 

'Message Box when tasks are completed 
    MsgBox "Complete" 

デバッガは、エラーが発生した後起動されると、それが特異的ElseIf結果浮き彫りに:

ThisWorkbook.Worksheets(3).Range(Cells(i, 9), Cells(i, 48)).Value = ThisWorkbook.Worksheets(6).Range(Cells(i, 1), Cells(i, 40)).Value 

を編集下記答えた人たちからの助けに

おかげで、私ができました問題を解決する。 .Cells.Rangeから削除し、希望するセルを.Range("I" & y1 & ":AV" & y1)(最初の変更例)に参照しました。さらに、変数としてwsRwsL、およびwsHと定義したので、私がワークシートを引用した方法を変更しました。 With/End Withステートメントにも追加されています。

Private Sub CommandButton2_Click() 


Dim LastRow As Long 
Dim wsR As Worksheet 
Dim wsL As Worksheet 
Dim wsH As Worksheet 
Dim y1 As Integer 
Dim y2 As Integer 

'Set row value for light chain 
y1 = 4 
'Set row value for heavy chain 
y2 = 4 

'Set raw data worksheet 
Set wsR = ThisWorkbook.Worksheets(6) 
'Set light chain worksheet 
Set wsL = ThisWorkbook.Worksheets(1) 
'Set heavy chain worksheet 
Set wsH = ThisWorkbook.Worksheets(3) 

'Finds last row 
With wsR 
    LastRow = .Cells(.Rows.count, "A").End(xlUp).Row 
End With 

'Iterates through rows in column A, and copies the row into proper sheet depending on "H" or "L" 
For i = 4 To LastRow 
    'Checks for "L" for light chain 
    If InStr(1, Range("A" & i), "L") <> 0 Then 
     With wsL 
      .Range("I" & y1 & ":AV" & y1).Value = wsR.Range("A" & i & ":AN" & i).Value 
     End With 
     y1 = y1 + 1 
    'Checks for "H" for heavy chain 
    ElseIf InStr(1, Range("A" & i), "H") <> 0 Then 
     With wsH 
      .Range("I" & y2 & ":AV" & y2).Value = wsR.Range("A" & i & ":AN" & i).Value 
     End With 
     y2 = y2 + 1 
    End If 
Next i 

'Message Box when tasks are completed 
    MsgBox "Complete" 


End Sub 
+0

を参照してください。この一般的な問題に関する拡張された議論のために、.Cells](https://stackoverflow.com/questions/36368220/is-the-in-range-necessary-when-defined-by-cells)で定義されている場合に必要な範囲で。 – Jeeped

答えて

4

これは非常に一般的な問題です - あなたはあなたの細胞にシート参照を追加していない(とすべてのあなたの範囲はあなたが解決すべきいずれかを認定されていません)。

Sub x() 

Dim LastRow As Long, ws As Worksheet 

Set ws = ThisWorkbook.Worksheets(6) 

'Finds last row 
With ActiveSheet 
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
End With 

'Iterates through rows in column A, and copies the row into proper sheet depending on "H" or "L" 
For i = 4 To LastRow 
    If InStr(1, Range("A" & i), "L") <> 0 Then 
     With ThisWorkbook.Worksheets(1) 
      .Range(.Cells(i, 9), .Cells(i, 48)).Value = ws.Range(ws.Cells(i, 1), ws.Cells(i, 40)).Value 
     End With 
    ElseIf InStr(1, Range("A" & i), "H") <> 0 Then 
     With ThisWorkbook.Worksheets(3) 
      .Range(.Cells(i, 9), .Cells(i, 48)).Value = ws.Range(ws.Cells(i, 1), ws.Cells(i, 40)).Value 
     End With 
    End If 
Next i 

'Message Box when tasks are completed 
    MsgBox "Complete" 

End Sub 
+0

ありがとうございますが、「資格を持つ」とはどういう意味ですか? – MTJ

+0

シート参照があります。 'ThisWorkbook.Worksheets(1).Range'で部分的に行いましたが、省略された場合、コードはアクティブなシートを意味し、範囲が異なるシートのセルから構成されてしまいます。レンジ/セルのすべてのインスタンスにシート参照を追加したことに注意してください(関連するシートがわからない場合を除く)。 – SJR

+0

さて、ありがとう。 – MTJ

2

99% of the time the 1004 error is because you have sloppily defined range objects.

ThisWorkbook.Worksheets(3).Range(Cells(i, 9), Cells(i, 48)).Value = _ 
    ThisWorkbook.Worksheets(6).Range(Cells(i, 1), Cells(i, 40)).Value 

この代入文の左側と右側はCellsを用いて修飾範囲(それぞれWorksheets(3)Worksheets(6)の一部)が、動的割り当てとして開始両方方法は、Cellsが隠し_Globals名前空間の一部として、ActiveSheet.Cellsを参照しているため、エラーが発生しています。

この文は、その文の一方または他方の側を評価できないため、どのシートがアクティブであっても失敗します。

+0

'.Cells'については分かりませんでした。私の範囲を '.Range(" A "&i&":AN "&i)'として設定することでそれらをすべて置き換えました。お手伝いありがとう。 – MTJ

関連する問題