いちばん失敗した人決定戦

エクセルでセルを相互にリンクさせたいのですが方法が分かりません。ご存知の方がいらっしゃったら教えてください!(例:sheet1のA1とsheet2のB2を、どちらから入力しても、双方に同じ数値が入る)

A 回答 (4件)

No.2 のmatsu_junです。

作業用シートを作ることになってもよろしければ以下参照ください。

1) まずは新しいシートを作成してください。シート名は基本的には「DataBase」としていますが
  既存シートのシート名とかぶる場合はお好きな名前を付けていただいて結構です。

2) 下の図(図がずれていたらごめんなさい)のように、A列、C列にシート名、B列、D列にセル名を
  記入していってください。B列、D列のセル名は、やはり絶対参照($付き)で記入してください。
  同じ行同士で値の相互リンクをします。(Sheet1のA1セルと、Sheet2のA2セル・・・)
  どれだけ下に追加していってもらってもOKです。

    ┃ A ┃ B ┃ C ┃ D ┃
 ━━━╋━━━╋━━━╋━━━╋━━━╋━
  1 ┃Sheet1│$A$1 │Sheet2│$A$2 │
 ━━━╋───┼───┼───┼───┼─
  2 ┃Sheet3│$D$5 │Sheet2│$C$1 │
 ━━━╋───┼───┼───┼───┼─
  3 ┃Sheet2│$B$4 │Sheet3│$D$7 │
 ━━━╋───┼───┼───┼───┼─
  4 ┃Sheet1│$E$1 │Sheet3│$E$8 │
 ━━━╋───┼───┼───┼───┼─
  5 ┃   │   │   │   │
 ━━━╋───┼───┼───┼───┼─

3) 作業用シートが表示されるのを嫌うのであれば、メニューから、
  「書式(O)」-「シート(H)」-「表示しない(H)」を選択し、非表示にしてください。

4) 以下を前回と同じ場所に上書きします。(前のものは消してください)
  なお、1)で任意のシート名をつけた場合は、下の
  「ここを自由に変更できます」というところを変更してください。

'ここから------------------------------------------------------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

'ここを自由に変更できます-----------------------------------------------
  データ格納シート名$ = "DataBase"
'ここまで自由に変更できます---------------------------------------------
  
  Application.EnableEvents = False
  On Error GoTo ERREND
  If Sh.Name = データ格納シート名 Then GoTo ERREND
  ERow# = Worksheets(データ格納シート名).Cells(65536, 1).End(xlUp).Row
  With Worksheets(データ格納シート名).Range("A1:D" & CStr(ERow))
    Set x = .Find(Target.Address, LookAt:=xlWhole, MatchCase:=False)
    If Not x Is Nothing Then
      ATmp = x.Address
      If x.Offset(0, -1).Value <> Sh.Name Then
        Do
          Set x = .FindNext(x)
          If x.Address = ATmp Then GoTo ERREND
        Loop While (x.Offset(0, -1).Value <> Sh.Name)
      End If
    End If
    Set y = x.Offset(0, (x.Column / 2 - 1.5) * -4)
    Worksheets(y.Offset(0, -1).Value).Range(y.Value).Value = _
    Worksheets(x.Offset(0, -1).Value).Range(x.Value).Value
  End With
ERREND:
  Application.EnableEvents = True
End Sub
'ここまで------------------------------------------------------------------------

5) 以上で完成です。相互リンクを追加したい場合は最初に作ったデータベースシートに
  追記すればOKです。追記した後にどちらかのセルの値を変更したら、相互リンク先の
  セルの値も同期するようになります。
    • good
    • 1
この回答へのお礼

ありがとうございます。頂いた部分をコピーするだけで、非常に簡単に思い通りのものができました。感謝しています。

お礼日時:2005/05/09 20:12

皆さんがマクロを使ったハイレベルな回答を寄せて


いらっしゃるので
ご質問者のお考えとは異なる気がするのですが、
「循環参照」を利用した低レベルな方法を書いておきます。

EXCELのメニューから
[ツール] メニューの [オプション] をクリックし、[計算方法] タブをクリック。
[反復計算] チェック ボックスをオンに。
[最大反復回数]にデフォルトで「100」などと入力されていれば
そのまま変更せず。
[変化の最大値] にデフォルトで「0.001」などと入力されていれば
そのまま変更せず。
OKをクリックして閉じる。
リンクさせべきsheet1のA1とsheet2のB2にそれぞれ
以下のように記述
Sheet1のA1には
=Sheet2!B2
と記述する。すると「0」が表示される。
Sheet2のB1には
=Sheet1!A1
と記述する。すると、こちらも「0」が表示される。

