2017-03-08 8 views
0

にシートをコピーします。VBA - 私は別のブック(テンプレート)に、特定のワークブック(セル列「B」のパス)からシート(シート2)をコピーする別のワークブック

私は、次のいずれかを試してみましたが、Excelは私に次のエラー「ファイル名を指定して実行時エラー 『1004』:アプリケーション定義またはオブジェクト定義のエラー」を返します。

Private Sub SplitFile_Click() 
    Dim C As Integer 
    Dim x As Variant 
    Dim Z As Workbook 

    For C = 0 To 10 

    Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C) 
    Worlbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy 
    Set Z = Workbooks.Open("D:\PTP\MASTERDATA\SPACCHETTAMENTO FILE\TEMPLATE.Template.xlsx") 


    Z.Sheets("SPLIT TAB").Range("A1:U1000").PasteSpecial 
    Workbooks("Z").SaveAs Filename:="PROVA.xlsx" 
    Next C 
End Sub 

私を助けることができますか?

おかげで、 イヴァン

+1

'Z'はすでにワークブックで、ワークブックのラッパーを必要としない: –

+2

だから、:' Z.SaveAsファイル名:[ツアー]を取るために時間がかかるしてください= "PROVA.xlsx" ' –

+0

;) – R3uK

答えて

0

VBAは、このライン上に吹いている:

Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C) 

Cの値が0で、0は有効な行番号ではありませんので - B0ではありません有効範囲アドレス。だから、C = 1で始めることができ、それはこのエラー修正でしょう。

Integer(16ビット)の代わりにLong整数(32ビット)を使用することを強くお勧めします(必要な行に関係なく)。 Integerの最大値は32,767であり、ワークシートはそれよりも多くの行を持つことができます。

xVariantとして宣言されています。これは文字通りあなたがそれを作ることができる/何でもできることを意味します。

あなたはこれを行う場合:

x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C) 

その後xRange呼び出しによって参照セルの値が含まれます。

あなたはこれをしなかったしかし:

Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C) 

これはxはそれをセルのを割り当てるので、代わりに、オブジェクト参照を含めるべきであるとVBAを指示し、あなたはセル自体を取得しています

は、その後、あなたは次の操作を行います。これはコンパイルした場合 Option Explicitが指定されていないため

Worlbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy 

は、それだけです。 Worlbooksはどこにも存在しない、それはタイプミスだ - しかし、Option Explicitが指定されていないため、VBAは、あなたがそれらを宣言せずに変数を使用することができ、かつので喜んWorlbooksをコンパイルして、時間を実行するための決議を延期...その時点別でエラーが表示されます。

これは、それを修正します:そのループの反復ごとに、あなたは(おそらく存在しない)"x"という名前のブックを開くしよう:

Workbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy 

それはループ内の...除き。"x"ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)に含まれるファイル名であることを意味している場合、xString変数として宣言しなければならない、とあなたはこのようにそれを参照します:

Dim source As Workbook 
Set source = Workbooks.Open(x) 

そして、あなたはとてもループ外のを行うだろうループが繰り返されるたびに同じブックを開こうとはしません。すでに開いているブックを開くとIIRCはもう1つのランタイムエラーをスローします。

各繰り返しで別のブック/ファイルを使用する必要がある場合は、各繰り返しでそのブックを閉じる必要があります。それ以外の場合は、12個のブックが開かれます。

だから、あなたはあなたと仕事をしたいワークブックオブジェクトへの参照を保持:

あなた本と同じ
For C = 1 To 11 
    x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C).Value 
    Set source = Worlbooks.Open(x) 
    source.Sheets(Sheet2).Range("A1:U1000").Copy 
    '... 
    source.Close 
Next 

Set Z = Workbooks.Open("D:\PTP\MASTERDATA\SPACCHETTAMENTO FILE\TEMPLATE.Template.xlsx") 

あなたは11回、同じファイルを開いています一度閉じることはできません。そして、あなたは、前の反復の仕事のたびに上書きし、11回を保存...そのブック...

Z.Sheets("SPLIT TAB").Range("A1:U1000").PasteSpecial 

ソース帳から貼り付けます。


ので、多くの深刻な問題のは、そのコードにあります。要約:

  • 各モジュールの先頭にOption Explicitを指定します。
  • 可能な限り、すべての変数を明示的な特定の型で宣言します。
  • 自分で解決してください。

デバッガの使用方法を学びます。 F9は、実行を停止するブレークポイントを設定します。その時点から、一度にあなたのコード一つの命令を実行するためにF8を使用することができる上、あなたは現在の実行コンテキストに出力何に即時ペインはCtrl + G)を使用することができます。 ローカル toolwindowを使用して、現在のスコープがアクセスできるすべてのものを視覚化します。

0

ワークブックの間でデータをコピー&ペーストする必要はありません。ここではいくつかのコード例は、それがあなたを助けることを願っ..!

Option Explicit 

    Public Sub SplitFile_Click() 
     Dim C As Integer 
     Dim x As Range 
     Dim Z As Workbook 

     For C = 1 To 10 
      Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C) 
      Set Z = Workbooks.Open("D:\Template.xlsx") 

      Z.Sheets("SPLIT TAB").Range("A1") = x 'this code is faster that copy & paste 
      Z.SaveAs "PROVA" & C & ".xlsx" 'workbook should have a unique filename 

      Z.Close 'close workbook 
     Next C 
    End Sub 
関連する問題