Excel VBA質問箱 IV

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

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


4550 / 13644 ツリー ←次へ | 前へ→

【55997】行番号を出す数式? i-de 08/5/29(木) 10:48 質問[未読]
【56001】Re:行番号を出す数式? Yuki 08/5/29(木) 11:49 発言[未読]
【56003】Re:行番号を出す数式? Abebobo 08/5/29(木) 12:08 発言[未読]
【56006】Re:行番号を出す数式? ひげくま 08/5/29(木) 12:31 回答[未読]
【56007】Re:行番号を出す数式? i-de 08/5/29(木) 12:57 お礼[未読]

【55997】行番号を出す数式?
質問  i-de  - 08/5/29(木) 10:48 -

引用なし
パスワード
   こんにちは。VBA初心者のi-deと申します。
いつも質問箱にはお世話になっております。

他サイトに記載されていたプログラムの中にわからない点があるので、ご回答お願い致します。

「選択セルの内容が一つ上のセルと同じ内容ならば選択セルの行を消去する」という内容のプログラムで、以下がその内容です。

------------------------------------------------------------
Sub 一行上と同じ内容なら行消去()
Dim 行 As Long
 Const 列 = 2
 For 行 = Cells(Rows.Count, 列).End(xlUp).Row To 3 Step -1
   If Cells(行, 列) = Cells(行 - 1, 列) Then
     Rows(行).Delete
   End If
 Next 行
End Sub
------------------------------------------------------------
この中の4行目の

行 = Cells(Rows.Count, 列).End(xlUp).Row To 3 Step -1

は「行」の値を出すプログラムだと思いますが、その内容が何を示すのか理解できずにいます。
特にTo〜Step文の数値がなぜ3と-1なのかがわかりません。

VBAや用語の知識がなく、質問の仕方が下手で申し訳ありませんが、ご回答よろしくお願い致します。

【56001】Re:行番号を出す数式?
発言  Yuki  - 08/5/29(木) 11:49 -

引用なし
パスワード
   ▼i-de さん:
>この中の4行目の
>
>行 = Cells(Rows.Count, 列).End(xlUp).Row To 3 Step -1
>
まず
Debug.Print Cells(Rows.Count, 列).End(xlUp).Row
として見ましょう。
B列の最終行が表示されます。
次に
B列の最終行にカーソルを置き
Ctrl と ↑のキーを押して見ましょう。
同じ位置になるでしょう。

【56003】Re:行番号を出す数式?
発言  Abebobo  - 08/5/29(木) 12:08 -

引用なし
パスワード
   i-de さん:Yuki さん こんにちは

Yuki さんから適切な回答があり解決しそうですが、かいちゃったので送信します。 Debug.Print を使ってイミディエイトウインドウで確認 も有りましたね。

>質問の仕方が下手で・・・
そんなことないっすよ (^0^!!! 
初級者の私にはばっちり解ります。
そんなときは、途中にブレークポイントを設定しておいてマクロを走らせます。
そして .Select を活用して動きを確かめたり
ローカルウインドウで 行 が何かを確かめたり、てきとーな宣言で確認します。

Sub 一行上と同じ内容なら行消去()
Dim 行 As Long
Const 列 = 2
Dim 何だろう As String  ’追加1

Cells(Rows.Count, 列).Select ’追加2
何だろう = Cells(Rows.Count, 列).End(xlUp).Row ’追加3

 For 行 = Cells(Rows.Count, 列).End(xlUp).Row To 3 Step -1
   If Cells(行, 列) = Cells(行 - 1, 列) Then
     Rows(行).Delete
   End If
 Next 行  ’ブレークポイントにしておく
End Sub

*ブレークポイント
例1・ Next 行 にカーソル当てておいて手のアイコンをおす。
例2・ Next 行 の左側の灰色のところをクリックする。
のようにしてコードの一部を茶色にする。

*ローカルウインドウ
メニューの 表示 から設定しておいてね。

End(xlUp)はマクロの記録を取っている状態で、
Ctrl + ← や  Ctrl + ↑ や Ctrl + →  等のキーボード操作して確認してください。

【56006】Re:行番号を出す数式?
回答  ひげくま  - 08/5/29(木) 12:31 -

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

Rows.Count とは何か?
Cells(Rows.Count, 列) とは何か?
Cells(Rows.Count, 列).End(xlUp) とは何か?
Cells(Rows.Count, 列).End(xlUp).Row とは何か?

というように考えていくと、少しは解り易いかもしれません。

たぶん、i-deさんが理解できないのは、i-deさんが想像している削除の順番と、このプログラムで削除する順番が逆だから、混乱しているのでしょうね。

行を削除すると、その行より下の行は、すべて上に移動(シフト)します。
だから、上から順に削除しようとすると、カウンタの処理が少し面倒になります。
逆に、下から順に削除していくと、その行を処理(削除)した後はその上の行を処理することになるので、その行より下の行が上に上がっても上がらなくても、カウンタの処理を変えなくて済みます。
う〜〜〜ん、我ながら解りにくい説明だな(苦笑)

まぁ、そんなわけで、行を順に調べて、条件により追加や削除をする場合は、下から順に調べるほうが、何かと楽な場合が多いのです。

これを踏まえると、
> 特にTo〜Step文の数値がなぜ3と-1なのかがわかりません。
これも解りやすいのではないでしょうか。

【56007】Re:行番号を出す数式?
お礼  i-de  - 08/5/29(木) 12:57 -

引用なし
パスワード
   ▼Yukiさん・Abeboboさん・ひげくまさん

迅速かつご親切なご回答、誠にありがとうございます。
一昨日からこの件でずっとモヤモヤしていたのですが、その霧がひとつ残らず晴れました!

恥ずかしながら、イミディエイトウインドウ・ローカルウインドウの存在を全く知らず、今まで1行1行デバッグしながら、現在の数値を紙に書きつつ考えていました…こんな便利な機能があったのですね!これから大いに活用していきます!

自分の数式に対する捕らえ方は全くひげくまさんのおっしゃる通りで、なぜ下から処理するのかもわかり、To〜Stepの謎も解けました。

皆さん、本当にご丁寧でわかりやすいご回答をありがとうございました。
また、機会がありましたら、よろしくお願い致します。

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