Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


883 / 13645 ツリー ←次へ | 前へ→

【77738】特定条件の行に他シートの行を貼り付け&シート分け保存 さいとう 15/12/12(土) 20:17 質問[未読]
【77739】Re:特定条件の行に他シートの行を貼り付け... γ 15/12/12(土) 21:07 発言[未読]
【77740】Re:特定条件の行に他シートの行を貼り付け... さいとう 15/12/12(土) 22:21 発言[未読]
【77741】Re:特定条件の行に他シートの行を貼り付け... γ 15/12/12(土) 22:40 発言[未読]
【77742】Re:特定条件の行に他シートの行を貼り付け... γ 15/12/13(日) 8:54 発言[未読]
【77743】Re:特定条件の行に他シートの行を貼り付け... さいとう 15/12/14(月) 5:24 お礼[未読]
【77745】Re:特定条件の行に他シートの行を貼り付け... γ 15/12/14(月) 20:39 発言[未読]
【77751】Re:特定条件の行に他シートの行を貼り付け... さいとう 15/12/15(火) 7:09 お礼[未読]
【77752】Re:特定条件の行に他シートの行を貼り付け... γ 15/12/15(火) 7:16 発言[未読]
【77753】Re:特定条件の行に他シートの行を貼り付け... さいとう 15/12/15(火) 18:20 お礼[未読]

【77738】特定条件の行に他シートの行を貼り付け&...
質問  さいとう  - 15/12/12(土) 20:17 -

引用なし
パスワード
   はじめまして。
手探りでマクロを勉強しておりますがわからないので質問させていただきます。
Excel2013です。

やおやA        
項目 みかん りんご なし
1日  5    1   2
2日  1    2   3
----空白1行----
やおやB        
項目 みかん りんご なし
1日  2    4   5
2日  5    2   1
3日  4    5   3
----空白1行----
やおやC        
項目 みかん りんご なし
1日  4    5   2
2日  1    1   3
3日  2    5   3
4日  1    8   6
5日  3    2   1

上記のように、セルA1に「やおやA」が入る形で、やおやA〜C(増減あり)の表がsheet1に空白行を挟んで縦に並んでいます。
各店舗の表の行数はバラバラで、変動します。

1.同じブック内の別シート(シート名:見出し)の2行目の行を、sheet1の上記表の各「項目」で始まる行に貼り付けたい。(現在の「項目〜」で始まる行が不要。差し替えたい)
(「項目」はA列、「みかん」はB列、「りんご」はC列に入っています)

2.1の処理の終わったそれぞれのやおや表を、新規ブックにシート別に貼り付けたい。

3.新規ブックのシート名をやおやの名前にしたい。

以上です。
よろしくお願いいたします。

【77739】Re:特定条件の行に他シートの行を貼り付...
発言  γ  - 15/12/12(土) 21:07 -

引用なし
パスワード
   ▼さいとう さん:
>手探りでマクロを勉強しておりますがわからないので質問させていただきます。
いいですね。頑張って下さい。
それで、どこまでできているんでしょうか?
部分的でも構いませんので、できているところまで書いてもらえますか?

【77740】Re:特定条件の行に他シートの行を貼り付...
発言  さいとう  - 15/12/12(土) 22:21 -

引用なし
パスワード
   ▼γ さん:
レスありがとうございます。

マクロの記録を使い、
sheet1でオートフィルタを用いてA列が「項目」の行を抽出して
「見出し」シートの2行目を貼り付けしようとしたところ、

Sub midashi_
  Sheets("Sheet1").Select
  Range("A1:D18").Select ←末行18としていますが実際の行数は変動します。
  Selection.AutoFilter
  Selection.AutoFilter Field:=1, Criteria1:="項目"
  Sheets("見出し").Select
  Rows("1:1").Select
  Selection.Copy
  Sheets("sheet1").Select
  Rows("7:13").Select
  ActiveSheet.Paste
End Sub

となって貼り付け行がRows("7:13")で固定されてしまい変動に対応しません。
また、オートフィルタで抽出した行になんとか貼れないものかと試行錯誤しているうちに、
抽出されない行(非表示になっている部分)にまで全部貼り付けてしまったりもしました。

そして、見出しを未処理のままでsheet1を
  Workbooks.Add
  ActiveSheet.Paste
により別のブックにすることはできたのですが、表でシートを分けることができませんでした・・・

【77741】Re:特定条件の行に他シートの行を貼り付...
発言  γ  - 15/12/12(土) 22:40 -

