2017-03-04 21 views
0

このコードを使用して、あるシートから別のシートにデータを転送しています。このコードでは、転送されるデータが削除されるまで新しいシートに留まることができます。値が見つからない場合はvbaコードを終了

Private Sub Transfer2_Click() 
Dim Work_Order1 As String, Qty1 As Integer, Frame1 As String, Qty_Frame1 As Integer 
    Worksheets("Work_Order").Select 
    if Worksheets("Work_Order").Range("C12") = "" Then Exit Sub 
    Work_Order1 = Range("N3") 
    Qty1 = Range("B3") 
    Frame1 = Range("C12").Value 
    Qty_Frame1 = Range("M12") 
    Worksheets("Order").Select 
    Worksheets("Order").Range("A4").Select 
    If Worksheets("Order").Range("A4").Offset(1, 0) <> "" Then 
    Worksheets("Order").Range("A4").End(xlDown).Select 
    End If 
    ActiveCell.Offset(1, 0).Select 
    ActiveCell.Value = Work_Order1 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Qty1 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Frame1 
    ActiveCell.Offset(0, 2).Select 
    ActiveCell.Value = Qty_Frame1 

Private Sub Transfer2_Click() 
Dim Work_Order2 As String, Qty2 As Integer, Frame2 As String, Qty_Frame2 As Integer 
    Worksheets("Work_Order").Select 
    if Worksheets("Work_Order").Range("C13") = "" Then Exit Sub 
    Work_Order2 = Range("N3") 
    Qty2 = Range("B3") 
    Frame2 = Range("C13").Value 
    Qty_Frame2 = Range("M13") 
    Worksheets("Order").Select 
    Worksheets("Order").Range("A4").Select 
    If Worksheets("Order").Range("A4").Offset(1, 0) <> "" Then 
    Worksheets("Order").Range("A4").End(xlDown).Select 
    End If 
    ActiveCell.Offset(1, 0).Select 
    ActiveCell.Value = Work_Order2 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Qty2 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Frame2 
    ActiveCell.Offset(0, 2).Select 
    ActiveCell.Value = Qty_Frame2 

Private Sub Transfer2_Click() 
Dim Work_Order3 As String, Qty3 As Integer, Frame3 As String, Qty_Frame3 As Integer 
    Worksheets("Work_Order").Select 
    if Worksheets("Work_Order").Range("C14") = "" Then Exit Sub 
    Work_Order1 = Range("N3") 
    Qty3 = Range("B3") 
    Frame3 = Range("C14").Value 
    Qty_Frame3 = Range("M14") 
    Worksheets("Order").Select 
    Worksheets("Order").Range("A4").Select 
    If Worksheets("Order").Range("A4").Offset(1, 0) <> "" Then 
    Worksheets("Order").Range("A4").End(xlDown).Select 
    End If 
    ActiveCell.Offset(1, 0).Select 
    ActiveCell.Value = Work_Order3 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Qty3 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Frame3 
    ActiveCell.Offset(0, 2).Select 
    ActiveCell.Value = Qty_Frame3 

私がやっていることは、 "C"の範囲に値が見つからないということです。このコードは9回繰り返されています。これは、この情報が見つかる9つのインスタンスが存在するためですが、すべてが常に値を持つわけではないためです。それが発生した場合は、情報を新しいシートに転送する前にコードを終了します。

if Worksheets("Work_Order").Range("C12")="" Then 
Exit sub 

をしかし、もしあれば、それは終了せず、エラーブロックを返します。

これまでのところ、私は試してみました。 Ifに別の行にExit Subを置くことによって

答えて

0

は、あなたがEnd Ifを必要とする「ブロックする場合」を、作成している:

If Worksheets("Work_Order").Range("C12")="" Then 
    Exit sub 
End If 

あなたは、「シングルラインの場合を」使用したい場合は、あなたは、単一の行にあなたの文を置く必要があります。

If Worksheets("Work_Order").Range("C12")="" Then Exit sub 

どちらのステートメントは全く同じように動作しますが、あなたが持っているとき、「ブロックIFSは、」通常のコードに簡単ですステートメントのTrueまたはFalseレッグ内で実行される複数のステートメント

など。

If a = 5 Then 
    b = 7 
    c = 10 * a - b 
    d = 5 + b - c 
Else 
    b = 9 
    c = 20 * a - 4 * b 
    d = 6 + b + c 
End If 

があなたのコメントに応えて

