• ベストアンサー

エクセルのフォームのVBAについて

VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1 としないと、次行(最終行の下)になりません。 ただし、これだけだと1行目が空白でも2行目からの記入になって仕舞います。 Sub 入力() Dim LastRow As Long With Worksheets("sheet2") If .Range("A1") = "" Then LastRow = 1 Else LastRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 End If .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub

ohana117
質問者

お礼

ありがとうございます 意味がよくわかりませんがコピーして貼り付けでできました 感謝です。

その他の回答 (2)

回答No.3

>LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row の行のすぐ後に以下の3行を追加すればよいと思います。 If .Range("A" & LastRow).Value <> "" Then  LastRow = LastRow + 1 End If 以下、解説です。 >LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row でやろうとしていることは、Sheet2 の A 列の(値がコピーされている) 最終行を求めることです。 1. Rows.Count というのはそのシートの行数(通常は 65536 行)です。 2. Worksheets("sheet2").Range("A" & Rows.Count) でカーソルを A65536 に移動させます。 3. Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp) で A65536 から Ctrl+↑ を入力します。 4. Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row で 3. でのカーソルのある行番号を取得しています。 これで Sheet2 の最終行が求まるので、その後に行を追加したいのなら >LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row ではなく、 LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1 (最後で +1 している)とすべきです。 しかしそれでは、シートが空のとき最終行は 1 となり、2行目から追加されてしまうので、 If .Range("A" & LastRow).Value <> "" Then  LastRow = LastRow + 1 End If を追加して最終行が空でない場合にだけ最終行に +1 するようにしています。 おわかりいただけますでしょうか・・・

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.1

OFFSETを使えばなんだかもっと簡単に出来そうですが、とりあえず 今のプログラムを生かすならば、問題はこいつでしょう。 LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row Range("A" & Rows.Count)だと、A1にデータが入った時点でRange("A1") になりますよね。ここでいくら.End(xlUp).Rowをやっても、"1"しか出て 来ませんよ。 で、勉強中だということなので、解決のヒントだけ。 2行以上入っていれば、1行目からxlDownで下げれば、最後の行に入力 可能ですよね。だから全然入ってない時と、1行しか入ってない時の、 両方を「特別扱い」にすりゃいいんです。 まあ、他の考え方も出来ますが、わかりやすい発想はコレということで。

ohana117
質問者

お礼

ありがとうございます 勉強していきます

関連するQ&A