[[20030918003719]] 『文字列として貼り付けられた日付』(EUREKA) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列として貼り付けられた日付』(EUREKA)

 外部のエクセルデータからCopy&Pasteしたデータで、
 和暦の生年月日の列があります。
 S25/01/25 とか T10/12/20 という表示です。
 このままでは、これらをシリアル値に変換できませんでした。
 古い日付順に並べ替えることもままなりません。

 別の列で =VALUE(参照セル) のワークシート関数を組み込んで、
 文字列数字を数値に変換しなければなりませんでした。以前
[[20030811090130]]『手入力と貼り付けの違い』(Nyal)
といったご質問がありましたが、似たようなことだと思います。

 この =VALUE()関数の機能をVBAで記述できないものでしょうか。
 つまり、貼り付けられた文字列の数字のセルを、
 自動的に数値のセルにしてしまう機能が欲しいのです。

      A       B
 1    S25/01/25    =VALUE(A1)   B列の関数なしで、A列にデータが貼り
 2    T10/12/20    =VALUE(A2)   付けられたら、即自動的にA列が数値に
 ・    ・       ・        変換される方法。    
 ・    ・       ・

 ご教授のほど、よろしくお願い致します。

 よくわからないのですが、

 > S25/01/25 とか T10/12/20 という表示です。

 これらは文字列になっているのでしょうか?  (りな)

 横から失礼します。

 Sub Str2Num()
 Dim Cc As Range
 For Each Cc In Selection
   Cc.Value = DateValue(Cc) * 1
   Cc.ClearFormats
 Next
 End Sub

 選択した範囲を変更します。S, T, H は変換してくれますが、M は駄目です。

 日付じゃない文字列は、DateValue(Cc)*1 を単に、Cc * 1 と変えないとだめです。
 書き加えて自動判別にすることは可能ですが…。

 親分、ルーチン名の 2 を気にしないで下せえ!(通りすがりの者)


 気がつきましたけど、気にしてません。
 (なぜか親分と呼ばれる・kazu)


 貼り付けが終わった後に、一括で日付(数値)にできます。

 参考
[[20021209025031]] 『20020623を2002/06/23に変換する方法...』(yuki) 
 表示形式は適当なものに変更してください。

 数値の1をコピーしておいて、日付(文字)の上に乗算で貼り付け、
 もしくは0をコピーしておいて、同じく加算で貼り付けでも可です。

 私の記憶が正しければ、親分の方が年下だったような。

 (ramrun)お昼休み〜


 りなさん/通りすがりの者さん/ramrunさんへ (EUREKA)

 留守中にこんなにアドバイスをいただきありがとうございます。
 全部トライして自分のモノにします。

 りなさん・・・長年続いているイベントの参加者のリストが,開催日ごとに
 SQLサーバーに蓄積されています。端末機で呼び寄せるとエクセルブックで
 再現され,ファイル保存ができます。たくさんの保存したファイルを統合して,
 ひとつのエクセルブックにまとめているのですが,延べ5万人超分のレコードの
 生年月日フィールドが文字列なのです(当たり前のことなのかも)。

 通りすがりの者さん・・・Mは対象外ですので,大丈夫です。

 0 の加算または 1 の乗算は気がつきませんでした。これが一番! いいことを
 聞きました。(通りすがりの者)

 驚きです!  (EUREKA)

 =VALUE(参照セル)というのは,関数電卓の一発変換ボタンみたいなモンで,
 ramrunさんのおっしゃる通り,時刻・時間・年月日の文字列に四則演算子を
 ぶっつけると数値として戻る!   =VALUE()はこれをやっている訳ですか?

 文字列+0,文字列*1,文字列-0,文字列/1 で 数値に転ぶ!
 エクセルの正規のワザですか? ramrunさん。


 以下はVALUE関数のヘルプです

 >Excelでは、数式中の値は必要に応じて自動的に変換されるため、
 >通常は数式の中でVALUE関数を使用する必要はありません。
 >VALUE 関数は、他の表計算アプリケーションとの互換性を維持するために
 >用意されている関数です。

 Excelでは全角で0001と入力した場合、勝手に
 計算できる数値1として置き換えてしまいます。
 他にも文字で9月19日と全角でワープロ風に入力しても、
 きちんと右揃えで、数式バーにも2003/9/19と表示されていると思います。

 ということでExcelはそもそも、裏で何とか数値にしてやれ〜
 と働いているわけです。

 ユーザー関数でも分かると思うのですが、

 Function test(ByVal v As Integer) As Variant
     test = v
 End Function

 で、この関数に'0001を与えたら、他の言語では間違いなくエラーです。
 引数をInteger型で受けているのですから。
 でもそこはVB。勝手に数値化して1を返してくれます。

 ようはExcelに処理を促すようなきっかけを起こしてやれば
 いいんですよ。
 A1に'0001とあるなら、=--A1という数式をB1に入れてもいいし、
 T10/12/20という文字列などはファイルをCSV形式で出力して、
 開きなおせば日付化してます。
 (ramrun)

 こんにちは

 Sub Str2Num()
 Dim Cc As Range
 For Each Cc In Selection
   Cc.Value2 = CDate(Cc)
   Cc.ClearFormats
 Next
 End Sub 

 通りすがりの者さんのマクロ、こんなふうにすれば文字列としての数字も
 数値に変換できるようですね  (りな)


 ramrunさん・りなさんへ   (EUREKA)
 いろいろありがとうございます。
 文字列を数値に変換したいケースには、結構遭遇します。
 印刷された大量のリストをOCRフォント変換ソフトでデータ化する場合なんかも、
 数字は見事に文字列として取り込まれちゃいます。
 上記のコードをうまく役立てたいと思います。
 通りすがりの者さんにも、感謝です。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.