• ベストアンサー

エクセル マクロで行き詰まりました。助けて・・・

エクセル初心者です。初心者にも関わらず、マクロに挑戦して壁にぶち当たりました。やはり限界です。教えてください! <やりたい事> SHEET1に必要項目を入力してから計算開始ボタンを押す。計算結果を別シートに表示させると同時に、ボタンを押す毎にその計算結果を履歴として積み重ねる。 今回の計算結果    A     B    C    D    E 1       四月   20   30   40  2   9  履歴    10  2回前   六月   40   30   40  11  1回前   五月    30   40   50 12  今回   四月   20    30   40 うまく説明できませんが、数式セルを値だけコピーして、ボタンを押す度に自動改行しながらペーストをするというマクロなんだと思うんですが・・・。 非常に困っています。どうか宜しくお願いします。

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

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

こんにちは。 値だけ必要なら、コピーではなく代入がベターです。 PasteSpecialメソッドを使用すると使用後に範囲選択状態の解除など余計な手間が必要になります。 結果表Sheet2にCommandButtonがあるとして。 '-------------------------------------------------------- Private Sub CommandButton1_Click()  Dim LastR As Long  LastR = Range("B65536").End(xlUp).Row + 1  If LastR < 10 Then LastR = 10 ● Range(Cells(LastR, "B"), Cells(LastR, "U")).Value = Range("B2:U2").Value End Sub '--------------------------------------------------------- ●の部分はResizeを使うと Cells(LastR, "B").Resize(1, 20).Value = Range("B2:U2").Value 尚、If LastR < 10 Then LastR = 10 は 9行目に見出しがなかった場合(少なくともB9にない場合)に必要になります。 9行目に見出しがあれば不要です。 それから、最初の質問のレイアウトにある、1回前、2回前というのは、B列の四月、五月というので分かるのではありませんか? で、上記コードでは、1回前とかは省いてあります。  

exceling
質問者

お礼

おはようございます。回答ありがとうございます!! さっそく試してみたところ、やりたい事が出来ました。代入・・・、初めて知りました。ずっとコピーっていう認識しかなかったからですね。 kobouzu_suさんが回答してくださったマクロを自分なりに消化してみます。そうでないと何度もお世話になりそうですから。 今回は本当にありがとうございました。 ひとつお尋ねしたいのですが、visual basicの知識を深めるにあたり、おすすめの参考書ってありますか?

その他の回答 (4)

  • daruizm
  • ベストアンサー率61% (8/13)
回答No.4

前の回答が多少参考になったのなら幸いです。 >ボタンを押したら自動改行しながらデータはコピペ出来たのですが、 >全て最新のデータに書き換えられちゃいます。 >おそらくB2:U2のセルをコピーする際に値ではなく、 >数式をコピーしてしまってるからだと考えてます。 何がコピーされてしまってるかは実物を見ればわかりますよね。 実際のところ、数式がコピーされてましたか? で、私の書いた奴で、 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True の行のところが、前の行でコピーしたセルのデータを、 形式を選択して貼り付けするコマンド(正確にはメソッドと言う)で、 .PasteSpecial が実際の形式指定貼り付けコマンド名で(Selectionというのは変数みたいなもの) paste:=xlPasteValues というのが、「"値"を貼り付け」という意味です。 PasteSpecialというコマンドの詳細は参考URLをご覧下さい。 ただ、なんとなくSelectionとか使わない方法でやってるのかな、と推測します。 やっぱり一度、今作ってみてるマクロを見せていただくのが早い気もしますね。

参考URL:
http://www.moug.net/tech/exvba/0050104.htm
exceling
質問者

補足

selectionとか使わないんじゃなくて使えないんです・・・。なさけなし。 下記が現在のマクロです。ご覧の通り、値を貼り付け出来てません。 Sub 入力完了1_Click() Worksheets("Sheet2").Activate r = Cells(10, 2).CurrentRegion.Rows.Count + 9 Range("B2", "U2").Copy Destination:=Cells(r + 1, 2) End Sub コマンドボタンはSHEET1にあります。

noname#140971
noname#140971
回答No.3

