ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

もし出来ればすごく助かるのですが、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で質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q(Excel)あるセルに文字を入力しただけで、同じブック内のほかのワークシートにも、同じ文字が自動的に入るようにするには?

こんにちは。
質問内容はタイトルのとおりです。

あるワークシートのあるセルに文字を入力すると、ほかのワークシートのセルにも同じ文字が自動的に書き込まれる方法を知りたいです(ブックは同じ)。複数のワークシートを制御するには、やはりマクロを使うのでしょうか?

よろしくお願いします。

Aベストアンサー

clam_chowderさん、こんにちは。

Sheet1のA1にたとえば「100」と入力しますね。
Sheet2のA1に、これと同じ数値を表示するには、
 =Sheet1!A1
でOKです。

数式をいれるのが苦手なら、
Sheet2のA1セルで「=」を入力すると、数式入力状態に入りますから、
ここでSheet1のシートタブをクリックし、
リンクしたいA1セルをクリックしてEnterすると、
自動的にさきほどと同じ式が入ります。

Qエクセルで打ち込んだ数字を自動で別シートに表示したい

エクセルでセルに打ち込んだ数字を自動で別シートに表示できる方法があれば、教えてください。

例えば、シート1のC1に5を打ち込んだら、シート2のD2にシート1で打ち込んだ5が自動で表示される。

また1列すべてを自動で表示させる場合、一つのセルの時と違いがありましたら教えてください。よろしくお願いします。

Aベストアンサー

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コピー&リンク貼り付けを使うと便利です。

例)例)シート1のC1~C5に何かを入力したら、
  シート2のD2~D7にシート1で打ち込んだものが自動で表示される

  シート1にあるコピー元のセルを範囲選択して、
  シート2のD2の上で「右クリック」⇒「形式を選択して貼り付け」
  をクリックします。

  そして出てきた小さな画面の左下にある「リンク貼り付け」という
  ボタンをクリックすると完成です。
  試してみてください。。

  念のためにリンク貼り付けを図解しているURLを載せておきます。
  参考にしてみてくださいね。。
  http://www.geocities.jp/office_inoue/excel/eq21.htm

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コ...続きを読む

Qエクセルで条件に一致したセルの隣のセルを取得したい

下のような「得点」という名前のシートがあります。
(「田中」のセルがA1です。)

 [ 田中 ][ 10 ][ 200 ]
 [ 山田 ][ 21 ][ 150 ]
 [ 佐藤 ][ 76 ][ 250 ]
 [ 鈴木 ][ 53 ][ 350 ]

別のシートのA1セルに、「佐藤」と入力すると、

 [ 佐藤 ]

「得点」シートから「佐藤」の列を見つけて、B1、C1に

 [ 佐藤 ][ 76 ][ 250 ]

のように表示させたいのですが、B1、C1にはどのような式を書けば良いのでしょうか。
「得点」シートでは氏名が重複する事はありません。
IF文を使うと思うのですが、いまいち良く分かりませんでした。

よろしくおねがい致します。

Aベストアンサー

こんにちは!
VLOOKUP関数で対応できます。
IF関数と併用すればエラー処理が可能です。

Excel2007以降のバージョンであれば
B1セルに
=IFERROR(VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0),"")
としてC1セルまでオートフィルでコピー!
そのまま下へコピーすると行が2行目以降でも対応できます。

Excel2003までの場合は
=IF($A1="","",VLOOKUP($A1,得点!$A:$C,COLUMN(B1),0))

としてみてください、m(_ _)m

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

QEXCELで別のシートのデータを参照して返す方法

ちょっとしたことなのですが、うまく式が書けなくて悩んでいます。

作業用のシート1と参照用のシート2があり、
シート1のA列には
 あおき
 あべ
 いぐち
 いはら
などと文字列(名前)が入力されています。
こちらは今度の野球のスタメンだと思ってください。

シート2にはA列とB列があって、
わたなべ 55
いぐち  43
あおやま 67
いはら  41
などと、名前:背番号が羅列されています。こちらが参照用の全選手の背番号リストだと思ってください。

ここで、 シート1のB列に、A列の名前に対応した背番号を返したいのです。
なので、シート1のB列に
IF(シート1のA列の値=シート2のA列のいずれかの値)だったとき、
適合したシート2の行のB列の値を表示する
という式を入れたいのですが、どのように式を書けばよいでしょうか。

すみませんがどなたか教えてください。

Aベストアンサー

私もその場合はVLOOKUP関数を使用しています。

