2017-01-24 4 views
1

msoFileDialogFolderPickerを開き、すべてのExcelファイルが開かれ、1つずつデータが新しく開いたブックからコピーされ貼り付けられるフォルダを選択する、マクロのVBAコードに問題がありますマクロが実行されているブックの特定のシートに挿入します。基本的には、営業担当者のそれぞれに売上を補うためのスプレッドシートを与え、その後、スプレッドシートを営業マネージャーに提出します。誰かが各スプレッドシートを開き、データをコピーして1つのスプレッドシートに手動で貼り付けなければならないのではなく、単にこれを行うマクロを持つだけです。ファイルの場所と名前が変更される可能性があるので、私は可能な限り動的にしようとしています。これを行うより良い方法があるかもしれないので、どんな提案も高く評価されます!1つのブックから別のブックにコピーして貼り付けるために、VBAコードで実行時エラー '1004'が表示されるのはなぜですか?

ファイルを開いてコピーすると問題が発生しますが、ランタイムエラー1004 'Range Class Failed'メソッドが表示され、ワー​​クブックに貼り付けられます。マクロを実行しています。私はThisWorkbookとThisWorkbook.Activateを試して、マクロが実行されているスプレッドシートに行くようにExcelに指示しましたが、誰も私の問題を解決しませんでした。時々私はエラーを通過するが、それでもマスターブックのデータを貼り付けることはありません。私は下に私のコードを書いている。確かに、それは主に私が見つけたコードからコピーされていますが、私はそれを自分の目的に合わせようとしました。エラーを表示する行は、 "wb1.Worksheets(1).Range(" A5 ")です。「行」を選択します。

Sub LoopAllExcelFilesInFolder() 

    Dim wb As Workbook 
    Dim wb1 As Workbook 
    Dim myPath As String 
    Dim myFile As String 
    Dim myExtension As String 
    Dim FldrPicker As FileDialog 

Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker) 

    With FldrPicker 
    .Title = "Select A Target Folder" 
    .AllowMultiSelect = False 
     If .Show <> -1 Then GoTo NextCode 
     myPath = .SelectedItems(1) & "\" 
    End With 


NextCode: 
    myPath = myPath 
    If myPath = "" Then GoTo ResetSettings 

myExtension = "*.xls*" 

myFile = Dir(myPath & myExtension) 

Do While myFile <> "" 
    Set wb = Workbooks.Open(Filename:=myPath & myFile) 
    Set wb1 = ThisWorkbook 

    Do events 

    wb.Worksheets(1).Range("A5:H28").Select 
Selection.Copy 
    wb1.Activate 
    wb1.Worksheets(1).Range("A5").Select 
    ActiveSheet.Paste 

    DoEvents 

    myFile = Dir 
Loop 

    MsgBox "Task Complete!" 

ResetSettings: 

    Application.EnableEvents = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 

End Sub 

これは、新しくオープンしたワークブックに複数のワークシートからのものをコピーして、もともとマクロ実行中のワークブックの複数のシートに貼り付ける含ん私は最終的にはするつもりです何の簡易版です。しかし、この時点で、私はこの単純なバージョンを実行して動作させようとしています。長いコードのお手伝いと謝罪のすべてに感謝しますが、皆さんに私が何をしているのかを正確に伝えたいと思います。ありがとう!

答えて

0

SelectActivateを使用して停止し、Selectionを使用するコードを書き留めます。これはマクロレコーダー用です。あなたはマクロレコーダーではありません、あなたはそれよりはるかに良いコードを書くことができます。

これは、あなたがのIntelliSense、ノー自動補完、ないツールチップから任意の助けを借りずにやみくもにコードを入力している意味し、あまりにも多くのことをやってObjectをオフ作業遅延バインディングの呼び出しであなたを閉じ込めている:

wb.Worksheets(1).Range("A5:H28").Select 

ここにRangeオブジェクトが必要です。今

Dim source As Range 
Set source = wb.Worksheets(1).Range("A5:H28") 

、あなたがsource.を入力し、のIntelliSenseはあなたを助けることができます。試してみてください:

source.Copy[space] 

右の宛先を指定できることを示すツールチップが表示されます。

だから、別の範囲行います

Dim destination As Range 
Set destination = wb1.Worksheets(1).Range("A5") 

を離れコピー!

source.Copy destination 

さて、あなたはおそらく...そのループの終了前に

+0

オーケー感謝をwb.Closeを呼び出す必要があります。私はそれが動作するようになっていると思うが、明日再びそれに取り組むことを計画しているので、確実にスレッドを開いたままにしておきたい。また、どのようにループ上にコピー&ペーストするが、既存のデータに上書き/貼り付けをしないようにするにはどうすればいいですか?基本的にすべてのデータは1つのテーブルに格納され、1つはテーブルに格納されます。 msofolderpickerで開いているワークブックの中には90個のエントリがあり、50個しかないものもあります。正確な番号を持つことはできませんので、その意味で動的にする必要があります。 –

関連する問題