- ベストアンサー
Excel 文字の抽出と置換についての質問
Excel 文字の抽出と置換についての質問です。 次のような数字があります。 「09 3 4」※日付です。間に空白あり。 Aの列の日付の中で、一番新しい日付を抽出し、 その後A列に入っているデータを、 すべて一番新しい日付データに置換えが行えることができるでしょうか? また、もともと数字の入っていなかったセルは数字を入力せず、「NULL」のままにしておきたいです。 [変換前] A1のセル「09 3 4」 A2のセル「09 228」 A3のセル「09 315」 A4のセル「09 2 3」 [変換後] A1のセル「09 315」 A2のセル「09 315」 A3のセル「09 315」 A4のセル「09 315」 ご存知でしたら、ぜひご教授ください。 宜しくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
マクロでないと出来ないね '標準モジュールへ Sub test() Dim vSelect As Variant Dim i As Long vSelect = Range("a1", Cells(Rows.Count, 1).End(xlUp)) Range("a1", Cells(Rows.Count, 1).End(xlUp)).Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin For i = 2 To UBound(vSelect) If vSelect(i, 1) <> "" Then Cells(i, 1).Value = Cells(1, 1) Else Cells(i, 1).Value = "" End If Next i End Sub お試しあれ
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 全体的に、よく分からないですが、たぶん、データベースのテキストファイルのようです。 自分である程度考えてみた結果だとしたら、その過程を書いていただいて、それではできない、と書いていただいたほうが良かったですね。ただ、ご質問者さんのレスを読むと、少し誤解があるような気がします。 セルのNULL にするというのは、たぶん、空っぽのことだと思いますが、テキストファイル出力では、「""」は残りませんので、数式で解決できないことはないはずです。 別のシートに A1~下へ =IF(Sheet1!A1="","",INDEX(Sheet1!$A$1:$A$12,MATCH(1,$B$1:$B$12,0),1)) B1~下へ =COUNTIF(Sheet1!$A$1:$A$12,">="&Sheet1!A1) ------------------------------------- 上記の数式と同じ考え方で作ったマクロです。マクロのコードを作ってみて気が付いたのは、このデータは、Excel上では、非常に壊れやすいようです。以下はあくまでも、文字列であることが条件です。A1からあるという必要性はありません。 適当なブックか、PERSONAL.XLS の標準モジュールに入れて使用します。 '--------------------------------------------- Sub FindMaxDate() Dim rng As Range Dim c As Variant Dim buf As Variant Dim mx As Variant Application.ScreenUpdating = False Set rng = ActiveSheet.UsedRange.Columns(1).Cells For Each c In rng If Len(c.Value) = 6 Then buf = c.Value If mx < buf Then mx = buf End If End If Next c For Each c In rng If Not IsEmpty(c.Value) Then c.Value = mx End If Next c Application.ScreenUpdating = True End Sub
お礼
試したらできました。 私の質問があいまいで、分かりにくかったのにも関わらず、 マクロを丁寧に教えていただきありがとうございました。 これを機に勉強していきたいと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
質問者は質問振りから、エクセルというものを多く経験して無いようだ。 質問のA列のように(内容が)日付を入力することは、すべきじゃない。 しかしどうしてもそうせざるを得ないなら、色々考えても無駄で、発想として、すぐA列を別列で、日付シリアル値(この意味わかってますか)に直すべきだ。関数を使うと結果は別列になるのは分かりますか。 直し方だが 空き列に(B列と仮定しB1に) =DATEVALUE(SUBSTITUTE(("20"&A1)," ","/")) A列が空白行のことも考えて =IF(A1="","",DATEVALUE(SUBSTITUTE(("20"&A1)," ","/"))) と入れる。 年は1桁の場合必ず07のようにするものとすす。 また、その列の書式は日付に設定しておくと見やすい。 これで日付シリアル値という、日付の前後関係を反映した整数値になるから、最新とは、一番大きい数字を探すことになる。 =MAX(B1:B10) 結果は下記例の「普通の式により求めた・・」のセル ーー これでこの後、手操作でA列を上記最新日に置き換えるのが簡単。 ーー それをしない(直接求める)となると配列数式という高等なテクニックにを使うことになる。 質問者には、いままで無縁のやり方だろうが、問題条件が難しいので仕様が無い。 =MAX(IF($A$1:$A$10="","",DATEVALUE(SUBSTITUTE(("20"&$A$1:$A$10)," ","/")))) と入れて、SHIFT,CTRL,ENTERを同時押しする。 全行最新日になる。(下記C列) 例データ A列 B列 C列(配列数式) 09 3 2 2009/3/2 2013/12/31 10 12 4 2010/12/4 2013/12/31 08 11 23 2008/11/23 2013/12/31 12 1 24 2012/1/24 2013/12/31 13 12 31 2013/12/31 2013/12/31 2013/12/31<=普通の式により求めた最新日 ーーー これも質問者に無縁だろうが、VBAでやれは、何と言うこともない課題だ。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 質問内容の回答とは違っているかもしれませんが・・・ A列の日付で一番最後の日付をB列に表示させると解釈して回答させてもらいます。 別セル(B列)に表示させる方法になりますが、 B1セル=IF(A2="","",MAX($A$2:$A$10)) としてオートフィルで下へコピーしてみてください。 尚、A2~A10までに日付のデータがあるとして数式を入力しています。 的外れの回答なら読み流してくださいね。m(__)m
補足
申し訳ございません。。。日付は、空白のはいった文字列状態で入力しなければないません。。(元データのまま加工し、その後システムにインポートする必要があるため、、) しかし、何かで必要になるかもしれませんので、参考にさせていただきたいと思います。 ありがとうございます。
- ookami1969
- ベストアンサー率14% (137/953)
表示のしかたは この方法でないといけないんですか? 試しに「=MAX」で最大値を探そうとやってみましたが結果は「0」で無理でした。 やはり空白が原因ですね。 そのせいで文字列扱いになるので加工は不可です。 なので データとしての数字は「09/03/04」として普通なら「2009/3/4」となってしまいますので 表示形式「ユーザー定義」で「yymmdd」とすれば「090304」のまま表示出来ます。 そうなってようやく「=MAX」が使え、一番新しい日付が探せます あとはフィルタで「NULLと等しくない」で抽出して一番新しい日付を全部にコピペでOKでしょう。
お礼
ご回答ありがとうございます。 ご回答ありがとうございます。 日付は、空白のはいった文字列状態で入力しなければないません。。(元データのまま加工し、その後システムにインポートする必要があるため、、) 方法がわからず、できるかどうかも不明だったため、別の方法で考えたいと思います。
お礼
ありがとうございます。 マクロを実行したらできました。すばらしいです。 ご親切に本当に本当にありがとうございます。