• ベストアンサー

エクセルの値のコピー(自動で)について

例えば、 セル(A1)に1      セル(B1)に3      セル(C1)に=SUM(A1:B1) と入力します。      セル(C1)は、見た目には4ですが、      実際は「=SUM(A1:B1)」です。  ここで、 セル(D1)には、セル(C1)のコピーを「値」の形式で貼り付けると    セル(D1)は4となります。 このセルDの貼り付けを自動で行いたいのですが可能でしょうか。 私はマクロとか分かりません。 関数での方法を教えて下さい。

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

  • ベストアンサー
回答No.10

こんばんわ。マクロ記述ミスがあったようなので訂正させていただきます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRow As Integer myRow = Target.Row If Target.Address = Range("A" & myRow).Address Then Target.Offset(0, 3).Value = Target.Offset(0, 2).Value ElseIf Target.Address = Range("B" & myRow).Address Then Target.Offset(0, 2).Value = Target.Offset(0, 1).Value End If End Sub それと、#9さんのご回答は1行目だけでしか変化しません。2行目以降に値を入力しても何も起こりません。 ですから、わたしはどの行であっても動作するようにTargetとOffsetを使って#9に書かれている Range("D1") = Range("C1") を Target.Offset(0, 3).Value = Target.Offset(0, 2).Value'A列の値が変化した時 Target.Offset(0, 2).Value = Target.Offset(0, 1).Value'B列の値が変化した時 という式で表しているのです。 例えば、A1の値が変化した時 Target.Offset(0, 3).Value = Target.Offset(0, 2).Valueは Targetは,A1・Offset(0,3)は下に0,右に3進んだセル(D1)・Offset(0,2)は下に0,右に2進んだセル(C1)を表しています。ですから、 この式はRange("D1") = range("C1")と同じ意味になるのです。 A2・A3・・・が変化すれば、Targetの値もA2・A3・・・と変化していきます。 ですから、#9さんが >A1に1、B1セルに3、C1に=SUM(A1:B1)と入れる 。C1は4になります。A1(-->2に)またはB1(-->4に)を値を変えても、勿論C1は変りますが、D1には値(5とか6)がセットされませんが。 とおっしゃっておりますが、私の式で動かないということは、この方の書かれた式でも動作しないということになります。 #9さんもよく式の意味を理解してから書き込みをされた方が、よろしいかと思います。このように質問者を惑わすようなことになりかねませんので・・・。

その他の回答 (11)

回答No.12

#11の方が使われた Application.WorksheetFunction.Sum(Range(cells(.Row, 1), cells(.Row, 2))) を使うとエラーがおきてしまうことがあります。マイクロソフトのサポートセンターのサポーターからエクセルのバグでWorksheetFunctionが誤作動を起こしてしまうことがあるために、使わない方がよいという指導を受けたことがありますのでお知らせしておきます。 この式を使うのであれば、 Application.Sum(Range(cells(.Row, 1), cells(.Row, 2))) を使った方がエラーを出さずに実行できるようです。 #11さんの考え方を利用したサンプルマクロを作ってみました。前回と同じように操作してみて下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRow As Integer myRow = Target.Row If Target.Address = Range("A" & myRow).Address _ Or Target.Address = Range("B" & myRow).Address Then Range("C" & myRow).Value = Application.Sum(Range("A" & myRow & ":" & "B" & myRow)) Range("D" & myRow).Value = Range("C" & myRow).Value End If End Sub

eoc
質問者

お礼

回答者の皆様、私のやりたいことは 皆様の教えてくれた方法で実現できました。 心より感謝いたします。ありがとうございました。 多数様よりご回答いただきましたが、 No10、No11の順でポイントとさせていただきます。 この場(No12のお礼欄)を借りて皆様にお知らせします。

回答No.11

