• ベストアンサー

Excel シート1の雛型からシート2の一覧表作成へ

 お世話になります。  私は会社でExcelを使い事務をしております。  式を入力して少し事務を簡素化する事は出来ますが、マクロやVBには明るくありません。  シート1の雛型1箇所に入力すると同時に、シート2に一覧表が作成される様には出来ないものでしょうか?  頑張ってマクロを使ってみましたが、シート1のB1を入力するとシート2のB1の数値まで変わってしまいます。(表を参考にしてください)  シート1(雛型)    A       B        C 1 固定数  入力した数字  数式A/B  シート2(一覧表)     A           B         C 1 シート1A1の数字 シート1B1の数字 シート1C1の数字  2 シート1A1の数字 シート1B1の数字 シート1C1の数字 3 シート1A1の数字 シート1B1の数字 シート1C1の数字 4 シート1A1の数字 シート1B1の数字 シート1C1の数字  分かりにくい説明で申し訳ありません。  皆さまのお知恵をお待ちしております。  よろしくお願いします。

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

  • ベストアンサー
  • jindon
  • ベストアンサー率43% (50/116)
回答No.4

シート名 シート1 : 雛形 シート2 : データ蓄積用 シート1のB1に変更があった場合、シート1のA1:D1の: 1)「値のみ」をシート2に順次蓄積する。 Private Sub Worksheet_Change(ByVal Target As Range) Dim lastA As Long, ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("シート1") Set ws2 = Sheets("シート2") With Target If .Address <> "$B$1" Or .Count <> 1 Or IsEmpty(Target) Then Exit Sub If WorksheetFunction.Count(ws1.Range("a1:b1")) <> 2 Then Exit Sub lastA = ws2.Range("a65536").End(xlUp).Row ws2.Range("a" & lastA + 1).Resize(1, 4).Value = _ ws1.Range("a1").Resize(1, 4).Value End With End Sub 2)数式も含めてシート2に順次蓄積する。 Private Sub Worksheet_Change(ByVal Target As Range) Dim lastA As Long, ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("シート1") Set ws2 = Sheets("シート2") With Target If .Address <> "$B$1" Or .Count <> 1 Or IsEmpty(Target) Then Exit Sub If WorksheetFunction.Count(ws1.Range("a1:b1")) <> 2 Then Exit Sub lastA = ws2.Range("a65536").End(xlUp).Row ws2.Range("a" & lastA + 1).Resize(1, 4).Copy _ Destination:=ws2.Range("a" & lastA+1) End With End Sub

morukai
質問者

お礼

 迅速かつ丁寧なお返事をありがとうございます。  早速試してみたところ、思っていた通りになりました。これで事務処理もスムーズになると思います。  丁寧な方々に出会えてすぐに問題も解決でき、本当ならば全員にポイントを差し上げたいところですが、今回はこのような配点にさせていただきました。  ご了承下さいませ。  本当にありがとうございました。    

その他の回答 (3)

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

私も#1のお方と同じく質問の意味(何をしたいか)が判りません。シート1は固定数と入力値1個を取るためのものですよね。シート1のC1の数式A/Bは何のためにある(使う)のですか。 シート2は何をしたいのでしょうか。 数値実例でも3-4行上げてもらえれば判るかもしれない。 シート2の各行で変わるのは何ですか。 ●今閃きました。ひょっとしてシート1に入力した 値を行をづらして記録すること及びA/Bの値を計算して 累積して記録して行きたいのでしょうか。 それであればシート1のChangeイベントなど使い シート2の行数を1ずつ増やせば良いのですが、VBAとしてもやや難しい。行を表す変数の扱い(下記のi)が私も含め、初学者には難しいと思う。 シートのChangeイベントに Private Sub Worksheet_Change(ByVal Target As Range) i = i + 1 Worksheets("sheet3").Cells(i, "B") = Target End Sub 標準モジュールに Public i Sheet1のセルに値をいれるとSheet3のB列に B1->B2->B3・・・に入力値をセットします。 あとA1の値とか、C列は(VBAでもやれますが)関数でやれば良いでしょう。

morukai
質問者

補足

 皆さまお返事ありがとうございます。  質問の仕方が悪く申し訳ありません。  今回アークタンジェントを利用して角度取得一覧表を作成することが目的です。  そのためにシート1のA1には10、C1はA/B、D1には式ATAN(C1)*180/PI()を入力し、B1に数値を入力すれば角度を求めることが出来る雛型を作成しました。  B1が更新されるたびに、シート2にA1~D1の入力内容が自動的にとび、一覧表が作成されるようにしたいと思っています。  ちなみに求めたい角度は800~1000個あります。  初心者はやはり欲張らずに一覧表を作成し、式をコピーした方が良いのでしょうか?  皆さまの意見をお待ちしています。

  • jindon
  • ベストアンサー率43% (50/116)
回答No.2

Sheet1の一列目を入力用として、Sheet2にデータを重ねていくということでしょうか? Sheet1のシートタブを右クリックして「コードを表示」を選択 下記のコードを貼り付ける。 Sheet1のB1が変更された時点でSheet1のA1:B1が入力されている場合、Sheet2のA列の最後の次の行に転記されます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim lastA As Long, ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("sheet1") Set ws2 = Sheets("sheet2") With Target If .Address <> "$B$1" Or .Count <> 1 Or IsEmpty(Target) Then Exit Sub If WorksheetFunction.Count(ws1.Range("a1:b1")) <> 2 Then Exit Sub lastA = ws2.Range("a65536").End(xlUp).Row ws2.Range("a" & lastA + 1).Resize(1, 3).Value = _ ws1.Range("a1").Resize(1, 3).Value End With End Sub

morukai
質問者

お礼

 お返事ありがとうございます。  質問の仕方が悪く申し訳ないです。  #3さんのお返事に補足しました。  もしお時間があれば回答お願いします。

回答No.1

すみません、ちょっとやりたいことの内容がよくわからないんですが、質問に書かれたシート2はご自分で作ったマクロの結果という意味でしょうか? 作りたいのは  シート1(雛型)    A       B        C 1 固定数  入力した数字  数式A/B 2 固定数  入力した数字  数式A/B 3 固定数  入力した数字  数式A/B 4 固定数  入力した数字  数式A/B  シート2(一覧表)     A           B         C 1 シート1A1の数字 シート1B1の数字 シート1C1の数字  2 シート1A2の数字 シート1B2の数字 シート1C2の数字 3 シート1A3の数字 シート1B3の数字 シート1C3の数字 4 シート1A4の数字 シート1B4の数字 シート1C4の数字 ということでしょうか? 単純にシート1のそれぞれのセルを参照する、ということではダメなんですね?

morukai
質問者

お礼

 お返事ありがとうございます。  質問の仕方が悪く申し訳ないです。  #3さんのお返事に補足しました。  もしお時間があれば回答お願いします。

関連するQ&A