• ベストアンサー

エクセル(2003) 「1900/1/0」を消したい

セルA1に0を入力し 書式設定で日付→yyyy/m/dを選択しました。 しかし下記のマクロ実行しても 0が空白になりません。 Sub 日付置換() Cells.Replace what:="1900/1/0", Replacement:="", LookAt:=xlPart Cells.Replace what:="00/01/00", Replacement:="", LookAt:=xlPart Cells.Replace what:="0", Replacement:="", LookAt:=xlWhole End Sub なら最初から0なんか入力しなきゃいいじゃん。 と思われるかもしれませんが これはCSVファイルで出力したもので 最初から0の数値にも書式設定がかかってて「1900/1/0」となっています。 「1900/1/0」のデータをなくしたいのですが どんな方法がありますか? データ量が多いためマクロなどで一度に行ないたいです。 アドバイスよろしくお願いします。

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.4

>セルA1に0を入力し >書式設定で日付→yyyy/m/dを選択しました。 単純ですが 書式設定をユーザー定義で→yyyy/m/d;; としてみてください。 0の時の表示が1900/1/0からブランクに変わります。

lkhjlkhjlk
質問者

お礼

こんな方法があるのですか。 初めて知りました。 参考になりました。 ありがとうございます。 「;;」を付ける事によって、 「0なら空白」という意味になるのでしょうか?

その他の回答 (8)

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

こんにちは。 #5の回答者です。 少し、読み直し、いろいろ考えてみました。 >これはCSVファイルで出力したもので >最初から0の数値にも書式設定がかかってて「1900/1/0」となっています。 たぶん、マクロか何かでインポートしているのでしょうか? 書式設定が掛かっているかは別として、型キャストが起きていれば正しい日付値になっているはずです。しかし、「1900/1/0」が存在していますから、どうやらワークシート上では、日付値にもなっていないはずです。つまり、型キャスト(該当する書式で値が変更)が、おきていないようです。 テキストのソースのまま、処理しても可能だと思うのですが、CSVは、列に対しては、取り扱いが煩雑になります。だから、ワークシートにインポートし、もう一度、区切り位置で処理すれば、ワークシート上なら、日付書式にならないものは、はじき出されて、文字列になるはずです。それは、手動でも、そんなに大変ではないはずです。 ご質問の要求が、マクロ・コードを書かれていますから、あえてマクロ化しました。 「0」自体は、そのままなら、置換できるはずですから、その部分のコードは書いていません。 こちらの書いた、マクロについては評価しなくても構わないのですが、Excelの持つ機能からの操作は、マクロを使わなくても分かるはずです。ご質問者さんの技術の理解度とは別に、数値と日付値の区分け程度は、VBAで求めた方が良いのではないかなって思います。 '------------------------------------------- Sub FindStrings()   Dim rng As Range   Dim col As Range   Dim r As Range   With ActiveSheet     Set rng = .Columns("A:B") 'インポートされた範囲     On Error Resume Next     For Each col In rng.Columns       If WorksheetFunction.Count(col) > 1 Then         col.TextToColumns _         Destination:=col.Cells(1, 1), _         FieldInfo:=Array(1, 5)         Set r = col.SpecialCells(xlCellTypeConstants, xlTextValues)         If Not r Is Nothing Then           r.ClearContents '書式はクリアしない・値だけ         End If       End If      Next col     On Error GoTo 0   End With   Set rng = Nothing End Sub '-------------------------------------------

lkhjlkhjlk
質問者

お礼

コードの意味は難しいですができました! ありがとうございます。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.8

またまたまた登場、myRangeです。 >最初に書式を"G/標準"にするのはなぜなのでしょうか? 書式を日付(yyyy/m/d)にしておくと、 Replaceでは実際の値である0を捉えられないようなので Replaceで捉えられるように実際の値0をそのまま表示させておくためです。 こんなんで説明になってますか? 以上ここまで。    

lkhjlkhjlk
質問者

お礼

何度もありがとうございます。 Replaceは奥が深いですね。 参考になりました。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.7

