2016-05-19 7 views
0

コンピュータの特定のフォルダにあるファイルからワークシートをコピーしようとしています。メインのワークブック(Workbook1)を持って、特定のフォルダ(C:\ Location)からすべてのxlsまたはxlsmファイルの1番目のシートを取るボタンを押したいと思います。現在私が持っているものは以下の通りです。特定のフォルダ内のファイルからワークシートをコピーする

Sub read_a_folder() 

Dim MainWB As String 

strPath = "C:\Location\" 
MainWB = ActiveWorkbook.Name 

Set objFso = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFso.GetFolder(strPath) 

For Each objFile In objFolder.Files 

If objFso.GetExtensionName(objFile.Path) = "xls" Or objFso.GetExtensionName(objFile.Path) = "xlsm" Then 



End If 
Next 

End Sub 

私のメインブックにそのままコピーする方法がありません。私はActiveSheet.QueryTables.Addを使用しようとしましたが、コピーされたシートの特別なフォーマットでは判読できません。 Ctrl + Shift + EndとCtrl + Cは手動で行うと機能します。

助けが必要です。

ありがとうございます。

答えて

1

ちょうどDaveのコードをフォローアップするために、いくつかの機能強化(と一つの小さな改訂)で

Option Explicit 

Sub read_a_folder() 

    Dim objFso As FileSystemObject 
    Dim objFolder As Folder 
    Dim objFile As File 

    Dim MainWB As Workbook 
    Dim strPath As String 

    strPath = "C:\Location\" 

    Set MainWB = ActiveWorkbook '<~~ Workbook is an object -> you must "Set" it 

    Set objFso = CreateObject("Scripting.FileSystemObject") 
    Set objFolder = objFso.GetFolder(strPath) 

    Application.ScreenUpdating = False '<~~ this will reduce the flickering and speed it all up 
    For Each objFile In objFolder.Files 
     If objFso.GetExtensionName(objFile.Path) Like "xls*" Then '<~~ use "Like" operator to check for all "xls..." extensions in a single check 
      With Workbooks.Open(objFile.Path, False, True) '<~~ no need to set an object, just instantiate it and work with it! Furthermore let's use some of the "Open" method parameters to avoid prompts popping out 
       .Worksheets(1).Copy After:=MainWB.Sheets(MainWB.Sheets.Count) 'copies after last worksheet 
       .Close False 
      End With 
     End If 
    Next 
    Application.ScreenUpdating = True '<~~ turn screen updating on 
End Sub 
+0

ありがとう@ user3598756 @Daveにも感謝します)。これは私が望むように機能します。非常に有用なコメントもあります:) –

+0

あなたは大歓迎です。しかし、私は@Daveのソリューションを構築しただけです。私はそれを編集したいと思っていませんでしたが、コメントは混乱していました。私は物事を明確にする答えを書き終えました。しかし、Davesは信用できるものです – user3598756

+0

@Daveもう一度私を助けてもらえますか?このプログラムの後半では、このフォルダの読み込みテクニックでどのワークシートが追加されたのかを検出できる必要があります。これらのワークシートを隠しとして追加することは可能ですか?それは私のために役立つだろう。 (私はサイトに新しいので私はここにコメントするか、新しい質問を投稿するか分からなかった)。 –

0

以下が役立つことがあります。(! - 彼に>クレジット)

Sub read_a_folder() 

Dim MainWB As Workbook 
Dim objSheet As Worksheet 

strPath = "C:\Location\" 
MainWB = ActiveWorkbook.Name 

Set objFso = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFso.GetFolder(strPath) 

For Each objFile In objFolder.Files 
    If objFso.GetExtensionName(objFile.Path) = "xls" Or objFso.GetExtensionName(objFile.Path) = "xlsm" Then 
     Set objWb = Workbooks.Open objFile.Path 
     Set objSheet = objWb.Worksheets(1) ' sets first sheet 
     objSheet.Copy After:=MainWB.Sheets(MainWB.Sheets.Count) 'copies after last worksheet 
     objWb.Close 
     Set objSheet = Nothing 
     Set objWb = Nothing 
    End If 
Next 

End Sub 
+1

罰金コード。ちょうどいくつかのアドバイス:A) 'MainWB = ActiveWorkbook.Name'が間違っている間に、' Dim MainWB As Workbook'がオブジェクト変数を宣言します(A1) 'Set'キーワードを使用していません。 'Workbook''' Name'プロパティを使うと、 'Set'キーワードがうまくいけばうまくいかないでしょう。 B)ファイル拡張子のチェックで "xlsx"ファイルが欠落する... C) 'Workbooks'オブジェクトの普通の' Open'メソッドを使用すると、 "xlsm"ファイルに何らかのプロンプトが表示される可能性がある – user3598756

+0

@ user3598756もちろん、私はスポットA)とA2を最初にしましたが、最初にコードを修正しませんでした.BIのために、OPは他のファイルタイプについて言及していないので、OPが投稿したファイルタイプと一緒に行きました – Dave

関連する問題