• 締切済み

ファイルを開き、シートをコピーするマクロについての質問です。

VBA初心者の者です。解決法が分からないのでよろしくお願いします。 以下のことがマクロを用いて行いたいと思ってます。 (1)まず、シート1からnまであるデータの入ったファイル【以下、ファイル1】を指定して開き、それを別のシート1からnまであるファイル【以下、ファイル2】を指定して開きます。 (2)ファイル1の各々のシートからファイル2のおのおののシートにデータをコピーしたいと思っています。ただし、コピーするのは、ファイル1のシート1からファイル2のシート1、ファイル1のシート2からファイル2のシート2に、・・・、ファイル1のシートnからファイル2のシートnまでループさせたいです。 一応、自分で以下のようにマクロを組んでみましたが、上手く動きません。どこが違うのかをご指摘いただきたいです。 よろしくお願いします。 Public sh As Integer Public sht_n As Integer Public Lst As Integer Sub Macro1() Dim file1 As String file1 = Application.GetOpenFilename(Title:="ファイルを選択して下さい") If file1 = "" Or file1 = "false" Then MsgBox "ファイルOPEN不可", vbCritical End Else Workbooks.Open Filename:=FN1 End If Dim file2 As String file2 = Application.GetOpenFilename(Title:="ファイルを選択して下さい") If file2 = "" Or file2 = "false" Then MsgBox "ファイルOPEN不可", vbCritical End Else Workbooks.Open Filename:=FN2 End If sht_n = ActiveWorkbook.Sheets.Count Lst = sht_n + 1 For sh = 1 To sht_n Call CpSh(sh) Next sh End Sub Sub CpSh(s) Dim st As String st = Sheets(s).Name Sheets(st).Select Workbook("FA1").Activate Sheets("st").Select Cells.Select Selection.Copy Workbook("FA2").Activate Sheets("st").Select Range("A1").Select ActiveSheet.Paste End Sub

みんなの回答

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.7

はい、どうぞ Sub Macro1() Dim file(1) As String Dim sh As Integer For sh = 0 To 1 file(sh) = Application.GetOpenFilename(Title:="ファイルを選択して下さい") Workbooks.Open Filename:=file(sh) Next sh For sh = 1 To Workbooks(file(0)).Sheets.Count Workbook(file(0)).Sheets(sh).Cells.Copy Workbook(file(1)).ActiveSheet.Paste Destination:=Sheets(sh).Range("a1") Next sh End Sub どう説明していいのか分からないので、解説はなし 思うような動作をしなければ捨ててください 以上

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.6

>この部分を修正すれば良いのですか? 「文字列」と「変数名」の使い方の基本です。 "st": st と言う文字列 st : st という名前の変数に格納された値 Sheets("st").Select なら st と言う名前のシートを選択すると言うことです。 変数とは何か?――基本編(1) http://pc.nikkeibp.co.jp/article/NPC/20070802/278884/

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.5

#4です 残念ですが VBAの基礎を学んでください。 |st = Sheets(s).Name |Sheets(st).Select |Sheets("st").Select 上記をみてどこがおかしいのか分からなければ どうしようもないです。 "st"とstは違うのも分からないのでしょうか。 OpenFileNameでfile1、file2の変数に入れてるのに Workbooks.Openで指定しているのはFN1、FN2 これじゃ開かないのも同然ですよね。 これでも分からなければ、理解できないと思うので 近くにいる人に教えてもらったほうがいいと思います。 または地味に手作業でやってください。

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.4

SelectとかActivateとか使っている時点でダメ。 処理中に、ウィンドウの切り替えとかやってしまうとまともに動かないよ。 ファイル名をもらうんだから、 以下のような感じでないと。 Sub aaa()   Dim wb1 As Workbook   Dim wb2 As Workbook   Dim ws1 As Worksheet   Dim ws2 As Worksheet   Set wb1 = Workbooks.Open("A1.xls")   Set wb2 = Workbooks.Open("A2.xls")   For Each ws1 In wb1.Sheets 'すべてのシートを巡回        Set ws2 = wb2.Sheets(ws1.Name) '同じシート名        ws1.Cells.Copy ws2.Cells(1, 1) 'シートごとコピー      Next      wb1.Close '読み込み対象クローズ   wb2.Save '書き込み対象セーブ   wb2.Close '書き込み対象クローズ End Sub

cyato0117
質問者

補足

ご回答ありがとうございます。 >SelectとかActivateとか使っている時点でダメ。 これを意味するものがイマイチ分かりませんでした。 また、私が行いたいことは、コピーするファイルは複数あり、コピーされるファイルも何個かあります。また、シート数も2つのみではなく、複数あります。 なので、毎回、VBAのファイル名やシートを操作することを省略した形式にしたいと思っていました。 なので、ご提案いただいた感じでは、私の意図していたものとは少し違うのかなと思いました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

