プロが教えるわが家の防犯対策術!

エクセル初心者です。文章だけで説明できるか自信がないですが、どなたか助けてください。

隣接した列に時間とそれに対応した数値が打ち込まれた100行ほどのデータが2つある。

EX、A列(時間:秒)1行=2.003、2行=4.05、3行=8.002…(行が進む  ほど大きくなる) 
  B列(数値)1行=10、2行=5、3行=4(ランダム)
  
  C列(時間:秒)1行=1.001、2行=2.2、3行=7.9…(行が進む   ほど大きくなるがA列と一緒とは限らない) 
  D列(数値)ランダム

 このような場合に、時間に対応した数値はそのまま(AとB,CとDは連 動)で、時間を似た数字でそろえる(少数点1桁くらいの精度)場合
 どのような操作が最も簡便でしょうか?
 EX、
 A列1行=空欄、C列1行=1.001
 A列2行=2.003、C列2行=2.2
 A列3行=8.002、C列3行=7.9

 イメージがつきにくいと思いますが、補足で説明させていただきます
ので、どなたか、私に付き合って、上記のファイル処理を達成させて
ください。

実際には、時間と数値の組み合わせが20パターンほどあり、
似た時間で並べて解析したいのですが、一つずつ合わせていくのでは
膨大な時間がかかってしまいそうです。。。
何卒よろしくお願いします。

A 回答 (5件)

>時間を似た数字でそろえる


最終目的である、ここが解りません。
似たような数字とは、どういう定義ですか?
数字は、同じ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)、行列の範囲を指定した
のち、特定の行に、その数値をかえすという方法だけでも
ご存じでしたら、教えてください。

もちろん、上の解決法があれば、ベストです。

補足日時:2007/06/08 19:25
    • good
    • 0

こんにちは。



 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以上ありますが・・・)

という結果でもよいでしょうか?(重複しないデータは左寄せ)
良ければ方法を紹介します。
    • good
    • 0

#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つ以上ある場合は修正が必要です。
    • good
    • 0
この回答へのお礼

駄文に付き合っていただき、ありがとうございます。

回答者様のマクロ文?をコピペして、実行してみたら、
できました!!!感動です。ホントに助かります。

>なお、近似データは2つまでと仮定していますので、
>3つ以上ある場合は修正が必要です。

とのことですが、近似データを4つにできれば完璧なの
ですが、4つに修正する方法もご教授願えないでしょうか?

やり方のヒントだけでも結構ですので、よろしくお願いします。

ただ、これだけでも大満足です。ホントにありがとうございました!!!

お礼日時:2007/06/09 10:20

#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>の組み合わせで構成されています。

>今日は用時があるので、回答は明日以降になるかもしれません。
わざわざ、明記していただいてありがとうございます。
懇切丁寧なご対応、誠に感謝しております。

補足日時:2007/06/09 11:36
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

早速の修正版作成ありがとうございます。
無償でここまで、やっていただいてホントに恐縮です。

実行してみましたが、完璧です。

これを機会に、マクロを勉強してみようと思います。
また、ほかの質問を投稿するかもしれませんが、
その時は、またお世話になるかもしれません。
よろしくお願いします。

これまで、このサイトを活用していて、一番助かりました。
ポイント20点では足りないです。。。

ホントにありがとうございました。

お礼日時:2007/06/10 00:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!