重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

昨日質問し、回答を頂いたものです。

もう少しで作業が上手くいきそうなのですが
教えて頂いたコードの各工程の意味(処理)がわからず
止まっています。

一つずつ調べてはいますが、かなり時間がかかっていて
とても今日中に終わりそうになくて焦っています。

急いでいるもので、すいませんがどなたか下のコードの各行が
どのような意味か、訳をつけて頂けないでしょうか。

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

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
これで作業再開することが出来ます。

本当に助かりました。

完成まであと一息、頑張ります!!

お礼日時:2006/07/07 20:00

>ただ何も入力されていないチームの列が削除されなくて


>原因を調べてるところです。

>If myRow = 1 Then
> .Columns(myCol).Delete

1 を データベースの見出し行に変更。
    • good
    • 0
この回答へのお礼

急ぎの質問にも丁寧に答えて頂き
本当にありがとうございました。

これから少しずつ勉強していきたいと
思います。

お礼日時:2006/07/10 19:30

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

ですかね。
    • good
    • 0
この回答へのお礼

本当にありがとうございます。

完璧に思っていた通りのことが出来ました!


お礼ついでにもう一つだけわがままを言わせてもらうと
このマクロを実行して処理が完了するまでに
1分くらいかかってしまうのですが、このような処理は
やはり重たいものなのでしょうか。

今まで膨大なデータベースをフィルタ処理したり
ユーザーフォームを表示して編集作業したりといった
ことはかなり軽く動いていたので・・・。

チーム数が100以上あるので処理しているところを
見た感じでは列を順に削除している工程で時間が
かかっているように思えます。

それでも思っていた事ができてかなり嬉しいです☆

処理が完了するまで
”しばらくお待ち下さい”みたいなウィンドウを
表示しておいて、処理が完了したら
”完了しました”みたいなことって簡単に
できるものですか?

お礼日時:2006/07/07 20:33

元の質問での


>早速、適用しようと今作っている本シートの方に
>組み込んでみたのですが、うまくいかず止まって
>しまいました。

シートのデータが問題になるかと思いますが、
どの行で止まりますか?
また、エラーメッセージは?
    • good
    • 0
この回答へのお礼

止まったのは
myVal = myVal + .Cells(myRow, myCol).Value
のところです。

どうも2行目以下が●以外なら数値を合計のところで
指定を変えてやらなければいけないところをそのまま
記述していたのが原因のようです。

実際の検索シートでは4行目以降がデータベースに
なっていたので、そのように直すと一応処理は出来ました。

ただ何も入力されていないチームの列が削除されなくて
原因を調べてるところです。

検索結果において、得点が全くない(数値も●も一切入力
されていない)チームは列削除したいのですが、今の状態
だと空白が合計されて0点が最下行にセットされてしまい
削除されていない状態です。

お礼日時:2006/07/07 20:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!