• ベストアンサー

[エクセル] 表からデータを取り出して、一列にならべる方法はないでしょうか。

仕事でエクセルを使い始めて2~3年くらいで、関数が少し使えるようになった初心者です。どこにいくつ数字が入っているか一定していない表から、数字が入っているセルだけを左上から右下へ順番に抽出して、一列にして表示する方法は無いでしょうか。 現在、目で表を確認しながら手作業で写しています。関数か何かで自動的にする方法があれば教えてください。よろしくお願いします。

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

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

こんばんは。#3のWendy02です。 数式の意味が分かりますでしょうか? =PickupFig(Rng,index) Pickup(範囲,インデックス) 範囲は、お分かりになるかと思いますが、 Indexを入れなくてはなりません。つまり何番目ということです。 それを、Row(A1)関数で入れます。(下記参照) そうすると、Row(A1)は、1 フィルハンドルで、下にドラッグしたら、インデックスは、1,2,3,4,5,... と代入されていきますから、数字が出てきます。 それを入れないで作る方法もありますが、逆に使いにくくなるので、やめました。 [任意の場所] =PICKUPFIG($A$5:$X$20,ROW(A1))  ↓(フィルハンドルをドラッグ) =PICKUPFIG($A$5:$X$20,ROW(A2)) =PICKUPFIG($A$5:$X$20,ROW(A3))     ・     ・     ・     ・

tododesu
質問者

お礼

判りました。ありがとうございました。 ここのところ、ずっとVBAの本を読んで勉強しておりました。 まだ、勉強中ですけど、徐々に意味が判ってきました。 お礼が遅くなってしまってすみませんでした。

その他の回答 (4)

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

VBA向きの問題です。 たった Sub test01() Dim cl r = 1 For Each cl In Selection If cl <> "" Then Cells(r, "L") = cl r = r + 1 End If Next End Sub でできます。 コピーして標準モジュールに貼り付け。 例えば、A-J列にデータがあって、L列にならべるとする。 大きめに範囲指定して(これを忘れないように)、全データが含まれるようにして、実行(=>F5キーを押すと実行) 1 3 5 6 0 b c 2 が 1 3 5 6 0 b c 2 のようになります。

tododesu
質問者

お礼

回答ありがとうございました。 お礼が遅くなってしまいましたが、なんとかなりました。 VBAはこれを機会に勉強していきたいと思います。 ありがとうございました。

tododesu
質問者

補足

すぐに回答いただきありがとうございます。また、連絡が遅くなってすみません。VBAはまったく見たことがなく、何を質問すれば良いのか判らなかったので、入門書を買ってきて読んでおりました。 コピーして標準モジュールに張り付けることはできましたが、範囲指定をする場合に、どこをどうしたら良いのでしょうか。 例えばA5からX20までの範囲のデータを、同じシートか、別のシートのA8から並べる場合はどこに指定するのでしょうか。 基本的なことで申し訳ありませんが、よろしくお願いいたします。

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

こんにちは。 それは、いずれにしても、VBAでないと無理というか、負担が大きすぎるように思います。 >どこにいくつ数字が入っているか一定していない表から、 >数字が入っているセルだけを左上から右下へ順番に抽出して、 並べ替えてよいなら、SMALL()関数で出来るのですが、順番というと、そう行きませんね。 ユーザー定義関数を作りました。 数式の使い方: =PickupFig($A$1:$D$50,ROW(A1)) これを、下に、フィルダウン・コピーします。 '標準モジュールに貼り付けてください。 '----------------------------------------------------------- Function PickupFig(Rng As Range, index As Long) Dim i As Long Dim j As Long Dim k As Long Dim myData() As Double With Rng For j = 1 To .Columns.Count: For i = 1 To .Rows.Count   If VarType(.Cells(i, j).Value) = vbDouble Then    ReDim Preserve myData(k)    myData(k) = .Cells(i, j).Value    k = k + 1   End If Next i: Next j End With index = index - 1 If index <= UBound(myData()) Then  PickupFig = myData(index) Else  PickupFig = "" End If End Function

