- ベストアンサー
質問No.2259731で教えて頂いたコードを訳して欲しい
昨日質問し、回答を頂いたものです。 もう少しで作業が上手くいきそうなのですが 教えて頂いたコードの各工程の意味(処理)がわからず 止まっています。 一つずつ調べてはいますが、かなり時間がかかっていて とても今日中に終わりそうになくて焦っています。 急いでいるもので、すいませんがどなたか下のコードの各行が どのような意味か、訳をつけて頂けないでしょうか。 Sub Test() Dim myCol As Integer, myVal Dim LRow As Long, myRow As Long With ActiveSheet LRow = .Cells(65536, 1).End(xlUp).Offset(1, 0).Row For myCol = .Range("IV1").End(xlToLeft).Column To 3 Step -1 myVal = 0 myRow = .Cells(65536, myCol).End(xlUp).Row If myRow = 1 Then .Columns(myCol).Delete Else Do While myRow > 1 And .Cells(myRow, myCol).Value <> "●" myVal = myVal + .Cells(myRow, myCol).Value myRow = myRow - 1 Loop .Cells(LRow, myCol) = myVal End If Next myCol End With End Sub ちなみに元の質問内容は http://oshiete1.goo.ne.jp/kotaeru.php3?q=2259731 です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Sub Test() '変数の宣言 myColが整数、myValが可変、LRowとmyRowが長整数 Dim myCol As Integer, myVal Dim LRow As Long, myRow As Long '開いてるシートでの処理 With ActiveSheet '最下行の位置取得 LRow = .Cells(65536, 1).End(xlUp).Offset(1, 0).Row '最右端の列からC列まで逆順に処理をループ For myCol = .Range("IV1").End(xlToLeft).Column To 3 Step -1 'myValを初期化 0をセット myVal = 0 '現在列の最下行を取得 myRow = .Cells(65536, myCol).End(xlUp).Row '最下行が1行目の場合、その列を削除 If myRow = 1 Then .Columns(myCol).Delete Else '2行目以下が●以外なら数値を合計 Do While myRow > 1 And .Cells(myRow, myCol).Value <> "●" myVal = myVal + .Cells(myRow, myCol).Value myRow = myRow - 1 Loop '現在列の最下行に合計をセット .Cells(LRow, myCol) = myVal End If Next myCol End With End Sub
その他の回答 (3)
- bonaron
- ベストアンサー率64% (482/745)
>ただ何も入力されていないチームの列が削除されなくて >原因を調べてるところです。 >If myRow = 1 Then > .Columns(myCol).Delete 1 を データベースの見出し行に変更。
お礼
急ぎの質問にも丁寧に答えて頂き 本当にありがとうございました。 これから少しずつ勉強していきたいと 思います。
- bonaron
- ベストアンサー率64% (482/745)
Do While myRow > 1 And .Cells(myRow, myCol) <> "●" If IsNumeric(.Cells(myRow, myCol)) Then myVal = myVal + .Cells(myRow, myCol) End If myRow = myRow - 1 Loop ですかね。
お礼
本当にありがとうございます。 完璧に思っていた通りのことが出来ました! お礼ついでにもう一つだけわがままを言わせてもらうと このマクロを実行して処理が完了するまでに 1分くらいかかってしまうのですが、このような処理は やはり重たいものなのでしょうか。 今まで膨大なデータベースをフィルタ処理したり ユーザーフォームを表示して編集作業したりといった ことはかなり軽く動いていたので・・・。 チーム数が100以上あるので処理しているところを 見た感じでは列を順に削除している工程で時間が かかっているように思えます。 それでも思っていた事ができてかなり嬉しいです☆ 処理が完了するまで ”しばらくお待ち下さい”みたいなウィンドウを 表示しておいて、処理が完了したら ”完了しました”みたいなことって簡単に できるものですか?
- bonaron
- ベストアンサー率64% (482/745)
元の質問での >早速、適用しようと今作っている本シートの方に >組み込んでみたのですが、うまくいかず止まって >しまいました。 シートのデータが問題になるかと思いますが、 どの行で止まりますか? また、エラーメッセージは?
お礼
止まったのは myVal = myVal + .Cells(myRow, myCol).Value のところです。 どうも2行目以下が●以外なら数値を合計のところで 指定を変えてやらなければいけないところをそのまま 記述していたのが原因のようです。 実際の検索シートでは4行目以降がデータベースに なっていたので、そのように直すと一応処理は出来ました。 ただ何も入力されていないチームの列が削除されなくて 原因を調べてるところです。 検索結果において、得点が全くない(数値も●も一切入力 されていない)チームは列削除したいのですが、今の状態 だと空白が合計されて0点が最下行にセットされてしまい 削除されていない状態です。
お礼
ありがとうございます!!! これで作業再開することが出来ます。 本当に助かりました。 完成まであと一息、頑張ります!!