- ベストアンサー
EXCEL-VBAで、別ファイルのシートをコピーしてくることはできますか
先日TTACさんに組んでいただいたプログラムに、追加したい項目があります。 追記していただきたいのは、同じディレクトリ内に入っている「A」というファイル内の「BL」「M2」「まとめ」という3つのシートを、現在のファイルにコピーするという命令です。ファイル「A」はこの3シートで構成されています。 前回は、ファイル内にこの「BL」というシートが存在するという前提で組んでいただきましたが、今回は、別ファイルからこの3つのシートをコピーしてきた後、処理をするという形にしたいのですが、できますでしょうか? 前回作って頂いたプログラムは下記通りです。 Sub Macro1() Dim datCol As Integer Dim i As Integer Set sheetBL = ThisWorkbook.Sheets("BL") With sheetBL datCol = .Range(.Cells(14, .Columns.Count). _ End(xlToLeft).Address).Column If datCol > 248 Then MsgBox "これ以上データ追加できません。" Exit Sub End If For i = 4 To 248 Step 4 If .Cells(14, i).Value = "" Then .Range(.Cells(14, i), .Cells(22, i + 2)).Value _ = Sheets("測定結果").Range("G14:I22").Value Exit For End If Next i End With Set sheetBL = Nothing End Sub また、このプログラムを元にして、今度はG14:I14に入った値を、シート「まとめ」のC6を開始位置とし、C7、C8と今度は行ごとに値のみコピーをするプログラムに変更は可能でしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
この質問は http://oshiete1.goo.ne.jp/kotaeru.php3?q=518444 http://oshiete1.goo.ne.jp/kotaeru.php3?q=520013 に関連しています。今後、nanami0310さんが明示していただくと助かります。 さて、シートコピーのコードを追加ということですが、可能です。ただ、すでにシートがすでに追加されている(すなわち2つ以上シートがある)場合は、A.xlsからのシートのコピー追加は必要ないと判断しました。 > このプログラムを元にして、今度はG14:I14に入った値を、シート「まとめ」のC6を開始位置とし、C7、C8と今度は行ごとに値のみコピーをするプログラムに変更は可能でしょうか? コード中に追加しています。このMacro1では不要ということでしたら、当該部分を削除してください。 Sub Macro1() Dim i As Integer If ThisWorkbook.Sheets.Count <= 3 Then Application.ScreenUpdating = False Workbooks.Open ThisWorkbook.Path & "\A.xls" With Workbooks("A.xls") .Sheets("BL").Copy Before:=Workbooks(ThisWorkbook.Name). _ Sheets(ThisWorkbook.Sheets.Count) .Sheets("M2").Copy Before:=Workbooks(ThisWorkbook.Name). _ Sheets(ThisWorkbook.Sheets.Count) .Sheets("まとめ").Copy Before:=Workbooks(ThisWorkbook.Name). _ Sheets(ThisWorkbook.Sheets.Count) End With ThisWorkbook.Sheets("測定結果").Move Before:=Sheets(2) Workbooks("A.xls").Close False Application.ScreenUpdating = True End If Set sheetBL = ThisWorkbook.Sheets("BL") Set sheetMA = ThisWorkbook.Sheets("まとめ") With sheetBL For i = 4 To 248 Step 4 If .Cells(14, i).Value = "" Then .Range(.Cells(14, i), .Cells(22, i + 2)).Value _ = Sheets("測定結果").Range("G14:I22").Value '---ここからG14:I14→"まとめ"シートに追加のコード sheetMA.Cells(i + 2, 3).Value = _ .Cells(14, i).Value sheetMA.Cells(i + 3, 3).Value = _ .Cells(14, i + 1).Value sheetMA.Cells(i + 4, 3).Value = _ .Cells(14, i + 2).Value '---ここまで Exit For End If Next i End With Set sheetBL = Nothing Set sheetMA = Nothing End Sub
その他の回答 (2)
- moon00
- ベストアンサー率44% (315/712)
<datCol=…行と、IF.Cells(14,i)…行の指示 についてですが、 datColは変数で、Dim datCol As Integer いう宣言で 使用可能となります。 つまり、VBA側であらかじめ定義されているものでは なく、コードを書くに当たり、TTakさんが定義されたものです。 ここでは、datColに.Range以下の部分で指定される列数を 代入することになります。 ここでは、14行目の一番右にある空白でないセルの列番号です。 これが248列目だと、データ書込に列数が不足するということで メッセージがでるようになっています。 IF.Cells(14,i)…行はその上のForと関連しています。 iという変数を4~248まで4刻みで変化させ、 空白のセルを見付けたときに、測定結果シートのG14:I22 の内容を書き込むというVBAです。 何回も質問されているので、お急ぎなのかもしれませんが、 一度VBAの本あるいは、VBAについてのHPをごらんになって みてはいかがですか。 Dim ○○ as ** やRange、Cellsくらいは、意味を分かった方が より、作業がやりやすくなると思います。 TTakさん、横レス失礼いたしました。
お礼
ありがとうございます。ごもっともなご意見だと思います。 本は買いましたが、入力の仕方から入った超入門編ではここまでの指示の仕方は載ってないし、素人が必ず躓くという変数でストップし、自力で前に進むことは私の理解力では正直無理でした。 Dim ○○ asは変数だとは分っても、以前TTACさんの回答に「dat?の?は…」と説明があり、他の何か意味のある変数宣言?と思って、変数のHPでdatColで引いてみましたが、見つけ出せるはずもなく、でもそこからこのプログラムを前に読み進めない…) 本では「Rangeはセルを指定する時のオブジェクト」とあります。なので、「空白でないセル」の「空白でない」を、どの言葉が指示しているのか?というのが出てきます。 もしRangeが「空白出ないセル」を指示するのであれば、逆に空白のセルの場合は?など、分る方にはなんてことのないものも、私には理解し難い文に見えてしまいます。 自分でややこしくしているだけなのだろうとは思いますが、確かに聞いていては身になりませんよね。 お手数お掛けしました。
- ki-aaa
- ベストアンサー率49% (105/213)
処理の流れが、今一判らないのですが。 ファイル「A」・・・「BL」「M2」「まとめ」という3つのシートがある。 ファイル「B」・・・「測定結果」のシートがある。 ファイル「A」の「BL」に、ファイル「B」の「測定結果」をコピーすれば良いと思うのですが。その方法は次の通りです。 マクロは、ファイル「A」に記述する。 = Sheets("測定結果").Range("G14:I22").Value ↓ = Workbooks("B").Sheets("測定結果").Range("G14:I22").Value また、ファイル「B」の名前が毎回変わる(B-20030401,B-20030510のように)ようだと、また、違う方法でやる必要があります。
お礼
ありがとうございます。 ごめんなさい、前回の流れを説明してないので、すごく分り難いですよね。質問No.518444,520013 をお手数ですが見ていただけると幸いです。 あるソフトのデータがファイルBに読み込まれてくるので、どうしてもファイルBにAを読み込んでくる必要が出てくるのです。 お手数ですが、この方法を教えて下さい。 宜しくお願いします。
補足
いつもお世話になります。よかった、TTacさんにこの質問見ていただけて(^^;) >今後、nanami0310さんが明示していただくと助かります。 はい。。。ごめんなさい。次回より気をつけます。こんなとこまでお手数かけて申し訳ありません。 お世話になりついでに、もう2件お願いします! 1: シート「測定結果」K8:N32のデータを、シート「輝度-電流値」のD5を貼付位置としてL5,T5とSTEP9?でコピーしたい (最初の応用なんですが、datCol=…行と、IF.Cells(14,i)…行の指示が理解不能で挫折しました。日本語にするとどういう意味になるのでしょうか?) 2: シート「測定結果」G20に入る値は、シート「RGB」C6を開始とし、次回からはC7、C8と行毎に シート「測定結果」H20:I20に入る値は、シート「RGB」F6を開始とし、次回からはF7、F8と行毎に シート「測定結果」G21に入る値は、シート「RGB」D6を開始とし、次回からはD7、D8と行毎に シート「測定結果」H21:I22に入る値は、シート「RGB」M6を開始とし、次回からはM7、M8と行毎に シート「測定結果」G22:I22に入る値は、シート「RGB」Q6を開始とし、次回からはQ7、Q8と行毎に シート「測定結果」G23:I23に入る値は、シート「RGB」X6を開始とし、次回からはX7、X8と行毎に シート「測定結果」G24:I24に入る値は、シート「RGB」AE6を開始とし、次回からはAE7、AE8と行毎に シート「測定結果」I27に入る値は、シート「RGB」AL6を開始とし、次回からはAL7、AL8と行毎に という指示をしたいので宜しくお願いします