引用なし
パスワード
   最終行は下記のようにして求めることができます。
  Dim lastRow As Long
  lastRow = Cells(Rows.Count, 1).End(xlUp).Row

フィルタで抽出した段階で、
2行目からlastRowを対象にして貼付けると
可視セルだけに貼り付けることができます。

後半部分は、下記のコードを参考にしてください。
一行空白行がありますから、そこに注目して、Areasを活用します。

Sub test()
  Dim lastRow As Long
  Dim area As Range
  Dim myRng As Range
  
  lastRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  Set myRng = Range("A1", Cells(lastRow, 1)).SpecialCells(xlCellTypeConstants)
  
  For Each area In myRng.Areas
    Set r = area.Resize(, 4)
    
    Debug.Print r.Address      '確認用
    
    ' r を 新しいブックのシートにコピー。
    ' シート名は r(1).Valueに変更
  Next
End Sub

【77742】Re:特定条件の行に他シートの行を貼り付...
発言  γ  - 15/12/13(日) 8:54 -

引用なし
パスワード
   これから出掛けてしまうので、時間がとれませんがコメント追加しておきます。

オートフィルタだけを使って操作するには以下のようにします。
「項目」をキーワードにしてオートフィルタを掛けた段階で
A列の可視セルを変数にセットしておきます。

・オートフィルタを解除します。
・For each で以下の操作を繰り返します。
・その行に見出しをコピーペイストします。
・そのセルのCurrentRegionをとれば、そのブロックだけが選択できます。
 それをシートにコピーペイストしてください。
・シート名にすべき文字列は、そのセルのOffset(-1)に入っていますから、
 シー名を修正します。

こんな方針でいかがでしょうか。

【77743】Re:特定条件の行に他シートの行を貼り付...
お礼  さいとう  - 15/12/14(月) 5:24 -

引用なし
パスワード
   ありがとうございます。
おっしゃっていることの筋道と意味はわかるのですが、記述の仕方が全くわかりません。
一日潰して考えましたがどうにもなりませんでした。。。

【77745】Re:特定条件の行に他シートの行を貼り付...
発言  γ  - 15/12/14(月) 20:39 -

引用なし
パスワード
   一例です。

Sub test()
  Dim ws As Worksheet
  Dim newBook As Workbook
  Dim lastRow As Long
  Dim myRng As Range
  Dim myRng2 As Range
  Dim wsNew As Worksheet
  Dim r As Range

  Set ws = ThisWorkbook.Worksheets("Sheet1")

  Set newBook = Workbooks.Add

  '"項目"のみ抽出
  lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
  Set myRng = ws.Range("A1", ws.Cells(lastRow, 4))
  myRng.AutoFilter Field:=1, Criteria1:="項目"

  ' その一列目の可視セルを変数に持つ
  Set myRng2 = ws.Range("A2", ws.Cells(lastRow, 1)).SpecialCells(xlCellTypeVisible)

  'オートフィルターを解除
  myRng.AutoFilter

  '各ブロックについて処理
  For Each r In myRng2
    '見出しのコピー
    ThisWorkbook.Sheets("見出し").Rows(2).Copy r

    '各ブロックを別々のシートに転記
    Set wsNew = newBook.Worksheets.Add(after:=newBook.Worksheets(newBook.Worksheets.Count))
    r.CurrentRegion.Copy wsNew.Range("A1")
    wsNew.Name = r(1).Offset(-1).Value
  Next
End Sub

十分な検証をしていないので、そちらでよくチェックしてください。

【77751】Re:特定条件の行に他シートの行を貼り付...
お礼  さいとう  - 15/12/15(火) 7:09 -

引用なし
パスワード
   ありがとうございました!
教えていただいた手順で見出しのコピーまではできました。

シート分けコピーは、1番上のブロックは1シートにうまく貼りつくのですが、
残りのシートはすべて2番目のブロックから最後のブロックまでが1シートに貼り付けとなってしまったので
コードを触ってみます。

【77752】Re:特定条件の行に他シートの行を貼り付...
発言  γ  - 15/12/15(火) 7:16 -

引用なし
パスワード
   ----空白1行----
というのが見かけだけで、数式が入っているとかでは?
# 日中はアクセスしないので、別の方のコメントをお待ちください。

【77753】Re:特定条件の行に他シートの行を貼り付...
お礼  さいとう  - 15/12/15(火) 18:20 -

引用なし
パスワード
   空白行のデータをデリートして実行したらうまくいきました!
本当にどうもありがとうございました!

883 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free