Excel VBA質問箱 IV

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

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


6339 / 13644 ツリー ←次へ | 前へ→

【45801】Do until について さくら 07/1/14(日) 20:37 質問[未読]
【45803】Re:Do until について Kein 07/1/14(日) 21:39 回答[未読]
【45809】Re:Do until について さくら 07/1/14(日) 22:30 質問[未読]
【45811】Re:Do until について Kein 07/1/14(日) 23:35 回答[未読]
【45815】Re:Do until について さくら 07/1/15(月) 5:46 お礼[未読]

【45801】Do until について
質問  さくら E-MAIL  - 07/1/14(日) 20:37 -

引用なし
パスワード
   エクセルVBA初心者です。Do untilを使って以下の作業をしたいです。

商品製造時期を管理しているデータです。

1.「sheet1」のA列には西暦4桁が昇順で入力されています。
 (例)2001→A2からA5まで入力、2002→A6からA10まで入力

2.B列には西暦が変わっている箇所に「1」を入力しています。
 (他はブランクにしています。)
 2001の西暦のかたまりを行ごと選択し、別シートに貼り付けます。
 (「1」から次の「1」が入力されている1行上迄を選択するイメージ)

3.「sheet1」から2.のかたまりを行ごと削除し、次の2002の処理を実行します。

説明が下手ですみません・・・
半日悩んだのですが、解決できずに投稿しました。。
よろしくお願い致します。

【45803】Re:Do until について
回答  Kein  - 07/1/14(日) 21:39 -

引用なし
パスワード
   A列の各年度毎に新規シートを挿入し、それぞれの年度のデータをA1からコピーする。
ということがしたいのでしょーか ? いちおうそれを前提に組んでみました。

Sub Mk_NewSheets()
  Dim Cnt As Long, i As Long, Rw As Long
  Dim MyR As Range, C As Range
  Dim Ttl As Variant, Ary As Variant
 
  Application.ScreenUpdating = False
  Sheets("Sheet1").Activate: Ttl = Rows(1).Value
  With Range("A2", Range("A65536").End(xlUp)).Offset(, 1)
   .Formula = "=IF($A2<>$A3,$A2&"",""&COUNTIF($A$2:$A2,$A2))"
   .Value = .Value
   Set MyR = .SpecialCells(2, 2)
  End With
  Cnt = Worksheets.Count
  Worksheets.Add After:=Worksheets(Cnt), Count:=MyR.Count
  For Each C In MyR
   i = i + 1: Ary = Split(C.Value, ","): Rw = CLng(Ary(1))
   With Worksheets(Cnt + i)
     .Name = CStr(Ary(0))
     .Rows(1).Value = Ttl
     C.Offset(-1 * (Rw - 1)).Resize(Rw).EntireRow _
     .Copy .Range("A2")
     .Range("B:B").ClearContents
   End With
   Erase Ary
  Next
  MyR.EntireColumn.ClearContents: Set MyR = Nothing
  Application.ScreenUpdating = True
End Sub

【45809】Re:Do until について
質問  さくら E-MAIL  - 07/1/14(日) 22:30 -

引用なし
パスワード
   Kein さん早速ご回答いただき、ありがとうございました!
私の言葉足らずで申し訳ございません。。。

>A列の各年度毎に新規シートを挿入し、それぞれの年度のデータをA1からコピーする。
>ということがしたいのでしょーか ?

1.新規シートを作成せずに、あらかじめ設定してあるシート(「work」シート)に2001年データのかたまりを貼り付けます。

2.「work」シートでは2001年データの加工作業のマクロを実行させます。
 (印刷など)

3.2.のマクロが終了したら「sheet1」と「work」シートから2001年のデータを削除し、2002年データの作業を行います。

こんなイメージです。。。

【45811】Re:Do until について
回答  Kein  - 07/1/14(日) 23:35 -

引用なし
パスワード
   では、こんな感じで。

Sub MyYear_Data()
  Dim Sh1 As Worksheet, Sh2 As Worksheet
  Dim MyR As Range, MyR2 As Range, C As Range
  Dim Rw As Long
 
  Set Sh1 = Worksheets("Sheet1"): Set Sh2 = Worksheets("work")
  Application.ScreenUpdating = False
  With Sh1.Range("A2", Sh1.Range("A65536").End(xlUp)).Offset(, 1)
   .Formula = "=IF($A2<>$A3,COUNTIF($A$2:$A2,$A2))"
   .Value = .Value
   Set MyR = .SpecialCells(2, 1)
  End With
  For Each C In MyR
   Rw = C.Value
   Set MyR2 = C.Offset(-1 * (Rw - 1)).Resize(Rw).EntireRow
   MyR2.Copy Sh2.Range("A2")
   Sh2.Range("B:B").ClearContents

   'ここへ変数 Sh2 を使って、コピーしたデータの加工をするコードを書く
   
   MyR2.ClearContents: Set MyR2 = Nothing
  Next
  Sh2.Activate
  Set MyR = Nothing: Set Sh1 = Nothing: Set Sh2 = Nothing
  Application.ScreenUpdating = True
End Sub

【45815】Re:Do until について
お礼  さくら E-MAIL  - 07/1/15(月) 5:46 -

引用なし
パスワード
   Kein さん、どうもありがとうございました!
イメージ通りです♪

参考書やネット上のサンプルを参考にしていたのですが、
なかなか前進せず、困っていました。
今後もよろしくお願いいたします!!

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