If a = 5 Then b = 7: c = 10 * a - b: d = 5 + b - c Else b = 9: c = 20 * a - 4 * b: d = 6 + b + c 

よりも読みやすいですが、私ははあなたがブランク値を打ったとき、あなたが実際にあなたが、Exit Subにしたくないを推測しています代わりに次の範囲を処理することにします。

この

は、次のように行うことができる:

Private Sub Transfer2_Click() 
    Dim Work_Order1 As String, Qty1 As Integer, Frame1 As String, Qty_Frame1 As Integer 
    If Worksheets("Work_Order").Range("C12").Value <> "" Then 
     With Worksheets("Work_Order") 
      Work_Order1 = .Range("N3") 
      Qty1 = .Range("B3") 
      Frame1 = .Range("C12").Value 
      Qty_Frame1 = .Range("M12") 
     End With 
     With Worksheets("Order").Cells(Worksheets("Order").Rows.Count, "A").End(xlUp).Offset(1, 0).EntireRow 
      .Cells(1, "A").Value = Work_Order1 
      .Cells(1, "B").Value = Qty1 
      .Cells(1, "C").Value = Frame1 
      .Cells(1, "E").Value = Qty_Frame1 
     End With 
    End If 
    'Then repeat for the next set of cells 

として(に非常に多くの問題をリード)Selectの使用を避けるように書き換えることができ

Private Sub Transfer2_Click() 
    Dim Work_Order1 As String, Qty1 As Integer, Frame1 As String, Qty_Frame1 As Integer 
    If Worksheets("Work_Order").Range("C12").Value <> "" Then 
     Worksheets("Work_Order").Select 
     Work_Order1 = Range("N3") 
     Qty1 = Range("B3") 
     Frame1 = Range("C12").Value 
     Qty_Frame1 = Range("M12") 
     Worksheets("Order").Select 
     Worksheets("Order").Range("A4").Select 
     If Worksheets("Order").Range("A4").Offset(1, 0) <> "" Then 
      Worksheets("Order").Range("A4").End(xlDown).Select 
     End If 
     ActiveCell.Offset(1, 0).Select 
     ActiveCell.Value = Work_Order1 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = Qty1 
     ActiveCell.Offset(0, 1).Select 
     ActiveCell.Value = Frame1 
     ActiveCell.Offset(0, 2).Select 
     ActiveCell.Value = Qty_Frame1 
    End If 
    'Then repeat for the next set of cells 

しかし、それは最高の場合になりますそれは2つのサブルーチンに分割され、多くの繰り返しコードを避けました。

Private Sub Transfer2_Click() 
    With Worksheets("Work_Order") 
     Transfer2_Paste .Range("N3").Value, .Range("B3").Value, .Range("C12").Value, .Range("M12").Value 
     'Then repeat for the next set of cells, e.g. 
     'Transfer2_Paste .Range("N4").Value, .Range("B4").Value, .Range("C13").Value, .Range("M13").Value 
     'etc 
    End With 
End Sub 

Private Sub Transfer2_Paste(Work_Order1 As String, Qty1 As Integer, Frame1 As String, Qty_Frame1 As Integer) 
    If Frame1 = "" Then 
     Exit Sub 
    End If 
    With Worksheets("Order").Cells(Worksheets("Order").Rows.Count, "A").End(xlUp).Offset(1, 0).EntireRow 
     .Cells(1, "A").Value = Work_Order1 
     .Cells(1, "B").Value = Qty1 
     .Cells(1, "C").Value = Frame1 
     .Cells(1, "E").Value = Qty_Frame1 
    End With 
End Sub 
+0

ありがとうございます。私はそれを1行のステートメントにし、データをコピーする前にその範囲をチェックするために残りのコードでそれを変更しました。 –

+0

これは素晴らしいことでしたが、そのステートメントを完全にスキップして次のステートメントに進む場合はどうすればよいですか?私はセルの値が0に等しい場合に "エラー再開時に次へ"を入れてみましたが、それでも0を入力して次のステートメントに進みます。私は何も入力したくない、基本的にそのステートメントをスキップし、次のステートメントに移ります。 –

+0

@AshleyGoodwinどのステートメントをスキップしようとしていますか?どんな状況ですか? (特定の状況で文をスキップする通常の方法は、それらを 'If'ブロックで囲むことです。'何かが真であれば' '何かをする' '何かをする' '終わりの場合' 'もし何かが真ならば' '何かをする' '何かをする' 'それ以外は' 'テストがそうでないときに何かするTrue) 'End If'。 – YowE3K