• ベストアンサー

エクセルVBA複数ファイルのデータを1つのシートに

(1)サーバー上にある圧縮ファイルをダウンロード (URLはエクセルの一覧表をクリック)※図A (2)ダウンロードした圧縮ファイル(ZIP形式)を解凍する (3)エクセルファイルを開いて範囲を指定してコピー (コピーする範囲はB2:C101の100行2列のデータ)※図B (4)コピーしたデータを別ファイルのエクセルシートにペースト (シートは1枚、下に下に続けてペースト) 表にあるURL一覧の最後まで(1)~(4)を繰り返す (パソコン環境) Windows10 Google Chrome Excel2010

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

ならば、    With ThisWorkbook.Sheets(2)     Set TRange = Range(.Cells((RowCnt - 1) * CpyCnt + 2, 2), _       .Cells((RowCnt) * CpyCnt + 1, 3))    End With    Set FRange = Range(tgSheet.Cells(1, 2), tgSheet.Cells(CpyCnt, 3))    TRange.Value = FRange.Value を    With ThisWorkbook.Sheets(2)     If RowCnt = 1 Then      Set TRange = Range(.Cells(1, 1), _       .Cells(CpyCnt + 1, 3))      Set FRange = Range(tgSheet.Cells(1, 1), tgSheet.Cells(CpyCnt + 1, 3))     Else      Set TRange = Range(.Cells((RowCnt - 1) * CpyCnt + 2, 2), _       .Cells((RowCnt) * CpyCnt + 1, 3))      Set FRange = Range(tgSheet.Cells(2, 2), tgSheet.Cells(CpyCnt + 1, 3))     End If    End With    TRange.Value = FRange.Value に 直せば期待の結果になると思います。

value100100
質問者

お礼

ありがとうございます。 完璧です。 期待通りのことができるようになりました。 いろいろとお手数お掛けいたしました。

その他の回答 (3)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

http://xxx.com/23156.zip これをダウンロードして解凍したときの エクセルのレイアウトは 1行目がタイトル、 2行目以下がデータの羅列 ですか? 複写先のレイアウトは 1行目がタイトル、 2行目以下が全数データの羅列 になることを期待していますか? ならば、 複写元1つめのファイルの1つ目のシートは 複写元の1行目から101行を 複写先の1行目以下に複写 複写元2つめのファイルの1つ目のシートは 複写元の2行目から100行を 複写先の102行以下に複写 複写元3つめのファイルの1つ目のシートは 複写元の2行目から100行を 複写先の202行以下に複写 といった複写を期待していますか?

value100100
質問者

お礼

何度も申し訳ございません。 説明不足を補完していただきありがとうございます。 その通りでございます。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

ごめんなさい、コードを間違えています。    With ThisWorkbook.Sheets(2)     Set TRange = Range(.Cells((RowCnt - 1) * CpyCnt + 1, 2), _       .Cells((RowCnt) * CpyCnt + 1, 3))    End With    Set FRange = Range(tgSheet.Cells(1, 2), tgSheet.Cells(CpyCnt + 1, 3))    TRange.Value = FRange.Value は誤りで、以下が訂正後です。    With ThisWorkbook.Sheets(2)     Set TRange = Range(.Cells((RowCnt - 1) * CpyCnt + 2, 2), _       .Cells((RowCnt) * CpyCnt + 1, 3))    End With    Set FRange = Range(tgSheet.Cells(1, 2), tgSheet.Cells(CpyCnt, 3))    TRange.Value = FRange.Value で、 Const CpyCnt = 101 '複写行数100?と変更しました。 これは Const CpyCnt = 100 '複写行数 としてください。

value100100
質問者

お礼

お手数お掛けしております。 2回目のご回答ありがとうございます。 早速、ご指示の点、修正させていただきました。 「Const CpyCnt = 100」にしています。 番号はA列の数値です。 番号1の行(セルB2C2)が空白になり、 番号2の行(セルB3C3)からデータが始まっています。 データを見るとコピーはできているようです。 ペーストする際に1番目のデータがB2C2ではなく、B3C3からはじまっているようです。 データの終わりの箇所は、 番号100 99行目のデータ 番号101 空白 番号102 次の100個のデータの1番目のデータ 100行目のデータが抜けた状態になっております。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

