私は毎月 100 以上の Excel スプレッドシートを受け取り、そこから一定の範囲を取り、他のスプレッドシートに貼り付けてレポートを作成しています。
VBA スクリプトを作成して、Excel ファイルを反復処理し、範囲を 1 つのスプレッドシートにコピーしようとしていますが、実行できませんでした。
これを行う簡単な方法はありますか?
これは、ディレクトリ内の多数のExcelファイルを反復処理してそれぞれを開くことを示すVBAコードです。
Dim sourcePath As String
Dim curFile As String
Dim curWB As Excel.Workbook
Dim destWB As Excel.Workbook
Set destWB = ActiveWorkbook
sourcePath = "C:\files"
curFile = Dir(sourcePath & "\*.xls")
While curFile <> ""
Set curWB = Workbooks.Open(sourcePath & "\" & curFile)
curWB.Close
curFile = Dir()
Wend
うまくいけば、それが既存のマクロコードを操作するための十分な出発点になるでしょう。
もう 1 つの解決策は、ロールアップ スプレッドシートがファイル名で他のスプレッドシートにアクセスし、データ自体を取得することです。
これを行うには、すべてのスプレッドシートを同時に開いてリンクを更新できるようにする必要がありますが、マクロを使用しても、一度に 1 つずつ開いてコピー/貼り付けするよりもおそらく高速です。すべてのスプレッドシートには、一意のファイル名が必要です。
受け取るまでスプレッドシートの名前がわからない場合、または定期的に変更される場合は、ロールアップ テーブルに列を作成してシートのファイル名を保存し、文字列操作を使用して必要なアドレスを作成し、データを取得します。 INDIRECT() を使用します。
1 つの特定のファイルから 1 つのセルのデータを取得する例:
=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2")
取得する各スプレッドシートのセルごとに、上記をすすぎ、繰り返します。
INDIRECT() に渡す文字列を取得する方法については、賢くする必要があります。数式として作成して、取得する必要があるすべてのセルに文字通り同じ数式を使用できるようにします。
例:
= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL()))
上記の数式は、ファイル名が $A2 にあるスプレッドシートに移動し ("2" の前に $ がないことに注意してください。同じ数式を他のファイルの他の行に貼り付けることができます)、MyWorksheet シートのセルの値を取得します。行 3 と現在の列 (したがって、これがロールアップの B2 にある場合、他のファイルから B3 を取得します)。
ADDRESS 関数を調整して、必要な行と列にオフセットを追加します。
上記のソリューションの利点は、入力する必要がある行と列に同じ数式をコピーして貼り付けることができ、Excel が必要に応じて $A2 と COL() を調整することです。非常に保守的です。
同様の状況があり、一度にすべてのスプレッドシートをロードできませんでした (200 以上) 。VBA を作成してしまったので、実際には Excel ファイルを開いて読み取らなかったと思います。代わりに、ファイル名をループし、それぞれに ODBC 接続を開き、ADO を使用して、指定された名前付き範囲 (ODBC では「テーブル」として表示されます。ワークシートも「テーブル」として表示されます) から必要な値を読み取ります。 " ただし、許可される名前には規則があります)。これは、Excel ファイルを開いたり閉じたりするよりもはるかに高速であり、Excel がクラッシュしないという利点もありました。
試しましたか
Tools->Macro->Record New Macro
同じことをするマクロを作成する
ロドリゴ
100 以上のワークブックを個別に開いて、コピーして 1 つに貼り付ける必要があると思いますか? 楽しいように聞こえる :)
それらすべてを単一のディレクトリに入れることができれば、各ファイルを開くのはかなり簡単です。最初にそれを検索してください。(@Mark Biek が良い例を投稿しています)
ファイルを開いたら、データを ADO レコードセットにコピーし、それを追加します。複数のシートを 1 つのワークブックにマージするのと非常によく似たことを行うためのコードをいくつか投稿しました。
それはまさにあなたが必要とするものではありませんが、役立つはずです。そうでない場合は、どこまで到達したかを投稿してください。今週中にもう一度見てみます.
以前は、VBAを使用して外部参照(リンク)を作成していました。
私はそれについてここに投稿しました(例2を参照):
INDIRECTを使用するのと似ていますが、Excelワークブックを開く必要はありません。
唯一の欠点は、古いコンピューターまたは古いバージョンのExcelが、どちらがこのプロセスを遅くする可能性があるかわからないことです。新しい外部参照が追加されるたびに、他のすべての外部参照が更新されるためだと思います。高速化するために、[計算]を[手動]に設定し、外部参照を追加し、[計算]を[自動]に設定して更新しました。
その後、値だけが必要な場合は、リンクの解除を使用するか、特別な値をコピーして貼り付けることができます。
これは、AccessでTransferSpreadsheetを使用することで実現できます。このリンクを参照してください:
このソリューションはVBAを必要としません。