Excel VBA質問箱 IV

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

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


5782 / 13646 ツリー ←次へ | 前へ→

【48853】範囲の最終行を取得する場合 質問(煮詰まった) 07/5/11(金) 18:26 質問[未読]
【48855】Re:範囲の最終行を取得する場合 ウッシ 07/5/11(金) 18:51 発言[未読]
【48879】Re:範囲の最終行を取得する場合 質問(煮詰まった) 07/5/14(月) 9:21 お礼[未読]
【48880】Re:範囲の最終行を取得する場合 ウッシ 07/5/14(月) 9:48 発言[未読]
【48882】Re:範囲の最終行を取得する場合 質問(煮詰まった) 07/5/14(月) 11:04 お礼[未読]
【48883】Re:範囲の最終行を取得する場合 ウッシ 07/5/14(月) 12:04 発言[未読]
【48902】Re:範囲の最終行を取得する場合 質問(煮詰まった) 07/5/15(火) 9:18 お礼[未読]

【48853】範囲の最終行を取得する場合
質問  質問(煮詰まった)  - 07/5/11(金) 18:26 -

引用なし
パスワード
   以下の処理で結果がことなるのですが
何が原因か教えて下さい。

作業3のシートにデータがありその転送されている行
の最後の行をを取得しています。

作業3には394行までデータが転送されています。


