2016-06-01 7 views
-1

私はまだVBA(仕事のために学ぶ、JSの背景から来ている)でかなり新しいです、そして、私は少し助けが必要です。私の目標は次のとおりです。ブック内のループから除外する方法がわからないにもかかわらず、各ワークシート(「要約」シートを除く)をループし、各シートのA2をコピーします。各シートの列Lを選択し、「要約シート」の列Aおよび列Bにお互いに隣接する列を貼り付けます。私はVBA構文の専門家ではないので、もし誰かがこれをリファクタリングする方法があれば(私はすべての.selectメソッドが必要ないと知っています)、私はそれを感謝します。今、私は28行目で "invalid or unqualified reference"エラーが出ています。私の目標は学ぶことです。もしあなたが入力があれば、論理の簡単な説明に感謝します。ありがとう。シンプルなVBAスクリプトエラー

  Sub Macro7() 
      ' 
      ' Macro7 Macro 
      ' 
      ' Keyboard Shortcut: Ctrl+c 


      Dim ws As Worksheet 
      Dim lastRow As Integer 
      Dim summaryRow As Integer 

       summaryRow = 1 

      For Each ws In ActiveWorkbook.Worksheets 

      'Copy item number and paste on Summary Page' 

       Range("A2").Select 
       Selection.Copy 
       Sheets("Summary").Select 
       Range("A" & summaryRow).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
        :=False, Transpose:=False 

      'Copy corresponding BOM item # and paste on Summary Page' 

       ws.Select 
       lastRow = .Cells(.Rows.Count, "L").End(xlUp).Row 
       Range("L" & lastRow).Select 
       Application.CutCopyMode = False 
       Selection.Copy 
       Sheets("Summary").Select 
       Range("B" & summaryRow).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
        :=False, Transpose:=False 

       summaryRow = summaryRow + 1 

        Next ws 
      End Sub 
+3

'.Cells(...'と '.Rows ...')にピリオド(たとえば '.'または*フルストップ*)を付けていますこのセル参照は、 With ... End Withステートメント](https://msdn.microsoft.com/en-us/library/wc500chb.aspx)。期間を修正するか、With With ... With End – Jeeped

+0

@Jeepedありがとう、しかし、それは何のエラーもなく実行することができました。しかし、それはいくつかのあいまいな結果をもたらしました。それはB列の値を貼り付けましたが、A列(要約シート上)には何もありませんでした。 ?FWIW、このばかげたレポートには300枚以上があります。 –

答えて

2

あなたは、セル範囲の参照に沿って、親ワークシートの参照を渡すWith ... End With statementを構築することにより、.Select¹の使用を避けることができます。ダイレクトバリューの転送は、コピーと貼り付けよりも便利で効率的です。さらに、クリップボード全体の関与を避けることができます。


Sub Macro7() 
    Dim ws As Worksheet 
    Dim lastRow As Long 
    Dim summaryRow As Long 

    summaryRow = 1 

    For Each ws In ActiveWorkbook.Worksheets 
     With ws 
      If LCase(.Name) <> "summary" Then 
       Worksheets("Summary").Range("A" & summaryRow).Resize(1, 2) = _ 
        Array(.Range("A2").Value, .Cells(Rows.Count, "L").End(xlUp).Value) 
       summaryRow = summaryRow + 1 
      End If 
     End With 
    Next ws 

End Sub 

は、選択に頼るから離れるの詳細な方法について How to avoid using Select in Excel VBA macrosを参照してくださいとあなたの目標を達成するために有効にします。

+0

あなたの助けてくれてありがとうございました。あなたの説明は完璧です。私はWith..EndWithの目的を理解しようとしていました。子供たちに私はそれを働かせることができました。ループの最初のブロックの上にws.Selectを選択しますが、それをリファクタリングしてより速く実行し、より専門的に見えるようにします。ありがとう! –

1

あなたのコードは '。'参照ジープは指摘した。

私はちょうど.selectを使ってコードを完成させました。大きなマクロをビルドしていると、不要な作業が増え、速度が遅くなることがあります。

下図のようにあなただけのストレート範囲参照からのコマンドを実行できます。

 Sub Macro7() 

     Dim ws As Worksheet 
     Dim lastRow As Integer 
     Dim summaryRow As Integer 

      summaryRow = 1 

     For Each ws In ActiveWorkbook.Worksheets 

     'Copy item number and paste on Summary Page' 

      Range("A2").Copy 
      Sheets("Summary").Range("A" & summaryRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
       :=False, Transpose:=False 

     'Copy corresponding BOM item # and paste on Summary Page' 

      lastRow = ws.Cells(Rows.Count, "L").End(xlUp).Row 
      Application.CutCopyMode = False 
      ws.Range("L" & lastRow).copy 
      Sheets("Summary").Range("B" & summaryRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
       :=False, Transpose:=False 

      summaryRow = summaryRow + 1 

       Next ws 
     End Sub 

私は通常、(「」)範囲。(「」)ワークシートをコーディングし、アクション毎回、私は多くのことをやっている場合を除きます。 1つのシート上の作業を見ればわかりますが、私は一見すると何が起こっているのかを簡単に見ることができますが、作業には自分の好みがあります(F8でコードを実行して何をしているのかを忘れることはできませんすべてのステップ)

私はあなたのVBAの旅を始めるのに役立つことを願っています!

関連する問題