- ベストアンサー
ランダムに出てくるデータの抽出
こんにちは。 マクロ初心者です。 A B C D E F G 1 あ あ う う う え お 2 あ あ い い い お 3 い 4 5 う お 6 う お 7 8 あ お え え え お 9 あ い う え お 10 お い い い え 上記のような表があるとき。 1の行には「あ・う・え・お」 2の行には「あ・い・お」 3の行には「い」 4の行には「データなし」 5の行には「う・お」 6の行には「う・お」 7の行には「データなし」 8の行には「あ・え・お」 9の行には「あ・い・う・え・お」 10の行には「い・え・お」 このように、『行ごとに何のDataが存在しているかを取り出す』ようなマクロを組みたいのです。 関数でも可能だと思うのですが、出来るだけエクセルシートの容量を減らしたいのでマクロで組みたいと考えています。 このデータは、上記の例では5個ですが、1000個ぐらいあり全てランダムに出てきます。 何か条件が付いているデータの抽出という質問は、よく見かけるのですが、 このように何を条件とすれば良いのかわからない場合は、どのようにすれば良いのでしょうか。 どのようにマクロを組んだら良いかわからず困っています。 何卒アドバイスをお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
この問題もVBAの数をこなしてない人には難しいと思う。 (1)2つのシートにまたがる処理のことも判ってないだろうから、 (2)また特有のロジックに結びつけて処理する方法 下記の2重ForNextループに持っていくアイデア など難しいはずだ。 結局丸投げ質問にならざるを得ない。 ーー 例データ 質問と同じデータを使った。 ーー 結果 あ う え お あ い お い う お う お あ お え あ い う え お お い え ーーーー コード(標準モジュールに) Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet2") Set sh2 = Worksheets("Sheet3") d = sh1.Range("a65536").End(xlUp).Row k = 1 For i = 1 To d l = 1 If sh1.Cells(i, "a") = "" Then GoTo p1 Else For j = 1 To 7 c = Application.WorksheetFunction.CountIf(Range(sh1.Cells(i, 1), sh1.Cells(i, j)), sh1.Cells(i, j)) If c = 1 Then sh2.Cells(k, l) = sh1.Cells(i, j) l = l + 1 End If Next j End If p1: k = k + 1 Next i End Sub データはG列までと仮定(実情で7を修正のこと) データ数が多いようなので、実行時間はかかるかも。 >>何か条件が付いているデータの抽出という質問は、よく見かけるのですが、このように何を条件とすれば良いのかわからない この発想は適当でない。重複排除する方法を見つけることを考えることだ。 各行で Find法(見つかれば重複) 総なめ判別法(同じ値のセルは無いかIFで聞いて回る) Countif法(1でなければ重複) など考えられる。
その他の回答 (1)
- n-jun
- ベストアンサー率33% (959/2873)
Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html 私がよく使う手です。 行・列が逆になってますので大変でしょうが、 何をどうしたいのかがちょと不明なので、参考まで。
お礼
n-jun様 回答ありがとうございます。 いろんなやり方があるんですね。 参考まで、との事ですが、この方法で問題ありませんでした。 行列の入れ替えは何とか自分でも出来ました。 教えていただいたコードを、自分でも作れるよう勉強します。 ありがとうございました。
お礼
imogasi様 回答ありがとうございます。 >この発想は適当でない。重複排除する方法を見つけることを考えることだ。 >各行で >Find法(見つかれば重複) >総なめ判別法(同じ値のセルは無いかIFで聞いて回る) >Countif法(1でなければ重複)など考えられる。 大変参考になります。 確かにVBA初心者ですので、考え方はおろか、回答の内容を理解するのさえ難しいです。 教えていただいたコードや、考え方を参考にさせていただき、自分でも作れるように努力します。 ありがとうございました。