Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
行の非表示の禁止
投稿日時: 21/09/16 00:09:21
投稿者: botamochi

エクセルの行の非表示禁止(自分が編集する際は禁止を解除する)する方法が分かりません。
  
はじめはエクセルのシートの保護で代用できるかと思いましたが、非表示をピンポイントで
禁止することが出来ず仕舞いです。
  
代替案として、「行での右クリックの禁止」又は「行での非表示の前にmsgboxで警告文を出す」
等を考えましたが、初心者には実現可能なスキルがありませんでした。
 
そもそもマクロで実現可能なのかも分かっておりません。
失礼を承知ですが、お力添え頂ける方はご助言頂けると幸いです。

回答
投稿日時: 21/09/16 06:34:15
投稿者: simple

直接の回答ではありません。質問の背景・趣旨等の確認です。
 
「行の非表示の禁止」はなぜ必要なのですか?
また、一瞬でも非表示にしたらアウトなんですか?
例えば、マクロが動作する環境であるとして、
・そのシートがアクティブで無くなったときや、
・保存する際に、(つまりイベントプロシージャを使ってということですが)
非表示行があったら警告するとか、非表示行を解除する、とかではダメなんですか?
 
一瞬でもダメというなら、シートの保護でしょうね。
通常のセルの変更とかは許可(ロックをはずす)とかする前提ですが、
保護に伴う副作用はあるかもしれません。

回答
投稿日時: 21/09/16 09:57:37
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
エクセルの行の非表示禁止(自分が編集する際は禁止を解除する)する方法

 
考え方が逆です。
「非表示の行を表示されたくない(させたくない)」
と考えるのが普通なのでは?
 

回答
投稿日時: 21/09/16 10:24:38
投稿者: WinArrow
投稿者のウェブサイトに移動

非表示の行の「表示を制御する」参考コードを紹介します。
 
前提として
シートモジュールの記述します。
右クリックイベントを使用します。
行選択を確認⇒
その中に非表示の行が存在(1行以上)するかを確認⇒
Msgboxで再表示するか問い合わせし、再表示する
という仕様です。
 

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Rx As Long

    With Target
        If InStr(.Address, ":") > 0 Then
            If .Address = "$" & .Row & ":$" & .Row + .Rows.Count - 1 Then
                For Rx = .Row To .Row + .Rows.Count - 1
                    If Rows(Rx).EntireRow.Hidden Then
                        If vbYes = MsgBox("「 " & Rx & "」を再表示にしますか?", vbYesNo) Then
                            .EntireRow.Hidden = False
                            Exit For
                        End If
                    End If
                Next
            End If
        End If
    End With
    Cancel = True
End Sub

 

投稿日時: 21/09/16 12:53:34
投稿者: botamochi

simple   様
WinArrow 様
 
早々にコメント頂きましてありがとうございます。
 
前提とする背景について補足いたします。
 
手作りで創る商品の管理をエクセルの表でしているのですが、
作成済みの商品は青、作成前キャンセルは緑に行に色づけをして、
色フィルターで「塗りつぶしなし」を選択することで、常に
未作成の商品が表示されているような管理表があります。
 
ここで、管理側・作成側多くの人がエクセルを使用する関係上、
未作成のものにも関わらず、非表示にされて保存されてしまい
誰も手を付けていない商品があることが頻発しております。
 
そういった背景を基に質問させていただきました。
(エクセル表の形式を変更して、色フィルターを使わない方法を採れれば
良いのですが、諸事情で表形式の変更が認められておりません・・・)
 
とはいえ右クリックイベントなるものがあるのですね!

回答
投稿日時: 21/09/16 15:04:23
投稿者: WinArrow
投稿者のウェブサイトに移動

「行を非表示にさせたくない」ということですか?
紹介した右クリックイベントを変更すれば対応可能と思います。
   
本当は、表の形式を変更されたくないのであって、
行だけとは限りませんよね?
メッセージは、単に、「行を非表示にしますか?」のような形ではなく、
表の形式を変更すると、どのような問題が起こるかを
説明する方がよいと思います。

回答
投稿日時: 21/09/17 07:54:53
投稿者: mattuwan44

>未作成の商品が表示されているような管理表があります。
 
元のデータと表示したいデータを、
別のシートやブックに分ける運用をしてはいかがでしょうか?
ユーザーに元のデータベースのシートを触らせないことは、
誤操作を防ぐ意味で必須かと。
 
 
マクロで専用アプリを作れたらよいのでしょうが、
全く触ったことないということであれば、
数式等を駆使することになるかと思います。
 
業務にどうしても必要な事柄なら、
業者にアプリの開発を発注することを検討するべきです。
すでに業務に支障が起きているのですから。
 

回答
投稿日時: 21/09/17 08:57:06
投稿者: simple

色フィルタですか。実験してみました。
 
・「塗りつぶしなし」のセルが一つもないと、
  色フィルタの選択肢に「塗りつぶしなし」が表示されませんが、
・「塗りつぶしなし」セルが一つでもあると、
  「塗りつぶしなし」が指定でき、実行すると、
   非表示の行も含めて(表示対象になり)、
   全ての「塗りつぶしなし」セルだけが表示されますね。
 
ということは、使う時に、色フィルタを再実行すれば防げませんか?
 
もしくは、どうしてもということなら、マクロで対応するかです。
 
すべての非表示行を解除するマクロは、

   Cells.EntireRow.Hidden = False
という一行からなる簡単なものですから、
(1)ボタンに登録しておいて、必要な都度クリックするか、
(2)もしくはシートがアクティブになったときに自動で実行される
   イベントプロシージャを仕組んで置くかですね。
   下記を、そのシートのモジュールに転記すればOKです。
   Private Sub Worksheet_Activate()
       Cells.EntireRow.Hidden = False
   End Sub 

ちなみに、OSや、Excelのバージョンも書かれたほうがいいですよ。

回答
投稿日時: 21/09/17 09:09:45
投稿者: simple

Suzuさんのコメントにありました、

 Rows.Hidden = False
のほうがよかったですね。修正ください。
ちなみに、色フィルタの実験したのは、Excel2010、Win7でした。

回答
投稿日時: 21/09/17 09:49:44
投稿者: WinArrow
投稿者のウェブサイトに移動

再三、コメントします。
 
既に、お分かりと思いますが、
行、列の表示/非表示を拾うイベントはありません。
しかし、行、列の表示/非表示は、その前に対象のセル範囲を選択する必要があります。
そのイベントは、用意されているので、そのイベントで次に何をしようとしているかを
判断する(させる)方法があります。
その一つが右クリックイベントですが、シート選択イベントの方が確実といえます。
 
もっと、確実で簡単な方法としては、
シートの表示時やブック保存時に、非表示を解除する方法があります。
 
 
 

投稿日時: 21/09/17 22:20:21
投稿者: botamochi

再度コメントありがとうございます。
 
「色フィルター後からのフィルター解除で非表示行が表示される」
まさにその通りでした。
 
初心者向けマクロの本を一冊通したところで、マクロで解決しようとしていましたが、
答えは簡単でした。
 
Activateイベントについても勉強になりました!
(windows 10、excel2016環境下ですが、再現できました。)
 
本当にありがとうございました。