• ベストアンサー

エクセルのマクロで質問です。

初心者です。 エクセルのマクロで 下記のようなデータを編集したいのですが 111-1111-1111,あああ 111-1111-1111,いいい 111-1111-1111,ううう 111-1111-1111,えええ 111-1111-1111,おおお 222-2222-2222,あああ 222-2222-2222,いいい 222-2222-2222,ううう 222-2222-2222,えええ 222-2222-2222,おおお 333-3333-3333,あああ 333-3333-3333,いいい 333-3333-3333,ううう 333-3333-3333,えええ 333-3333-3333,おおお 111-1111-1111から222-2222-2222に変わる部分で分割して それぞれ別々のシートにして保存したいのですが どういう流れになるのか教えていただけませんか? ソースで説明があると大変助かります。

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

  • ベストアンサー
回答No.2

学習の参考にどうぞ。 111-1111-1111の列がソートされているとの前提で説明します。 シート名が「Sheet1」、111-1111-1111がA列にあるとします。 処理としては、A1とA2、A2とA3というように、上下のセルを比較して違うところ(111-1111-1111から222-2222-2222になる)となるところを探します。 Dim i As Integer Dim toprow As Integer '番号毎のブロック(たとえばA列が111-1111-1111の行)の最初の行番号。最初は1 toprow = 1 For i = 1 To 1000 'とりあえず1000まで '空セルなら、もうデータがないとみなして終了 If Range("A" & i).Value = "" Then Exit For End If 'iが4(4行目)まではIfの中の処理は行われず、iが5になって初めて以下の処理が行われる。 If Range("A" & i).Value <> Range("A" & (i+1)).Value Then '違う番号が見つかったので、今までのブロックを選択してコピー Range("A" & toprow &":B" & i).Copy'範囲は「"A" & toprow &":B" & i」 '新規シートの作成 Sheets.Add '貼り付け ActiveSheet.Paste 'データシートを表示 WorkSheets("Sheet1").Activate '次のブロックの先頭行 toprow = i+1 End If Next i こんな感じです。分からないメソッドや関数は調べてください。 またF8でステップ実行をして動作を確認してください。 お手本とはいえませんが、初心者にはわかりやすいかなとは思います。

ikeuchiya
質問者

お礼

ご回答ありがとうございます! これをそのまま貼り付けて使ったところ 希望していた動作になりとても助かりました! コメント付きだったのでとてもわかりやすかったです。 ただ、まだ内容をしっかり理解できていないので もっと関数やメソッドの理解を深めようと思います。 ありがとうございました!!

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

値だけ問題にするとして (1)A列の値が変わるまでSheet1の値を、Sheet2に代入する。 Sheet1の1行分の各列を代入するごとに、行ポインターを+1してSheet2の次の行を指しておく。 A列が変わったら、シートを増やす(Sheets.addし名前を設定)その最初行に代入。その後は(1)の繰り返し。 代入する場合 (新シート).セル=Seet1.セル の、シートの特定の仕方のコードの書き方を勉強すること。 === 1行づつ、代入しないで、A列が変わった前の行までを、新シートに コピー貼り付けする方法が在る。 次に備えて、尺取虫的にスータートのセルの行番号を保持する変数を 設けて使う。 From=A列が変わった行 To=次にA列の値が変わった行の直上行 の範囲をコピペ

ikeuchiya
質問者

お礼

回答ありがとうございます! 参考にさせていただきます。 まだマクロの書き方を理解していないところがあるのですが、 流れがわかるとイメージしやすくなりました。 ありがとうございます!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 あくまでも、私個人の目算ですが、 (1) 一行ずつ写す方法 (2) オートフィルタを使った方法 (3) ループをしてその範囲を変数に入れていく方法 (1) --> (3) に難しい この中で、量が多くなると、一番、スピードが速いのは、オートフィルタを使った方法です。 >どういう流れになるのか教えていただけませんか? 一応、(2),(3)は、コードを書いてみましたが、コードは必要ないようですね。 たとえば、オートフィルタを使った方法の場合は、一意(ユニーク)のデータを出さなくてはなりませんから、それは、フィルタオプションを使います。適当な場所に以下のデータを出します。 手作業でためしにやってみると、記録マクロでもある程度取れます。 111-1111-1111 222-2222-2222 333-3333-3333 (ただし、これにはタイトル行がないので、最初のダミーのタイトル行を挿入します) 次に、これをループして、オートフィルタに入れて、2行目から全体をコピーして、新しいシートにコピーします。(不思議なことに、見えない行はコピーされません。もしコピーされるなら、バグがあるようですから、SpecialCells(xlCellTypeVisible)を使います。

ikeuchiya
質問者

お礼

回答ありがとうございます。 なるほど! オートフィルタ+記録マクロでも抽出することができますね! 参考になりました!ありがとうございます!

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.3

ひんと 1 キーを覚える(変数に入れる) 2 そのキーの出力シートを作る(既に在るなら切り替える) 3 キーが変わるまで(変数とシートのA列の値 2にもどる これを一行ずつ最後の行まで行う。 2つのシートを同時に扱うので注意が必要(どっちのシート(元のシーとか転記先のシートか)のcellかを意識する

ikeuchiya
質問者

お礼

なるほど、 まったくイメージがわかなかったんですが、 こういう流れになるんですね! 考え方がわかってスッキリしました! ありがとうございます。

回答No.1

>111-1111-1111,あああ これは2列にあるということ?それとも1列にあるのですか? とりあえず「111-1111-1111」だけなら本を片手にできますか? もしそのやり方も検討がつかないなら、ソースを見ても理解は困難でしょう。

ikeuchiya
質問者

補足

ご回答ありがとうございます。 111-1111-1111 と あああ は 別の列になります。 すみません、 もう少し勉強します。

関連するQ&A