tododesu
質問者

補足

すぐに回答いただきありがとうございました。VBAは初めてで入門書を買ってきて読んでおりました。 標準モジュールに張り付けると、新しい関数が使えるようになることまで理解できたのですが、実際にやってみるとエラーが出てしまいます。 例えば、A5からX20までの範囲を指定して、同じシートまたは別のシートに縦でも横でも良いのですが、順番に並べるためには、どのようにこの関数を使えば良いのでしょうか。 本当に基本的なことで申し訳ないのですが、よろしくお願いいたします。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

マクロを使ってよいなら、以下の方法で Sheet1 のセルにある数値を Sheet2 のA列に抽出できます。 Alt+F11でVBAの画面を起動する。 「挿入」>「標準モジュール」を選択する。 右側の白いところに、以下のマクロをコピーして貼り付け、F5キーを押して実行する。 ※Sheet1、Sheet2というシート名でないところは、マクロの中に出てくるシート名を実際の名前に置きかえてください。 ※同じシートに抽出したい場合は、データが入っているのがどのセル範囲で、どの列に抽出したいか補足していただければ、そのように修正します。 Sub 数字を抽出()   Dim ReadCell As Range, WriteCell As Range   Set WriteCell = Worksheets("Sheet2").Range("A1")   For Each ReadCell In Worksheets("Sheet1").UsedRange     If IsNumeric(ReadCell.Text) Then       WriteCell.Value = ReadCell.Value       Set WriteCell = WriteCell.Offset(1, 0)     End If   Next End Sub

tododesu
質問者

お礼

回答ありがとうございました。 お礼が遅くなってしまいましたが、なんとかなりました。 VBAはこれを機会に勉強していきたいと思います。 ありがとうございました。

tododesu
質問者

補足

すくに回答いただきありがとうございました。VBAそのものが全く理解できなかったので、入門書を買ってきて読んでおりました。 例えば、A5からX20までの範囲のデータを同じシート(または別のシート)に縦(または横で)一列に順番にならべるとすると、どのようにしたらよいのでしょうか。 また、この処理を、31回、同じシート内で行う場合は、どのようにしたらよいのでしょうか。 本当に基本的なことが判っていなくて、申し訳ないのですが、よろしくお願いいたします。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

1.表を「text.csv」など、ファイルの種類を「CSV(カンマ区切り)」にして「名前を付けて保存」する 2.エクセルを終了し、保存した「text.csv」をメモ帖など、テキストファイルの編集が出来るソフトに読み込む 3.メモ帖の文字列の置換の機能で「,,を,に置換するのを、,,が無くなるまで」繰り返す。すると「,,,,」や「,,,」や「,,」など、カンマの連続がカンマ1つになればOK 4.各行の行頭に「,」がある場合のみ、行頭の「,」を手作業で削除する 5.各行の行末に「,」が無い場合のみ、手作業で行末に「,」を足す 6.すべてを繋げて1行にしてしまう。但し、長くなり過ぎないように注意 7.メモ帖で上書き保存 8.エクセルで「text.csv」を開くと、全部のデータが1行になって表示されるので、その行をコピー&ペーストして、目的の表に貼り付ける

tododesu
質問者

お礼

回答ありがとうございました。 お礼が遅くなってしまいましたが、なんとかなりました。 VBAはこれを機会に勉強していきたいと思います。 ありがとうございました。

tododesu
質問者

補足

すぐに回答いただきありがとうございました。 やってみましたらできました。この方法ならば、私のような初心者でもできますね。 ただ、毎月、31回やらなければいけないので、この手は奥の手として、No.2さん、No.3さん、No.4さんに教えていただいたVBAに挑戦してみようと思います。

関連するQ&A