オートフィルを利用するなどして、それぞれのSheet
の対応位置に同様に記述しておく。

このsheetを名前を付けて保存しておく。

この状態でSheet1のA1に数値を入力すると
Sheet2のB2にその値が反映されますし、
Sheet2のB2に数値を入力すると
Sheet1のA1にその値が反映されます。

ただし、このリンクは
Sheet1から
Shett2から
のいずれか1回のみ有効です。
従ってご質問者のケースでSheet1のA1に数値を入力して、
Sheet2のB2に反映された後にB2に新たな数値を入力しても
Sheet1のA1には反映されません。

このためこのSheetを一度使って上書き保存してしまうと効果が
なくなってしまいます。
必ず異なる名前で保存し、再利用するときは最初に保存した
オリジナルなSheetを呼び出して使用する必要があります。
    • good
    • 1

マクロを使えば簡単ですが、試してみてください。



'ここから------------------------------------------------------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Application.EnableEvents = False
  On Error GoTo ERREND
'ここを自由に変更してください----------------------------------------------------
  ShNam1$ = "Sheet1"
  ShNam2$ = "Sheet2"
  CellNam1$ = "$A$1"
  CellNam2$ = "$B$2"
'ここまで変更可能----------------------------------------------------------------
  If Sh.Name = ShNam1 And Target.Address = CellNam1 Then
    Worksheets(ShNam2).Range(CellNam2).Value = Target.Value
  ElseIf Sh.Name = ShNam2 And Target.Address = CellNam2 Then
    Worksheets(ShNam1).Range(CellNam1).Value = Target.Value
  End If
ERREND:
  Application.EnableEvents = True
End Sub
'ここまで------------------------------------------------------------------------

貼り付け方が分からない場合は以下を参照してください
1) 目的のブックを開いたら、Altキーを押しながらF11キーを押し、Microsoft Visual Basicを開く
  (他のブック(Excelファイル)は開いていない方が分かりやすいです)
2) 開いたMicrosoft Visual Basicの左側に、「プロジェクト-VBAProject」と書かれた
  一見エクスプローラ風のウィンドウがあります。
3) VBAProject (ブック名) の、「Microsoft Excel Object」の、「ThisWorkbook」を
  ダブルクリックすると、ウィンドウの右側がグレーから白くなります。
4) 白くなった部分に、上の「ここから」から「ここまで」を貼り付けます。

おまけ
2つのシート名、セル名は自由に変更できます。
ソース中の、「ここを自由に変更してください」と書かれた部分の下4行、
""に囲まれた部分を変更してください。ただし、セル名は$付きのものにしてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。前に教えてくださった方にも質問をしてしまっているのですが、実際はリンクさせたいセルがひとつのシートに複数あります。その場合はどのようにしたら良いかを教えてください。

お礼日時:2005/05/06 20:07

マクロ(VBA)を利用します。


(他の方法が思いつかないので...)


Bisual Basic Editor を開いて、Sheet1のコードウィンドウに下記のコードをコピペします。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 1 And Target.Column = 1 Then
Worksheets("Sheet2").Cells(2, 2) = Worksheets("Sheet1").Cells(1, 1).Value
End If
End Sub

同様に、Sheet2のコードウィンドウに下記のコードをコピペします。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 2 And Target.Column = 2 Then
Worksheets("Sheet1").Cells(1, 1).Value = Worksheets("Sheet2").Cells(2, 2).Value
End If
End Sub


・マクロは自動的に実行されるので、自分での実行は不要です。
・Worksheets("xxx")のxxxには実際のシート見出し名を入力してください。
・Row=xは実際の行番号を指定してください。
・Column=xは列番号を整数で指定します。(C列なら、3)
・Cells(x,x)は、Cells(行番号、列番号)です。

実際に環境に合わせて、シート見出しの名前や行番号・列番号を変更してお使い下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。リンクしました。ただ、実際はリンクさせたい箇所が複数個あります。その場合はどのようにしたら良いか、よろしければ教えてください。

お礼日時:2005/05/06 20:01

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