- ベストアンサー
エクセルで似た数字を同じ行に並びかえる方法
- エクセル初心者です。文章だけで説明できるか自信がないですが、隣接した列に時間とそれに対応した数値が打ち込まれた100行ほどのデータで、時間に対応した数値を似た数字でそろえる方法が知りたいです。
- 具体的なデータ例を示し、A列とB列、C列とD列の組み合わせで説明しています。時間に対応した数値はそのままで、時間を似た数字でそろえるためにどのような操作が最も簡便なのか教えてください。
- 実際には時間と数値の組み合わせが20パターンほどあり、似た時間で並べて解析したいですが、一つずつ合わせるのには膨大な時間がかかりそうです。効率的な方法をご教示いただければ幸いです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
4組のデータに対応した修正版を紹介します。 使い方は2組の場合と同じように、インデックスの列を追加して、 それぞれ1、2、3、4の数値を入力してください。 カット&ペーストで<A,B>列にして、昇順で並び替えてください。 test3()を実行すれば、希望の結果が得られると思います。 データ組の数は変数にしています。2以上であれば問題なく動作するはずです。 注意点 1)検証が十分ではないので、プログラムに間違いがあるかもしれません。 データ保存後、希望どおりの結果になっているか確認してください。 2)例えば、4組のデータの場合、24列(A~X)を作業列として使いますので、 4組(A~H)以外は空白セルにしておいてください。 3)列幅が足りず、表示が狂う(見かけ上桁落ちする)場合があります。 最終的に列幅を調整してください。 4)前準備も自動化が可能です。興味があれば勉強して、 自動化を試みてください。 Sub test3() '4組データ対応版 Dim k As Integer Dim k0 As Integer Dim m As Integer Dim p As Integer Dim r As Integer Dim s As Integer Dim DATA_Set As Integer Dim threshold As Double DATA_Set = 4 'データの組の数 threshold = 0.1 '閾値を変更するときはココを変えてください k0 = 1 'データ探索開始行です。見出し行がある場合は2にしてください '近似データの抽出 k = k0 Do If Cells(k + 1, "A").Value < Cells(k, "A").Value + threshold Then r = Application.WorksheetFunction.CountA(Range(Cells(k, "A"), Cells(k, "A").End(xlToRight))) For p = 1 To 3 Cells(k, p + r).Value = Cells(k + 1, p).Value Next p Rows(k + 1).Delete Else k = k + 1 End If Loop Until Cells(k + 1, "A") = "" 'データ位置の復元 For m = 1 To DATA_Set For s = 1 To DATA_Set k = k0 Do If Cells(k, m * 3).Value = s Then For p = 1 To 3 Cells(k, 3 * DATA_Set - 3 + 3 * s + p).Value = Cells(k, m * 3 - 3 + p).Value Next p End If k = k + 1 Loop Until Cells(k, "A") = "" Next s Next m '作業カラムの削除 Range(Cells(1, 1), Cells(k - 1, DATA_Set * 3)).Columns.Delete For m = DATA_Set To 1 Step -1 Range(Cells(1, m * 3), Cells(k - 1, m * 3)).Columns.Delete Next m End Sub
その他の回答 (4)
- ka_na_de
- ベストアンサー率56% (162/286)
#2です。 うまくいって幸いです。 >近似データを4つにできれば完璧なのですが、4つに修正する方法もご教授願えないでしょうか? A列とC列の中に0.1以内の近似するデータが3つ以上存在するのでしょうか? それとも、別の列、例えば <A,B><C,D><E、F><G、H>というようにデータが複数あるという意味でしょうか? 補足説明をしていただけないでしょうか? 今日は用時があるので、回答は明日以降になるかもしれません。
補足
また、曖昧な文章を書いてしまってすみません。 >>近似データを4つにできれば完璧なのですが、4つに修正する方法もご教授願えないでしょうか? は、回答者様のご指摘の後者 >それとも、別の列、例えば ><A,B><C,D><E、F><G、H>というようにデータが複数あるとい>う意味でしょうか? です。つまり、A,C,E…列には時間データが、B,D,F…には数値データ が並んでおり、<A,B><C,D>の組み合わせで構成されています。 >今日は用時があるので、回答は明日以降になるかもしれません。 わざわざ、明記していただいてありがとうございます。 懇切丁寧なご対応、誠に感謝しております。
- ka_na_de
- ベストアンサー率56% (162/286)
#2です。 >似た時間で並べて解析したいのですが、 ということは、やはりデータの左右の場所が変わると都合が悪いですね。 前準備が多い方法で申し訳ありませんが、方法を紹介します。 1)新たに<C>列を挿入して、データのある全ての行に数値で「1」を入力 同様に<F列>には数値で「2」を入力。 (データのインデックスとして使います) 2)<A,B,C>列のデータの下に<D,E,F>列のデータをカット&ペーストする。 3)<A,B,C>列を選択し、上部のメニューから、 「データ」→「並べ替え」を選択 「最優先されるキー」を「A列」、「昇順」にチェックを入れて「OK」 4)以下のマクロを標準モジュールに登録して実行 (登録・実行方法が分からなければ、解説します) Sub test2() Dim k As Integer Dim m As Integer Dim val_A As Double Dim val_B As Double Dim val_C As Double Dim threshold As Double '近似データの判定閾値 threshold = 0.1 '閾値を変更するときはココを変えてください k = 1 'データ探索開始行です。見出し行がある場合は2にしてください m = k '近似データの抽出 Do If Cells(k + 1, "A").Value < Cells(k, "A").Value + threshold Then Cells(k, "D").Value = Cells(k + 1, "A").Value Cells(k, "E").Value = Cells(k + 1, "B").Value Cells(k, "F").Value = Cells(k + 1, "C").Value Rows(k + 1).Delete End If k = k + 1 Loop Until Cells(k + 1, "A") = "" '左右データ位置の復元 Do If Cells(m, "C").Value = 2 Then val_A = Cells(m, "A") val_B = Cells(m, "B") val_C = Cells(m, "C") Cells(m, "A") = Cells(m, "D") Cells(m, "B") = Cells(m, "E") Cells(m, "C") = Cells(m, "F") Cells(m, "D") = val_A Cells(m, "E") = val_B Cells(m, "F") = val_C End If m = m + 1 Loop Until Cells(m, "A") = "" '作業カラムの削除 Columns("F").Delete Columns("C").Delete End Sub あくまで、100行程度のデータで使うことを前提にしていますので、 大規模なデータでは、遅くて使えないと思います。 なお、近似データは2つまでと仮定していますので、 3つ以上ある場合は修正が必要です。
お礼
駄文に付き合っていただき、ありがとうございます。 回答者様のマクロ文?をコピペして、実行してみたら、 できました!!!感動です。ホントに助かります。 >なお、近似データは2つまでと仮定していますので、 >3つ以上ある場合は修正が必要です。 とのことですが、近似データを4つにできれば完璧なの ですが、4つに修正する方法もご教授願えないでしょうか? やり方のヒントだけでも結構ですので、よろしくお願いします。 ただ、これだけでも大満足です。ホントにありがとうございました!!!
- ka_na_de
- ベストアンサー率56% (162/286)
こんにちは。 A列1行=1.001、C列1行=空欄 A列2行=2.003、C列2行=空欄 A列3行=2.2、C列3行=空欄 A列4行=4.05、C列4行=空欄 A列5行=8.002、C列5行=7.9 (最後の行のデータ偏差は0.1以上ありますが・・・) という結果でもよいでしょうか?(重複しないデータは左寄せ) 良ければ方法を紹介します。
- black2005
- ベストアンサー率32% (1968/6046)
>時間を似た数字でそろえる 最終目的である、ここが解りません。 似たような数字とは、どういう定義ですか? 数字は、同じor異なるしかあり得ず、似たような・・・という抽象的な表現では他人には理解出来ませんよ。 また、”そろえる”とは、具体的にどうしたいんでしょ? 後半の例は、前半の例を操作した(あなたの言うところの”そろえた”)結果ですか? A1が空欄であったり、前半例のA2=4.05が無くなったりしていますが、そのルールがさっぱり解せません。 こういう並びの数列を、こういう並びの数列に並び替えたい。 並び替えのルールは、こうこうである。 という風に具体的に質問して下さい。 エクセル初心者以前の問題です。
補足
何とか理解しようと試みていただいて ありがとうございます。 補足させていただきます。 計時時間毎に検出される成分の量を解析したいというのが目的で、 検出時間と検出量が、それぞれA列、B列となっています。 ですが、検出時間には、ずれが生じており、小数点1ケタ(ほどの範囲 で時間をそろえて、各検出量を比較したいのです。 EX、 A列1行=空欄、C列1行=1.001 A列2行=2.003、C列2行=2.2 A列3行=8.002、C列3行=7.9 についてですが、適当に書きすぎました。小数点1ケタなので、 正しくは、下記のようになります。 A列1行=空欄、C列1行=1.001 A列2行=2.003、C列2行=空欄 A列3行=空欄、C列3行=2.2 A列4行=4.05、C列4行=空欄 A列5行=8.002、C列5行=7.9 です。 数値が小数点1ケタで合わない場合は、下の行にずれていき、 他列の数値と合うところで、表示される。ようにしたいです。 ご指摘のように、簡潔に説明できなくてすみません。 質問を変えて、 数値の幅を決めて(例えば、2から4)、行列の範囲を指定した のち、特定の行に、その数値をかえすという方法だけでも ご存じでしたら、教えてください。 もちろん、上の解決法があれば、ベストです。
お礼
早速の修正版作成ありがとうございます。 無償でここまで、やっていただいてホントに恐縮です。 実行してみましたが、完璧です。 これを機会に、マクロを勉強してみようと思います。 また、ほかの質問を投稿するかもしれませんが、 その時は、またお世話になるかもしれません。 よろしくお願いします。 これまで、このサイトを活用していて、一番助かりました。 ポイント20点では足りないです。。。 ホントにありがとうございました。