dポイントプレゼントキャンペーン実施中!

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

A 回答 (12件中1~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さんもよく式の意味を理解してから書き込みをされた方が、よろしいかと思います。このように質問者を惑わすようなことになりかねませんので・・・。
    • good
    • 1

#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
    • good
    • 0
この回答へのお礼

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

この場(No12のお礼欄)を借りて皆様にお知らせします。

お礼日時:2002/11/16 17:20

マクロが解禁になった?みたいなので・・・



他の方は、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の関数を使用してみました。
    • good
    • 0

#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
マクロはお好みでないところ済みません。
    • good
    • 0

こんばんわ。

実現できないとのことですので、次のように少し変更してみましょう。

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と表示されるはずです。

これでも何も動作をしない場合は、エクセルのバージョンを教えて下さい。
もしかしたら、シートのチェンジイベントが使えないのかもしれません。その時は、別のサンプルマクロを組んでみたいと思います。何とか貴方様の思ったとおりに動作をする様を体験していただきたいので・・・・。

お手数をおかけいたします。よろしくお願いいたします。
    • good
    • 0

こんばんわ。

#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列に適当な数値を入れる

貴方様のおやりになりたいことが実現していると思います。

不具合・ご不明な点等がございましたら、ご遠慮なくお知らせ下さい。

この回答への補足

誠に有り難うございます。
実は、
教えていただいた手順でやってみましたが 実現できていません。

A1とB1に数値を入れるとC1にA1+B1の「値」がでるものと思われますが、いかんせん、私、基本ができていません。

しばらく勉強して、教えていただいた構文を理解してみます。

補足日時:2002/11/15 18:46
    • good
    • 0

敢えて言えば、D1に=Value(C1)でしょうか。


(数値の時に限りOK)。名目的に値=Valueを使っているが、=C1の方が
判りやすく、簡単でしょう。=C1も関数と言えなくはないのではないですか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/15 18:26

eocさんのおっしゃってることを関数でやるのは不可能だと思います。


「関数」を使う限り、数式バーにはその関数を用いた式が入力される
ことになるからです。
マクロを使うしかないと思うのですが。
お役に立てずにすみません。
    • good
    • 0
この回答へのお礼

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

構文が長くなるようでしたら、貴方に申し訳ないので結構です。

ご返答有り難うございました。

お礼日時:2002/11/15 17:09

D1セルに「=C1」と入力するか、C1をコピーして「編集→形式を選択して貼り付け→値」でしょうね。


値をコピーするのでしたら、ショートカットを使う方法もあります。
Ctrl+Cでコピーした後、貼り付け先のセルを選択し、Altを押しながら「E→S→V→Enter」です。

あるいは、「値を貼り付け」ることが多いようでしたら、「ツール→ユーザー設定→コマンド→編集」の中に「値の貼り付け」がありますから、このアイコンをドラッグしてツールボックスの中に入れておけば、次からワンクリックで値をコピーできます。

この回答への補足

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

補足日時:2002/11/15 16:17
    • good
    • 0

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

この回答への補足

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

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

補足日時:2002/11/15 16:31
    • good
    • 0

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