[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『同一セル内での計算』(ヨシヒロ)
同一セル内に数字を打ち込んでいくだけで、自動的に足し算にする方法はないでしょうか? マクロなどでもかまいません。 こんな感じです!
A1に5分と入力 その後また、A1に10分と入力する。 合計15分と表示できるようにしたいのですが詳しい方がいらっしゃいましたら宜しくお願いします。
正直あまりお勧めできる仕様ではありません。 入力ミスした場合にどう間違えたのかすらわからなくなりますし そもそも電卓のように使うのであれば表計算ソフトの意味すら無いと思いますので。
まぁでも、下のようなコードで表示形式を0"分"などにしておけば可能は可能ですが・・・
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And IsNumeric(Target.Value) Then Me.Range("B1").Value = Me.Range("B1").Value + Target.Value End If End Sub
(momo)
あ、意味が違うかな・・・? こっちの意味かな?
Private Sub Worksheet_Change(ByVal Target As Range) Dim buf As Double If Target.Address = "$A$1" And IsNumeric(Target.Value) Then Application.EnableEvents = False If Target.Value = 0 Then Target.ClearContents Else buf = Target.Value Application.Undo Target.Value = Target.Value + buf End If Application.EnableEvents = True End If End Sub
(momo)
お聞きしたいのですが、縦の列をA1からA13など指定したい場合は以下の入力になるのですか?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim buf As Double If Target.Address = "$A$1:$A$13" And IsNumeric(Target.Value) Then Application.EnableEvents = False If Target.Value = 0 Then Target.ClearContents Else buf = Target.Value Application.Undo Target.Value = Target.Value + buf End If Application.EnableEvents = True End If End Sub
> If Target.Address = "$A$1:$A$13" And IsNumeric(Target.Value) Then この1行を
If Target.Count > 1 Then Exit Sub If Not Application.Intersect(Target, Me.Range("A1:A13")) Is Nothing And _ IsNumeric(Target.Value) Then
の3行に書き換えてください。 (momo)
こんにちは。横からお邪魔します^^/ A1:A13を対象とするのなら、こんな感じにしても良いかも〜。
Private Sub Worksheet_Change(ByVal Target As Range) Dim TValue, buf, Buf2 Dim i As Long Dim R As Range
If Target.Areas.Count <> 1 Then Exit Sub Set R = Intersect(Target, Range("A1:A13")) If R Is Nothing Then Exit Sub
TValue = Target.Value buf = R.Value
Application.ScreenUpdating = False Application.EnableEvents = False Application.Undo
Buf2 = R.Value Target.Value = TValue
If Target.Count = 1 Then If IsNumeric(buf) And Not IsEmpty(buf) Then R.Value = buf + Val(Buf2) Else R.Value = Empty End If Application.EnableEvents = True Application.ScreenUpdating = True Exit Sub End If
For i = 1 To UBound(buf, 1) If IsNumeric(buf(i, 1)) And Not IsEmpty(buf(i, 1)) Then buf(i, 1) = buf(i, 1) + Val(Buf2(i, 1)) Else buf(i, 1) = Empty End If Next
R.Value = buf Application.EnableEvents = True Application.ScreenUpdating = True End Sub (はち)
この場合、30分と入力してあった場合、次に入力する数字を間違えた場合に、前の30分に戻れるように出来るのでしょうか?
はちさんのですと、0を押したときは前の数字のままです。
いい方法がありましたら教えて頂きたいと思います。
そのような問題が発生するので、お勧めできません。と先に記述したつもりですが・・・ 結局、入力履歴をどこかに残さなければそのような事は出来ないと思います。 なので、最初から表計算ソフトの本来の使い方のとおり順次入力していって SUM関数などで足すようにすればいいのです。 (momo)
もし駄目ならあきらめます。
いろいろと教えて頂きありがとうございます。
入力確定後、確定前に戻れるようには作っていません(v_v )
momoさんもおっしゃっていますが、 エクセルの機能を普通に使いたいのであれば、マクロの介入はNGです。 それならばセオリー通り、セルを分けて入力するのがよろしいかと思います。
でも一応。 一セル入力だけを対象にしたいのならば、B1に履歴は可能です。 その場合は改変が簡単な、momoさんの方のコードをお勧めします^^/
ちなみに僕のは0では無く、数字以外の入力で初期化するようにしています。 # 間違って編集を開始してしまったら、0で確定する事でもエスケープになるかと。 ここ0で初期化が、良かったのかしらん?(はち)
履歴を残しておくとして、どんなタイミングor入力文字でUndoさせるのかが必要ですね。 (momo)
とりあえず A1:A13が入力範囲 履歴をそれぞれB1:B13に残す 1つ前に戻る場合はA列のセルに「bs」と入力(バックスペースという意味で) 完全に消す時はDeleteキーで消す
以上を条件に以下のコードをサンプルとして載せておきます。
Private Sub Worksheet_Change(ByVal Target As Range) Dim buf As Variant If Target.Count > 1 Then Exit Sub If Not Application.Intersect(Target, Me.Range("A1:A13")) Is Nothing Then Application.EnableEvents = False Select Case VarType(Target.Value) Case vbString If StrConv(Target.Value, vbNarrow + vbLowerCase) = "bs" Then If Target.Offset(, 1).Value = "" Then Target.ClearContents Else Application.Undo buf = Split(StrReverse(Target.Offset(, 1).Value), ",", 2) Target.Value = Target.Value - CDbl(StrReverse(buf(0))) Target.Offset(, 1).Value = StrReverse(buf(1)) End If Else Application.Undo End If Case vbDouble buf = CDbl(Target.Value) Application.Undo Target.Value = Target.Value + buf Target.Offset(, 1).Value = Target.Offset(, 1).Value & "," & buf Case vbEmpty Target.Resize(, 2).ClearContents End Select Application.EnableEvents = True End If End Sub
(momo)
これを機会にもっと勉強しないといないと思います。
今回は本当にありがとうございました。
何をD列ですか? 入力セルなら If Not Application.Intersect(Target, Me.Range("A1:A13")) Is Nothing Then ここをD列の範囲に
履歴なら各所にある Offset(, 1) を Offset(, 3) に変更です。
(momo)
Offsetを変更だけで宜しいでしょうか?
そのとおりです。 Offsetの数字を変えてください。 B列=A列の1列右なのでOffset(,1) C列=A列の2列右なのでOffset(,2) D列=A列の3列右なのでOffset(,3)
(momo)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.