「B1」=VLOOKUP(A1,Sheet2!$A:$B,2,0)

Qエクセルについて-同一セルに何回も入力したい

お世話になります。
エクセルのセルにデータ(たとえば数字)を入力したあと、もう一回同じセルに数字を入力すると上書されます。
そこのところでお尋ねしたいのですが、上書しないで新しく入力するたびにそれまで入力済みの数字に加算合計を表示するようにしたいのですが、何か方法があるのでしょうか。
よろしくお願いします。

Aベストアンサー

No7のmerlionXXです。
VBAを多少かじるとこれくらいはできるようになります。興味があったら勉強してみてください。

> 他のセルにもやりたい、貼り付けた内容のクリアはどうやってやるのか、入力した数字の履歴を知りたい

If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによってほかのセルにも設定できます。

クリアや入力履歴についても対応しました。
下記に書き換えてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Value = "" Then Exit Sub
x = Target.Value
With Application
.ScreenUpdating = False
.EnableEvents = False
.Undo
y = Target.Value
Target.Value = x + y
.EnableEvents = True
.ScreenUpdating = True
End With
With Cells(ActiveSheet.Rows.Count, "C").End(xlUp)
.Offset(1, 0).Value = x
.Offset(1, 1).Value = Time()
End With
End Sub

A1をクリアできるようにしました。
C列に入力履歴、D列に入力時間を記録するようにしました。

No7のmerlionXXです。
VBAを多少かじるとこれくらいはできるようになります。興味があったら勉強してみてください。

> 他のセルにもやりたい、貼り付けた内容のクリアはどうやってやるのか、入力した数字の履歴を知りたい

If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによってほかのセルにも設定できます。

クリアや入力履歴についても対応しました。
下記に書き換えてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit ...続きを読む

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む

Qエクセルでシートに入力した値を別シートに飛ばし、月別に集計する方法を教えてください

タイトルでは分かり辛かったとは思いますが、要約すると以下の通りです。

1.元シート(以下Aと呼びます)に毎日同じセル内に1回値を入力します。

2.その入力された値を別シート(以下Bと呼びます)へとリンクさせ、尚且つそのBシート内で1か月分の集計を取ります。

つまりAシートでは毎日同じセルに値を入力しますが、Bシートでは1列ずつ下に記録され1か月分の入力がされていく、そのような操作は可能でしょうか?

Bシートのあるセルに”=Aシートの指定セル”を入力するとAシートで値を変更するたびに同じセル内で値が更新されてしまいます。

どなたか方法が分かる方お知恵をお貸し下さい。よろしくお願いします。

Aベストアンサー

似たような質問は結構多くありますが、セルに値を入力したときにマクロを実行すると、間違えた場合、訂正した場合は、どうするかなどがあります。
やりたいことを、Sheet1のC1,C2,C3に入力して内容確認後、ボタンを押すと
Sheet2のデータの最後の行の下に、横方向に記録していくということしたら。VBAで仕事を行うに定番のようなマクロです。
以下、試して、そちらの都合に合わせて編集してください。

Sub ボタン3_Click()
GYOU = Sheets("Sheet2").Range("B65536").End(xlUp).Offset(1, 0).Row
Sheets("Sheet2").Cells(GYOU, 2).Value = Range("C1").Value
Sheets("Sheet2").Cells(GYOU, 3).Value = Range("C2").Value
Sheets("Sheet2").Cells(GYOU, 4).Value = Range("C3").Value
End Sub
補足説明
Range("B65536").End(xlUp).Offset(1, 0).Row  は
エクセルで使用できる最大行65536行目のB列を上方向へ移動して、空白でない行を探す、その行から1行上へ移動した行番号を取得して、変数GYOUに入れる。
Sheets("Sheet2").Cells(GYOU, 2).Value = Range("C1").Value は、
シート2で、前のコマンドで探し当てた行の2列目にC1セルに値を入れるです。

似たような質問は結構多くありますが、セルに値を入力したときにマクロを実行すると、間違えた場合、訂正した場合は、どうするかなどがあります。
やりたいことを、Sheet1のC1,C2,C3に入力して内容確認後、ボタンを押すと
Sheet2のデータの最後の行の下に、横方向に記録していくということしたら。VBAで仕事を行うに定番のようなマクロです。
以下、試して、そちらの都合に合わせて編集してください。

Sub ボタン3_Click()
GYOU = Sheets("Sheet2").Range("B65536").End(xlUp).Offset(1, 0).Row
Sheets("S...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング