- ベストアンサー
EXCEL: 日付を残す関数
どなたか教えてください。 伝票明細に度々同じような編集を加えるので、自動的に編集した日付を履歴として残すようにしたいのです。 ↓ 明細行の一番左側(A5)に、プルダウンリスト(入力規則)から「入庫」または「出庫」を選ぶと、自動的にとなりのセルにその日の日付が入力されるようにする。 私が考えたのは、次のとおり。 (B5)にひとまずToday関数を入れる。→(C5)に次の関数を入れる。 C5=IF(OR(A5="入庫",A5="出庫"),B5,"") けど、これじゃ値ではなく数式をもってきちゃうので、別な日に開くと日付が更新されてしまうのです。 どうすればよいですか?よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>入力セルをA5,A6だけではなく、列Aすべてに有効にするには Private Sub Worksheet_Change(ByVal Target As Range) With Target If(.Column = 1 ) then 'A列ならば If (.Value = "入庫" Or .Value = "出庫") Then '入力値チェック Range("B" & CStr(.Row)) = Date '日付を表示 Else Range("B" & CStr(.Row)) = "" 'セルのクリア End If End If End With End Sub に変更してください。 >Range("B" & CStr(.Row)) = Date '日付を表示」の部分の >「& CStr(.Row)) 」はどういう意味になっているのですか? セルを指定する場合、VBAでは、 Range("A1") Cells(1,1) 'Cells(行番号,列番号) のように指定します。 Cstr(.Row)は実際には With Targetを受けて Cstr(Target.Row)の事です。(Tagetは入力セル .Rowは行) Target.Rowは入力セルの行番号を数値で返しますのでCstr()で文字に変換しています。 (str()だと数値の前にスペースが入る(今はよく知りませんが)為、Cstr()にしています) 昔の知識をそのまま現在も使用しているので、もしかしたら、変換しなくても うまくいくのかもしれませんが・・・ Range("B" & CStr(.Row))の代わりに Cells(.Row,2)でも同様になります。 今回はB列という事がわかり易いようRangeを使用しました。
その他の回答 (3)
- taisuke555
- ベストアンサー率55% (132/236)
関数を関数で値に変換することはできないと思います。 手動でしたらimogasiさんの(2)の方法で、関数の入ったセルを選択し、 [F2]→[F9]で関数を値にするのが、簡単かと思います。 VBA(マクロ)でよければ、 1、[Alt]+[F11]を押す。VisialBasicEditerに変更されます。 2、左上にプロジェクトと書いてある中に、 VBAProject(現在のブック名) └Microsoft Excel Objects ├Sheet1 ・・・ └ThisWorkbook とあると思うので、Sheet1(伝票明細のシート)をダブルクリック 3.以下のコードを貼り付ける ***************************この下から***************************** Private Sub Worksheet_Change(ByVal Target As Range) With Target Select Case .Address(False, False) '入力セルのアドレス Case "A5", "A6" If (.Value = "入庫" Or .Value = "出庫") Then '入力値チェック Range("B" & CStr(.Row)) = Date '日付を表示 Else Range("B" & CStr(.Row)) = "" 'セルのクリア End If End Select End With End Sub ***************************この上まで*************************** 4.[Alt]+[F11]を押す。Excelに戻ります。 5.Sheet1のA5,A6で[入庫],[出庫]のどちらかを入力すると隣のセルに日付が表示されます。 (プルダウンリスト)の選択でもできると思います。 詳細が分かりませんでしたので、1シートにしか対応させていません。 おかしい所や分からない事があれば補足してください。
補足
こんにちは。 やってみたらできました!すばらしいっ。マクロでやってみようと思っていたのですがサッパリわかりませんでした。ありがとうございます。 一つお願いがあるのですが、入力セルをA5,A6だけではなく、列Aすべてに有効にするにはどうしたらいいのでしょうか? また、「Range("B" & CStr(.Row)) = Date '日付を表示」の部分の 「& CStr(.Row)) 」はどういう意味になっているのですか? 作っていただいた上に、わがまま言ってすみませんが、よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)関数は、値を反映してくれるところがメリットで す。 例えば=B1と言う式を、C1に入れると、B1の値 が変ると、C1も即座に変ってくれます。(設定を自 動計算として) 一般的には再計算される都度そこを参照しているセル の値も変ります。既回答もB5の値が変る時はVAL UEにしても=Value(b5)の式が残る以上、B5が変る とC5も変ると思います。 日付けの時にこれが困る訳です。そこで対策は (2)計算値へ置換する方法 対象セル数が1つの時に使うのが適当です。 a.計算値に変換したいセルをアクチブにする。 b.数式バーをクリックする。データを編集できる 状態にする。 c.ここでF9キーを押す。数式バー全体がハイライ トされる。 d.エンタキーを押す。数式は消え、値になることが 判る。 (3)セル範囲に対してするときは、コピーして、同じ範 囲に対し「形式を選択して貼り付け」「貼り付けオ プション」で「値」オプションをONにして、貼り 付ける。
- kazuhiko5681
- ベストアンサー率49% (79/159)
初めまして。 C5=IF(OR(A5="入庫",A5="出庫"),VALUE(B5),"") これで値を拾ってくると思います。お試しになってみて下さい。
お礼
できました! わざわざ書き換えてくださりありがとうございました。 しかも、分かり易い説明まで加えていただいて、ホントにホントに感謝しております。 ありがとうございました。