- ベストアンサー
セルを抽出する方法とは?
- 連日となっているセルを抽出する方法について教えてください。
- A列の数字が同一の行で、C列とB列の日付が翌日になっている行を探す方法を知りたいです。
- A列には2700種類程度の数字があり、エクセルデータは1万行程度です。マクロや関数などのヒントでも構いません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- KURUMITO
- ベストアンサー率42% (1835/4283)
すべて絞り出すという意味が具体的にはどのようにしたいのかがよくわかりませんが例えば次の式をD1セルに入力してE1セルまで横にドラッグコピーしたのちに下方にもドラッグコピーすればよいでしょう。 データはシリアル値で表示されますのでセルの表示形式で日付にすればよいでしょう。該当する日付が表示されることになります。 =IF(A1="","",IF(COLUMN(A1)=1,IF(COUNTIF(INDEX($C:$C,MATCH($A1,$A:$A,0)):INDEX($C:$C,MATCH($A1,$A:$A,0)+COUNTIF($A:$A,$A1)-1),$B1-1),$B1,""),IF(COUNTIF(INDEX($B:$B,MATCH($A1,$A:$A,0)):INDEX($B:$B,MATCH($A1,$A:$A,0)+COUNTIF($A:$A,$A1)-1),$C1+1),$C1,""))) 該当するセル番地を表示させるのでしたらD1セルには次の式を入力します。 =IF(A1="","",IF(COLUMN(A1)=1,IF(COUNTIF(INDEX($C:$C,MATCH($A1,$A:$A,0)):INDEX($C:$C,MATCH($A1,$A:$A,0)+COUNTIF($A:$A,$A1)-1),$B1-1),CELL("address",$B1),""),IF(COUNTIF(INDEX($B:$B,MATCH($A1,$A:$A,0)):INDEX($B:$B,MATCH($A1,$A:$A,0)+COUNTIF($A:$A,$A1)-1),$C1+1),CELL("address",$C1),"")))
お礼
>>KURUMITO さん ありがとうございます!! 出来ました! ちなみに分かれば教えて頂ければ幸いです。。 この式を入力後、D列に対象の日付が反映されます。 空白セル以外の行を抽出したいのです。 さらに、抽出する際、「A列の対象の数字」が知りたいです。 A B C D 1 123 2013/1/1 2013/12/31 2013/12/31 2 123 2014/1/1 2014/12/31 2014/12/31 3 123 2015/1/1 2015/12/31 上記だとD列が反映されているのは「A1-A3」の「123」なので 「123」が抽出される式が知りたい・・です。 何度も次から次へと申し訳ないです。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! VBAになってしまいますが、一例です。 元データはSheet1の1行目からあり、同SheetのE列に表示するようにしてみました。 Sheet2を作業用のSheetとして使用していますので、Sheet2は全く使用していないSheetにしておいてください。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, endRow As Long, cnt As Long, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Application.ScreenUpdating = False With wS1 .Range("D:D").ClearContents .Rows(1).Insert .Range("A1") = "ダミー" i = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(1, 1), .Cells(i, 1)).AdvancedFilter xlFilterInPlace, unique:=True endRow = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(2, 1), .Cells(endRow, 1)).Copy wS2.Range("A1") .Range("A1").AutoFilter .Range("A1").AutoFilter For k = 1 To wS2.Cells(Rows.Count, 1).End(xlUp).Row .Range("A1").AutoFilter field:=1, Criteria1:=wS2.Cells(k, 1) endRow = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(2, 2), .Cells(endRow, 3)).Copy wS2.Cells(1, 2) For cnt = 1 To wS2.Cells(Rows.Count, 2).End(xlUp).Row - 1 If wS2.Cells(cnt, 3) + 1 = wS2.Cells(cnt + 1, 2) Then With wS2.Cells(Rows.Count, "D").End(xlUp).Offset(1) .Value = wS2.Cells(cnt, 3) .Offset(1) = wS2.Cells(cnt + 1, 2) End With End If Next cnt wS2.Range("B:C").Clear Next k .AutoFilterMode = False wS2.Range("D:D").Copy .Range("E1") .Range("E:E").NumberFormatLocal = "yyyy/m/d" .Rows(1).Delete End With wS2.Cells.Clear Application.ScreenUpdating = True MsgBox "処理完了" End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m
お礼
>tom04 さん VBAとやら、無知なので全くわかりませんが 早速試してみます!! 貴重なお時間ありがとうございました!
- tsubuyuki
- ベストアンサー率45% (699/1545)
ごく一般的な関数と機能でやりたい、かつ作業列を作ってかまわない、 という条件に合致するのであれば、 ご提示の例であれば、D列に D1セル 式:=C1=B2-1 D2セル以降 式:=OR(C2=B3-1,B2=C1+1) とし、フィルタ機能でD列から「TRUE」だけを抽出してやればOKです。 もっと綺麗にやる方法もあるでしょうが、とりあえず参考まで。
お礼
>tom04 さん マクロとか使ったことないので 怪しいですが、まずはやってみます!! ありがとうございます! >tsubuyukiさん ご確認ありがとうございます。 出来るかどうか、一度試してみたいと思います! よろしくお願いします。
お礼
ありがとうございます! これで、ほぼ解決しましたので クローズさせて頂きます。 本当にありがとうございました!!