[[20180220104908]] 『ループの書き方』(ゆう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ループの書き方』(ゆう)

お世話になります
ご教示頂けたら幸いです

下記の作業を A列データあるまで行いたいのですが
どの様に書けばいいのでしょうか
お手数お掛けしますが
宜しくお願いいたします

For ii = 2 To 36 Step 2
s = 2
Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
Next ii
s = s + 1
Rows(s).Delete

< 使用 Excel:Excel2010、使用 OS:Windows7 >


【質問への回答】
>A列データあるまで行いたいのですが
.(A列の最終行までループ処理したいのですが と理解して)Endプロパティっていうのをネット検索してみては如何でしょうか。

【その他で気になったこと】
・前にも言ったかもしれませんが、インデントつけたほうが回答者も見やすいし、ご自身も構造が理解しやすいとおもいますよ。
・Offsetしてるけど Cellsの中で変数「s」、変数「ii」を直接+1、−1してもいいのかも(好みでしょうけど)
・変数「s」の加算がループの外にあるけど意図した記述なんでしょうか?意図した記述なら、{S=2」を繰り返しても無駄なので、こちらもループの外に出すべきじゃないでしょうか?、
(もこな2) 2018/02/20(火) 11:17


もなこ2様
色々有難う御座いました
下記の様にまとまりました

Sub 列並び替え()
Dim i As Long, s As Long, ii As Long
s = 2
Do Until Cells(s, 1) = ""
For ii = 2 To 36 Step 2
Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
Next ii
Rows(s + 1).Delete
s = s + 1
Loop
End Sub
(ゆう) 2018/02/20(火) 12:07


アドバイスしたことが、(変数「s」の扱いは別として)1つも採用されてないけど、まぁ・・・質問者さんが納得してるんだったらそれでいいんじゃないですか?

ところで、それ動かしてみました?
上から順に処理するルーチンのなかに行削除処理がはいってるけど、失敗というか想定外の動作にならなかったんでしょうか?
(もこな2) 2018/02/20(火) 12:16


もこな2様

iiについて 列処理で組んでるつもり でしたけど
違うのかな?

>上から順に処理するルーチンのなかに行削除処理がはいってるけど、失敗というか想定外の動作にならなかったんでしょうか?
s = s + 1  これでダメだったので Rows(s + 1).Deleteでうまく作動しました

ループが理解してないうえに 2重にループ掛ける事が
理解が乏しくて 質問させていただきました

有難う御座います

(ゆう) 2018/02/20(火) 12:36


せっかくレスいただいてるんで追加コメントです。

繰り返しになりますけど、ゆうさんがいいならそれが一番です。

>iiについて 列処理で組んでるつもり でしたけど 違うのかな?
特に変数「ii」について、列処理がおかしいとか私は言ってないつもりですが。
 Cells(s, ii).Offset(1, -1).Value
 Cells(s+1, ii-1).Value
   ↑どっちも同じなので、Offsetしなくても記述できますねって言いたいだけです。

コメントしてるのは行削除の方です。
s = 2
Do Until Cells(s, 1) = ""

    Rows(s + 1).Delete
    s = s + 1
Loop

Do〜Loopの部分を実行すると、 Rows(s + 1).Delete するたびに1行繰り上がるから
2行目の次(3行目)が削除され4行目以降が繰り上がる
3行目(元4行目)の次(元5行目)が削除され(元6行目)以降が繰り上がる
4行目(元6行目)の次(元7行目)が削除され(元8行目)以降が繰り上がる


って1行おきに削除されるとおもうんで、想定してる動作なのかなぁ・・・とちょっと気になっただけなので、期待通りの動きであれば、それでいいんじゃないですか?
※ちなみに削除による繰り上がりを無視するには、上からではなく下から順に処理する方法があります。
  For〜Nextステートメントで STEP -1 させる手がよく使われるように思います。

インデントについては、ご自身が付けない方が見やすいというのであれば、ご自由にどうぞ。としか・・

(もこな2) 2018/02/20(火) 13:34


もこな2様

色々有難う御座います

>インデントについては、ご自身が付けない方が見やすいというのであれば、ご自由にどうぞ。としか・・

インデントは有ったほうがいいのですが  出来上がった後メモ置きながら つけてるんですけど

マクロ作ってる途中は メモ帳で かきかきして

コピペして っ手感じで  正直 そこまで気が回ってないのが  現実です

本当に色々有難う御座います 
(ゆう) 2018/02/20(火) 15:57


インデントはご自分のためにはどうでもいいですけど
このようなところで他の方に読んでいただくためには
必ず一般的な方法で付けるべきだと思いますが

マルチポストがマナー違反というのと同じくらい
のマナーかと思うが

あまりこのように強く言われる方がいないのは
私の心が狭いのか?

(ホトケ) 2018/02/20(火) 17:04


私も、見る方からすれば、付けてと言いたいですけど、何回か言っても直らないんだったら言うだけ無駄だと思ってるだけです・・・
(もこな2) 2018/02/20(火) 17:22

ホトケ様 もなこ2様

貴重なご意見ありがとうございます

インデントについて 私なりに調べさせていただきました

見やすさ とかいろいろ書いてありましたが

まず インデントはなぜ必要か?

これに対して 書いてあったことには 8bit時代のプログラムにはスペースが無い為

致し方なく使っていたこと

この苦肉の策が 継承されているのが私の判断でした

そして いろいろなサイトで プログラムの基本がわかってない私には

多くのサイトにはインデントが付いてある方が見やすいでしょ  

って書いてありましたが 私的にはインデント付きを読んでいると

短いプログラムは感じませんでしたけど

長いプログラムを読んでいると 視線の動かすのが多くなり

疲れる事を感じました

結局のところ 感じたことは

プログラムをきちんと勉強した皆様は

長い年月の古い継承に慣らされて 基本的なルールと認識して義務化されてると認識しました

プロフェッショナルとしてプログラムを組んでる間では まかり通る認識でも

この様な素人相手の場で求めるのは そこはまた違ものかと感じました

私的にはインデント付けてだらだら下に左側スペースが空いてくなら

よっぽど 1行2行空白

又は ブロックごとのインデント 半角2個くらい

ブロック終われば また戻す みたいな方が

綺麗で見やすと感じました

何分 素人のたわごとですので 軽く流してください

本題からずれて申し訳ございませんでした
(ゆう) 2018/02/20(火) 22:22


横から失礼します。
ゆうさんに、お尋ねします。
ExcelVBAについての書籍はお持ちですか?
インデントなしのコードが書かれている書籍は
無いと思います。
インデントは有益なものだからこそ普及して
います。考えを改めたほうがよいですよ。
(γ) 2018/02/20(火) 23:00

わたしは、プロでもなく、全くの畑違いな出身で、確信をもって言えないのが残念ですが。たしか?

OSがCPM80とかCPM86 8Bit〜16bit メモリー640キロバイト、HDDは無し
8インチ外付けA、B2ドライブ ワンドライブ1メガバイトで日本語BASICでプログラム組んでた頃は
容量節約の為、開発終了後は可読性、メンテの効率等は無視して止む無く、NO Spaceな圧縮したソースにしてあったような、今でもHPなどアップする場合、Jscriptのライブラリはダウンロード
しやすいよう、全スペースを取り容量を圧縮したものと。
内容を確認用のインデント、改行付きと双方用意されています。

昔でも、開発時は、インデントをつけ、デバッグしていたように思います。
(昔、専門家の作業を後ろでみていた。)
可読性とは、単なる美しさではなく、多々潜むバグを発見しやすいように処理範囲、等を一見で解る様に
工夫された先陣、諸先輩の知恵だと思います。
横から、大変、失礼致しました。

m(__)m

(隠居じーさん) 2018/02/20(火) 23:35


ゆうさんが個人で利用するだけで、今後誰かに見せるつもりもない……というのなら
その考えでもいいと思いますが、こういった場で自分のコードを見せるのであれば従うべきでは?
郷に入っては郷に従え、ですよ。

IfやFor Nextなど、どこからどこまでがそれらステートメントの範囲(処理)なのかが一瞥して把握できるし、
入れ子などの階層が深くなれば深くなるほど、インデントがついている方が
上記の内容がよりわかりやすくなります。

コードを見てもらう側なら、見てくれる人に配慮すべきだと思います。
(通りすがり) 2018/02/21(水) 09:51


まだコーディングに慣れていない今こそ、Web検索して他者のコードをいろいろコピペして、それを元につなぎ合わせたり変えたりしていって、目的のコードにしていくことが多いと思います。 そんなとき、参照するコードは全てインデントを付けていませんか? そのまま利用する方が楽だと思います。

4文字タブだと飛びすぎ、という感覚は判ります。 Ruby言語では、2文字のインデントを推奨していたりしますし。 でも、Excelでは、TAB1文字で空白4文字分になるので、4文字インデントにしておく方がアプリの流儀に合っていて、入力時間もかからないので、4文字タブが一般的です。 更には、複数行範囲選択してからの TABやSHIFT+TABも便利ですし。

そして、インデントを付けないコードは、親オブジェクトや命令の適用範囲が一目で判らないので、見にくくて、ロジックが読みにくくて、汚くて、手抜き、失礼と、多くの人が感じます。 VisualStudio等、コンピュータ言語の編集ツールの多くは、自動的にインデント挿入するエディタになっています。 範囲表現に、インデントが必須な言語もあります。 それくらい圧倒的にインデントを付ける派が多いのに、インデントを削るコードを続けるのは、何の利点も無いと思いますよ。
(???) 2018/02/21(水) 10:21


>ブロックごとのインデント 半角2個くらい
>ブロック終われば また戻す

この考えでいいと思います。
If〜End-If、For〜Next、Do〜Loop などをブロックと考えます。
そしてブロックの中身を1段下げます。
そうなるとブロックの中に更にブロックがでてきます。
なので2段、3段とインデントが深くなっていきます。

(semm) 2018/02/21(水) 10:23


インデント豊富だと視線が…、という点は、エディタのフォントサイズを小さくして、表示する文字数を増やしてみるとどうでしょう?

私の場合、編集画面の「ツール」−「オプション」−「エディタの設定」で、標準コードのフォントサイズを9にしています。 試してみてください。
(???) 2018/02/21(水) 10:27


インデントネタで盛り上がってるので、ちょっと参加。

のまえに、「2018/02/20(火) 22:22」の投稿は1行おきに空行入ってて見づらいですよ・・・
他意は無いんでしょうけど、悪意を持って読むとインデントで指摘されて納得いかないから腹いせに読みづらくしてるのかな?って思えちゃいますよ。

わたしは、VBA以外のプログラミング言語は知らないですし、VBAも勉強初めてまだ数年なので理解してるとはとても言えないですが、インデントのあるなしは、実行には影響でないです。(VBA以外の言語では、インデントの位置に意味を持たせてるものもあるようです。)
ただ、ループ処理や条件分岐を使うようになってくると、記述しているものが、今どの部分に対する命令なのかわからなくなることがしばしばあると思います。

たとえば、この投稿の最初のコード
【パターン1】

    For ii = 2 To 36 Step 2
    s = 2
    Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
    Next ii
    s = s + 1
    Rows(s).Delete

【パターン2】

    For ii = 2 To 36 Step 2
        s = 2
        Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
    Next ii
    s = s + 1
    Rows(s).Delete

また、「2018/02/20(火) 12:07 」に投稿されたコード
【パターン3】

    Dim i As Long, s As Long, ii As Long
    s = 2
    Do Until Cells(s, 1) = ""
    For ii = 2 To 36 Step 2
    Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
    Next ii
    Rows(s + 1).Delete
    s = s + 1
    Loop
    End Sub

【パターン4】

    Sub 列並び替え()
    '==変数の宣言など
        Dim i As Long, s As Long, ii As Long

    '==処理
        s = 2
        Do Until Cells(s, 1) = ""
            For ii = 2 To 36 Step 2
                Cells(s, ii).Value = Cells(s, ii).Offset(1, -1).Value
            Next ii
            Rows(s + 1).Delete
            s = s + 1
        Loop
    End Sub

【パターン1】、【パターン2】では、「 s = 2」はループの内側に、「s = s + 1」や「Rows(s).Delete」はループの外にあるわけですが、ぱっと見たときにどちらが見やすいですか?
また、【パターン3】【パターン4】では、「Do〜Loop」の内側に「For〜Next」が入れ子になってるわけですが、それが見て直ぐにわかるのはどっちでしょうか?

どちらも同じくらい直ぐわかります!と仰るんであれば、すばらしい才能なのでご自身に誇りを持って下さい。私は【パターン1】、【パターン3】はしばらく悩むなり、自分でインデント付け直さないとわからないんで、インデント付けた方がいいですよ。とアドバイスしました。

以下、インデントあった方が見やすいと思われる場合の話です。

これから、もっと複雑なものを作っていくことになるとおもうんですが、そうであればなおさら自分の書いてるものがどういう構造なのかすぐにわかるようにしておかないと、うっかりミスして、質問:謎のエラーがでます。思った通りの動作をしません。→回答:記述する位置がおかしいです。っていう無駄な質疑を何回も繰り返すことになるんじゃないかと心配します。

なお、個人的には4くらいがちょうどいいと思いますけど、エディタの「ツール」−「オプション」−「編集」タブ−「タブ間隔」の右側の数字をいじると、Tabキーを押して挿入されるインデント間隔を増減できますのでお試しあれ。
(ちなみに、メイリオ、9ポイント、コードの背景色は好みに変更して使ってます。)

長文レス失礼しました。

(もこな2) 2018/02/21(水) 12:00


閲覧する人のためという意見もあるようですが、
私はあくまで、自分のためにすべきだという意見。
そんなこと言っているから、
ループの外でループカウンターを加算する、
などという初歩的誤りをおかすことになるのです。

インデントは専門家の悪習、などという珍説を開陳する前に
基本動作を身につけることです。

(γ) 2018/02/21(水) 12:44


日本語の書き方にも触れているので、脱線しつつも、大事な事なので、私も指摘を。
ゆうさんの書き込みは、コーディングだけでなく、日本語も読みづらいです。 それは、2点。

・行間に意思がなく、機械的に1行毎に1行空けているだけ。
・句読点が無く、お経のよう。(空欄を読点代わりにしていますが、詩じゃないのだから…)

読み手にどう思われるか判りませんから、Q&A系の掲示板では改めた方が良いかと思います。
(お経を聞き流すように感情を込めないことで、相手の言う事なんて聞くつもりなし、なんて、喧嘩を売っていると捉えられてもおかしくないです)

それとも、今までの質問では1行おきではなかったのに、今回だけこう書いているというのは、わざとだったのでしょうか?
(???) 2018/02/21(水) 13:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.