重要なお知らせ

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

【GOLF me!】初月無料お試し

マクロでの列の表示、非表示

マクロ初心者です。
シート1に表があって、シート2にも同じような表があるのですが、
シート1で〇と入っている列だけを、シート2で表示させたいです。
逆に言うとシート1で指定の言葉が入っていない場合には非表示にさせるようなコードを教えて欲しいです。

自分でも調べてみているのですが上手くいかず困っています。
よろしくお願いします。

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

  • 例えば

    シート1のA1 B1 C1に〇を入れるセルがあったとして
    B1に〇と入ってる場合
    シート2のA1とC1の列は非表示にしたいのです。

    列を非表示にするコードは分かるのですが、
    〇がC1だけに入る時もあれば、A1とB1に入る時もあるので
    流動的に変わる時どうしたらいいのか分からず…

      補足日時:2021/03/14 08:06
  • 中途半端に例えで伝えたのが悪かったのかもしれないです。

    厳密に言うと

    sheet1に1日〜31日までのシフト表があり【画像内①】
    その他に1日につき1sheet表があり、それが31日分あります。
    昼の時間帯は白い表、夜の時間帯はグレーアウトしてあり
    例えばsheet1でAさんが3/1に休みだと3/1のAさんの昼の時間帯がグレーアウトし、ロングとは言っていると夜の時間帯が白くなり、夜の時間帯にAさんがいることがわかるようにしているのです。【画像内②】

    データを印刷する時に、ボタンひとつで
    夜の時間帯にいる人だけの表示させたかったので
    sheet1に指定の言葉が入っていない人の列を非表示にしたいと言う質問の仕方をしました。
    ベースになるコードだけ教えていただいて、あとは自分で変えたらいいかなと思ったので…。

    「マクロでの列の表示、非表示 マクロ初心者」の補足画像2
      補足日時:2021/03/14 18:17

A 回答 (5件)

こんばんは、#3です。


表題のご質問とは、違うご質問のようですね。
2つの表は、同じようでは無いと思いますし、①②共に表組みが不明なので、何とも言えませんが、列方向だけでなく行方向の条件や処理が必要になると思います。
よく解りませんが、列や行を非表示にすると言う考え方でなく、必要な(該当する)データを他のシート(印刷用フォーマット)に書き出すような手順が良いのではないかと思います

検索ワードが〇でなければ、私は回答していないと思いますので、後は諸先輩の回答をお待ちください。。。
    • good
    • 4

>シート1で〇と入っている列だけを、シート2で表示させたいです。


シート2に直接〇を付けることは出来ないのでしょうか?
例えば、シート2の1行目に〇を付けて、その行を非表示にしておくとか・・・。
それから、○でなければいけない理由ってありますか。
その辺、自由に設計できるのであれば、プログラムは簡単にできます。
こんな感じです(1行目が空白の列を非表示にしています)。

Sub Macro1()
Rows("1:1").SpecialCells(xlCellTypeBlanks).EntireColumn.Hidden = True
End Sub
    • good
    • 2

こんにちは


>A1 B1 C1
>シート1で〇と入っている列だけを、シート2で表示させたいです。
すでに回答がありますが補足の意味を含め、横から失礼します。

続けて使われる事もあるでしょうから、先に対象列全てを非表示にして、
〇の有無を(Sheets("Sheet1")で)検証する、〇のある列を表示すると言う考え方です

少し分かり難いかも知れませんが、col As Rangeは行、列、セルやセル範囲(レンジ)のオブジェクト変数でUnionでつなげる事が出来ます。
Rangeの表示、非表示、挿入や削除などは可能であれば、纏めて(特に範囲が広い場合など)処理するのが良いので col.EntireColumn.Hidden = False で纏めて処理しています。(変数名は任意です)
(今回不要とも考えられますが、よくある処理なので一応採用)

デバッグ用サンプルです。
Sub sample()
Const strWord As String = "〇"
Dim i As Long, col As Range
  With Sheets("Sheet2")
   .Columns("A:C").Hidden = True
   For i = 1 To 3
    If Sheets("Sheet1").Cells(1, i) = strWord Then
      If col Is Nothing Then
       Set col = .Cells(1, i)
      Else
       Set col = Union(col, .Cells(1, i))
      End If
    End If
   Next
  End With
  If Not col Is Nothing Then col.EntireColumn.Hidden = False
End Sub

デバッグ時 重要な事
ご質問の例で挙げられている 〇 は漢数字や記号などあり、表示と一致しない場合があります。(添付図)
Const strWord As String = "〇" の 〇部分は、実際に使用しているセルの値をコピーしてペーストしてください。
どちらでも対応する場合は、条件分岐処理時にORで条件を加える必要があるかも知れません。


不明な点は補足してください。
「マクロでの列の表示、非表示 マクロ初心者」の回答画像3
    • good
    • 3

以下のマクロを標準モジュールに登録してください。


シート1のシート名は、Sheet1
シート2のシート名は、Sheet2
にしてあります。あなたのほうで、適切に変えてください。


Public Sub 表示列設定()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxcol As Long
Dim wcol As Long
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
maxcol = sh1.Cells(1, Columns.Count).End(xlToLeft).Column '1行目の最終列を求める
For wcol = 1 To maxcol
If sh1.Cells(1, wcol).Value = "○" Then
sh2.Columns(wcol).EntireColumn.Hidden = False
Else
sh2.Columns(wcol).EntireColumn.Hidden = True
End If
Next
MsgBox ("完了")
End Sub
    • good
    • 0

コード自体は簡単そうなんだけど、


シート1のどこに○が書かれてるの?
    • good
    • 4

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