• ベストアンサー

質問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 です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

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

typemode
質問者

お礼

ありがとうございます!!! これで作業再開することが出来ます。 本当に助かりました。 完成まであと一息、頑張ります!!

その他の回答 (3)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

>ただ何も入力されていないチームの列が削除されなくて >原因を調べてるところです。 >If myRow = 1 Then > .Columns(myCol).Delete 1 を データベースの見出し行に変更。

typemode
質問者

お礼

急ぎの質問にも丁寧に答えて頂き 本当にありがとうございました。 これから少しずつ勉強していきたいと 思います。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.3

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 ですかね。

typemode
質問者

お礼

本当にありがとうございます。 完璧に思っていた通りのことが出来ました! お礼ついでにもう一つだけわがままを言わせてもらうと このマクロを実行して処理が完了するまでに 1分くらいかかってしまうのですが、このような処理は やはり重たいものなのでしょうか。 今まで膨大なデータベースをフィルタ処理したり ユーザーフォームを表示して編集作業したりといった ことはかなり軽く動いていたので・・・。 チーム数が100以上あるので処理しているところを 見た感じでは列を順に削除している工程で時間が かかっているように思えます。 それでも思っていた事ができてかなり嬉しいです☆ 処理が完了するまで ”しばらくお待ち下さい”みたいなウィンドウを 表示しておいて、処理が完了したら ”完了しました”みたいなことって簡単に できるものですか?

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

元の質問での >早速、適用しようと今作っている本シートの方に >組み込んでみたのですが、うまくいかず止まって >しまいました。 シートのデータが問題になるかと思いますが、 どの行で止まりますか? また、エラーメッセージは?

typemode
質問者

お礼

止まったのは myVal = myVal + .Cells(myRow, myCol).Value のところです。 どうも2行目以下が●以外なら数値を合計のところで 指定を変えてやらなければいけないところをそのまま 記述していたのが原因のようです。 実際の検索シートでは4行目以降がデータベースに なっていたので、そのように直すと一応処理は出来ました。 ただ何も入力されていないチームの列が削除されなくて 原因を調べてるところです。 検索結果において、得点が全くない(数値も●も一切入力 されていない)チームは列削除したいのですが、今の状態 だと空白が合計されて0点が最下行にセットされてしまい 削除されていない状態です。