こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルのフォームの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
と参考書とおりいれたのですが‥。教えて下さい。

投稿日時 - 2008-02-01 10:30:33

QNo.3733444

すぐに回答ほしいです

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

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

投稿日時 - 2008-02-01 11:02:06

お礼

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

投稿日時 - 2008-02-01 18:21:33

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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 するようにしています。
おわかりいただけますでしょうか・・・

投稿日時 - 2008-02-01 11:07:29

ANo.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行しか入ってない時の、
両方を「特別扱い」にすりゃいいんです。

まあ、他の考え方も出来ますが、わかりやすい発想はコレということで。

投稿日時 - 2008-02-01 10:56:45

お礼

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

投稿日時 - 2008-02-01 18:20:43

あなたにオススメの質問