プロが教える店舗&オフィスのセキュリティ対策術

もし出来ればすごく助かるのですが、1つのセル内に入力した数値の履歴を残すことって出来ますか?

具体的に言いますと、1つの商品に対して価格を入力するとします。しかし、その価格は変動していきます。品目数が少なければ、いくつかセルを使えばよいのですが、100品目を超えるため、1つのセル内で過去に入力した価格も参照出来るようにしたいのです。何もしてない状態では最新の価格だけが見え、どこかを押すと過去の価格も見ることが出来れば最高です・・・!(全く違うと思いますが、ドロッップダウンリストのような感じで過去の入力数値を見れればとても見やすいです。)

ご存知の方がいらっしゃいましたら、よろしくお願い致します。

A 回答 (6件)

私的には入力シートに履歴が必要かが疑問です


実務に履歴は必要ないと思いますし
入力時にゴチャゴチャしていると、入力ミスしてしまいそうで
履歴は他のシートにとるようにして、履歴を取ったシートで
履歴見るなり、分析なりすればよいと思います
あくまで、私的意見ですので参考程度に

一例です
コメントを使用した例です
'前回のものと入れ替えてください
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Range("b2:e100"), Target) Is Nothing Then Exit Sub
If Target.Value = "" Then Exit Sub
Dim aaa As String
aaa = Target.Address
If Worksheets("sheet2").Range(aaa).Value = "" Then
Worksheets("sheet2").Range(aaa).Value = Target.Value
Else
Worksheets("sheet2").Range(aaa).Value = Target.Value & vbLf & Worksheets("sheet2").Range(aaa).Value
End If
With Target
If Not .Comment Is Nothing Then .ClearComments
.AddComment "履歴" & vbLf & Worksheets("sheet2").Range(aaa).Value
.Comment.Visible = False
.Comment.Shape.TextFrame.AutoSize = True
End With
End Sub
    • good
    • 0
この回答へのお礼

hige_082 様

私の質問に対して何度もお時間を取ってくださり、本当にありがとうございました。
作ってくださったもので、理想としていたものが出来ました。コメントとして履歴が入るようしてくださっているので、いらない部分は削除したり、編集できたり・・・と、とても便利です。別のシートで履歴を見られるのもとても助かります。

本当にお世話になりました。感謝の限りです。ありがとうございました。

お礼日時:2009/05/31 23:47

fujillin様 補足有難う御座います


いつも、的確な回答参考にさせて戴いております

fujillin様の回答にもありますように、私としても業務に使用するのに
このような方法は、良い方法では無いと思います

#3の最初にも書きましたが
>本当に必要なのか疑問ですが(表示方法など)
の理由が、ドロップダウンリストは入力を簡単にするものです
本来、データを表示するものではないので、ちょっとした操作のミスで
データが変更されてしまいます、したがって、今回のような条件での
使用は避けた方が良いと思います、実務では正確性が求められると思う

以上、余りお薦めしませんが
fujillin様の意見を取り入れたものを作ってみましたが
実務には、よーく考えて使用してくださいね

'ワークシートモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Range("b2:e100"), Target) Is Nothing Then Exit Sub
If Target.Value = "" Then Exit Sub
Dim aaa As String
aaa = Target.Address
If Worksheets("sheet2").Range(aaa).Value = "" Then
Worksheets("sheet2").Range(aaa).Value = Target.Value
Else
Worksheets("sheet2").Range(aaa).Value = Worksheets("sheet2").Range(aaa).Value & "," & Target.Value
End If
With Target.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Worksheets("sheet2").Range(aaa).Value
.ShowInput = False
.ShowError = False
End With
End Sub
    • good
    • 0
この回答へのお礼

hige_082様

お世話になります。再度のご回答を本当にありがとうございます。作ってくださったものを使い、表を作ってみました。私の思い描いていたことが出来、本当に感動だったのですが、ご回答に書いてくださっていたように、確かにちょっとした操作のミスによりデータが変更されてしまう点では危ないかと思います。

もし、入力履歴データを見れるだけのリストを出す方法(データは選べない)方法があれば教えていただけないでしょうか。。。?せっかくご回答くださっているのに新たに希望を出してしまい、本当に申し訳なく思います。またお時間あるときでよいですので、よろしくお願い致します。

今回教えてくださった方法も素晴らしいので、別のデータ処理の際には是非使わせていただこうと思います。

お礼日時:2009/05/30 20:23

No2です。



No3様の回答は各列を記録用に利用する方式になっていますので、現状は、記録を残したいセルが1箇所/列みたいになっています。
(Sheet2の記録の内容を見てみればわかるはず)

