- ベストアンサー
エクセルで変化する行数に対応してコピーするマクロ
- エクセルで行数が変化する場合でも、指定された文字列を含むセルから次のスペースまでのグループをコピーするマクロを作成します。
- このマクロは、指定された文字列を含むセルをそれぞれ検索し、対応するシートの指定されたセルにコピーを行います。
- マクロの実行はブックBから行います。マクロを実行する際には、ブックAのファイル名を指定する必要があります。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
ANo.8です。 >ブックAのシート1のデータをブックBのシート1~3に貼り付けたら、続いてブックAのシート2のデータをブックBのシート4~6に >貼り付けて、ブックAのシート3のデータをブックBのシート7~9という風になれば理想的です。 Sub Test4() Dim wb As Workbook Dim ws As Worksheet Dim i As Integer Dim ws_name, F_name, r As Range 'データを書き込むブックのセット Set wb = ThisWorkbook For Each ws_name In Array("Sheet1", "Sheet2", "Sheet3") 'データのあるブック&シートセット 'ブック名・シート名は適宜修正のこと Set ws = Workbooks("Book1.xls").Worksheets(ws_name) '検索したい文字をセットし順次与える For Each F_name In Array("あいう", "かきく", "さしす") With ws '値の検索(部分一致) Set r = .Range("A:A").Find(what:=F_name, After:=.Range("A" & Rows.Count), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns).CurrentRegion End With i = i + 1 r.Copy wb.Worksheets(i).Range("A1") Next Next Set r = Nothing End Sub こうゆう事でしょうか?
その他の回答 (8)
- n-jun
- ベストアンサー率33% (959/2873)
ANo.7です。 >検索する文字が完全一致ではなく、含んだ文字。 ここはANo.1さんが回答しているFindメソッドの”LookAt:=xlPart”です。 前回のと比べると違いがわかります。 >もう一つはコピーの範囲が決まってるのではなく、 >検索した文字列のセルを含んだ行から次のスペースの範囲まで。 ANo.1さんが回答してますFindメソッドの結果に対して行なっている、 ”.CurrentRegion”です。 最低限必要としている部分は既に回答が出ていますよ。 取り敢えずブックA及びブックBを開いた状態でブックBに下記コード貼付。 Sub Test3() Dim wb As Workbook Dim ws As Worksheet Dim i As Integer, j As Integer Dim F_name, r As Range 'データのあるブック&シートセット 'ブック名・シート名は適宜修正のこと Set ws = Workbooks("Book1.xls").Worksheets("Sheet1") 'データを書き込むブックのセット Set wb = ThisWorkbook j = wb.Worksheets.Count '検索したい文字をセットし順次与える For Each F_name In Array("あいう", "かきく", "さしす") With ws '値の検索(部分一致) Set r = .Range("A:A").Find(what:=F_name, After:=.Range("A" & Rows.Count), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns).CurrentRegion End With i = i + 1 With wb 'データを書き込むシートが足りない場合は追加する。 If i > j Then .Worksheets.Add After:=.Worksheets(.Worksheets.Count) j = .Worksheets.Count End If End With r.Copy wb.Worksheets(i).Range("A1") Next Set r = Nothing End Sub でしょうか。
補足
ありがとうございます。 あと一歩ってところなんですけど・・・。 この部分Set ws = Workbooks("Book1.xls").Worksheets("Sheet1") は複数のシートを指定できないのでしょうか? Set ws = Workbooks("Book1.xls").Worksheets("Sheet1","Sheet2","Sheet3")と変更したらダメでした。 質問ではブックAのシート1だけでお尋ねしたのでこのように回答いただいたのですが、私はあほでマクロのコードがよく分からないので、 1つの動作を教えて頂いてそれを単純に何回も繰り返そうと思っていました。 つまり「ブックAのシート1を検索して見つかった1グループをブックBのあるシートとセルを指定して貼り付けるだけの動作」を検索する文字列の数だけマクロで連続実行させようと思っていました。 親切に貼り付ける先のシートも順番に振り分けるようになっていたので、その部分も変更する(Bのシートを指定する方法)のが分からなくて困っていました。 なるべく複雑にならないようにお手数をかけまいと考えて質問すると、 さらに違う方向に行ってしまい自爆です。 もしブックAの複数のシートを指定して実行できるならそれに越した事は無いのです。 ブックAのシート1のデータをブックBのシート1~3に貼り付けたら、続いてブックAのシート2のデータをブックBのシート4~6に貼り付けて、ブックAのシート3のデータをブックBのシート7~9という風になれば理想的です。 ブックBのシートが足りなくなる事はありません。 これが複雑で大変でしたら、ブックAからコピーしたデータを単純にブックBの指定のシートのセルに貼り付ける方法が分かればお願いします。それを何回も繰り返しますので。 すいませんお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
ブックAにコードを貼付して実行。 実行時に書き込みたいブックBを指定して開く。 Sub Test2() Dim wb As Workbook Dim ws As Worksheet Dim i As Integer, j As Integer Dim r As Range Dim F_name, OP_name As String 'データのあるブック&シートセット Set ws = ThisWorkbook.Worksheets("Sheet1") '書き込むブックを選択して開く OP_name = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OP_name = "False" Then Exit Sub On Error Resume Next Workbooks.Open Filename:=OP_name If Err <> 0 Then Exit Sub 'データを書き込むブックのセット Set wb = ActiveWorkbook '検索したい文字をセットし順次与える For Each F_name In Array("あいう", "かきく", "さしす") With ws '値の検索 Set r = .Range("A:A").Find(what:=F_name, After:=.Range("A" & Rows.Count), _ LookIn:=xlValues, LookAt:=xlPart).CurrentRegion End With i = i + 1 With wb 'データを書き込むシートが足りない場合は追加する。 If i > j Then .Worksheets.Add After:=.Worksheets(.Worksheets.Count) j = .Worksheets.Count End If End With r.Copy wb.Worksheets(i).Range("A1") Next Set r = Nothing End Sub ではどうでしょうか?
補足
何度も回答頂きありがとうございます。 私の求めている内容とは違うようです。 以前にn-junさんに回答頂いた、 http://oshiete1.goo.ne.jp/qa4269678.html この場合と今回との違いは、検索する文字が完全一致ではなく、 含んだ文字。 もう一つはコピーの範囲が決まってるのではなく、 検索した文字列のセルを含んだ行から次のスペースの範囲まで。 これを教えて頂けませんか? どうしてもブックAからBへはダメなんです。 現在開いてるブックからAに検索に行く方法しか使えないのです。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3です。 追加です。 >ブックBは既にあるファイルで名前も決まっています。 >別名で何百もあるファイルです。(ブックB1~ブックB2・・・・) >ブックAは1つだけのファイル。 >ブックBからブックAに見に行き目的の名前の部分をコピーして持って帰ってくるというイメージです。 別段ブックAから任意のブックBを選択・開いて実行もできますが、 その際にも書き込みたいシートと、ブックAの個々のデータ固まりのどれがつながるのかが不明ですけど。
補足
すいません、そうですね。 例えば”あいう”を検索した1グループはブックBのシート1のA1に貼り付けるというマクロが分かれば、2つ目からは同じマクロで検索文字を”かきく”として貼り付けるシートをブックBシート2A1という具合に代えれば良いと思ったのです。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3です。 ”あいう”・”かきく”という検索値は当然ダミーですよね。 では実際にはどこからその検索値を持ってくるのか、と言う事が問題になります。 ブックBから引っ張るとした場合に、例えばシート名にある名前と一致したデータを持ってくるとか。 何かしらの検索値として与える条件がなければ、なが~いコードをひたすら書かなければなりませんよ。 提示したコードは単に上から順番に各々のシートに放り込むタイプで、検索値に依存しません。
補足
すいません、”あいう”はダミーじゃないです。 毎回その文字なんです。 宜しくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3です。 ちょっと訂正です。 Do~Loop間を以下に変更願います。 Do If i = j Then wb.Worksheets.Add After:=wb.Worksheets(wb.Worksheets.Count) j = wb.Worksheets.Count End If i = i + 1 r.CurrentRegion.Copy wb.Worksheets(i).Range("A1") If r.Row = last_row Then Exit Do Set r = r.End(xlDown) Loop
補足
何度もすいません。 以前にn-junさんに回答頂いた、 http://oshiete1.goo.ne.jp/qa4269678.html この場合と今回との違いは、検索する文字が完全一致ではなく、 含んだ文字。 もう一つはコピーの範囲が決まってるのではなく、 検索した文字列のセルを含んだ行から次のスペースの範囲まで。 それでご理解頂けるでしょうか?
- n-jun
- ベストアンサー率33% (959/2873)
ANo.2です。 >ブックBは毎回違います。 仮にブックBを実行の都度新規で作って良ければ、コードをブックAに 貼り付けて実行してみて下さい。 Sub test() Dim wb As Workbook Dim i As Integer, j As Integer Dim last_row As Long Dim r As Range With ThisWorkbook.ActiveSheet Set r = .Range("A1") last_row = .Range("A" & Rows.Count).End(xlUp).Row End With Workbooks.Add Set wb = ActiveWorkbook j = wb.Worksheets.Count Do If i = j Then wb.Worksheets.Add After:=wb.Worksheets(wb.Worksheets.Count) j = wb.Worksheets.Count End If i = i + 1 r.CurrentRegion.Copy wb.Worksheets(i).Range("A1") Set r = r.End(xlDown) Loop Until r.Row = last_row End Sub ブックBの”名前を付けて保存”は手作業になりますが。。。 ご参考まで。
補足
回答ありがとうございます。 私の質問が悪いですね、うまく表現できなくて・・・。 ブックBは既にあるファイルで名前も決まっています。 別名で何百もあるファイルです。(ブックB1~ブックB2・・・・) ブックAは1つだけのファイル。 ブックBからブックAに見に行き目的の名前の部分をコピーして持って帰ってくるというイメージです。 ご提示頂いたマクロの中には検索する文字が見当たりません。(1例目”あいう”) 今回の例だと”あいう”を含む文字のあるセルを検索して、 そのグループのスペース~スペースの間のをコピーしてブックBのシート1に貼り付けます。 次に別の文字”かきく”を含む文字のあるセルを検索して、 同じくそのグループをブックBのシート2に貼り付けます。 ブックBは基本となる基のファイルがあり、 それにいろんなデータを入れてから名前を付けて保存しています。 基本となる基のファイルにマクロを入れておきたいのです。 そうすれば名前が変わった後でも実行できると思ったのですが、違いますか? 私の望んでる事が分かり難いでしょうか? ダメならただ単に ”あいう”を含む文字のあるセルを検索して、 そのグループのスペース~スペースの間のをコピーしてブックBのシート1に貼り付けます。 この部分だけのマクロをブックBから実行できれば良いのですけど、 宜しくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
>*ブックAのファイル名は固定ですが、ブックBは毎回違います。 >マクロの実行はブックBから行います。 全てのブックBにコードを書くのですか? 変更があった場合、面倒に思うのですが・・・。 試しにブックAに下記コードを貼り付けて実行してみると、範囲が取れてるのが わかるかと思います。 Sub try() MsgBox Range("A1").CurrentRegion.Address MsgBox Range("A1").End(xlDown).CurrentRegion.Address End Sub
- masa_019
- ベストアンサー率61% (121/197)
こんにちは。 Cells.Find(What:="あいう", After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).CurrentRegion.Copy で"あいう"を含む1グループをコピーできますので、 後は好きなところに貼り付けれるだけです。
補足
回答ありがとうございます。 実行しましたが、エラーになってしまいます。 「実行時エラー”91” オブジェクト変数または1withブロック変数が設定されていません」と、表示が出ます。 どうすれば良いのでしょう?
お礼
凄い!完璧です。 わがままを聞いて下さり感謝いたします。 ありがとうございました。