こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel:別々のセル間のデータを常に双方向で同期する方法

Excel:別々のセル間のデータを常に双方向で同期する方法

一つのエクセルファイル内の別々のシートにあるセルの一方にデータを入力すると他方にも同時に入力されるようにするにはどうすればいいでしょうか。
一方通行ではなく、どちらのセルに入力しても他方に同じ内容が入力されるようにする具体的な方法を知りたいです。
また、データを入力した後いつでもどちらかのセルの内容を訂正しても他方のセルにそれが反映されてほしいです。
使用しているのはWin XP homeでエクセル2003です。

具体例をあげます。

シート1のセルE4に「100」と入力すると、シート2のセルF9にも「100」と入力される。
その逆のシート2のF9に先に「100」と入力してもシート1のセルE4に「100」と入力される。
また、シート2のF9に「100」と入力しシート1のセルE4にも「100」と自動で入力された後、シート1のセルE4に「200」と訂正するとシート2のF9も同時に「200」と訂正されてほしいのです。

もし上記が可能でしたら、別々の3枚のシートにある別々の3個のセルでも同じように、どれかのセルにデータを入力すると他の2つのセルにも同じデータが入力されるようにできるのかを知りたいです。これも一方通行ではなく、3つのセルのどれに入力しても他の2つに同じデータが入力されてほしいです。

もし当方が望むことができないようなら、どういう理由でできないのかも知りたいです。

上記質問に対する的を射た答えでなくとも関係のありそうなことやヒントになりそうなこともお教えください。
参考になりそうなサイトがありましたら、どの部分が参考になるのかを示した上でURLを教えてください。
当方の質問が下手で意味が伝わりにくいようでしたら、ご指摘いただければできるだけ詳細に追記する所存です。
ご回答いただいた内容に対してさらに質問するかもしれません。

どうぞよろしくお願いいたします。
最後まで読んでいただきありがとうございました。

投稿日時 - 2010-01-04 06:43:45

QNo.5566053

v4u

困ってます

質問者が選んだベストアンサー

関数では無理でしょう。
関数では、入力されたセル以外を操作することはできません。E4に関数を入れてSheet2のF9を参照していても、E4に数値を入力したとたん関数はなくなってしまいます。 
VBAのイベントで、つぎのようにすれば、実現できます。
Sheet1に、
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$4" Then
Sheets("Sheet2").Range("$F$9").Value = Sheets("Sheet1").Range("$E$4").Value
End If
End Sub

Sheet2に、
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F$9" Then
Sheets("Sheet1").Range("$E$4").Value = Sheets("Sheet2").Range("$F$9").Value
End If
End Sub

投稿日時 - 2010-01-04 08:24:14

お礼

ご回答ありがとうございます。

完璧です。

お陰さまで当方が望んでいたことを実現できました。
いただきましたご回答は見事としかいいようがありません。
こんな短時間で明快なご回答をいただけるとは思ってもいませんでした。

okormazd様にとっては些細なことかもしれませんが、
当方は本件につきまして相当長い期間疑問に思っておりました。
googleでいろいろ検索しては見よう見まねでVBAを改造したりしましたが
VBAの基礎的な知識がないため結局解決できずじまいでした。

お陰さまで、作業能率が上がるどころか、
今まで思いつかなかったエクセルの利用方法も浮かんできました。

具体的なスクリプト及び新たな可能性をいただき
ありがとうございました。

投稿日時 - 2010-01-05 01:02:24

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>別々の3枚のシートにある別々の3個のセルでも同じよう・・・
の方を提示しておきます
セルを指定されていないので
Sheet1はA1
Sheet2はA2
Sheet3はA3としています

'Sheet1のモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Variant
Dim ws As Variant
Dim i As Integer
Application.EnableEvents = False
If Target.Address(0, 0) <> "A1" Then Exit Sub
ws = Array("Sheet2", "Sheet3")
rng = Array("A2", "A3")
For i = 0 To 1
Worksheets(ws(i)).Range(rng(i)).Value = Target.Value
Next i
Application.EnableEvents = True
End Sub

'Sheet2のモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Variant
Dim ws As Variant
Dim i As Integer
Application.EnableEvents = False
If Target.Address(0, 0) <> "A2" Then Exit Sub
ws = Array("Sheet1", "Sheet3")
rng = Array("A1", "A3")
For i = 0 To 1
Worksheets(ws(i)).Range(rng(i)).Value = Target.Value
Next i
Application.EnableEvents = True
End Sub

'Sheet3のモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Variant
Dim ws As Variant
Dim i As Integer
Application.EnableEvents = False
If Target.Address(0, 0) <> "A3" Then Exit Sub
ws = Array("Sheet1", "Sheet2")
rng = Array("A1", "A2")
For i = 0 To 1
Worksheets(ws(i)).Range(rng(i)).Value = Target.Value
Next i
Application.EnableEvents = True
End Sub

参考まで

投稿日時 - 2010-01-04 15:05:37

お礼

ご回答ありがとうございます。

至れり尽くせりです。

参考どころかそのままずばりのご回答でたいへんありがたいです。

現在のところ、どういうメカニズムで動作しているのか見当もつきませんが
先のご回答のVBAと比較したり検索したりして認識を深める所存です。

拡張版のスクリプト及びVBAを比較する機会をいただき
ありがとうございました。

投稿日時 - 2010-01-05 01:08:09

ANo.1

そんな横着たれたような、めちゃくちゃな入力ルールではデータのリンクのしようがありません。
データのリンクは、コピーしたあと、リンク先をクリック
『編集』『形式を選択して貼り付け』『リンク貼り付け』をすればデータのリンクはできますが、そこには式が設定されていることになるのでその上から入力してしまえば式は消えてしまいます。
入力するシートはひとつに統一するべきです

投稿日時 - 2010-01-04 07:56:30

お礼

ご回答ありがとうございます。

> そんな横着たれたような、~

おっしゃる通りです。
少しでも能率が上がればと思いました。
それでも当方の質問にお付き合いいただきありがとうございます。

> データのリンクは、~

この方法当方は存じておりませんでした。
この方法だと、キーボードによる入力を省けて便利ですね。
しかも自動で絶対参照になりますので、
F4キーを押す行程も省けます。

教えていただいた方法は今後多用しそうです。
有意義な方法をありがとうございました。

投稿日時 - 2010-01-05 00:59:04

あなたにオススメの質問