質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1428閲覧

非表示の行の保護方法を教えてください。

ta-

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/07/26 16:09

VBA初学者です。
回答よろしくお願い致します。

#説明
(1)シートの
3~5行目
10~15行目
34~50行目



と、いくつもの行が非表示になっています。

(2)この非表示の行のみ、保護し、データを入力できないようにしたいです

(3)なので、以下のコードを入力すればよいと思います。

【全ての非表示の行】.Locked = True
ActiveSheet.Protect AllowFormattingCells:=True

#質問
**【全ての非表示の行】**は、どのようにコードで表せば よいでしょうか。
※非表示の行は、人の操作で、様々に変わっていくので、その行を自動で認識できる方法を知りたいです。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この非表示の行のみ、保護し、データを入力できないようにしたいです

非表示の行を別にシートに分けるという発想なら対応できなくもないです。
詳しくはこちらのページをご覧ください。

【全ての非表示の行】は、どのようにコードで表せば よいでしょうか。

※非表示の行は、人の操作で、様々に変わっていくので、その行を自動で認識できる方法を知りたいです。

グレーアウトというセルの色で識別する方法なら私も何度かやったことがあります。
通常では滅多に使わない色を指定しておくことで、仕様ということにもなるので凄く便利です。
(別にシートに分ける方法ならそんな判定すら必要ありませんが...)

投稿2021/07/27 01:50

編集2021/08/01 21:31
stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta-

2021/07/28 12:34

回答ありがとうございます。 グレースケールの色付けセルを検索して、そのセルをロック・保護という意味でしょうか。 確かにそれならば、いけそうな気がします。 一度試してみます。
Zuishin

2021/07/29 00:48

もう一つの回答は重いから却下なのに、こちらはいいんですか? 計測してこちらの方が速かったということでしょうか? 質問の主題に合っているのはもう一つの回答の方だと思いますが、それを却下してこちらを採用した理由を教えてください。
ta-

2021/07/29 13:04

計測方法などわからないので、私の経験からですが、回答します。 説明A (1)全セルを選択します (2)Hiddenプロパティで、以下のようにします。    1列目表示、2~5列目非表示    6列目表示、7~10列目非表示   11列目表示、12~15列目非表示    ・    ・    ・ (3)全セルを(2)のようにFOR NEXTで実施しようとするとエクセルがフリーズしました。 説明B (1)全セルのうち、数式と条件付き書式のみを選択し、保護・ロックをしてもフリーズせず、スムーズに遂行できました。 よって 説明Aより、Hiddenプロパティを全セルにしようするとフリーズするのではないかと思いました。 また説明Bの要領で 『グレースケールというセルの色』を選択し、保護・ロックをかければ、全セル選択しても、フリースせずに、実施できるのではないかと思ったのが理由です。
ta-

2021/07/29 13:07

説明Aのコード Sub 選択行を非表示() Dim my非行 As Long my非行 = 5 Dim my行始め As Long my行始め = Selection.Row Dim my行終わり my行終わり = Selection.Rows.Count + my行始め - 1 Dim my行終わり2 As Long my行終わり2 = (Selection.Rows.Count \ my非行) * my非行 + my行始め - 1 Rows(my行始め & ":" & my行終わり).Hidden = False Dim i As Long For i = my行始め To my行終わり2 Step my非行 Rows(i + 1 & ":" & i + my非行 - 1).Hidden = True Next i End Sub
Zuishin

2021/07/29 13:08

全セルをグレーにしてもフリーズしなかったんですか?
ta-

2021/07/29 13:10

説明Bのコード Sub 数式と条件書式保護() Call [あ1保護解除] Call [あ2全セル透明色] Call [あ5数式色付け] Call [あ6条件書式色付け] Call [あ7全セルロック解除] Call [あ10数式ロック] Call [あ11条件書式ロック] Call [あ12全セル保護] End Sub Sub あ1保護解除() ActiveSheet.Unprotect End Sub Sub あ2全セル透明色() Cells.Interior.Color = xlNone End Sub Sub あ5数式色付け() Cells.SpecialCells(xlCellTypeFormulas).Interior.Color _ = RGB(160, 230, 170) End Sub Sub あ6条件書式色付け() Cells.SpecialCells(xlCellTypeAllFormatConditions).Interior.Color _ = RGB(160, 230, 170) End Sub Sub あ7全セルロック解除() Cells.Locked = False End Sub Sub あ10数式ロック() Cells.SpecialCells(xlCellTypeFormulas).Locked = True End Sub Sub あ11条件書式ロック() Cells.SpecialCells(xlCellTypeAllFormatConditions).Locked = True End Sub Sub あ12全セル保護() ActiveSheet.Protect AllowFormattingCells:=True End Sub
ta-