マクロが解禁になった?みたいなので・・・ 他の方は、C1セルに=SUM(A1:B1)という数式が入力されているのを前提に処理しておられるようなので、 私は、数式を入れないで行う方法を記述します。 1、[Alt]+[F11]を押す。VisialBasicEditerに変更されます。 2、左上にプロジェクトと書いてある中に、    VBAProject(現在のブック名)      └Microsoft Excel Objects         ├Sheet1          ・・・         └ThisWorkbook   とあると思うので、Sheet1をダブルクリック 3.以下のコードを貼り付ける ***************************この下から***************************** Private Sub Worksheet_Change(ByVal Target As Range) With Target '列指定(A,B列に入力された時に入力された行のC列に結果を表示する Select Case .Column Case 1, 2 'A列とB列 Cells(.Row, 3) = Application.WorksheetFunction.Sum(Range(cells(.Row, 1), cells(.Row, 2))) End Select End With End Sub ***************************この上まで*************************** 4.[Alt]+[F11]を押す。Excelに戻ります。 5.Sheet1のA列,B列で数値を入力すると合計が表示されます。 参考までに *-------------------------------------------------------------* '1つづつ指定 With Target Select Case .Address(False, False) Case "A1", "B1" '入力したセルがA1,B1 Range("C1") = Application.WorksheetFunction.Sum(Range("a1:b1")) Case "A2", "B2" '入力したセルがA2,B2 Range("C2") = Application.WorksheetFunction.Sum(Range("a2"), Range("b2")) End Select End With *-------------------------------------------------------------* '行列指定(A2~B5に入力された時に入力された行のC列に結果を表示する With Target If (.Row >= 2 And .Row <= 5 And (.Column = 1 Or .Column = 2)) Then Cells(.Row, 3) = Application.WorksheetFunction.Sum(Range(Cells(.Row, 1), Cells(.Row, 2))) End If End With *-------------------------------------------------------------* Application.WorksheetFunction.Sum Excelの関数を使用する為の記述です。 わかりやすい?ようにExcelの関数を使用してみました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.9

#8のご回答を追試しましたが思うようになりません A1に1、B1セルに3、C1に=SUM(A1:B1)と入れる 。C1は4になります。A1(-->2に)またはB1(-->4に)を値を変えても、勿論C1は変りますが、D1には値(5とか6)がセットされませんが。 またWorksheet_Changeは、演算結果で値が代わったケースを捉えてくれないようですね。C1はA1やB1の変化で変るが、TargetはA1かB1のどれか1つということで当たり前ですね。それを考えて、 Private Sub Worksheet_Change(ByVal Target As _ Range) If Target.Address = "$A$1" Or Target.Address = "$B$1" Then Range("d1") = Range("c1") End If End Sub マクロはお好みでないところ済みません。

回答No.8

こんばんわ。実現できないとのことですので、次のように少し変更してみましょう。 1.新規ブックを立ち上げ、ALT+F11キーを押してVBE画面を表示させ、画面左上のVBAProjectと書かれている下のSheet1をクリックして表示された右側の白い部分に下記のコードをコピー&ペーストする。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRow As Integer myRow = Target.Row If Target.Address <> ActiveSheet.Range("B" & myRow).Address Then Exit Sub Target.Offset(0, 2).Value = Target.Offset(0, 1).Value End Sub ・シート1のC列に必要な行数分計算式を入力しておく。 ・シート1のA1に3と入力する。 ・シート1のB1に4と入力する。 D1に7と表示されるはずです。 これでも何も動作をしない場合は、エクセルのバージョンを教えて下さい。 もしかしたら、シートのチェンジイベントが使えないのかもしれません。その時は、別のサンプルマクロを組んでみたいと思います。何とか貴方様の思ったとおりに動作をする様を体験していただきたいので・・・・。 お手数をおかけいたします。よろしくお願いいたします。

回答No.7

こんばんわ。#2です。 >見た目だけでなく、実際にも「値」とするには、C1をコピーして、カーソルをD1に運び、形式を選択して貼り付けの「値」として貼り付けています。これを自動でやりたいのです。 つまり、D1を選択したときに数式バーに4と表示されるようにしたいということですよね?これを実行ためにはマクロを組む以外に方法はありません。サンプルマクロを組んでみました。次のように操作してみて下さい。 ・データの入っているブックを立ち上げ、ALT+F11キーを押してVBE画面を表示させ、画面左上のVBAProjectと書かれている上にマウスポインターを合わせて右クリック後、挿入→クラスモジュールを順にクリックし、表示された右側の白い部分に下記のコードをコピー&ペーストする。 Public WithEvents App As Application Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim myRow As Integer myRow = Target.Row If Target.Address <> ActiveSheet.Range("B" & myRow).Address Then Exit Sub Target.Offset(0, 2).Value = Target.Offset(0, 1).Value End Sub ・次に画面左上のVBAProjectと書かれている下のThisWorkbookをダブルクリックし、表示された右側の白い部分に下記のコードをコピー&ペーストする。 Dim myClass As New Class1 Private Sub Workbook_Open() Set myClass.App = Application End Sub ここまでの作業が終了したら、1度ブックを保存して終了し、再度ブックを立ち上げます。 操作方法: A列に適当な数値を入れる B列に適当な数値を入れる 貴方様のおやりになりたいことが実現していると思います。 不具合・ご不明な点等がございましたら、ご遠慮なくお知らせ下さい。

eoc
質問者

補足

誠に有り難うございます。 実は、 教えていただいた手順でやってみましたが 実現できていません。 A1とB1に数値を入れるとC1にA1+B1の「値」がでるものと思われますが、いかんせん、私、基本ができていません。 しばらく勉強して、教えていただいた構文を理解してみます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

敢えて言えば、D1に=Value(C1)でしょうか。 (数値の時に限りOK)。名目的に値=Valueを使っているが、=C1の方が 判りやすく、簡単でしょう。=C1も関数と言えなくはないのではないですか。

eoc
質問者

お礼

ご回答有り難うございます。

  • moon00
  • ベストアンサー率44% (315/712)
回答No.5

eocさんのおっしゃってることを関数でやるのは不可能だと思います。 「関数」を使う限り、数式バーにはその関数を用いた式が入力される ことになるからです。 マクロを使うしかないと思うのですが。 お役に立てずにすみません。

eoc
質問者

お礼

ご返答有り難うございます。マクロを使うと簡単な内容でしょうか。 今からマクロについて勉強します。 直ぐには理解できないでしょうが、エクセルの解説書など見ながら少しずつ理解したいと思います。 図々しいお願いと思いますが、よろしければマクロでの方法をお教え願えないでしょうか。 構文が長くなるようでしたら、貴方に申し訳ないので結構です。 ご返答有り難うございました。

  • shota_TK
  • ベストアンサー率43% (967/2200)
回答No.4

D1セルに「=C1」と入力するか、C1をコピーして「編集→形式を選択して貼り付け→値」でしょうね。 値をコピーするのでしたら、ショートカットを使う方法もあります。 Ctrl+Cでコピーした後、貼り付け先のセルを選択し、Altを押しながら「E→S→V→Enter」です。 あるいは、「値を貼り付け」ることが多いようでしたら、「ツール→ユーザー設定→コマンド→編集」の中に「値の貼り付け」がありますから、このアイコンをドラッグしてツールボックスの中に入れておけば、次からワンクリックで値をコピーできます。

eoc
質問者

補足

早速のご返答有り難うございます。 「編集→形式を選択して貼り付け→値」に相当することを関数で自動にできないでしょうか? 具体的には、 セルA1とセルB1に数値を入れるだけで、C1は=A1+B1を自動で行い、なおかつD1には 数式バーの部分も含めて C1の「値」が入るようにしたいのです。 そんな関数はないでしょうか?

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.3

+C1 とやる手もあります。

eoc
質問者

補足

ご返答有り難うございます。 +C1と入力すると、D1の見た目はC1と同じですが、数式バーは「+C1」となります。 「形式を選択してコピー」に相当する関数はないでしょうか?

回答No.2

初めまして。 D1のセルに=C1とやってみてはどうでしょうかこれでできると思いますが・・・・。 もし、違うのであればごめんなさい。

eoc
質問者

補足

ご返答誠に有り難うございます。 No1,4の方の補足欄に記入した通りです。 D1に=C1といれると、D1の見た目はC1と同じですが、数式バーの表示は「=C1」のままですよね。 これでは具合が悪いのです。 >もし、違うのであればごめんなさい。 いいえ、私の質問が下手なんです。ご返答に感謝しております。

関連するQ&A