アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

以下の条件で、列の非表示をする方法をご教示ください。
Excel2010を使用しています。

①1行目に入力がない
②5行目以降に入力がない(最終行は開いたファイルによってまちまちです)
①と②を満たす場合、その列を非表示にする。

※2〜4行目に入力があっても、
①と②を満たしていれば、非表示の対象とします。

※最終列も開いたファイルによってまちまちです。


以上、どうぞよろしくお願い致します。

質問者からの補足コメント

  • ご回答いただき本当にありがとうございます!
    こちらの希望が叶いました。
    もし、お願いできたら追加で教えてください。

    上記のマクロを実行したところ、ファイルによっては無限ループに陥るものがありました。
    無限ループ回避のため、

    If c = 70 Then ←最大でも70列目までとしました。
    Exit For
    End If

    をNext cの後ろに組み込みましたが、
    合っていますでしょうか。

    ループ回避はしたようですが、
    作業時間が長くなったような気がします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/08/27 18:52
  • 追加のご回答ありがとうございます。

    以下について確認しました。
    >If c = 70 Then ←最大でも70列目までとしました。
    >Exit For
    >End If
    >をNext cの後ろに組み込みましたが、
    >合っていますでしょうか。

    Next c の前に入れていました…
    投稿前によく確認せず申し訳ありません…

    また、 
    If c >= 70 Then
    へのアドバイスもありがとうございます。

    この度は VBA素人の希望にお答えいただき、
    またとても丁寧な説明をいただき本当に感謝しております。
    ご教示頂いたことを今後も活かせるよう、
    勉強していきたいと思います。
    ありがとうこざいました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/08/28 12:50

A 回答 (2件)

こんにちは



こんな感じでしょうか?
アクティブなシートを対象にしてあります。

Sub Sample()
Dim ur As Range, tr As Range
Dim rwC As Long, c As Long, flg As Boolean

Set ur = ActiveSheet.UsedRange
Set tr = Intersect(ur, Rows(5).Resize(Rows.Count - 4))
If tr Is Nothing Then Set tr = Rows(5)
rwC = tr.Rows.Count

For c = ur.Column To ur.Column + ur.Columns.Count - 1
flg = WorksheetFunction.CountBlank(Intersect(Columns(c), tr)) = rwC
Columns(c).Hidden = flg And Cells(1, c).Value = ""
Next c

End Sub
この回答への補足あり
    • good
    • 0

No1です



>ファイルによっては無限ループに陥るものがありました。
ループは一か所のみですが、繰り返しの回数はUsedRangeの列数にしていますので「無限ループ」が発生することはないはずと思いますが・・・??
どこか右側の方のセルに何らかの値(空白文字列とか)が間違って入っていて、繰り返し数が大きくなっている可能性は無いとは言えませんが、最大でも16384回(=最大列数)のループかと。
(数がそれなりなので、多少の時間が掛かる可能性はありますが、大したことはないと想像します)
手順として左側から一列ずつ順に処理をしていますので、上記のような場合には、範囲外と思わっている列も順に非表示になっているはずですので、そのあたりを見てみることで実際に起きていることの確認が可能と思います。

>If c = 70 Then ←最大でも70列目までとしました。
>Exit For
>End If
>をNext cの後ろに組み込みましたが、
>合っていますでしょうか。
Nextの後ろでは意味がありません。(…というより間違いになります)
ループ内(For~Nextの間)で判断しないとループを抜けませんし、仮にその条件がTRUEになったとして、Exit Forを実行しようとしても対象のループが存在しない(すでにループ外なので)ため、エラーが発生するのではないかと思います。(←未確認)

また、補足の趣旨から言えば、条件文は
 If c >= 70 Then
等としておく方が確実でしょう。(現状のままでも問題はありませんが)

ループ内に記述することで目的は達成できますが、ループの回数分その条件判断を繰り返して処理することになりますので、若干効率が悪いと言えます。(大した影響はないでしょうけれど)
今回の場合であれば、ループ内で判断しなくてもループの前に判断が可能ですので、ループ処理を行う前に、ループの制御値を「70との最小値」に設定するようにした方が効率的と考えられます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答いただき本当にありがとうございます。

お礼日時:2018/08/28 12:51

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

このQ&Aを見た人はこんなQ&Aも見ています