2021/07/29 13:11

説明Bのコードより、フリーズしないのではないかと思います。
Zuishin

2021/07/29 13:17

> Cells.SpecialCells(xlCellTypeFormulas).Interior.Color _ = RGB(160, 230, 170) こういうのを RGB ではなく Hidden で非表示にするのではだめなんですか?
ta-

2021/07/29 13:18

ちなみに以下のコードでもフリーズしないです。 Sub 全セル保護() Call [あ1保護解除] Call [あ3全セル色付け] Call [あ5数式色付け] Call [あ6条件書式色付け] Call [あ8全セルロック] Call [あ12全セル保護] End Sub Sub あ1保護解除() ActiveSheet.Unprotect End Sub Sub あ3全セル色付け() Cells.Interior.Color = RGB(215, 215, 215) End Sub Sub あ5数式色付け() Cells.SpecialCells(xlCellTypeFormulas).Interior.Color _ = RGB(160, 230, 170) End Sub Sub あ6条件書式色付け() Cells.SpecialCells(xlCellTypeAllFormatConditions).Interior.Color _ = RGB(160, 230, 170) End Sub Sub あ8全セルロック() Cells.Locked = True End Sub Sub あ12全セル保護() ActiveSheet.Protect AllowFormattingCells:=True End Sub
Zuishin

2021/07/29 13:22

色を付ける意味がわからない。 結局数式のあるところをロックしてるだけですよね? 色はどういう役割を果たしているんですか?
ta-

2021/07/29 13:27

データや関数を構築していく際に 間違わないように、つけているだけです
ta-

2021/07/29 13:29

Cells.SpecialCells(xlCellTypeFormulas).Interior.Color _ = RGB(160, 230, 170) こういうのを RGB ではなく Hidden で非表示にするのではだめなんですか? →→Hiddenプロパティは、行や列全体を選択します。   Cells.SpecialCells(xlCellTypeFormulas).Interior.Color _ = RGB(160, 230, 170)は、セルを選択するので 選択している種類が違うので、不可能と思います。
Zuishin

2021/07/29 13:30

でも行や列毎にロックするんですよね? だったらどっちでも同じじゃ?
ta-

2021/07/29 13:35

確認しました。 不可能でした。 Sub test2() Cells.SpecialCells(xlCellTypeFormulas).Hidden = True End Sub エラーメッセージ↓ Rangeクラスの、HIddenプロパティを設定できません。
Zuishin

2021/07/29 14:12

いや、SpecialCells から行番号を抽出してユニークして。 まあでも色の意味はわかりました。 ありがとうございました。
stdio

2021/08/01 21:34

名前間違ってました。グレースケールではなくグレーアウトですね。回答の方も編集しておきました。 エクセルでセルの背景をグレーにすると編集済みと思われる効果があります。
ta-

2021/08/04 13:00

ありがとうございます。 また確認してみます!
guest

0

全てまとめて…とは行きませんが
hiddenプロパティで非表示になっているかどうか1行ずつ判別していってはどうでしょう?

VBA

1 2'非表示行だった場合その行をロックする 3If Rows(行番号).Hidden = True Then 4 Rows(行番号).Locked = True 5End If 6

投稿2021/07/27 04:03

sonarumono

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta-

2021/07/28 12:31

回答ありがとうございます。 全てのセルを1行づつ行うと、処理量が大きく、PCへの負担が気になってしまいます(汗
stdio

2021/07/29 00:11

遅い…重い…そんなエクセルVBAプログラムの処理速度を劇的に改善する方法があるので、実施してみるといいかも知れません。プログラムが書かれているのはページの最後の方「まとめとして最終的なプログラムを紹介しておきますね。」と書かれた後のプログラムです。 https://tonari-it.com/vba-processing-speed/
ta-

2021/07/29 13:41

回答ありがとうございます。 初学者なので、色々と挑戦するのは、また後にしてみます。 まずは、グレースケールの方を行ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問