With Sheets("作業3")
     vnt = .Range("B65536").End(xlUp).Row
  End With
  
  MsgBox vnt   ⇒394と表示します。
  
  '
  With Sheets("作業3")
     vnt = .Range("N2", .Range("A65536").End(xlUp)).Value
  End With

  MsgBox vnt   ⇒384と表示します。

 (単純にMSGBOXでは表示できなかたので、一旦VNC2 LONG に転送しました。

  変数は下記の内容で定義しています。

   Dim vnt, a

  なぜこのようなことがおこるのか教えて下さい。

  またFor i = 1 To UBound(vnt, 1)な記載の場合は
  前者の記載のままでは利用できないのはなぜかも
  併せて教えて下さい。

  宜しくお願いします。

【48855】Re:範囲の最終行を取得する場合
発言  ウッシ  - 07/5/11(金) 18:51 -

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

>  With Sheets("作業3")
>     vnt = .Range("B65536").End(xlUp).Row
>  End With
は「Row」なのでB列の最終行です。
  
>  With Sheets("作業3")
>     vnt = .Range("N2", .Range("A65536").End(xlUp)).Value
>  End With
は「Value」なので、N2〜A列最終セルまでの範囲の値になり、
> (単純にMSGBOXでは表示できなかた
エラーになります。

>  なぜこのようなことがおこるのか教えて下さい。
まったく違う意味の処理をしているのですから当然です。
B列の最終行と、N2〜A列最終セルまでの範囲の値を比較しても仕方ないです。

>  またFor i = 1 To UBound(vnt, 1)な記載の場合は
>  前者の記載のままでは利用できないのはなぜかも
>  併せて教えて下さい。
前者はB列の最終行なのでこれも当然です。

【48879】Re:範囲の最終行を取得する場合
お礼  質問(煮詰まった)  - 07/5/14(月) 9:21 -

引用なし
パスワード
   回答ありがとうございます。

N2−A列最終にはB列も含まれており
本来、N2−A列最終行はB列の最終行と同じ結果に
なると思うのですが、この考え方は違うのでしょうか?

アドバイスお願いします。


▼ウッシ さん:
>こんばんは
>
>>  With Sheets("作業3")
>>     vnt = .Range("B65536").End(xlUp).Row
>>  End With
>は「Row」なのでB列の最終行です。
>  
>>  With Sheets("作業3")
>>     vnt = .Range("N2", .Range("A65536").End(xlUp)).Value
>>  End With
>は「Value」なので、N2〜A列最終セルまでの範囲の値になり、
>> (単純にMSGBOXでは表示できなかた
>エラーになります。
>
>>  なぜこのようなことがおこるのか教えて下さい。
>まったく違う意味の処理をしているのですから当然です。
>B列の最終行と、N2〜A列最終セルまでの範囲の値を比較しても仕方ないです。
>
>>  またFor i = 1 To UBound(vnt, 1)な記載の場合は
>>  前者の記載のままでは利用できないのはなぜかも
>>  併せて教えて下さい。
>前者はB列の最終行なのでこれも当然です。

【48880】Re:範囲の最終行を取得する場合
発言  ウッシ  - 07/5/14(月) 9:48 -

引用なし
パスワード
   こんにちは

>N2−A列最終にはB列も含まれており
>本来、N2−A列最終行はB列の最終行と同じ結果に
>なると思うのですが、この考え方は違うのでしょうか?
決して「本来」では無いですが、この考えが正しいとしても、書いているコードが
間違っているという事です。

どうしても比較したいのなら、こんな感じです、

Sub test()
  Dim vntB As Long
  Dim vntNA As Long
  With Sheets("作業3")
     vntB = .Range("B65536").End(xlUp).Row
     vntNA = .Range("N2", .Range("A65536").End(xlUp)).Row + _
        .Range("N2", .Range("A65536").End(xlUp)).Rows.Count - 1
     MsgBox "B列の最終行   : " & vntB & vbCrLf & _
        "N2−A列最終行 : " & vntNA
  End With
End Sub

が、N2−A列最終行は「.Range("A65536").End(xlUp)の行」で設定してますので、
最初から、A列、B列の最終行を比較するのと同じ意味になります。

考え通りのコードが書けなくて、考え通りの結果が出ない・・・と煮詰まっても仕方
ないと思います。

N2−A列最終行の範囲を取得していますが、もしB列がA列よりデータが多かったら
どうするのでしょうか?
最初から最終データ行の判定出来る列を対象にすべきです。

また離席しますのでしばらくレス出来ません。

【48882】Re:範囲の最終行を取得する場合
お礼  質問(煮詰まった)  - 07/5/14(月) 11:04 -

引用なし
パスワード
   基本的な捉え方を間違っているようなので教えて下さい。

例えば) 作業3のシートとして
見出有り
   A列 B列 C列
1行  10  100 1000
2行  20  200 2000
3行  空白 300 

上記の場合、

With Sheets("作業3")
     vnt = .Range("B65536").End(xlUp).Row
  End With

  結果vnt=4 ★B列最後なので
  
  
  '
  With Sheets("作業3")
     vnt = .Range("C2", .Range("A65536").End(xlUp)).Value
  End With
  
  結果vnt=3 ★ひょっとしてA列の最後を検索するのでしょうか?

  C2-A65536を下から範囲検索するので、B列の最後を取得すると
  思っていたのですが・・・

  度々お手数ですが宜しくお願いします。

【48883】Re:範囲の最終行を取得する場合
発言  ウッシ  - 07/5/14(月) 12:04 -

引用なし
パスワード
   こんにちは

>作業3、見出有り
>   A列 B列 C列
> 1行 項目1 項目2 項目3
> 2行  10  100 1000
> 3行  20  200 2000
> 4行     300 
でしたら、
> With Sheets("作業3")
>     vnt = .Range("B65536").End(xlUp).Row
>  End With
>
>  結果vnt=4 ★B列最後なので
です。

>  With Sheets("作業3")
>     vnt = .Range("C2", .Range("A65536").End(xlUp)).Value
>  End With
>  
>  結果vnt=3 ★ひょっとしてA列の最後を検索するのでしょうか?
セルC2からA列の最終行ですが、何度も書いた通り「.Value」では違う意味になります。

>  C2-A65536を下から範囲検索するので、B列の最後を取得すると
>  思っていたのですが・・・
セルC2からA列の最終行ですから、Sheets("作業3")を表示しておいて、
>  With Sheets("作業3")
>     .Range("C2", .Range("A65536").End(xlUp)).Select
>  End With
とすれば、どのセル範囲が取得されているか分かります。

【48902】Re:範囲の最終行を取得する場合
お礼  質問(煮詰まった)  - 07/5/15(火) 9:18 -

引用なし
パスワード
   ありがとうございました。
試してみます。

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