2016-06-15 20 views
0

情報の行が自分のシートの1つに追加されると、そのブックを同じブックの別のシートに自動的に追加するマクロを作成しようとしています。私はそれを少し微調整した後、私は、オンライン広く研究と私はそれが何をしたいんだと思う。このコードを発見した:修正する方法コンパイルエラー:予期したEnd Sub?

Sub addrow() 

Public Sub worksheet_change(ByVal target As Range) 

    Set sourcebook = ThisWorkbook 
    Set sourcesheet = sourcebook.Worksheets("sheet1") 

    Set targetbook = ThisWorkbook 
    Set targetsheet = targetbook.Worksheets("sheet10") 

    If sourcesheet.Cells(198, 16).Value = "Auto" Or _ 
     sourcesheet.Cells(198, 16).Value = "Connect" Or _ 
     sourcesheet.Cells(198, 16).Value = "Multiple*" Or _ 
     sourcesheet.Cells(198, 16).Value = "Property" Or _ 
     sourcesheet.Cells(198, 16).Value = "Umbrella" Or _ 
     sourcesheet.Cells(198, 16).Value = "WC" Then 
     GoTo link 
    Else 
     GoTo insertion 
    End If 

    insertion: targetsheet.Activate 
    ActiveSheet.Rows(198).EntireRow.Insert 

    sourcesheet.Activate 

link: 
    'targetsheet.Cells(194, targetsheet.Range("initial response").Column) = sourcesheet.Cells(198, 16).Value 
    targetsheet.Cells(194, 16) = sourcesheet.Cells(198, 16).Value 

    targetsheet.Cells(194, 16) = sourcesheet.Cells(198, 16).Value 

End Sub 

私は、コードを実行しようとすると、私はエラーメッセージが「コンパイルエラーを取得します: Expected End Sub "と表示され、コードの最初の行、Sub addrow()が強調表示されます。私はこのラインを外してみると、VBAは私が試してみると新しいマクロを作る必要があり、そのラインを追加して再び正方形に戻ります。

+1

あなたはサブのAddRow()して、すぐます。Public Sub worksheet_change(範囲としてByVal対象)を持っています。 Sub addrow()を削除し、workshett_change()が実際に使用可能であることを確認するか、マクロを手動で実行している場合はworksheet_change()行を削除しますが、Sub addrow()は保持します。希望が役立ちます。 P .:メッセージにALL CAPSを入れないでください。 – Levon

答えて

3

最初の3行に注目してください。 2つのSub宣言があります。 1つだけを保つ。 はおそらく、私はいくつかの前の仕事から忘れられているように見えるので、あなたがこの行ではなく、他のものを削除すべきだと思うライン

Public Sub worksheet_change(ByVal target As Range) 

を削除します。パラメータtargetはコードでは使用されておらず、コードはworksheet_changeよりもaddrowという名前でよく適合します。

これはあなたのコードリファクタリングです:

  • 変数名は、GOTOSとラベルに並び替えコードの
  • ブロックが

を除外することができVBAの命名規則を維持します。サブルーチンが重複しないことができ、およびすべてのサブは、一致するEnd Subの、したがって、このエラーを持っている必要があります -

Sub AddRow() 

    Set SourceBook = ThisWorkbook 
    Set SourceSheet = SourceBook.Worksheets("sheet1") 

    Set TargetBook = ThisWorkbook 
    Set TargetSheet = TargetBook.Worksheets("sheet10") 

    If Not (SourceSheet.Cells(198, 16).Value = "Auto" 
      Or SourceSheet.Cells(198, 16).Value = "Connect" 
      Or SourceSheet.Cells(198, 16).Value = "Multiple*" 
      Or SourceSheet.Cells(198, 16).Value = "Property" 
      Or SourceSheet.Cells(198, 16).Value = "Umbrella" 
      Or SourceSheet.Cells(198, 16).Value = "WC") Then 
     TargetSheet.Activate 
     ActiveSheet.Rows(198).EntireRow.Insert 
     SourceSheet.Activate 
    End If 

    'TargetSheet.Cells(194, TargetSheet.Range("initial response").Column) = SourceSheet.Cells(198, 16).Value 
    TargetSheet.Cells(194, 16) = SourceSheet.Cells(198, 16).Value 
    TargetSheet.Cells(194, 16) = SourceSheet.Cells(198, 16).Value 

End Sub 
+0

良いニュース - あなたが言ったようにパブリックサブラインを削除した後、コンパイルエラーが修正されました。今私はエラーが発生しています - "ランタイムエラー '9':範囲外の下付き文字"。私はグーグルで、それは私が正しく範囲を参照していないようだ? – mfrank7114

+0

@ mfrank7114 - あなたのコードには多くのサブスクリプトが使われています。どちらがエラーになるか?それに集中してください。デバッグを試してください:(1)キャレットを最初の行に移動する( 'Sub ...')(2)** F9 **を押してブレークポイントを設定します。 (3)プログラムを実行し、ブレークポイントで停止します。 (4)** F8 **を押し続けて、プログラムをステップバイステップで歩き、そのステップを観察します。また、変数を表示することもできます。ステッピング中に*デバッグ*メニューを参照してください。 – miroxlav

関連する問題