Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2042 / 13645 ツリー ←次へ | 前へ→

【70327】最終行までの範囲取得について どぢょりん 11/11/2(水) 1:15 質問[未読]
【70328】Re:最終行までの範囲取得について UO3 11/11/2(水) 6:01 発言[未読]
【70333】Re:最終行までの範囲取得について ichinose 11/11/2(水) 18:53 発言[未読]
【70335】Re:最終行までの範囲取得について 訂正 ichinose 11/11/2(水) 19:39 発言[未読]
【70338】Re:最終行までの範囲取得について 訂正 どぢょりん 11/11/2(水) 23:34 お礼[未読]

【70327】最終行までの範囲取得について
質問  どぢょりん  - 11/11/2(水) 1:15 -

引用なし
パスワード
   お世話になります。
初心者レベルです。

シート1にはデータが入っています(B〜R列、300〜400行程度、3行目から)。
シート1の該当行のみA列に数字を入力し、数字の入っている行だけをシート2に貼り付けようと思い、以下のように記述しました。

Range("A3:A65536").SpecialCells(xlCellTypeConstants).EntireRow.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste

しかし、最終行を取得するのにエクセルのバージョンに依存しないほうがいいかと思い、下記のように変更しました。

Range("A3", Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste

ところがこの場合、例えばA3とA4に数字が入っている場合はコピーされますが、A3だけの場合はコピーされないことがわかりました。
最初の記述ではA3だけでもコピーされます。

なぜ、このようになるのかが分からなくて困っています。
教えてください。

また、現在は行全体をコピーして転記していますが、
データはR列までしかないので、A〜R列のみのコピーに変更したいと考えていますが、どのように変えたらいいのでしょうか。あるいは、このままのほうがいいのでしょうか。

よろしくお願いします。

【70328】Re:最終行までの範囲取得について
発言  UO3  - 11/11/2(水) 6:01 -

引用なし
パスワード
   ▼どぢょりん さん:

>ところがこの場合、例えばA3とA4に数字が入っている場合はコピーされますが、A3だけの場合はコピーされないことがわかりました。
>最初の記述ではA3だけでもコピーされます。

おはようございます

今、念のため確かめましたが、A3だけに数字が入っている状態で、いずれのコードでもコピーされましたよ?

もちろん、xlCellTypeConstants ですから 数字以外でも対象になりますし
逆に「式」がはいっていて表示されているようなセルは対象外になりますが。

>また、現在は行全体をコピーして転記していますが、
>データはR列までしかないので、A〜R列のみのコピーに変更したいと考えていますが、
>どのように変えたらいいのでしょうか。あるいは、このままのほうがいいのでしょうか。

エクセルの処理負荷ということをご心配ということですか?
であれば、それは考えなくてもいいと思います。
内部的には、エクセルは「UsedRange」の範囲で処理してくれると思われますので。
(本テーマではなく別のテーマでの検証ですけど、まず間違いないでしょう)

【70333】Re:最終行までの範囲取得について
発言  ichinose  - 11/11/2(水) 18:53 -

引用なし
パスワード
   こんばんは。


>Range("A3", Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Copy
>Sheets("Sheet2").Select
>Range("A1").Select
>ActiveSheet.Paste
>
>ところがこの場合、例えばA3とA4に数字が入っている場合はコピーされますが、A3だけの場合はコピーされないことがわかりました。

例えば

    A     B    C    D
 1
 2
 3   1     2     3    4
 4        5     6    7


Sheet1に上記のようなデータは位置の場合、
Sub test0()
  Range("A3", Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Copy
  Sheets("Sheet2").Select
  Range("A1").Select
  ActiveSheet.Paste
End Sub

このコードを実行すると、「そのコマンドは複数の選択範囲に対して実行できません」
というエラーが
  Range("A3", Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Copy

↑この行で発生し、プログラムが止まります。

  Range("A3", Cells(Rows.Count, 1).End(xlUp))

 この記述で上記のデータ配置で取得するセルは、A3だけですよね?

単一セルに対して、SpecialCells(xlCellTypeConstants)メソッドは、

cells.SpecialCells(xlCellTypeConstants) で取得できるセル範囲と同値です。

結果として、

Range("A3", Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow

は、 $3:$3,$3:$4 という複数のエリアを持つセル範囲になってしまい、
コピーが出来ないという趣旨のメッセージが表示されます。

修正は、Range("A3", Cells(Rows.Count, 1).End(xlUp))これで取得するセルの数を
1とそれ以外で処理を分けるか、

UO3さんの投稿のように元のコードで対応するかですね!!

【70335】Re:最終行までの範囲取得について 訂正
発言  ichinose  - 11/11/2(水) 19:39 -

引用なし
パスワード
   >Sheet1に上記のようなデータは位置の場合、
Sheet1が上記のようなデータ配置の場合、

【70338】Re:最終行までの範囲取得について 訂正
お礼  どぢょりん  - 11/11/2(水) 23:34 -

引用なし
パスワード
   UO3さん、ichinose さん、ありがとうございます。

再度やってみましたが、A3のみに入力した場合は、

「実行時エラー'1004'
そのコマンドは複数の選択範囲に対して実行できません」

となります。

また、A列に何もいれずに実行すると、A2を拾ってしまい、2行目をコピーしてしまいます。

ichinose さんの言われるように、以前のコードに戻すことにしました。
ありがとうございました。

2042 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free