• ベストアンサー

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と今度は行ごとに値のみコピーをするプログラムに変更は可能でしょうか? よろしくお願いします。

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

  • ベストアンサー
  • TTak
  • ベストアンサー率52% (206/389)
回答No.2

この質問は 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

nanami0310
質問者

補足

いつもお世話になります。よかった、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と行毎に という指示をしたいので宜しくお願いします

その他の回答 (2)

  • moon00
  • ベストアンサー率44% (315/712)
回答No.3

<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さん、横レス失礼いたしました。

nanami0310
質問者

お礼

ありがとうございます。ごもっともなご意見だと思います。 本は買いましたが、入力の仕方から入った超入門編ではここまでの指示の仕方は載ってないし、素人が必ず躓くという変数でストップし、自力で前に進むことは私の理解力では正直無理でした。 Dim ○○ asは変数だとは分っても、以前TTACさんの回答に「dat?の?は…」と説明があり、他の何か意味のある変数宣言?と思って、変数のHPでdatColで引いてみましたが、見つけ出せるはずもなく、でもそこからこのプログラムを前に読み進めない…) 本では「Rangeはセルを指定する時のオブジェクト」とあります。なので、「空白でないセル」の「空白でない」を、どの言葉が指示しているのか?というのが出てきます。 もしRangeが「空白出ないセル」を指示するのであれば、逆に空白のセルの場合は?など、分る方にはなんてことのないものも、私には理解し難い文に見えてしまいます。 自分でややこしくしているだけなのだろうとは思いますが、確かに聞いていては身になりませんよね。 お手数お掛けしました。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.1

処理の流れが、今一判らないのですが。 ファイル「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のように)ようだと、また、違う方法でやる必要があります。

nanami0310
質問者

お礼

ありがとうございます。 ごめんなさい、前回の流れを説明してないので、すごく分り難いですよね。質問No.518444,520013 をお手数ですが見ていただけると幸いです。 あるソフトのデータがファイルBに読み込まれてくるので、どうしてもファイルBにAを読み込んでくる必要が出てくるのです。 お手数ですが、この方法を教えて下さい。 宜しくお願いします。

