Excel VBA質問箱 IV

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

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


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

【69928】マクロエラー free 11/9/24(土) 17:53 質問[未読]
【69929】Re:マクロエラー n 11/9/24(土) 19:46 発言[未読]
【69930】Re:マクロエラー free 11/9/24(土) 20:20 お礼[未読]
【69931】Re:マクロエラー n 11/9/24(土) 20:43 発言[未読]
【69932】Re:マクロエラー free 11/9/24(土) 21:38 お礼[未読]

【69928】マクロエラー
質問  free  - 11/9/24(土) 17:53 -

引用なし
パスワード
   Private Sub 指定列がのセルに空白があったら行削除_Click()
Application.ScreenUpdating = False
Dim MaxRow As Long
Dim rc As Long
Dim i As Long
MaxRow = ActiveSheet.usedrange.Rows(.Rows.Count).Row '行番号
rc = InputBox("列を入力して下さい。")
 For i = MaxRow To 1 Step -1
  If Cells(i, rc) = "" Then
   Rows(i).Delete
  End If
 Next
Application.ScreenUpdating = True
End Sub

こんなコードを書いたのですが、エラーがでます。
with activesheet.usedrange
MaxRow =.Rows(.Rows.Count).Row
end with
これならいけるのですが。
違いがわかりません。
activesheet.usedrange.rows(.rows.count)はusedrangeの行になって最後に.rowをつける事によって全体の行番号になるのは理解出来るのですが。間違ってます?
最後の.rowはrowsにしなくていいのかな?rowsとrowの違いがいまいち。

素人ですみません。
誰か教えてください。
お願いします。

【69929】Re:マクロエラー
発言  n  - 11/9/24(土) 19:46 -

引用なし
パスワード
   >MaxRow = ActiveSheet.UsedRange.Rows(.Rows.Count).Row
.Rows.Countの『.』の前が指定されていませんからエラーになっています。
MaxRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
としなければいけません。

そこでActiveSheet.UsedRangeを何度も指定せずに、Withステートメントでくくって
With ActiveSheet.UsedRange
  MaxRow = .Rows(.Rows.Count).Row
End With
と書くわけです。

>rowsとrowの違い..
rowsはrowの複数形ですね。
Rows(1).Row でRowsの1行目の行番号を取得します。
Rows(n).Row でRowsのn行目。

目的が、UsedRangeの最下行の行番号を取得したいのだから
Rows(n).Row このnはRowsの行の数を指定すれば良い事になります。

Sub test()
  Sheets.Add.Range("A5:A10").Value = 1

  With ActiveSheet.UsedRange
    MsgBox ".UsedRange.Address= " & .Address
    MsgBox ".UsedRange.Rows(1).Row= " & .Rows(1).Row
    MsgBox ".UsedRange.Rows.Count= " & .Rows.Count
    MsgBox ".UsedRange.Rows(.Rows.Count).Row= " & .Rows(.Rows.Count).Row
  End With
End Sub
こんなサンプルだったら理解できるでしょうか?


ちなみに、UsedRangeは必ず1行目から始まるとも限りません。
提示コードはちょっと危ういところもありますから更に検討してみてください。

【69930】Re:マクロエラー
お礼  free  - 11/9/24(土) 20:20 -

引用なし
パスワード
   わざわざ回答ありがとうございます。
ネット上の知らない人間に対して丁寧な回答感謝しております。

対象物がないからエラーだったのですね。
わかりました。

usedrangeが1行目からない場合は理解しております。
提示コードの危うい場合とはどういった場合でしょうか?
せっかくなので勉強したのですが。
指摘願います。

【69931】Re:マクロエラー
発言  n  - 11/9/24(土) 20:43 -

引用なし
パスワード
   >提示コードの危うい場合とはどういった場合でしょうか?

>Dim rc As Long
rcをLong型(長整数型)で宣言しています。
>rc = InputBox("列を入力して下さい。")
ここで数字以外の文字を入れるとエラーです。
Cancelの場合もエラーです。
仮に数値を入れたとしても
rc < 1

rc > Columns.Count
の場合、
>If Cells(i, rc) = "" Then
ここでエラーになります。


>If Cells(i, rc) = "" Then
>  Rows(i).Delete
>End If
CellsとRowsの親が指定されていません。
通常はActiveSheetを指定したと見做されますが
そのコードがシートモジュールに書いてある場合は
シートモジュールがあるシートのCells、Rowsを指定したと見做されます。
Rangeオブジェクトについては特に、
その親オブジェクト(シート)を省略しない書き方を心がけたほうが良いと思います。


>For i = MaxRow To 1 Step -1
>:
>    Rows(i).Delete

>usedrangeが1行目からない場合は理解しております。
UsedRangeが1行目からない場合でも1行目までLoopします。
UsedRangeではないので当然、未入力だから削除されます。
>Private Sub 指定列がのセルに空白があったら行削除_Click()
..なので、そういう仕様で良いのだろうとは思いますが念のため。

【69932】Re:マクロエラー
お礼  free  - 11/9/24(土) 21:38 -

引用なし
パスワード
   なるほど注意して変更します。
指摘ありがとうございます。

自分も他人のコードを修正出来るくらいになるようがんばりたいと思います。
感謝します。

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