Excel は操作したこともない門外漢ですが・・・・。 <Sheet1> _______________B____________C____________D____________E 10___________ 6月_________ 20___________ 30___________ 40 <Sheet2> 1_____________________________________________________________3 10__2回前__4月________20___________30___________40 11__1回前__5月________20___________30___________40 12__今回____6月________20___________30___________40 履歴の月数が違っていると思います。 実際に、ボタンを押してコピーさせると上のようになりました。 Option Explicit Const START_ROW = 10 Const COPY_ROW = 10 Private Sub CommandButton1_Click()   Dim I    As Integer   Dim intCount As Integer      intCount = Worksheets("Sheet2").Cells(1, 6)   For I = intCount To 1 Step -1     Worksheets("Sheet2").Cells(START_ROW + intCount - I, 1) = I & "回前"   Next I   Worksheets("Sheet2").Cells(START_ROW + intCount, 1) = "今回"   Worksheets("Sheet2").Cells(START_ROW + intCount, 2) = Worksheets("Sheet1").Cells(COPY_ROW, 2)   Worksheets("Sheet2").Cells(START_ROW + intCount, 3) = Worksheets("Sheet1").Cells(COPY_ROW, 3)   Worksheets("Sheet2").Cells(START_ROW + intCount, 4) = Worksheets("Sheet1").Cells(COPY_ROW, 4)   Worksheets("Sheet2").Cells(START_ROW + intCount, 5) = Worksheets("Sheet1").Cells(COPY_ROW, 5)   Worksheets("Sheet2").Cells(1, 6) = intCount + 1 End Sub コード自体はこのようです。 ただ、Worksheets("Sheet2").Cells(1, 6)にコピー回数を記録することで簡素化しています。 ※今回が実は一番上・・・・これも、アレンジすればいいです。

exceling
質問者

お礼

回答ありがとうございます。 別の回答者の方のところに補足説明(ほとんど説明しなおし)をさせていただきました。もし宜しければ、そちらの質問にも回答願えませんか?

  • MIYABF5D
  • ベストアンサー率26% (17/64)
回答No.2

えーと・・・ 初めまして。 イマイチやりたいことがわかんないです。 (ボクの知識不足&読解力がないだけかな) 例に表示されているのは 「別Sheet」で表示したい「結果」なんですよね? 未来である5月や6月が上にきているのがどうしてかわからないですが。 要は1列目の結果をマクロで一番下に表示させたいってことですか? もうちょっと補足お願いします

exceling
質問者

補足

3名の方に回答いただいきまして、ありがとうございます。私の説明不足がかなりの混乱を招いているようで・・・。申し訳ないです。未来が上に来てる・・・間違いです!すみません。 説明の仕方を変えます。 SHEET1のB10:T10までに計算に必要な数値を入力すると、その計算結果がSHEET2のB2:U2に出るようにしています。ただこれだけだと数値を入力する度に計算結果データが更新されてしまい、過去の結果データが失われます。そこで入力完了ボタンを設けて、それを押すとSHEET2のB10:U10にB2:U2の値をコピーして表示させる。2回目のデータはB11:U11、3回目はB12:U12、・・・というように自動改行しながら履歴として残したいのです。 ようするにボタンに対してのマクロだと思います。自分で色々と参考になりそうなものを見ながら試してみたら、ボタンを押したら自動改行しながらデータはコピペ出来たのですが、全て最新のデータに書き換えられちゃいます。おそらくB2:U2のセルをコピーする際に値ではなく、数式をコピーしてしまってるからだと考えてます。 ちなみに入力データをそのまま結果として使っているセルもあります。日付とか部品名とか。 PASTESPECIAL XLPASTEVALUES・・・・・・ここら辺りに辿り着いたのですがどう使っていいものやら。 これ以上は上手く説明できる自信はないです。何とか宜しくお願いします。

  • daruizm
  • ベストアンサー率61% (8/13)
回答No.1

初心者さんが挑戦するには、色々地味にややこしいマクロになりそうですね。 例えば、 1.Sheet2のA~D列の、1行目が空白になるように、空行を挿入 2.Sheet1のB1~B4のデータをコピー 3.Sheet2のA1~D1に、B1~B4のデータの値だけを貼り付け という程度のことならこんな具合ですが。 Sub Macro1() Sheets("Sheet2").Select Range("A1:D1").Select Application.CutCopyMode = False Selection.Insert Shift:=xlDown Sheets("Sheet1").Select Range("B1:B4").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True End Sub これぐらいなら、なんとなくなにやってるかもわかると思いますけれど、 上で書かれてるように、途中に「履歴」という行をはさんだり、 2回前、1回前、というようなのを自動で入れたいということなら、 初心者の方が取り組むには、中々にややこしいマクロになります。 「マクロの勉強をしたい」なら、相応のところで手順を踏んで、 色々とサンプルマクロを作られるか、 ・今書いてみたマクロ ・実行したらどうなる を明確にしていただかないと、助言もしにくいかと。 「とりあえずこれを実現するマクロが欲しい」ということなら どなたかが作ってくれるのを待つしかないですけどね。 私は取り合えずご参考までということで。ポイントなど不要です。

exceling
質問者

お礼

回答ありがとうございます。コピペのマクロは何となく理解できました。 別の方のところに補足説明(ほとんど説明しなおし)をさせていただきました。もし宜しければ、そちらの質問にも回答願えませんか?