エクセル2000です。ブック内の全シートの計算式を非表示にするため以下のマクロを作成しました。
ところが実行時エラー1004「RangeクラスのLokedプロパティを設定できません」とエラーになります。
どうも結合セルがひっかかるようですが、理由がわかりません。
ご教示願えませんでしょうか?
Sub Formula_Hidden()
For Each ws In Worksheets
ws.Activate
For Each C In ActiveSheet.UsedRange
If C.HasFormula = True Then
C.Locked = True
C.FormulaHidden = True
i = i + 1
End If
Next C
Next ws
MsgBox i & "個のセルをFormulaHiddenしましたよん。"
End Sub
No.9ベストアンサー
- 回答日時:
こんにちは。
暫く振りに訪ねてみれば、またまたヘンテコなことにトライしておりまするねぇ。。(^^;
ヘンテコに興味あり、ということで一案。(^o^)
-----------------------------------------------
Sub MerlionXX()
Dim Sht As Worksheet
Dim Cnt As Long
On Error Resume Next
For Each Sht In Worksheets
With Sht.Cells.SpecialCells(xlCellTypeFormulas)
.Locked = True
.FormulaHidden = True
Cnt = Cnt + .Cells.Count
End With
Next Sht
MsgBox Cnt & " 個のセル云々"
End Sub
-----------------------------------------------
それから、
>でも変ですねえ、WendyさんのもActivateしてないのに同じSpecialCellsで認識してるのに・・・。
これ、Merlionさんの勘違いではありませぬか?
で、お訊きします。
「動作しない」とはどんな”状態”のことを仰っているのでせう。
少々興味ありです。
ところで、Merlionさん、
当方の尊敬する回答者のお二人、Wendy02さん、KenKen_SPさんのコードに
ちょっとした、場合によっては重大な、ケアレスミスがあることにお気づきでせうか?
コードを眺めただけでそれがお分かりになりましたら
次からは「お師匠さま」とお呼びせねばなりますまいねぇ。。(^o^)~~
以上です。
道士さま、こんばんは。
ヘンテコですか?けっこう使うと思うんですが・・・・。
だから個人用マクロに書いてしまい、作動しなかったようです。
ご教示のコードは完璧に作動しました。ありがとうございます。
> 場合によっては重大な、ケアレスミスがあることにお気づきでせうか?
何度か試して気づいたのですが、一旦Setしたシートごとの対象範囲が、クリアされていない、またはクリアする位置が違っているため、数式が存在しないシートがあった場合、個数を正しくカウントしないということでしょうか?
No.12
- 回答日時:
taocat 様、Wendy02です。
どうも、ご指摘ありがとうございます。
>式の無いシートでは、その前のシートのセル範囲(シートも含む)が
>そのまま引き継がれてしまう、ということです。
今、試してみました。
Sheet1, Sheet2, Sheet3
で、Sheet2 は、まったくの空の状態にし、SpecialCellsで、エラーが発生するように作り、Sheet3 は、2箇所の結合セルと一般の数式セルを置きました。ws に、Sheet2 が入ったときに、ステップモードで見てみると、前のSheet1のシートを繰り返していました。SpecialCells の内容は、Sheet 情報から入っているようですから、クリアしなければ、同じものを、再び、チェックしています。
私の試した方法では、問題はでなかったのですが、ループを繰り返していますから、無駄ですね。
(まあ、私のすることですから、何が抜け落ちでもあるかもしれませんが、ダメならダメでしょうがないとします。)
ループの最後の手前で、
Set rng = Nothing 'ここを加筆
Next ws
とすればよいのかな?
なお、カウンターは以下のようにしてみました。
'カウンター
If .FormulaHidden = False Then
If .MergeCells Then
i = i + 1
Else
i = i + .Cells.Count
End If
End If
私は、この件は、深追いするつもりはありませんが、もし、よかったら見てやってください。
No.11
- 回答日時:
こんばんは、お師匠さま ← お約束、(^o^)~~
>Setしたシートごとの対象範囲が、クリアされていない
>数式が存在しないシートがあった場合、個数を正しくカウントしない
Good Job!
その通りです。
式の無いシートでは、その前のシートのセル範囲(シートも含む)が
そのまま引き継がれてしまう、ということです。
On Errorを利用するときはそこら辺りのことには十分注意払いませう。
それからコードを眺めてみればお分かりになると思いますが、
Wendy02さんのではそれは表には現れませんが同じことです。
>ヘンテコですか?けっこう使うと思うんですが・・
いつもいつも、「色んなことにトライされてますねぇ」ではちょと芸がないなと思い。。。(^^;
KenKen_SPさん、こんばんは。
今回は重箱の隅的な発言、失礼しました。
それもこれも好奇心旺盛な、merlionXXさんの為、
ということでお許しください。
何れにしろ、KenKen_SPさんのコードは非常に参考になりますので
目につけば必ず読むようにしています。
これからも宜しくお願いいたします。
No.10
- 回答日時:
> 個人用マクロブックのPERSONAL.xlsにコピペしていたのです。
ああ、、それなら ThisWorkbook ではなく、ActiveWorkbook ですね。了解
です。それから、Sheets コレクションは使う意味がないので、Worksheets
コレクションに訂正します。
Dim Sh As Worksheet
と宣言もしていますのでm(__)m
> ちょっとした、場合によっては重大な、ケアレスミスがあることにお気づき
> でせうか?
わかりました。ご指摘ありがとうございました。こちらの修正は、merlionXX
さんにお任せします。
間違い等は、お気遣いなくご指摘いただけると非常に助かります。ありがとう
ございました。
No.8
- 回答日時:
> でも変ですねえ、WendyさんのもActivateしてないのに同じSpecialCellsで認識してるのに・・・。
気なしに、#4 では Sheets コレクションを使っているのですが、これが原因
かもしれません。Worksheets コレクションなら大丈夫かも...
これも確証はないのですが。
For Each Sh In ThisWorkbook.Sheets
↓
For Each Sh In ThisWorkbook.Worksheets
興味本位で申し訳ないのですが、このように変更した場合でも Sh.Activate
が必要でしょうか?
よろしければですが、結果を教えてもらえるとうれしいです。
原因がわかりました!
わたしのミスです。
実は、このコードを個人用マクロブックのPERSONAL.xlsにコピペしていたのです。
だから、For Each Sh In ThisWorkbook.Sheetsでも
For Each Sh In ThisWorkbook.Worksheetsでもダメだったんですね?
Activateを入れてうまく行ったのは、こっちはエクセルのBOOKに書いてみたからなのだと思います。
For Each Sh In Worksheets
としたら、個人用マクロでもActiveにしなくとも大丈夫でした。
お騒がせいたしました、すみません、
No.7
- 回答日時:
> やってみましたが、作動しません。
あら? Excel2002 だと動作してますけど(´・ω・`)?
> Sh.Cells.SpecialCells(xlCellTypeFormulas, ALL_TYPE)を認識できてない
> ようでした。
Excel2000 とかだと、直前にシートを Activate しないと、SpecialCells が
失敗するのかも。試す環境がないので、自信なしです。
Sh.Activate '<--------追加
Set rngHasFormula = _
Sh.Cells.SpecialCells(xlCellTypeFormulas, ALL_TYPE)
ありがとうございます。
おっしゃるとおりSh.Activate の追加でOKでした。
でも変ですねえ、WendyさんのもActivateしてないのに同じSpecialCellsで認識してるのに・・・。
No.6
- 回答日時:
>ただ、セルの数が数えられなくなりましたが。
(Areaを数えてるようですね)そうでした。
MsgBox i & "個をFormulaHiddenしましたよん。"
セルで数えたら、結合したところを、セルの数だけ数えているのは、なんとなく不自然に感じました。実際の、その場所(Area)をロックして、数式非表示にしたことを数えています。セルは、単なる論理的な数ですね。色づけしてみて、そのほうが、良いように感じました。
まあ、それは、お好きなように!
ありがとうございます。
Areaにすると、結合してなくとも、たとえばA1:A10にそれぞれ数式が入っていても、その範囲が1個と数えられてしまいますよね?それではちょっと不都合だったものですから。
No.5
- 回答日時:
元のコードをそのまま加筆してみました。
要点は、2点
・SpecialCellsで取った場所はセルではなくて、Area にする
・カウンターの取り方
'-----------------------------------------------------
Sub Formula_Hidden_Wendy()
Dim a As Range
Dim ws As Worksheet
Dim rng As Range
Dim i As Long
For Each ws In Worksheets
On Error Resume Next
Set rng = ws.Cells.SpecialCells(xlCellTypeFormulas, 23)
'Formula Types include All = 23
On Error GoTo 0
If Not rng Is Nothing Then
For Each a In rng.Areas
With a
'カウンター
If .FormulaHidden = False Then
i = i + 1
End If
.Locked = True
.FormulaHidden = True
'.Interior.ColorIndex = 3 '色づけ確認用
End With
Next a
End If
Next ws
MsgBox i & "個のセルをFormulaHiddenしましたよん。"
End Sub
'-----------------------------------------------------
Wendy02さん、お久しぶりで~ス!!。(^o^)/
ありがとうございました。
Area にすると結合しててもOKなんですね。
ただ、セルの数が数えられなくなりましたが。(Areaを数えてるようですね)
No.4
- 回答日時:
こんばんは。
結合セル判定は、 IF RangeObject.MergeCells Then でできます。
が、単独セルで MergeArea プロパティーを使っても単独セルを返すだけなので、
結合セル判定は必要ないかも。
Sub Formula_Hidden()
Dim rngHasFormula As Range
Dim Sh As Worksheet
Dim i As Long
Dim C As Range
Const ALL_TYPE = xlErrors Or xlLogical Or xlNumbers Or xlTextValues
For Each Sh In ThisWorkbook.Sheets
On Error Resume Next
Set rngHasFormula = _
Sh.Cells.SpecialCells(xlCellTypeFormulas, ALL_TYPE)
On Error GoTo 0
If Not rngHasFormula Is Nothing Then
For Each C In rngHasFormula
With C.MergeArea
.Locked = True
.FormulaHidden = True
End With
i = i + 1
Next C
End If
Next Sh
Set rngHasFormula = Nothing
' 結合セルの数が含まれる
MsgBox CStr(i) & "個のセルをFormulaHiddenしましたよん。"
End Sub
ありがとうございます。いつもお世話様です。
やってみましたが、作動しません。
On Error Resume Nextを削除したところ、
Sh.Cells.SpecialCells(xlCellTypeFormulas, ALL_TYPE)を認識できてないようでした。
No.3
- 回答日時:
SpecialCellsで数式のセルを選択したらいけそうでした。
コードは整理していません。悪しからずです。Sub Formula_Hidden()
For Each ws In Worksheets
ws.Unprotect
ws.Activate
ws.Cells(1, 1).Select
Selection.SpecialCells(xlCellTypeFormulas, 23).Select
Selection.Locked = True
Selection.FormulaHidden = True
i = i + Selection.Cells.Count
ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Next ws
MsgBox i & "個のセルをFormulaHiddenしましたよん。"
End Sub
な~るほど!
こういうやりかたもあるんですね。セルをFor next で探さなくともいいですね。
勉強になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) vbaで列幅について 1 2022/11/15 08:31
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelでSUBTOTAL関数を設定した...
-
エクセル ボタンを押すとセルの...
-
エクセルで片方のセルに入力し...
-
EXCELで、結合されたセルに連続...
-
VBAで “:” を含むセルの特定
-
Excel セルを結合したものを抽...
-
セルを結合した場合の関数(COU...
-
Excel2007 セルの削除について
-
エクセルでセルをクリックして“...
-
【EXCEL】条件に合致するセルの...
-
VBAで結合したセルがクリアでき...
-
Excelでnullになるような式のセ...
-
エクセルで作業した日の日付を残す
-
エクセル:ヘッダーにセル番号...
-
VBAで困っています。
-
セルの値を取得してSQL文に組み...
-
エクセルでたくさんのセルを小...
-
Excelのカウントアップボタンに...
-
A1セルに入力したら、入力時間...
-
EXCELで○ヶ月を○年○ヶ月に変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excelでSUBTOTAL関数を設定した...
-
エクセル ボタンを押すとセルの...
-
EXCELで、結合されたセルに連続...
-
セルを結合した場合の関数(COU...
-
エクセルで片方のセルに入力し...
-
VBAで結合したセルがクリアでき...
-
Excel 離れたセルへの連続デー...
-
セルの値を取得してSQL文に組み...
-
【EXCEL】条件に合致するセルの...
-
Excelでnullになるような式のセ...
-
エクセルで作業した日の日付を残す
-
エクセルでセルをクリックして“...
-
Excel セルを結合したものを抽...
-
Excelの表に自動でナンバリング...
-
VBAで困っています。
-
エクセルでたくさんのセルを小...
-
エクセル 結合セル内に空白なら...
-
EXCEL セル結合したセルを参照...
-
Excelのカウントアップボタンに...
-
エクセルでチェックボックスを...
おすすめ情報