プロが教えるわが家の防犯対策術!

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

以前、全て空白のセルの列を非表示にする方法をこちらで教わりました。
この度、それを応用して非表示ではなく列の幅を4に指定したいのですが、方法が分かりません。

以下、前回教わった非表示バージョンのマクロです。

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

列幅を指定するには、
Columns(c).Hidden = flg And Cells(1, c).Value = ""

Columns(c).Hidden を
Columns(c). ColumnWidth = 4
とすれば良いのかと思ったのですが、思うように動かないのです。
イコールが多すぎるのが問題なのでしょうか。

マクロを書き換えるにも、そもそも
Columns(c).Hidden = flg And Cells(1, c).Value = ""
の部分の理解が出来ていないため、どこをどうしてよいかわからない状態です。

ご教示のほど、どうぞよろしくお願いいたします。

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

  • 前回ご教示頂いた方から再びご回答頂いているようです!
    https://oshiete.goo.ne.jp/qa/10689982.html
    何度も教えていただき本当にありがとうございます。

    説明が足りず申し訳ありません。
    条件は前回と同様に、
    1行目に入力がなく、5行目以降に入力がない(最終行は開いたファイルによって変わります)場合、その列の幅を調整する内容です。

    If flg Then Columns(c). ColumnWidth = 4
    は、
    Columns(c).Hidden = flg And Cells(1, c).Value = ""
    の代わりに入れるのでしょうか。
    試したところ条件①の判定がされず、
    1行目に入力があり5行目以降が空白の列の幅が4センチになってしまいました。

    理解力が低く本当に申し訳ありません。
    ご回答お待ちしております。

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

A 回答 (3件)

No2です。



自分と同じ発想の記述方法だなと思いながら回答していました。
どうりで、ですね(笑)
申し訳ありませんが、一週間も経過すると回答内容はすっかり忘れてしまいますので、前回質問のご提示が無い限りは、知らない内容として回答することになってしまいます。

>試したところ条件①の判定がされず、~~
No2の説明のところでお断りしておきましたように、判断条件を変数flgの内容でしか行っていないためでしょう。
ご提示のコードと同じ条件で処理したいのであれば、条件の記述を同じに代えればよいだけです。
 If flg And Cells(1, c).Value = "" Then Columns(c).ColumnWidth = 4

※ 上記の記述の場合、「条件に合致したらセル幅を4にする」処理しか行いません。
それ以外の場合にはセル幅を広く設定するなどの処理も併せて行いたいような場合には、Else以下に記述するようにしてください。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございます。
ご教示いただいた方法で、無事に動作しました。

次回応用したいことが出てきた際は自分で解決できるよう、教わった内容をしっかり身につけたいと思います。
またお知恵を拝借することがあるかもしれませんが、よろしくお願いいたします。
ありがとうございました。

お礼日時:2018/10/13 11:21

こんにちは



判断対象とするセル範囲などはご提示の内容で良いものとして・・・
(単純に列全体を判断してはいませんので)

>Columns(c).Hidden = flg And Cells(1, c).Value = ""
>の部分の理解が出来ていないため
列の表示/非表示は通常
 Columns(c).Hidden = True (または False)
で指定しまうよね?
ご提示のコードでは、(flg And Cells(1, c).Value = "")の計算結果がTrueかFalseかによって表示/非表示になるという意味になっています。

変数flgにはその1行上で、「対象列範囲のCountBlank関数がその行数と同じか否か」が代入されていますので、結果的に「対象列範囲が全部空白ならTrue」となるということです。
ご説明文の内容だけからだと
  Columns(c).Hidden = flg
で良さそうに思われますが、 そうせずにCells(1, c)も併せて判断するようにしているので、項目名(か何かが1行目にあって)が無い場合に非表示といったようにしているのかも知れません。(対象のシート内容がわからないので実際の意味は不明です)

さて、列幅を指定するのは
 Columns(c). ColumnWidth = 4
で良いですから、条件が合致した時だけこれが実行されるようにするには、
 If flg Then Columns(c). ColumnWidth = 4
のようにすることで、対象列範囲が空白ならセル幅が指定されることになります。

※ 1行目も含めて条件判断をするのかどうかがわからないので、とりあえず、変数flgだけの判断にしてあります。
この回答への補足あり
    • good
    • 0

こんばんは!



お示しのコードは考慮せずこちらで勝手にやってみました。

Sub Sample1()
 Dim j As Long, myRng As Range
 Dim myStart As Long, myEnd As Long
  With ActiveSheet
   myStart = .UsedRange.Column
   myEnd = .UsedRange.Columns.Count + myStart - 1
    If myStart <> myEnd Then
     For j = myStart To myEnd
      If WorksheetFunction.CountA(.Columns(j)) = 0 Then
       If myRng Is Nothing Then
        Set myRng = .Cells(1, j)
       Else
        Set myRng = Union(myRng, .Cells(1, j))
       End If
      End If
     Next j
     If Not myRng Is Nothing Then
      myRng.EntireColumn.ColumnWidth = 4
     End If
    End If
  End With
End Sub

こんな感じではどうでしょうか?

※ 「空白」というのはデータがない!としています。
すなわち数式が入っていて、「空白に見えているセル」がある場合は
コードが変わってきます。m(_ _)m
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
できれば今あるコードを活かしたかったので、別の回答者の方をベストアンサーとさせていただきました。
新しくコードを書く際には、ご回答いただいた内容を参考にさせていただきます。
ありがとうございました。

お礼日時:2018/10/13 11:25

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