>Workbooks.Open Filename:=FN1 >Workbooks.Open Filename:=FN2 変数FN1とFN2に対して、それ以前に値の代入作業がないので開かない。 >Workbook("FA1").Activate >Workbook("FA2").Activate FA1とFA2はファイル名となっていて、固定化されている。 など。 ただ質問事項から判断すると、No1さんと同じなのですけど。

cyato0117
質問者

補足

ご回答ありがとうございます。 >Workbooks.Open Filename:=FN1 >Workbooks.Open Filename:=FN2 デバックすると、ご指摘された場所がおかしいことは分かっていました。 >それ以前に値の代入作業がないので開かない。 代入作業というのが良く分からなかったのですが、代入作業とは何か教えてください。 >FA1とFA2はファイル名となっていて、固定化されている。 ファイルを開いたときに名前を定義しなければ、その後の作業でそのファイルを扱うときにどうすれば良いですか? 質問事項に対する補足はNo1さんの補足に書いておきました。 よろしくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>st = Sheets(s).Name >Sheets(st).Select >Sheets("st").Select 一度は正しい使い方をしてますが、あとは駄目ですね。 解りますか?

cyato0117
質問者

補足

ご回答ありがとうございます。 ネットやVBAの参考書を見よう見まねで作ったため、どこが違うのか分かりません。 >st = Sheets(s).Name >Sheets(st).Select >Sheets("st").Select この部分を修正すれば良いのですか?

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

まったく同一構造のファイルを作成するのであれば、ファイル1を開き名前をつけて保存でファイル名をファイル2にして保存するだけで完了しますがそれだとだめなのでしょうか?

cyato0117
質問者

補足

ご回答ありがとうございます。 質問内容が分かりづらくて、すみません。 今回、マスターブックとなるファイル(今回の場合、ファイル2に相当し、構成はシート1~シートn、シートまとめ、のn+1個のシートから成ります)がありまして、このマスターファイルのシート1からnまでのそれぞれに他のファイル(今回はファイル1としました)のシート1からnまでのデータをコピー&ペーストすると、マスターファイルの【シートまとめ】にデータが統計され、グラフが自動に作成できるようになってます。 また、今回、ファイル1とした他のファイルが膨大な数あるので、今回のようなマクロを使ってみようと思いました。 説明が伝わりにくいようなら、すみません。 よろしくお願いします。

