2016-05-05 7 views
0

私は1つのファイルを選択して「ペン」タブをインポートすることができますが、複数のファイルを選択したいと思う次のコードがあります。VBA複数のシートをワークブックにインポート

複数のブックから、統合ブックのタブごとに「ペン」タブを選択したいと考えています。

これがどのように機能するか教えてください。私はこれがFor Each関数の使用を必要とするかもしれないと思うが、これをどのように構造化するかは不明である。非常に事前に

おかげ

Sub ImportActiveList() 
    Dim FileName As String 
    Dim WS1 As Worksheet 
    Dim WS2 As Worksheet 
    Dim ActiveListWB As Workbook 

    Set WS2 = ActiveWorkbook.Sheets("AllPens") 
    FileName = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*),*.xls*", _ 
              Title:="Select Active List to Import", _ 
              MultiSelect:=False) 

    If FileName = "False" Then 
     Exit Sub 
    Else 
     Set ActiveListWB = Workbooks.Open(FileName) 
    End If 

    Set WS1 = ActiveListWB.Sheets("Pens") 

    WS1.UsedRange.Copy WS2.Range("A1") 

    ActiveWorkbook.Close False 

End Sub 

答えて

0

。構文と使用例については、ドキュメントを参照してください。

GetOpenFilename()MultiSelectパラメータを変更すると、同じディレクトリから複数のファイルを選択できます。戻り値は、これらすべてのファイルを含むコレクションです。

Public Sub ImportActiveList() 
    Dim FileNames As Variant 
    Dim FileName As Variant 
    Dim WSNew As Worksheet 
    Dim ActiveListWB As Workbook 

    ' ask the user for the files to copy the data from 
    FileNames = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls*),*.xls*", _ 
               Title:="Select Active List to Import", _ 
               MultiSelect:=True) 
    If VarType(FileNames) = vbBoolean Then 
     If Not FileNames Then Exit Sub 
    End If 

    ' loop over all files selected by the user and import the desired sheets 
    For Each FileName In FileNames 
     ' create new worksheet to copy the data to 
     ' here you could add a name for the sheet or make sure it is at the right position 
     Set WSNew = ActiveWorkbook.Sheets.Add 

     ' copy the data 
     Set ActiveListWB = Workbooks.Open(FileName) 
     ActiveListWB.Sheets("Pens").UsedRange.Copy WSNew.Range("A1") 
     ActiveListWB.Close False 
    Next FileName 
End Sub 

次のようにも注意する必要があります:あなたは、このようにそれを繰り返すことができ、他の言語がFalseのための他のリテラルを持っているので

  • FileName = "False"は英語のみExcelのインストールで動作します。また、 "False"という名前のファイルを開くこともできません。なぜならファイルのダイアログとファイルの戻り値を区別することができないからです(しかし、ほとんどの場合問題ありません) 。
    タイプStringの変数に、タイプVariantの戻り値を保存します。それをVariantに変更した場合は、内容がサブタイプBooleanであるかどうかをテストし、ブール値がFalseであるかどうかをテストできます。これにより、上記のすべての問題が回避されます。
  • ActiveWorkbook.Closeは、現在のブックを閉じます。これは、データをコピーするために開かれたばかりのブックです。しかし、コードを停止し、統合ワークブックに切り替えてコードを続けると仮定します。アクティブなワークブックは今やこのワークブックであり、保存を促さずに閉じられます。
    あなたが今開いているワークブックを閉じると、ActiveWorkbookActiveListWBに置き換えられます。
+0

こんにちは、ありがとう、私は 'VarType(FileName)= vbBooleanで、FileNameではない場合はデバッグエラーを取得している' – Vince

+0

大変感謝です。私が変更したいのは、ユーザーがデータファイルを選択して一度に複数のファイルを選択できるようにすることです。これが可能なのは、特にそれらがたくさんある場合は、時間を大幅に節約できるからです。 – Vince

+0

再度更新されました。ユーザーが複数のディレクトリからファイルを選択する必要がある場合は、ディレクトリごとにファイルを開くダイアログを表示する必要があります。このために、前のコードを編集する前に使用することができます(答えの下にある「*編集済み*」リンクをクリックしてください)。 – Leviathan

0

私は役に立つかもしれませんマクロを持っています。あなたの欲望にそれを変換:あなたがコレクションしたり、反復するオブジェクトまたは値の配列を持っている場合は、For Eachループを必要とする

Sub agrupar() 

Application.EnableCancelKey = xlDisabled 
Application.ScreenUpdating = False 

ruta = Application.ActiveWorkbook.Path 
miarchivo = ThisWorkbook.Name 
nombrepestaña = ActiveSheet.Name 

ChDrive ruta 
ChDir ruta 

archi = Dir("*.xl*") 

Do While archi <> "" 

If archi <> miarchivo Then 
Workbooks.Open archi, UpdateLinks:=0, ReadOnly:=True 
For Each Sheet In ActiveWorkbook.Sheets 
Sheet.Copy after:=ThisWorkbook.ActiveSheet 
Next Sheet 
Workbooks(archi).Close False 
End If 

archi = Dir() 
Loop 

Sheets(nombrepestaña).Select 

Application.ScreenUpdating = True 

End Sub 
関連する問題