適当なダウンロードサイトがなかったので、 ほぼ机上デバックのみしか行っていません。 また、当方の環境はOffice2019です。 使っているブラウザには依存しないはずです。 http://xxx.com/23156.zip これをダウンロードして解凍したときに フォルダー構成だったり、複数ファイルだったりするのではなく 単に、23156.xlsx が作成される前提です。 WshShellの参照設定してください。 つまり、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。 Option Explicit Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _   (ByVal pCaller As Long, _   ByVal szURL As String, _   ByVal szFileName As String, _   ByVal dwReserved As Long, _   ByVal lpfnCB As Long) As Long Sub sample()    Const PutDir = "C:\work" 'ダウンロード先フォルダー  Const CpyCnt = 7   '複写行数 100?    Dim FNameSNum As Long  Dim FNameL As String  Dim FNameS As String  Dim LenFName As Long  Dim tgUrl As String  Dim tgBook As Workbook  Dim tgSheet As Worksheet  Dim RowCnt As Long  Dim FRange As Range  Dim TRange As Range  Dim i As Long  Dim FSO As Object  Set FSO = CreateObject("Scripting.FileSystemObject")    ThisWorkbook.Sheets(2).Cells.ClearContents    With ThisWorkbook.Sheets(1)      RowCnt = 1      Do        If .Cells(RowCnt, 1).Value = "" Then Exit Do        'Urlからファイル名算出    tgUrl = .Cells(RowCnt, 1).Value    LenFName = Len(tgUrl)    FNameSNum = InStrRev(tgUrl, "/")    FNameL = Mid(tgUrl, FNameSNum + 1, LenFName)    FNameS = FSO.GetBaseName(FNameL)        'ダウンロード    Download_File tgUrl, PutDir & "\" & FNameL        '解凍    UnZip PutDir & "\" & FNameL, PutDir        'ファイルを開き、データを取得し、自身シート2枚目に追記    Set tgBook = Workbooks.Open(PutDir & "\" & FNameS & ".xlsx")    Set tgSheet = tgBook.Sheets(1)        With ThisWorkbook.Sheets(2)     Set TRange = Range(.Cells((RowCnt - 1) * CpyCnt + 1, 2), _       .Cells((RowCnt) * CpyCnt + 1, 3))    End With    Set FRange = Range(tgSheet.Cells(1, 2), tgSheet.Cells(CpyCnt + 1, 3))    TRange.Value = FRange.Value        tgBook.Close        RowCnt = RowCnt + 1      Loop    End With    With ThisWorkbook.Sheets(2)   .Cells(1, 1).Value = "番号"   .Cells(1, 2).Value = "品名"   .Cells(1, 3).Value = "色"   For i = 2 To (RowCnt - 1) * CpyCnt + 1    .Cells(i, 1).Value = i - 1   Next i  End With End Sub '//----------------------ダウンロードサブルーチン Sub Download_File(strURL As String, strPath As String)    Dim lngRes As Long     lngRes = URLDownloadToFile(0, strURL, strPath, 0, 0)  If lngRes <> 0 Then   MsgBox "ダウンロード失敗"   Exit Sub  End If End Sub '//----------------------解凍関数 Function UnZip(a_sZipPath As String, a_sExpandPath As String) As Boolean  Dim sh   As New IWshRuntimeLibrary.WshShell  Dim ex   As WshExec  Dim sCmd  As String     '// 半角スペースをバッククォートでエスケープ  a_sZipPath = Replace(a_sZipPath, " ", "` ")  a_sExpandPath = Replace(a_sExpandPath, " ", "` ")     '// Expand-Archive:解凍コマンド  '// -Path:フォルダパスまたはファイルパスを指定する。  '// -DestinationPath:生成ファイルパスを指定する。  '// -Force:生成ファイルが既に存在している場合は上書きする  sCmd = "Expand-Archive -Path " & a_sZipPath & " -DestinationPath " & a_sExpandPath & " -Force"     '// コマンド実行  Set ex = sh.Exec("powershell -NoLogo -ExecutionPolicy RemoteSigned -Command " & sCmd)     '// コマンド失敗時  If ex.Status = WshFailed Then   '// 戻り値に異常を返す   UnZip = False   '// 処理を抜ける   Exit Function  End If     '// コマンド実行中は待ち  Do While ex.Status = WshRunning   DoEvents  Loop     '// 戻り値に正常を返す  UnZip = True End Function

value100100
質問者

お礼