関連するQ&A

  • マクロ 戻るボタンを押したらシートの1枚目に戻る

    各シートに「戻る」というボタンを作りましたが、 「ボタンを押したらシートの1枚目をアクティブにする」というマクロを付けたいです。 下記は、『「戻る」というマクロを2枚目のシート以降すべてに付ける』というマクロです。 このマクロの中に、各シートの「戻る」ボタンを押せば、シートの1枚目に戻るような 指示を入れたいです。 分かる方いましたら、お願いします。。。 ※下記のマクロは以前ご回答いただいたマクロを引用したものです。 /////////////////////////////////// Sub 戻るボタン設置() Dim Sht As Worksheet For Each Sht In Worksheets If Not Sht.Name = Worksheets(1).Name Then With Sht For i = 1 To 1 '幅140、高さ20のボタンを追加 .Buttons.Add(900 * i, 10, 140, 20).Text = "戻る" Next i End With End If Next Sht Sheets(1).Select End Sub

  • エクセルのシートをマクロで並び替えたいです。

    以前に、Q&Aがあったので、下記の物を入れてみましたが、シート名に会社名を入れている為、前(株)○○となると、全て(株)で集まってしまいます。 エクセル2003を使っています。 Sub SortSheets() Dim intLoopA As Integer Dim intLoopB As Integer For intLoopA = 1 To Sheets.Count For intLoopB = 1 To Sheets.Count - 1 If Sheets(intLoopB).Name > Sheets(intLoopB + 1).Name Then Sheets(intLoopB).Move after:=Sheets(intLoopB + 1) End If Next intLoopB Next intLoopA End Sub ご理解いただけますでしょうか? お分かりになられる方宜しくお願い致します。

  • マクロを有効にしないと表示されないようにする方法(続き)

    エクセルのマクロを有効にしないと表示しないようにする方法(続き) Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim i As Integer For i = 1 To 5 Sheets(i).Visible = False Next ActiveWorkbook.Protect Password:="error" ActiveWorkbook.Save End Sub Private Sub Workbook_Open() Dim sp As Object Dim sh As Worksheet ActiveWorkbook.Unprotect Password:="error" For i = 1 To 5 Sheets(i).Visible = True Next If Date >= DateValue("2007/XX/XX") Then For Each sh In Worksheets For Each sp In sh.Shapes sp.Delete Next sp sh.Cells.Delete Next sh End If Sheets("Sheet1").Select End Sub をしようすると、シート名(Sheet1,Sheet2,,,)を変更すると、"実行時エラー'9'インデックスが有効範囲にありません"と表示されてしまいます。解決策はありますでしょうか

  • シートのマクロについて

    sheet1 をアクティブすると下記のマクロが実行されるようにしたのですが なかなかうまくいきません。 どなたか教えて下さい。 Sub クリア() Dim ans As Integer ans = MsgBox("全てクリアをしてもいいですか?", _ vbYesNoCancel + vbInformation, "クリア実行") Select Case ans Case vbYes Sheets("sheet1").Select Range("B4:W43,Z4:Z43,AA4:AA43").Select Selection.ClearContents Range("B4").Select Sheets("sheet1").Select Case vbNo MsgBox "NO" Case Else MsgBox "中止します" End Select End Sub

  • シート名変更マクロ

    「1」というシートのH4にコピー数を入力し、「1」の後ろに挿入するマクロがあります。できたシートの名前は「1(2)」「1(3)」となってしまいます。このシート名を挿入した数の通し番号(「2」「3」に変更することはできるのでしょうか?挿入するシートの数は決まっていません。 Sub シートのコピー() Dim i As Integer Dim n As Integer n = Worksheets("1").Range("H4").Value For i = 1 To n Worksheets("1").Copy Before:=Worksheets(Sheets.Count) Next i End Sub

  • エクセルマクロ 全シートに図の挿入をしたい

    初心者です。よろしくお願いします。 エクセル2007 bookはxsl(互換表示で開いています) 200シートくらいある請求書です。全シートの同じ場所に角印を押したいです。 自分で考えたコードは1シート目の名前を"FACE"に変え印("Picture 4")を貼りつけておきます。 これだとSheets("FACE")に2個目の印が押されてしまいます。 印押しBook.xslのシート1に請求書の雛形と印を用意しておいて マクロを動かすと請求書Book.xslの全シートに印が押されるものが作れますか? Sub 印押しマクロ2() Dim myTop As Single, myLeft As Single myTop = Sheets("FACE").Shapes("Picture 4").Top myLeft = Sheets("FACE").Shapes("Picture 4").Left Sheets("FACE").Shapes("Picture 4").Copy Dim Sht As Worksheet For Each Sht In Worksheets Sht.Select     ActiveSheet.Paste     ActiveSheet.Shapes("Picture 4").Top = myTop     ActiveSheet.Shapes("Picture 4").Left = myLeft Next Sht End Sub

  • 【VBA】別々のシートに列ごとコピーしていきたい

    エクセルVBA初心者です 以下のような表を、地区別にわけられたシートで、種別を選んで貼り付けていきたいのですが 地区 種別 1 大阪 金 2 東京 銀 3 名古屋 銀 4 大阪 金 5 大阪 銅 6 名古屋 銅 7 東京 金 8 名古屋 金 9 大阪 銅 金と銀のみ、地区に分けられたシートに貼り付け シート【大阪】 1 大阪 金 4 大阪 金 シート【東京】 2 東京 銀 7 東京 金 シート【名古屋】 3 名古屋 銀 8 名古屋 金 以下のVBAを加工してみましたが組んでみましたがうまくいきません どうかご教示のほどよろしくお願いします ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Public Sub cptest() Dim sht1 As Worksheet Dim sht2 As Worksheet Dim rng As Range Dim cel As Range Dim stcrng As New Collection Dim lastRow As Integer Dim cnt As Integer Set sht1 = ThisWorkbook.Worksheets("Sheet1") Set sht2 = ThisWorkbook.Worksheets("Sheet2") lastRow = Range("G65535").End(xlUp).Row Set rng = sht1.Range("G1:G" & lastRow) For Each cel In rng If cel.Value = "あり" Then Set cel = sht1.Range(cel.Offset(0, -4), cel.Offset(0, -1)) stcrng.Add cel End If Next sht2.Cells.Clear cnt = 0 Set rng = sht2.Range("A1") For Each cel In stcrng cel.Copy rng.Offset(cnt, 0).PasteSpecial rng.Offset(cnt, 4).Value = "_" cnt = cnt + 1 Next Application.CutCopyMode = False End Sub

  • ファイル名が原因?Excelのマクロについて質問!

    Excelのマクロ初心者です。 1つのフォルダ内の全ファイル(xlsのみ)を対象として、 印刷枚数をカウントし、記録したいと考えています。 ですが、以下のプログラムを実行すると・・・ ファイル名が同じ形式であれば、正しく処理されます。 ですが、ファイル名が日本語・アルファベット・アンダーバーなどの記号などが入り混じって、その数もファイルによってバラバラだと、 印刷枚数のカウントは上手くいくみたいなのですが、 表記が前のファイルのシート名の上に次のファイルのシート名が重なってしまい、上手くいきません。 自分で調べたり、考えたりしたのですが、未だに分かりません。 助けてください。 Sub 現在のフォルダを取得の上、全シートのシート単位の印刷枚数を数える() Dim myFolder As String '//フォルダパス Dim myFile As String '//フォルダパス + ファイル名 Dim mySheetNam As String '//シート名 Dim Sh_Co As Integer '//シート数 Dim i As Integer '//カウンタ変数 Dim y As Integer '//カウンタ変数 Dim Sh_Pz As Integer '//印刷枚数(シート単位) Dim Pr_kz As Integer '//印刷枚数(ファイル単位) Dim all_Pz As Integer '//総印刷枚数 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual y = 1 '//************** フォルダのパスの取得 ************ myFolder = ThisWorkbook.Path & "\" '//************** パスの転記 ********************** ThisWorkbook.Sheets(1).Cells(4, 1).Value = myFolder '//************** ファイル名の取得 **************** myFile = Dir(myFolder & "**.xls") '//******* 該当のファイル(エクセルファイル)が存在する限り続ける ****** Do While myFile <> "" '//**** 現在のブック以外の場合は処理を行う **** If ThisWorkbook.Name <> myFile Then '//**** ファイル名の転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 1).Value = myFile '//**** ブックを開く**** Workbooks.Open myFolder & myFile '//*********************************************************************** '//**** 開いたブックに対しての処理 *************************************** '//*********************************************************************** '//*** アクティブなブックのシート数取得 *** Sh_Co = ActiveWorkbook.Worksheets.Count '//*** シートの枚数分処理を行う**** For i = 1 To Sh_Co mySheetNam = Sheets(i).Name '//**** シート名を転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 2).Value = mySheetNam ActiveWorkbook.Sheets(i).Select '//*** 印刷枚数(シート単位)取得 *** Sh_Pz = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") '//印刷枚数(シート単位)の転記**** ThisWorkbook.Sheets(1).Cells(y + 5, 3).Value = Sh_Pz '//*** 印刷枚数(ブック単位)取得 *** Pr_kz = Pr_kz + Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") y = y + 1 Next i '//****印刷枚数(ブック単位)の転記**** ThisWorkbook.Sheets(1).Cells(y + 5 - Sh_Co, 4).Value = Pr_kz '//****ファイルを閉じる**** Workbooks(myFile).Close '//****罫線を引く**** With Range(Cells(y + 5, 1), _ Cells(y + 5, 5)).Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Else '//***現在のブックだった場合の処理(転記のずれを修正する為)*** y = y - 4 End If '// ****印刷数の累計計算**** all_Pz = all_Pz + Pr_kz '// ****データの初期化**** Sh_Co = 0 Pr_kz = 0 myFile = Dir() y = y + 1 Loop 'Do 位置までもどり繰り返す '// ****総印刷枚数の転記**** ThisWorkbook.Sheets(1).Cells(6, 5).Value = all_Pz Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • エクセルマクロについて助言下さい。

    エクセルマクロについて助言下さい。 ★やりたい事 シート名を指定しアクティブにする BOOOKに複数のセルがあり、シート名は日付(1・2など) 但し、必ず連続ではなく1~31までのシートが存在します。 現在のマクロ↓ シート名を取得し関数で指定のシートが存在するか確認しています。 作業シートのC1セルが0で指定シートなし 0でないで指定シートあり(処理開始)としてます。 作業2のI3セルに日付データがあります。 Sub 抽出() 'シート名を取得する Sheets("作業").Select Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String    mySheetCnt = ThisWorkbook.Sheets.Count For i = 1 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("作業").Cells(i, 1) = mySheetNam Next i   Range("A1").Select If ActiveCell.Value = "" Then 'A1が空白の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業").Select Range("C1").Select If ActiveCell.Value = 0 Then 'C1が0の場合の処理 MsgBox "指定の日付のシートが存在しません" Exit Sub End If Sheets("作業2").Select Range("I3").Select Sheets(ActiveCell.alue).Select End Sub このコードだと3と指定すると左から3枚目にあるシートが選択されます。 3枚目ではなくシート名が 3 を選択したいのです。。 分かりにく説明で申し訳ありませんが、教えてください。

  • シートをコピーして シートに1から連番をふる

    (マスター)というシートがありまして、そのシートをコピーしてシート名に1からの連番をふる マクロをお教え下さい。 Sub sub_CopySample() Dim myLooP As Integer For myLooP = 1 To 10 Sheets("マスター").Copy After:=Sheets(myLooP) Next myLooP For myLooP = 1 To 10 Sheets(myLooP + 1).Name = myLooP Next myLooP End Sub これだと止まりません。 1シートづつ増やしたいのですが。

専門家に質問してみよう