またまた登場、myrangeです。 恥ずかしながら回答6にポカあり。 回答6でReplaceを関数と連呼してますが 正しくは、Replaceメソッドです。。。(^^;;;   以上ここまで。  

lkhjlkhjlk
質問者

お礼

そうなんですか! まったく気づきませんでした!

  • myRange
  • ベストアンサー率71% (339/472)
回答No.6

回答3、myrangeです。 上手くいったようで何より。。 >一度、"G/標準"にすることにより、0は文字列と認識されて >Replaceで置換できるのでしょうか? 0は文字列ではなく数値です。 どうもReplace関数について勘違いがあるようです。 ●Replace関数は、文字列、数値、どちらでも置換可能● 新しいシートで以下を試してみれば分かるでしょう。 A1とB1に、0 A2とB2に、100 A3とB3に、1020 を入力しておき次を実行 Sub Test() Range("A:A").Replace What:="0", Replacement:="", LookAt:=xlPart Range("B:B").Replace What:="0", Replacement:="", LookAt:=xlWhole End Sub どうでしょう、0は置換されてるはずです。 これで数値も置換されるということが分かりますね。 また、A列とB列の結果に違いがあることも気付いた思います これは、引数LookAtの値(xlPart,xlWhole)の違いによります。 質問の件では回答3で示したとおり、xlWholeを使わなければいけません。 理由は分かりますよね。 Replace関数のように引数のある関数を理解するときは 引数の値を変えながら色々試してみることをお勧めします。   以上ここまで。

lkhjlkhjlk
質問者

お礼

再度ご回答ありがとうございます。 Replace関数は数値でも文字列でも使えるのですね。 まだよく理解していない為わからないのですが 最初に書式を"G/標準"にするのはなぜなのでしょうか? 質問ばかりですいません、、、

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

こんばんは。 この出来ないのは、Excel 2000 での仕様だと思っていました。上位バージョンでもメニューから置換する方法は出来るのですが、VBAからはできません。当然と思う方もいるようですが、私は、これは、隠れたバグのようなトラブルのひとつだと思っています。 ただし、置換する方法もあるのですが、ものすごく難しいテクニックが必要になってしまいます。 以下は、数値の1 は、"1900/1/1" と区分けします。 書式は、そのままで行います。 '-------------------------------------------------------- Sub Tes1()   Dim r As Range   Dim c As Range   Const sD1 = "1900/1/1"   Const sD2 = "1900/1/0"   Const sD3 = "0"   With ActiveSheet     On Error Resume Next     Set r = .UsedRange.SpecialCells(xlCellTypeConstants, 23)     If r Is Nothing Then MsgBox "検索対象の数値がありません。", vbExclamation: Exit Sub     On Error GoTo 0     For Each c In r       If StrComp(sD1, c.Text) * StrComp(sD2, c.Text) * StrComp(sD3, c.Text) = 0 Then         c.ClearContents       End If     Next c     End With   Set r = Nothing End Sub '--------------------------------------------------------

lkhjlkhjlk
質問者

お礼

ご回答ありがとうございます。なんだかよくわかりませんができました。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

方法はいくつかあると思いますが、一案。  A列を対象とした場合。 (1)A列の書式を標準にする (2)0を変換する (3)A列の書式を、yyyy/m/d に戻す '------------------------------------- Sub 日付置換() Range("A:A").NumberFormatLocal = "G/標準" Range("A:A").Replace What:="0", Replacement:="", LookAt:=xlWhole Range("A:A").NumberFormatLocal = "yyyy/m/d" End Sub '------------------------------------- 以上ここまで。

lkhjlkhjlk
質問者

お礼

できました。 ありがとうございます。 一度、"G/標準"にすることにより、0は文字列と認識されて Replaceで置換できるのでしょうか?

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

Replaceは文字に対して有効です。 例えば、102345という「数字」が入っているセルに、ご質問のReplaceを実行しても、0が無くなって12345にはなりませんよね? 日付はエクセルでは特殊なデータですが、どちらかと言えば数字に近いもので、文字ではありません。(計算が可能) 手っ取り早いのは、 「ツール」-「オプション」-「表示」で「ゼロ値」のチェックをはずせば0が表示されなくなります。(2003の場合) ただし、この方法だと、他のセルに(表示が必要な)数字の0が入っていても表示されなくなってしまいます。 マクロでやる場合は、面倒ですが、各セルの値(または表示文字)をチェックして置き換えてあげる必要がありそうです。 先に、対象になるセルの範囲が限定できれば  For Each Cell In Range などの方法でループするのがよろしいでしょう。 その範囲内に、普通の数字0(←こちらは消したくない)が含まれているような場合は、表示書式と値の両方をチェックするか、または、表示テキストが 1900/1/0のものを決め打ちで空白にすればよいのでは?

lkhjlkhjlk
質問者

お礼

Replaceが文字だけとは初めて知りました! ありがとうございます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

こんな感じでいかがでしょうか? Sub zero() Dim c As Range For Each c In Range("A1:Z999") If c.Value = 0 Then c.Value = "" Next End Sub

lkhjlkhjlk
質問者

お礼

できました! 0なら""にしているのですね!ありがとうございます。

関連するQ&A

  • CSVファイルの「20090423」を日付型の「2009/4/23」へ変換したい

    CSVファイルには書式設定が標準で「20090423」と入力されていますが これを日付型の「2009/4/23」へ変換したいのですがどうすればいいでしょうか? 現在は With Columns(1) .Replace what:="200809", Replacement:="2008/09/", LookAt:=xlPart .Replace what:="200810", Replacement:="2008/10/", LookAt:=xlPart .Replace what:="200811", Replacement:="2008/11/", LookAt:=xlPart .Replace what:="200812", Replacement:="2008/12/", LookAt:=xlPart .Replace what:="200901", Replacement:="2009/01/", LookAt:=xlPart .Replace what:="200902", Replacement:="2009/02/", LookAt:=xlPart End With とやっていますが量が多くて追いつけません。 ご教授よろしくお願いします。

  • シート内のひらがなを全て削除したい

    こんばんは。エクセル2003です。 シート内の全てのひらがなを削除して 英数字、漢字、記号のみを残したいのですが Cells.Replace what:="あ", Replacement:="", LookAt:=xlPart Cells.Replace what:="い", Replacement:="", LookAt:=xlPart Cells.Replace what:="う", Replacement:="", LookAt:=xlPart ・ ・ ・ Cells.Replace what:="ん", Replacement:="", LookAt:=xlPart とやっていくしかないでしょうか? 何か効率のいい方法があれば教えて頂ければ助かります。 よろしくお願いします。

  • Cells.Replace What:="*234

    このような事は出来ないのでしょうか? 「2345」で終わる文字列を検索して 「2345?」にしたいのですが Sub test() Cells.Replace What:="*2345", Replacement:="*2345?", LookAt:=xlWhole End Sub を実行すると「a12345」が「*2345?」になってしまいます。 お尻のみ完全一致で「2345」以前の文字列は変更せず 「a12345」を「a12345?」にするにはどうすれば良いでしょうか? 実際の置換妻帯データは 「5」と「?」が連続している訳ではないので Sub test() Cells.Replace What:="5", Replacement:="5?", LookAt:=xlPart End Sub は考えていません。

  • LookAt の定数を変数で指定するには?

    エクセルvbaです。 Sub test() Dim strLookAt As String strLookAt = "xlPart" Cells.Replace What:="aaa", Replacement:="iii", LookAt:=strLookAt End Sub このようなことはできないのでしょうか? LookAtの部分のxlWhole または xlPart かをシートから読み取って変数に格納し、 Replace メソッドで置換したいのですが、 このコードを実行すると「型が一致しません」になります。 多分、LookAt:=strLookAtでエラーになってるのだと思います。 String型だからいけないのでしょうか? 回避方法を教えてください。よろしくお願いします。

  • excelのvbaを使って日付を置換したいのです

    こんにちは。いつも質問ばかりですみません。 今、excell の VBAの勉強をしているのですが、たとえば、B列に2004/5/3 とか、2004/5/5とか、5月の日付ばかりはいっていたとして、その2004/5の部分を2004/6に置換したいとします。 それを、マクロでやらせてみて、VBAを見ると Sub Macro9() Cells.Replace What:="2004/5", Replacement:="2004/6", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub のようになるのですが、このプロシージャーを実行しても、うまく置換できません。 どのように記述したら、できるのか、教えていただけるとうれしいです。 よろしくお願いいたします。

  • Excel VBA で 選択セルの一部を置換

    こんにちは。お願いします。 選択セルの文字列の右端が"号"、"番地"、"番"だったときに、それを消す、というマクロを作ろうとして、以下のようになりました。 Sub adrconv() Dim c For Each c In Selection If Right(c.Value, 1) = "号" Or Right(c.Value, 2) = "番地" Or Right(c.Value, 1) = "番" Then c.Replace what:="号", replacement:="", lookat:=xlPart c.Replace what:="番地", replacement:="", lookat:=xlPart c.Replace what:="番", replacement:="", lookat:=xlPart End If Next c End Sub お気づきかもしれませんが、これでは右端の"番"だけでなくどの"番"も消えてしまうのです。 右端の文字のみ消す方法をご教示願います。 よろしくお願いいたします。

  • エクセルのマクロにLEFT関数のような働きはありませんか?

    顧客データから抽出したデータの、書式を整える作業を自動記録したマクロを使ってやっています。 データの住所欄から、市か郡から下の部分を削除する作業があるのですが、抽出される顧客データは毎日違うので、自動記録のマクロでは出来ないため、この部分は手作業で行なっています。 この「住所の市または郡から下の部分を削除する作業」をマクロで行なう方法は無いでしょうか? 自動記録のマクロでは以下のようになっています。 Cells.Replace What:="○○県××市○○町1-2-3", Replacement:="○○県××市", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ReplaceFormat:=FalseCells.Replace What:="○○県**市△△町4-5-6", Replacement:="○○県**市", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ マクロに、ワークシート関数の=LEFT(A1,(FIND("市",A1)))と同じ様な働きを記述できればいいのか?とも思うのですが、やり方がわかりません。

  • 例題を繰り返しマクロで記述したい

    ネットや本でマクロを作成しているいて、あまりマクロの意味も分からず作成しています。 下記のマクロの記述を繰り返しマクロで記述したいので、御指導願います。(H列で終わっていますが、できれば隣のセルが空白になるまで繰り返すようにしたい。) あと、自分の欲しい内容に修正出来るように、記述の意味などもコメントして頂けたら嬉しいのですが・・・。よろしくお願いします。 Sub 最終履歴を表示する(2)() Range("C4").NumberFormatLocal = "G/標準" Range("C4").Value = Application.WorksheetFunction.Max(Range("C6:C10000")) Range("C4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("C4").NumberFormatLocal = "yyyy/m/d;@" Range("D4").NumberFormatLocal = "G/標準" Range("D4").Value = Application.WorksheetFunction.Max(Range("D6:D10000")) Range("D4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("D4").NumberFormatLocal = "yyyy/m/d;@" Range("E4").NumberFormatLocal = "G/標準" Range("E4").Value = Application.WorksheetFunction.Max(Range("E6:E10000")) Range("E4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("E4").NumberFormatLocal = "yyyy/m/d;@" Range("F4").NumberFormatLocal = "G/標準" Range("F4").Value = Application.WorksheetFunction.Max(Range("F6:F10000")) Range("F4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("F4").NumberFormatLocal = "yyyy/m/d;@" Range("G4").NumberFormatLocal = "G/標準" Range("G4").Value = Application.WorksheetFunction.Max(Range("G6:G10000")) Range("G4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("G4").NumberFormatLocal = "yyyy/m/d;@" Range("H4").NumberFormatLocal = "G/標準" Range("H4").Value = Application.WorksheetFunction.Max(Range("H6:H10000")) Range("H4").Replace What:="0", Replacement:="履歴無し", LookAt:=xlWhole Range("H4").NumberFormatLocal = "yyyy/m/d;@" End Sub

  • Excelマクロ 置換について教えてください。

    A列の,10を,15に置換したいので下記マクロを記録しました。 ほかに,10を,16などにしたい場合もあるため、 入力画面を表示して初期値は,10から,15ですが、ほかを入力した場合は他の値で置換するマクロを教えてください。 Sub Macro1() Columns("A:A").Select Selection.Replace What:=",10", Replacement:=",15", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub

  • 置換のマクロ

    先ほど質問させていただいている件なのですが 余りにも自分が記入した内容が分かりにくいので質問形式を変更します。 「置換」をするのに ボタンで簡単にできるよう以下のマクロを記録しました。 Sub Macro1() ActiveWindow.SmallScroll Down:=-15 Range("E7:AC7").Select Selection.Replace What:="2009年度契約", Replacement:="8.24-8.29", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False Range("E14:AC14").Select Selection.Replace What:="2009年度契約", Replacement:="8.24-8.29", LookAt:=xlPart, _ このマクロの「8.24-8.29」の部分を「シート名取得」にしたいのです。出来ないでしょうか? もしくは BOXを出し任意のものを手で入力するようにコメントを出す様には出来ないでしょうか?

専門家に質問してみよう