A1:E100みたいに、ある範囲のセル全部にこの機能を付加したい場合は、記録の方法を(No2にも書きましたように)1セル内にまとめてしまうか、あるいは記録保存の個数を制限しておいて(例えば100個)、1行目の記録はSheet2の1~100行に、2行目の記録は101~200行に記録しておく、みたいになるように修正してあげればよいでしょう。(列側で同様の処理でも同じですが)

もともとの情報が不足なので、方法的なサンプルとしてご提示なさったものだと思われます。

あえて言うなら、Sheet_Changeのイベントが良いのかSaveのイベントが良いのかの疑問くらいか。
Sheet_Changeだと、誤入力でリターンキーを押したり、セルを移動したりすると、それも記録に残ってしまう。その一方で入力が即座に反映されるというメリットもある。
    • good
    • 0
この回答へのお礼

もとの情報をもっと詳しく書くべきでした・・・たくさんアドバイスをしてくださっているのに申し訳ないです。

今からでは遅いかもしれませんが・・・
     A列  B列 C列 D列 E列
1行目 品名  卸1 卸2 卸3 卸4
2行目 …   価格 価格 価格 価格
3行目 …
といった感じで1つの品に関して、各卸の価格を入力します。そして、卸価格の変動があるのでその履歴を残したいのです。
そして、わがままですが、各品毎に、条件付き書式で最小値を表示できるようにしたいです。

ここまでするのは無理でしょうか・・・
素人で勉強不足のため、なかなか理解が遅いのですが、もし方法があれば教えてください。よろしくお願いします。

お礼日時:2009/05/28 21:05

詳細が不明(シート名、セルアドレスなどなど)


本当に必要なのか疑問ですが(表示方法など)

面白そうなので作ってみました

条件はSheet1のA1~E1までしか対応させてません
Sheet2へ履歴を記録します

新規ファイルで試してみてください

Sheet1のシートタブを右クリックし、コードの表示を選択
ワークシートモジュールが現れるのでコピペ

画面を閉じて、Sheet1のA1~E1に入力してみてください

'ワークシートモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Range("a1:e1"), Target) Is Nothing Then Exit Sub
If Target.Value = "" Then Exit Sub
Dim aaa As String
Worksheets("sheet2").Cells(1, Target.Column).Insert Shift:=xlDown
Worksheets("sheet2").Cells(1, Target.Column).Value = Target.Value
aaa = "=INDIRECT(""Sheet2!" & Worksheets("sheet2").Range(Worksheets("sheet2").Cells(1, Target.Column), Worksheets("sheet2").Cells(Rows.Count, Target.Column).End(xlUp)).Address(0, 0) & """)"
With Target.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=aaa
.ShowInput = False
.ShowError = False
End With
End Sub

後はご自由に
    • good
    • 0
この回答へのお礼

本当にありがとうございます!!ドロップダウンリストのように▼が出て入力履歴を見られる上に、条件付き書式(最小値を出すため)も使えて、したかったことが全て出来ました。すごいですね!!!

これを、A1:E1だけでなく、範囲を広げたい場合は、
「If Intersect(Range("a1:e1"), Target) Is Nothing Then Exit Sub If Target.Value = "" Then Exit Sub」
の(Range("a1:e1")を、希望の範囲(Range("a1:e100")にすればよいのかなあ・・・と思い、してみたのですが、これでは行1はうまくいくのですが、行2以降は行1の数値が履歴として表示されてしまい、うまくいきませんでした。
本当にお手数をお掛けして申し訳ないのですが、範囲を広げる方法を教えていただけないでしょうか?

よろしくお願い致します。

お礼日時:2009/05/28 18:37

時間がないのでアイデアのみ



・非表示のシートを記録用に用意しておいて、ブックの保存時に自動で
 マクロを走らせる。
・マクロ側では、価格の部分を記録の最新版と比較し、更新されていた
 らその部分を記録に追加する
・履歴を表示するのは、そのシートからデータを読めばよい
・記録は、1セルにカンマなどで繋げて保管しても良いし、レイアウトにも
 よるけど1行(あるいは1列)を利用するような方式でも可

ってなところでどうでしょうか?
    • good
    • 0
この回答へのお礼

アドバイスをありがとうございます。
早速やってみますね!!

お礼日時:2009/05/27 21:29

「ツール」「ブックの共有」すれば履歴が作成できます。


詳細は下記のURLを参照してください。
http://www.nurs.or.jp/~ppoy/access/excel/xlET017 …
    • good
    • 0
この回答へのお礼

早々のご回答をありがとうございます。

さっそく試してみました!!
すると、1つ前の履歴は見ることが出来るのですが、それ以前のものは消えていってしまいました・・・。もし、全ての履歴を残せる方法があれば教えてください。

再度の質問になりますが、よろしくお願い致します。

お礼日時:2009/05/27 00:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!