2017-09-07 11 views
0

私は2つのワークブックを持っています。ソースブックと宛先ブック。シート名に言及せずに別のブックからデータを抽出する

宛先ブックのヘッダーに応じて、ソースブックからすべてのデータを抽出したいと考えています。

このため、私は以下のコードを持っています。可能であれば、シート名に言及せずにワークブック名​​を言いたいのですが、私は知りたいのですか?新しいExcelファイルを保存するたびに、シートはsheet1、sheet2として保存されます。このシート名の変更により添え字エラーが発生します。

いずれにせよ、シート名に言及せずにシートからデータを抽出する方法はありますか。ほとんどの場合、私のワークブックには1枚しかありません。

Sub Extract() 
Dim DestinationWB As Workbook 
    Dim OriginWB As Workbook 
    Dim path1 As String 
    Dim FileWithPath As String 
    Dim Lastrow As Long, i As Long, LastCol As Long 
    Dim TheHeader As String 
    Dim cell As Range 
    Set DestinationWB = ThisWorkbook 

    ' get the path of this workbook 
    path1 = DestinationWB.Path 
    FileWithPath = path1 & "\Downloads\Sourcg.xlsx" 
    Set OriginWB = Workbooks.Open(filename:=FileWithPath) 

    'get the count of last row and column 
    Lastrow = OriginWB.Worksheets("1").Cells(Rows.count, 1).End(xlUp).Row 
    LastCol = OriginWB.Worksheets("1").Cells(1, Columns.count).End(xlToLeft).Column 

    For i = 1 To LastCol 
     'get the name of the field (names are in row 1) 
     TheHeader = OriginWB.Worksheets("1").Cells(1, i).Value 

     With DestinationWB.Worksheets("S").Range("A4:L4") 
      'Find the name of the field (TheHeader) in the destination (in row 4) 
      Set cell = .Find(TheHeader, LookIn:=xlValues) 
     End With 

     If Not cell Is Nothing Then 
      OriginWB.Worksheets("1").Range(Cells(2, i), Cells(Lastrow, i)).Copy Destination:=DestinationWB.Worksheets("S_APQP").Cells(5, cell.Column) 
     Else 
      'handle the error 
     End If 
    Next i 

    OriginWB.Close SaveChanges:=False 
End Sub 
+1

最初のワークシートは、インデックス '.Worksheets(1)'で参照できます。 – omegastripes

答えて

1

Mikz、あなたはWorkbookのプロパティWorksheetsを使用しています。このプロパティには、(ワークシートの)通常のVBA Excelコレクションが含まれています。 ポジション(整数)またはキー(文字列)によって、任意のコレクションのメンバーにアクセスできます。文字列値を使用するので、キーをコードに使用します。ブック内に唯一のワークシートがある場合は、1 - OriginWB.Worksheets(1).の位置値を使用してください。シートの名前に関係なく機能します。

あなたは1つの以上のワークシートを持っている場合は、あなたがところで
FOR EACH aWorksheet IN OriginWB.Worksheets

を使用してコレクションを横断することができます - 私はそれがより短く、より読みやすいコードを作成するのに役立ちます私見OriginWB.Worksheets("1")のために演算子で使用することをお勧めいたしますでしょう。ネストされたWITH演算子を使用できます。

+0

1-originWB.worksheets(1)を使用することを意味しますか? – Mikz

+0

はい、1は引用符なしです。つまり、originWB.worksheets( "1")ではなくoriginWB.worksheets(1)を使用する必要があります。 –

+0

私はこれを試しました、オブジェクトがこのプロパティのエラーをサポートしていないのを取得しています – Mikz

関連する問題