- ベストアンサー
新旧の数値の比較
あるセルの数値を変更たとき、変更前の値との新旧の差を他のセルに表示させるるのはどうしたらいいでしょうか。お教え下さい。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#3-7、cjです。#7お礼欄への返信です。 > 何度もお尋ねし、その都度丁寧にご回答頂き恐縮です。 いえいえ。私とて何んでも出来る訳じゃないですし、教わって学んだことを礎に、 質問者さんと協力して問題解決に参加したくてここにいるのですから、 同じ方向を向いているつもりでいます。お気になさらず。 > 右の大きいウィンドウはグレーで、左の「プロジェクト」ウインドウには「VBAProject(ブック名.xls)」が出ますが、そこをダブルクリックすると「プロジェクトがロックされてます」と表示されます。 > 右クリックで「VBAProjectのプロパティ」を調べようとしても同様です。 > ロック解除できればご指示どおりに先に進めると思うのですが・・・。 今回添付した画像のようなメッセージで合ってますかね? この場合、考えられる原因として最も有力なのは、 対象のブックに[ブックの共有]が設定されているケースです。 [複数のユーザーによる同時編集と、ブックの結合を許可する] にチェックが入っていたら、チェックを外し(共有を解除し)、 (通常は自動的に上書き保存されるので上書き保存された排他ブックを) 一旦閉じます。 再度ブックを開けばロック解除された状態でVBAProjectを編集できるようになりますので、 #6または#7の手順でコードを貼り付けてください。 対象ブックの拡張子が".xls"とのお話なので、コードの貼付けが済んだら、 そのまま一旦上書き保存し、続けて、 [ブックの共有]や[ブックの保護]の設定を元通りに戻します。 次にブックを開いた時から機能するようになりますから、 続けて動作確認したい場合は、再度、閉じて開いてください。 念の為、、、。 実際に動作確認をしてみた感触として、もしも不採用にしたいという場合も、 導入の際の手順同様、コードを削除するようにすれば、元通りになりますので、 心配は要りません。 ただ、共有を解除する際には、変更履歴が破棄されますので、 共有環境上の他者によるブック操作を制限する等して 間違いが起こらないように用意してから導入の作業にあたるよう注意してください。 /// 気が付き難いハードルではあるものの、 もっと早く気が付いても良さそうだったのに、手間掛けちゃったみたいですみません。 また動作上の疑問などもあるでしょうから、どうぞ遠慮なく。
その他の回答 (7)
- cj_mover
- ベストアンサー率76% (292/381)
#3-6、cjです。#6お礼欄への返信です。 VBAの編集画面を開くところまでは出来ているみたいなので、 あともう少しです。 VBAの編集画面を開いたら、 添付画像で説明している手順(1)から(3)を確認してください。 私が赤い文字で説明を書いている場所にあるのが、 ThisWorkbookモジュールのコードを貼り付けるウィンドウです。 うまく伝わるといいのですけれど、解らなかったら訊きかえしてくださいね。
お礼
何度もお尋ねし、その都度丁寧にご回答頂き恐縮です。 右の大きいウィンドウはグレーで、左の「プロジェクト」ウインドウには「VBAProject(ブック名.xls)」が出ますが、そこをダブルクリックすると「プロジェクトがロックされてます」と表示されます。 右クリックで「VBAProjectのプロパティ」を調べようとしても同様です。 ロック解除できればご指示どおりに先に進めると思うのですが・・・。 BASICは三十数年前(まだOSも使わない頃)に簡単なソフトを組むのに使った覚えもあるのですが、ソフトが出回りだした以後は全くご無沙汰で、すっかり全て忘れてしまいました。エクセルについても基本的な操作もおろそかになっており、真にお世話をお掛け致します。
- cj_mover
- ベストアンサー率76% (292/381)
#3-5です。#5補足欄拝見しました。 > 当方の場合、前日より前のデータを残す必要は全くないため、その保存を常に上書きで行えばよいのかなと思いました。 > ただし、保存のために独立のシートを作るより、同じシートの不要な列に前日分が自動コピーされている方が簡便なようにも思えます。 > 今のシートは縦に複数の表(データの内容は異なるが形式は同一)が並ぶ縦長のもので、 > M列より右は空白なのので、その範囲が使えればと思っています。 > 具体的にはA~L列の部分をそっくりM列より右方にコピー(上書き)したうえで、 > その部分の数値が固定されれば、目的が果たせるかと思います。 > そのような方法があれば改めて教示頂ければ幸甚です。 (<改行加えました) よく解ります。優れたご判断だと思います。 なるべく簡単に導入出来て、且、メンテナンスし易い方法を、と考えた結果、 一日の最初にブックを開いた時にだけ、A:L列をそっくりコピーして、 O列より右に(値と書式だけ)貼り付ける ようなマクロを紹介することにしました。 当初のご質問にある "変更前の値との新旧の差を他のセルに表示させる"方法としては、 例えば、A2の値についての前日との差を求める数式として =A2-O2 のように何処かのセルに設定しておけば、 常にお求めの数値を表示させておくことが出来ます。 尚、前回紹介したマクロは不要になりますので破棄してください。 導入手順■ ■添付画像(1)■対象ブックの[ウィンドウを元のサイズに戻す]ボタンをクリック ■添付画像(2)■対象ブックのタイトルバーを右クリック ■添付画像(3)■表示されたポップアップにて[コードの表示]をクリック Visual Basic Editor(VBAの編集画面)が表示されるので、 ■子ウィンドウの中で一番大きく、真っ新なウィンドウ(=ThisWorkbook モジュール)に 以下の記述(この行から‐この行まで)をコピーして、 過不足なく貼り付け。 ' ' =============== ThisWorkbook モジュール =============== この行から ' ' /// A:L列のデータを前日のデータとして ' ' /// O列より右に確保します。 ' ' /// N1セルに更新した日付を記録し、 ' ' /// ブックを開いた日付とN1セルの日付に相違があれば、 ' ' /// 前日データをコピペします。 ' ' /// 一日の最初にこのブックを開いた時にだけ、 ' ' /// 自動的に前日データを更新します。/// Re8806664_6 Private Sub Workbook_Open() ' ←↓ブックを開いた時に自動で処理するマクロです。 With Sheets("Sheet1") ' ★シート名を指定してください。"シート名"のように"の間にシート名です。 ' ' N1セルの更新日が当日であれば、処理する必要がないので何もせず終了します。 If .Range("N1").Value = Format(Date, "yy/m/d") Then Exit Sub ' ' ここから下は、当日の朝、最初にブックを開いた時にだけ実行されます。 ' ' 貼付け先を一旦クリアします。 .Range("O:X").Clear ' ' 昨日までのデータをコピーします。 .Range("A:L").Copy ' ' 昨日までのデータをO列より右に、値のみ貼付けします。 .Range("O1").PasteSpecial Paste:=xlPasteValues ' ' 昨日までのデータをO列より右に、書式のみ貼付けします。 .Range("O1").PasteSpecial Paste:=xlPasteFormats ' ' N1セルの更新日を更新します。 .Range("N1").Value = Format(Date, "yy/m/d") .Range("N2").Value = "↑ 更新日" ' ' 選択中の範囲をA1セルに設定し直します。 .Range("A1").Select End With ' ' コピーモードを解除します。 Application.CutCopyMode = 0 End Sub ' ' =============== この行まで ■Alt + F11 キーでExcel画面に戻る。 ▼マクロ無効ブック(拡張子が.xlsx)である場合は、 マクロ有効ブック(拡張子が.xlsm)として新規に[名前を付けて保存]する。 ▲元々マクロ有効ブック(拡張子が.xlsm)であった場合は上書き保存する。 導入手順■以上。 VBAの記述中、Sheet1の部分は処理対象のシート名に書き換えておいて下さい。 セル範囲の参照、N1、O:X、A:L、O1、N2、A1、については、 Excek数式でのセル参照と要領は同じですから、 もしもシートレイアウトを変更される場合は、こちらのセル参照も書換えて下さい。 数式での参照と違ってVBAでは、自動的に参照先を変更してくれるような機能はありませんので。 シート名、セル範囲の参照、ともに、"ダブルクオート"で挟んだ書式になるよう注意して下さい。 動作確認の為、一旦ブックを閉じて、 再度(拡張子が.xlsmの)ブックを開いてみてください。 N1に当日の日付、O列より右にA:L列のデータの複製が展開されていれば、 問題なく動作していることになります。 前日データの複製は自動で作成されますが、 上書き保存はしていませんので、必要な時に上書き保存してあげて下さい。 一日の最初にブックを開いた時の状態として、 ブックを開いただけのつもりでも未保存のデータ(N列より右)があることになります。 マクロの内容としては、初級の前段で覚えるようなものですから、 メンテナンスに迷ったとしても相談にのってくれる人は多数いる筈です。 無理矢理シートの保護を設定でもしない限り、滅多なことではエラーにならないように かいてあります。 その他、疑問が残っているようでしたら遠慮なくお訊ねください。
お礼
大変丁寧なご教示を賜り心から有り難く思っております。 当方マクロの使用経験がないのでVBAの編集画面の基礎操作の部分から分かりませんので、再々度質問させて頂きます。 ご指示に基づき「コードの表示」をクリックすることでVBAの編集画面が開くのですが、『■子ウィンドウの中で一番大きく、真っ新なウィンドウ(=ThisWorkbook モジュール)』に該当する子ウインドウが表示されていません。 大きなグレーのウインドウが1つ表示されており、上方の「表示」タブをクリックすると「ローカルウィンドウ」「ウオッチウインドウ」等いくつかの種類のウインドウが下の方に表示させられますが、そのいずれもご指示の“■子ウインドウの中で一番大きく真っ新なウインドウ”には該当しないように思えます。 全くの初心者の質問で恐縮ですが、当該の“子ウインドウ”の表示のさせ方をお教えくだされば幸いです。
- cj_mover
- ベストアンサー率76% (292/381)
#3-4、cjです。#3お礼欄拝見しました。 > 実はあるセルのデータを日々上書きにより変更を行っているわけですが、後になって前日のデータと比較を行いたいときが往々にしてあり、そのセルの旧データがどこかに表示されていればいいなと思ったので質問させて頂きました。 そういうことでしたらば、"あるセルの数値を変更したとき"という考え方ではなくて、 1営業日毎の日計を出す、という概念を導入した方が良さそうです。 普通は、営業日の最後にブックを閉じる前、 場合によっては、営業日の最初にブックを開いた時、に、 当日(前日)のデータを 日計履歴として、専用のシートまたはブックに 順次、旧いものが下新しいものが上に来るように記録していけば、 様々な分析が可能にもなりますし、お望みの前日との比較についても、 シート上の数式ひとつ(あるいは目視だけ)で可能になります。 この場合は、マクロだけではなくて、 シートまたはブックを新たに用意することにもなりますから、 そちらで可否を検討して貰って必要なら、再レスします。 或いは、同一のシートで、使うことが無いと断言できる列、があるなら、 シートやブックを追加せずとも適用可能ですが、 どこの列?なのか明示的な指定があれば着手できます。 先のマクロよりは単機能でシンプルなものになりますし、 システムとして発展性を残すことにもなります。 余裕があれば検討してみてください。 返答があれば着手しますので。
補足
重ねて丁重なご教示有り難く思っています。 確かに過去(前日)のデータを異なるシートなどとして自動保存しておけばよいわけですね。当方の場合、前日より前のデータを残す必要は全くないため、その保存を常に上書きで行えばよいのかなと思いました。 ただし、保存のために独立のシートを作るより、同じシートの不要な列に前日分が自動コピーされている方が簡便なようにも思えます。今のシートは縦に複数の表(データの内容は異なるが形式は同一)が並ぶ縦長のもので、M列より右は空白なのので、その範囲が使えればと思っています。 具体的にはA~L列の部分をそっくりM列より右方にコピー(上書き)したうえで、その部分の数値が固定されれば、目的が果たせるかと思います。 そのような方法があれば改めて教示頂ければ幸甚です。
- cj_mover
- ベストアンサー率76% (292/381)
#3、cjです。 > 導入手順■ > ■処理対象シ-トのシートタブを右クリック に続けて、一行 ■表示されたポップアップにて[コードの表示]をクリック 抜けていました。失礼しました。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 VBA(マクロ)でやるしかないです。 導入手順■ ■処理対象シ-トのシートタブを右クリック Visuak Basic Editor(VBAの編集画面)が表示されるので、 ■子ウィンドウの中で一番大きく、真っ新なウィンドウに 以下の記述(この行から‐この行まで)をコピーして、 過不足なく貼り付け。 ' ' この行から Private Sub Worksheet_Change(ByVal Target As Range) ' 8806664 If Target.Count > 1 Then Exit Sub ' ' 例えば、処理対象を"A1:A30"に指定する場合★運用に合わせて適宜修正 If Intersect(Range("A1:A30"), Target) Is Nothing Then Exit Sub Dim buf buf = Target.Value With Application .EnableEvents = False On Error Resume Next .Undo ' ' 例えば、変更前後の差を処理対象の1列右(, 1)に指定する場合★運用に合わせて適宜修正 Target.Offset(, 1).Value = buf - Target.Value Target.Value = buf .EnableEvents = True End With End Sub ' ' この行まで ■Alt + F11 キーでExcel画面に戻る。 ▼マクロ無効ブック(拡張子が.xlsx)である場合は、 マクロ有効ブック(拡張子が.xlsm)として新規に[名前を付けて保存]する。 ▲元々マクロ有効ブック(拡張子が.xlsm)であった場合は上書き保存する。 導入手順■以上。 差の数値の表示方法については、Excelのメニューから、 [セルの書式設定][表示形式]をお好みで設定してみて下さい。 以上のマクロは、手作業で単セルの値を入力または確定した時に動作します。 #経験的にこの手の課題はWebクエリやRSSの値変動を追跡するニーズである場合が多いのですが、 > あるセルの数値を変更たとき と書いてあって、 あるセルの数値 が 変更 された とき とは書いてない、ということから類推して、 上述の通り、手作業での値変更に関する課題であろうと判断してお応えしています。 もしも、WebクエリやRSS絡みの課題でしたら、 要点を整理して、必要十分な説明を施すようにして、 再度、別の質問として建て直してください。 ★印の行、2ヶ所は、そちらで運用に合わせて書き換えてください。 うまく行かない、とか、解らない点があれば、補足欄に詳しく書いてみて下さい。 以上です。
お礼
丁寧なご回答に感謝します。当方エクセルは基礎的な知識のみで使っている初心者で、マクロを用いる必要性が今まではなかったのですが、やはりいつまでも使わずにいるわけにはいきませんね。直ちにやれるかかどうかは分かりませんが、試させて頂きます。 実はあるセルのデータを日々上書きにより変更を行っているわけですが、後になって前日のデータと比較を行いたいときが往々にしてあり、そのセルの旧データがどこかに表示されていればいいなと思ったので質問させて頂きました。ありがとうございました。
- mt2008
- ベストアンサー率52% (885/1701)
- kadakun
- ベストアンサー率29% (356/1200)
「あるセルの数値を変更たとき・・・」 と言う事はたとえば、A1に10と入っているのを100に変えたとき、差の90をC1セルに表示させるって事ですよね? 普通に考えればわかりますが、そのままでは無理です。 何故なら、比較する数字が上書きされてしまうのですから、引っ張ってこれません。 なので、A1の数字をどこかにコピーして、上書きした数字と比較させて別セルにその結果を出すしか無いでしょう。(マクロでやるとか) しかし、同セル上で何度もやるとかセル値が固定しない場合は、無理なんじゃ無いかな?
お礼
そうだろうなとは思っていました。早速のご回答ありがとうございました。
お礼
大変丁寧にご教示頂き感謝に堪えません。 ご指示の方法に従い、なんとか目的が果たせました。貼り付ける列等についてはコピーする括弧内数値を書き換えるなどして修正させて頂くことにします。 用いたことのなかった「マクロ」というものの雰囲気だけは理解できました。お礼申し上げます。