早々にありがとうございます。 100行ずつコピーしたいので、 Const CpyCnt = 101 '複写行数100?と変更しました。 これで試してみました。 Sheet2を見てみると100行ずつペーストされているのですが、 ペーストするごとに(100行ごとに)1行のスペースが空いています。 このスペースを空けることなく、続けてペーストできるようにしたいと思っています。 どうにか自分でやろうとしたのですが、挫折しています。 どうかご教授いただければと思います。

value100100
質問者

補足

ご回答ありがとうございます。 1つ目の100個のデータと2つ目の100個のデータの間は、 行を空けることなく詰めてペーストしたいと考えています。 「Const CpyCnt = 100 にした場合」 ・ペーストされているデータは99行(1行足りない) ・次のデータとの間に1行スペースがある 「Const CpyCnt = 101 にした場合」 ・ペーストされているデータは100行(OK!) ・次のデータとの間に1行スペースがある

関連するQ&A

  • 複数のエクセルファイルのデータを新規のファイルで一覧表にまとめるには?

    1つのホルダーの中に1000のエクセルファイルがあり、これらのファイルには、複数のシートがあります。これら1000のファイルから指定するシート(シートの様式とシート名は同じ)のデータ(C5:C17)を一覧表にまとめたいのです。 1000のエクセルファイル名は、○_■(○:個別、■:共通)で、一覧表は新たなエクセルファイルを作成し、1行目は左(A1)から順に、○(ファイル名の個別の部分)、C5のデータ、C6のデータ..C17のデータを  2行目には次のエクセルファイルの○(ファイル名の個別の部分)、C5のデータ、C6のデータ..C17のデータを ・・ と1000ファイルのデータをコピー&ペーストしたく、マクロ作りに挑戦したのですが、うまくいきません。どなたか助けてください。よろしくお願いいたします。

  • エクセルのシート

    エクセルのシート エクセルで作った表をコピーして、同じファイル内で、 シートを新しくしてペーストしたいのですが、 セルの幅と高さの情報は反映されません。 そっくり同じものをコピー&ペーストするには、 どういう手順を踏めばよろしいのでしょうか? こちらの環境は、Mac10.5.8、EXCEL Mac2008です。 よろしくお願いいたします。

    • ベストアンサー
    • Mac
  • 複数のエクセルファイルからデータを抽出してリスト化

    あるフォルダ内(C¥sample)内に複数のエクセルファイルがあり(ファイル名はばらばら)、そのファイル全てに「報告書1」というシートが存在します。その「報告書1」というシート内のデータをまとめた一覧表を新規エクセルファイルに作成したいと思っています。 1つ目のファイルの報告書1シートのA2~F5のデータを一覧表エクセルA2~F5まで貼付け、2つ目のファイルの報告書1シートのA2~F5のデータを一覧表エクセルA6~F9まで貼付けという具合にまとめていきたいです。マクロで簡単にひとまとめにするいい方法はありませんでしょうか。ご教授お願いいたします。 例)報告書1シート A B     C      D     E    F 1 受付  支店    受注先    品物   数量  金額 2 0001 北海道   ●●      リンゴ    1   100 3 0002   北海道   ●●      リンゴ    2 200 4 0003   東北    ▲▲      みかん   1 150 5 0004   東北    ▲▲      みかん   2 300

  • フォルダ内の複数ファイルを1つのシートしたい

    フォルダに入っている同じFMTファイルから同じシート名のファイルの9行目からデータが入力されてる行までをコピーして別ファイルの指定シートにペーストしたいです。 50シートくらいありデータを下につなげていきたいのですが、どうしたらよいでしょうか? よろしくお願い致します。

  • 1シート内にまとめられているデータを分割してコピーし、それを別の複数の

    1シート内にまとめられているデータを分割してコピーし、それを別の複数のシートにペーストする方法があれば、教えて下さい。 例えば、学校の成績を、教科ごとに表示するシートから、生徒ごとに表示するシートへとデータをコピーする、なんていう場合を想定して下さい。 <教科のシート> シート1:国語のテストの点数表(生徒1~3の点数の一覧) シート2:数学のテストの点数表(生徒1~3の点数の一覧) シート3:英語のテストの点数表(生徒1~3の点数の一覧) <生徒のシート> シート101:生徒1の英数国の点数 シート102:生徒2の英数国の点数 シート103:生徒3の英数国の点数 という場合、 シート1から、生徒1の国語の点数をコピーし、シート101へペースト。 シート1から、生徒2の国語の点数をコピーし、シート102へペースト。 シート1から、生徒3の国語の点数をコピーし、シート103へペースト。 シート2から、生徒1の数学のテンスをコピーし、シート101へペースト。 シート2から、生徒2の数学の点数をコピーし、シート102へペースト。 シート2から、生徒3の数学の点数をコピーし、シート103へペースト。 シート3から、生徒1の英語の点数をコピーし、シート101へペースト。 シート3から、生徒2の英語の点数をコピーし、シート102へペースト。 シート3から、生徒3の英語の点数をコピーし、シート103へペースト。 という具合に、コピー・ペーストを『自動化』して、行いたいのですが、 このようなことは可能でしょうか? (実際のデータは、教科数も生徒数も、もっと沢山あります。) 方法としては、マクロ(VBA)を利用したものでも結構です。 どなたかお詳しい方、お力をお貸し下さい。 必ずお返事致します。(ポイント付与も確実に行います。)

  • エクセルの1シートの内容を複数のシートに分割したい。

    前任者から引き継いだエクセルのファイルを見やすくしたいと思っています。 1ページにつき1つの表が作られているのですが、一枚のシートのページ数が膨大で、とても見にくいのです。ページ毎に(一つの表毎に)違うシートにしたいのですが、地道にコピー&ペーストをしなければならないでしょうか。 一発でバチッとページ毎にシートにできる方法はありますか? windowsXP, Excel 2002を使用しています。

  • エクセルで複数ファイルのシートから一つのシートへ結合したい

    エクセル上で、 Aフォルダ内にファイルBook1~数十個があり、Book1にはシート名「sh1」、Book2にはシート名「st2」のみがぞれぞれあります。シート内のデータ数はバラバラで何行のデータがあるか不明ですが、列数は同一です。 このファイルすべてを開かずに、今開いている、「加工.xls」のsheet1にまとめたいと思っています。(sh1の下にsh2、その下にsh3・・・を繰り返して、「加工.xls」のsheet1に貼り付ける。行間は空けず一覧表にする。フォルダ内のファイルが無くなったら終了する。)こんな感じのをマクロでやりたいと思っています。 ファイルを開かないで行う方法は、何とか過去の質問を調べてApplication.ExecuteExcel4Macroを使ってやろうとしていますが、応用が利きませんでした。開いていないファイルの最終行をどう取得選択してsheet1に持ってくればよいか分からず悩んでいます。 よろしくお願いいたします。

  • エクセルで複数シートからデータを統合したグラフを作る

    エクセル2000を使用しています。 複数のシートの表からデータを統合したグラフを作りたいのです。 たとえば シート1:A 12 B 5 C 7 シート2:A 10 B 5 C 4 というデータから シート3で2つの表を統合したグラフ(たとえば積層グラフ:A  12と10  B・・・)をつくりたい。 但し、表は1つには統合しません。 また、データはそれぞれで、合計ではありません。 データの範囲の指定の仕方がわかりません。(たぶんここでは?) 

  • ワード差込ファイルで複数エクセルシートのデータを差込みたいのですが?

     ワードで表を作って、エクセルの複数シート(シートA、シートB)のデータをその表に差込みたいのですが、シートAのデータは差込めるのですが、シートBを差込もうとすると差込んでいたシートAのデータが消されてしまいます。エクセルのシートを一つにできれば良いのですが、列数が多くて1つのシートにできないもので。  エクセルで表を作って同じことをやったのですがシートA、シートBのデータは取り込めてうまくいくのですが、印刷する際に表の中で文字数が一つのセルに収まらないような時に(文字を縮小して表示や折り返して表示や自動調整を使ったりしたのですがいまいちでして)ワードだと文字数に合わせて表が広がるので、ワードでどうにかしてできないものかと思い悩んでおります。誰かお助け下さい!

  • エクセルで複数のシートにあるものをひとつに

    お世話になっております。 似たような質問を検索してみましたが、いまいち要領がつかめませんので教えて下さい。 ブックに複数のシートがあり、それをを同じブックまたは、別のブックでもいいので一つのシートにまとめたいのですが何かいい方法はありますでしょうか? ブックにより、シート枚数が違います(多いものは30シート以上)。 同じブックでの各シートの列のタイトルは同じで、行はデータ量により違います。(多いものは1000行以上) イメージとしては、シートを全コピーして、新しいシートにペースト。 次のシートを全コピーしてそれを、今ペーストした下の行にペースト。 現在はこのコピー&ペーストで地道に作業しております。 かなり時間を取られております。 XPでオフィスは2007を使用しております。

専門家に質問してみよう