関連するQ&A

  • VBA 別シートからコピー貼付け(複数列)

    別シートからコピー貼付け(複数列)をしたいのですが,同一シートからのコピー貼付けはネットから以下のマクロでできました。 しかし,別シートsheet1からsheet2ヘコピーで修正しましたが,「アプリケーション定義またはオブジェクト定義のエラーです。」となります。どなたかご教授よろしくお願いします。 修正したマクロ Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Sheets("sheet2").Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Sheets("sheet1").Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub 参考としたマクロ http://www.excel.studio-kazu.jp/kw/20041208152106.html Sub sampel() Dim i As Long For i = 2 To Range("E65536").End(xlUp).Row Step 2 Range(Cells(i + 1, 2), Cells(i + 1, 85)).Value = _ Range(Cells(i, 5), Cells(i, 88)).Value Next i End Sub

  • VBA 任意のシートからコピーを始める。

    教えてください。 全てのシートをコピーして一つのシートにまとめるプログラムシートを作成しました。 1番目のシートからコピーを始める場合は For i = 2 To Worksheets.Count 2番目のシートからコピーを始める場合は For i = 3 To Worksheets.Count とすればよいのですがこれだといちいちモジュールコードを出して数字を変更しなければならず面倒です。 そこでユーザーフォームのコンボボックスに任意の数字を入れてクリックを押せば希望するシートからコピーを始めるプログラムを作成してみましたがうまくいきません。どなたか教えてくださいませんか。 Sub matome() Dim i As Integer Dim lRow As Long, lCol As Long, lRow2 As Long, lRow3 As Long, SNo As Integer '----何番目からコピーを始めるかを決定します With UserForm2 SNo = .ComboBox1.value End With For i = 1 + SNo To Worksheets.Count With Worksheets(i) lRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 lCol = .Cells(1, Columns.Count).End(xlToLeft).Column '----シートのデータが2行以上の場合にコピーします If lRow >= 2 Then lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 If lRow2 < Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 Then lRow2 = Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Row + 1 .Activate .Range(Cells(2, 1), Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1) End If End With Next i

  • VBAの記述で、あるシートを別ファイルにした場合

    エクセル2002で、商品を管理しています。 1列目に品番をいれると、2列目に品名が表示するようにし、 新規の品番は品名を入れると、追加登録されるようにVBAを組みました。 今度、このシート"商品"を別ファイル(商品.xls)にしたいと思うのですが、 どうしても、やり方が分かりません。 よろしくお願いします。 Public Sub Worksheet_Change(ByVal Target As Excel.Range) Dim 品番 As String Dim 品名 As String Dim i As Long With Target If .Column = 1 Then 品番 = .Text For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then ActiveSheet.Cells(.Row, 2) = "" Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then ActiveSheet.Cells(.Row, 2) = Sheets("商品").Cells(i, 2) Exit For End If Next i End If If .Column = 2 Then 品名 = .Text 品番 = ActiveSheet.Cells(.Row, 1) If 品名 = "" Or 品番 = "" Then Else For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then Sheets("商品").Cells(i, 1) = 品番 Sheets("商品").Cells(i, 2) = 品名 Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then Exit For End If Next i End If End If End With End Sub

  • 【Excel VBA】ワークシートの表示(続き)

    すみません。 追記が出来なかったため、コードの続きをこちらに記載します。 For i = 1 To 12 If actsht = tmp(i) Then Flag = 1 Anser = MsgBox("翌月分シートを作成しますか?", vbYesNo + vbDefaultButton1, "確認") If Anser = vbYes Then ActiveSheet.Copy After:=ActiveSheet ActiveSheet.Name = tmp(i + 1) Sheets(actsht).Tab.ColorIndex = 2 Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value ActiveSheet.Range("A2").Select Exit For ElseIf Anser = vbNo Then Exit For End If End If Next If Flag = O Then MsgBox ("新しいワークシートを作成出来ません。") End If If actsht = tmp(i) Then If Sheets(元データ).Visible = False Then Sheets(元データ).Visible = True End If End If End Sub

  • excel;マクロ;表現をもっと縮小したい

    質問します。下記のようなモジュールで中に同様の数字のみが順に変わるブロック繰り返しが多数あるのですが、もっと簡略化した表現 が可能でしょうか。よろしくお願いします。 Sub usb_count() d = Range("A65536").End(xlUp).Row j = 3 For i = 2 To d Select Case Cells(i, "B") Case Sheets("sheet2").Cells(4, "A") Sheets("sheet2").Cells(4, "B").Value = Sheets("sheet2").Cells(4, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(4, "C").Value = Sheets("sheet2").Cells(4, "C").Value + 1 Else Sheets("sheet2").Cells(4, "D").Value = Sheets("sheet2").Cells(4, "D").Value + 1 ' End If ‘------------------------------------------------------------------------------------------------------------------------------------ Case Sheets("sheet2").Cells(5, "A") Sheets("sheet2").Cells(5, "B").Value = Sheets("sheet2").Cells(5, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(5, "C").Value = Sheets("sheet2").Cells(5, "C").Value + 1 Else Sheets("sheet2").Cells(5, "D").Value = Sheets("sheet2").Cells(5, "D").Value + 1 End If ‘----------------------------------------- ‘以下上記の‘-----------から‘-----------で囲まれたブロックが( )内の数字が6から20まで繰り返され続く が略す End Select Next i End Su

  • VBAの転記について

    With Sheets("入力") '3行目~22行目まで For i = 5 To 24 SheetName = Sheets("入力").Cells(i, "C").Value On Error Resume Next Set Dummy = Sheets(SheetName) SheetName2 = .Cells(i, "C").Value U最終行 = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 If U最終行 = 39 Then Sheets(SheetName2).Copy BEFORE:=ActiveSheet Sheets(SheetName).Delete End If If Err.Number = 0 Then A = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 Sheets(SheetName2).Range("C" & A).Value = .Cells(i, "G").Value Sheets(SheetName2).Range("D" & A).Value = .Cells(i, "I").Value Sheets(SheetName2).Range("E" & A).Value = .Cells(i, "L").Value Sheets(SheetName2).Range("F" & A).Value = .Cells(i, "N").Value Sheets(SheetName2).Range("G" & A).Value = .Cells(i, "P").Value Sheets(SheetName2).Range("H" & A).Value = .Cells(i, "R").Value Sheets(SheetName2).Range("I" & A).Value = .Cells(i, "T").Value Sheets(SheetName2).Range("K" & A).Value = .Cells(i, "V").Value Sheets(SheetName2).Range("L" & A).Value = .Cells(i, "X").Value ElseIf .Cells(i, "C").Value <> "" Then G = Sheets("原紙").Range("C65536").End(xlUp).Row + 1 Sheets("原紙").Range("B1").Value = .Cells(i, "D").Value Sheets("原紙").Range("B4").Value = .Cells(2, "D").Value Sheets("原紙").Range("C" & G).Value = .Cells(i, "G").Value Sheets("原紙").Range("D" & G).Value = .Cells(i, "I").Value Sheets("原紙").Range("E" & G).Value = .Cells(i, "L").Value Sheets("原紙").Range("F" & G).Value = .Cells(i, "N").Value Sheets("原紙").Range("G" & G).Value = .Cells(i, "P").Value Sheets("原紙").Range("H" & G).Value = .Cells(i, "R").Value Sheets("原紙").Range("I" & G).Value = .Cells(i, "T").Value Sheets("原紙").Range("K" & G).Value = .Cells(i, "V").Value Sheets("原紙").Range("L" & G).Value = .Cells(i, "X").Value '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next i End With On Error GoTo 0 上記のVBAを作成しましたが、 C行の値ごとの転記(G~Xの値)が出来ません。 どこが間違いか教えていただけないでしょうか。

  • QNo.2826776の質問の続き 表から別シートに一覧表を作成したいのですが

    質問の続きになってしまうのですが sheet1からsheet2へ転記するVBA Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Cells(1, 1).Value = "日付" Sheets("Sheet2").Cells(1, 2).Value = "応援に行く人" Sheets("Sheet2").Cells(1, 3).Value = "応援をもらう店舗" r2 = 1 For r = 2 To Range("A65536").End(xlUp).Row For c = 2 To 256 If Cells(r, c) <> "" Then r2 = r2 + 1 Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r, 1) Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(1, c) Sheets("Sheet2").Cells(r2, 3).Value = Sheets("Sheet1").Cells(r, c) End If Next c Next r End Sub と教えていただきました。 もうひとつ条件を入れたいのですが「"休"を無視する」 座標やシート名の入れ替えは理解できたのですが、やはり難しく ここを頼ってしまいました。教えてください。よろしくお願いします。

  • VBAにて別シートに貼り付けたいのでができません

    今開いているファイル(A)内のシート(依頼)にVBAを以下の用に記述しました。 これをデスクトップにあるファイル(提出)内のシート(データ更新)に貼り付けたいのですが できません。 「インデックスが有効範囲にありません。」と表示されます。 どこが悪いか教えて下さい。 sub 取り込み( ) Sheets("依頼").Range(Cells(15, 2), Cells(30, 21)).Copy Workbooks.Open Filename:="C:\Documents and Settings\Administrator\デスクトップ \作業中\提出.xls" Sheets("データ更新").Select Range(Cells(15, 2), Cells(15,2)).Select     ActiveSheet.Paste Application.CutCopyMode = False End sub

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • 指定記号のみ別シートにコピー

    sheet1(表-1)の入力文字「A,C,E」をsheet2へコピーする。 sheet2(表-3)のように[A,C,E」以外及びsheet1空白のセルはsheet2でも空白としたい。 その際、sheet2(表-2)に入力済みの記号「○、●、◎」はそのまま残したい。 下記のコードでは、sheet2に入力済みの記号「○、●、◎」が消えてしまいます。 どなたかコードがわかる方よろしくお願いします。 Sub シートコピー() Dim r As Range For Each r In Worksheets("Sheet1").Range("B1:D5") If WorksheetFunction.CountIf(Range("A8:A10"), r.Value) Then Sheets("sheet2").Range(r.Address).Value = r.Value Else Sheets("sheet2").Range(r.Address).Value = "" End If Next End Sub セルA11に"0"を入力して実行してもsheet1空白セルはsheet2でも空白となり困っています。

専門家に質問してみよう