0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【EXCEL】数式を保護する

Posted at

やること

 EXCELで数式の入ったセルのみ保護する。

事前確認:Qiitaでの記事

 ここで、以下の検索をしたところ、146件ヒットした。(2025/6/8時点)
「excel セルを保護」の検索結果 - Qiita

 以下、8種類ほど紹介。

通常の使い方とパスワードに関して ほか

特定のセルを保護して数式を隠したい #Excel - Qiita
投稿日 2017年05月09日

エクセルで特定セルの編集をロックする場合、シート保護は必須である #Excel - Qiita
投稿日 2024年02月29日

Excel2013/2016で特定条件下でファイルが壊れる不具合と回避方法 #Office365 - Qiita
投稿日 2019年05月23日

VBA使用

個人マクロブック等に保存して利用するVBAの汎用プロシージャ6選 #Excel - Qiita
最終更新日 2024年12月22日 投稿日 2024年10月10日

AccessのVBAでエクセルシートの特定セル以外は編集不可設定に #Excel - Qiita
投稿日 2023年05月28日

ExcelのアクティブセルをすべてA1にして最初のシートをアクティブにする #PowerShell - Qiita
最終更新日 2017年02月12日 投稿日 2016年12月01日

Excelのvbaでロックしたセルを塗りつぶしてみた #VBA - Qiita
最終更新日 2016年12月19日 投稿日 2016年12月08日

EXCEL VBA シート関連 自分用メモ crossfish21 #ExcelVBA - Qiita
最終更新日 2018年05月20日 投稿日 2018年05月18日

VBA Tips #Excel - Qiita
最終更新日 2016年07月09日 投稿日 2013年01月01日

Office Scripts使用

Excelで使えるOffice Scripts入門:Microsoft 365ユーザーのための自動化ガイド #TypeScript - Qiita
投稿日 2025年02月13日

PowerShell使用

PowerShellでExcelファイル作成で使う処理一通り #Excel - Qiita
投稿日 2020年06月28日

VB.NET使用

C#/VB.NET:Excel で特定のセルをロックする方法 #VB.Net - Qiita
投稿日 2023年04月07日

C#  Excelでセルのロックとロック解除 #C# - Qiita
投稿日 2021年10月27日

JavaScript使用

Exceljs でシートを保護し、特定のセルだけロックを解除して編集可能にする #Node.js - Qiita
投稿日 2024年02月29日

Python使用

【Python】ブックやシートのセルを保護する #初心者 - Qiita
投稿日 2021年02月09日

Pythonで実現するExcelセルのロックと保護 #XLSX - Qiita
投稿日 2025年04月25日

Pythonコードを使ってExcelのセルをロックする #Security - Qiita
最終更新日 2024年07月01日 投稿日 2024年06月07日

PythonでExcelの行、列、セルをロックする #API - Qiita
投稿日 2024年12月10日

PythonでExcelの数式や関数を削除し、データを保持する方法 #Python - Qiita
投稿日 2024年09月30日

Java使用

JavaでExcelのセルをロックする #API - Qiita
投稿日 2025年04月25日

事例

 【EXCEL】カレンダーづくり(Write Only Code) #初心者 - Qiita に、付箋を追加する例。

ロック数式セル.bas
Sub ロック数式セル()
'------------------------------------------------------------------
' 関数: ロック数式セル
' 説明: Excelシート内の数式が含まれているセルのみをロックし、
'       シート全体の保護を適用する。
' 引数:
'   なし
' 戻り値:
'   なし
'
' 使用例:
'   ' 現在のアクティブシートで数式セルのみをロックする
'   Call ロック数式セル()
'------------------------------------------------------------------
    Dim ws As Worksheet
    Dim rng As Range
    Dim cell As Range
    ' アクティブシートを対象とする
    Set ws = ActiveSheet
    ' すべてのセルのロックを解除(初期化)
    ws.Cells.Locked = False
    ' ワークシートの使用範囲を取得
    Set rng = ws.UsedRange
    ' 数式を含むセルを検索してロック
    For Each cell In rng
        If cell.HasFormula Then cell.Locked = True
    Next cell
    ' ワークシートの保護を適用(パスワードなし)
    ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    MsgBox "数式セルをロックし、シートを保護しました。", vbInformation, "完了"
End Sub
(元のカレンダー.basを少し書き直し)
カレンダー.bas
Sub main()
'-----祝日シート追加-----
    ' 内閣府の祝日データを「holiday_j」と定義し、シートの最後に移動
    Dim wb As Workbook                  ' VBAを起動したワークブック用
    Set wb = ActiveWorkbook             ' wb.Name = Book1(初期起動時)
    Dim ws As Worksheet                 ' VBAを起動したワークシート用
    Set ws = ActiveSheet                ' ws.Name = Sheet1(初期起動時)
    Dim URL_data As String              ' 祝日データのURL用
     URL_data = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
    ' 昭和30年(1955年)から令和7年(2025年)国民の祝日(csv形式:20KB) (2024/07/14時点)
    ' 国民の祝日について - 内閣府 https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
    Workbooks.Open URL_data             ' 祝日データをEXCELで開く
    Rows("1:1").Delete Shift:=xlUp      ' テキスト削除
    Columns("A:A").NumberFormatLocal = "[$-x-sysdate]dddd, mmmm dd, yyyy"
    ActiveWorkbook.Names.Add Name:="holiday_j", RefersTo:="=syukujitsu!$A:$A"
    Sheets("syukujitsu").Move After:=wb.Worksheets(wb.Worksheets.Count)
    ActiveSheet.Name = "祝日"           ' シート名を変更
    wb.Activate                         ' Moveのため新規時には不要
    ws.Activate                         ' 最初のシートを表示
'-----1か月カレンダー-----
    '3行目に年、月を入力:シート名をタイトルにした日曜始まりのカレンダー
    ws.Name = "壱ヶ月カレンダー"
    'セル全体の設定
    Cells.Select
        Call セル設定(11.89, 96#, 255, 255, 255)
        Call 文字設定_POP(11, "黒", "中央")
    '各行の設定
    ' タイトル
    Rows("1:1").Select
        Call セル設定(11.89, 30#, 255, 255, 255)
    Range("A1:G1").Select
        Call 文字設定_POP(22, "黒", "中")
        Cells(1, 1) = "=RIGHT(@CELL(""filename"",A1),LEN(@CELL(""filename"",A1))-FIND(""]"",@CELL(""filename"",A1)))"
    ' 空行
    Rows("2:2").Select
        Call セル設定(11.89, 13.2, 255, 255, 255)
    ' 年月入力
    Rows("3:3").Select
        Call セル設定(11.89, 21#, 255, 255, 255)
    Union(ws.Range("B3"), ws.Range("D3")).Select
        Call セル設定(11.89, 21#, 255, 255, 204)    ' 可変部分のみ背景色替え
        Call 文字設定_POP(18, "黒", "右")         ' 可変部分は右寄せ
    Union(ws.Range("C3"), ws.Range("E3")).Select
        Call 文字設定_POP(18, "黒", "左")
    Range("G3").Select
        Call 文字設定_POP(18, "白", "左")         ' 隠し文字
    Range("B3:G3").Formula = Array(Format(Date, "yyyy"), "年", Format(Date, "mm"), "月", "", "=DATE(RC[-5],RC[-3],1)")
    ' 空行
    Rows("4:4").Select
        Call セル設定(11.89, 13.2, 255, 255, 255)
    ' 曜日
    Rows("5:5").Select
        Call セル設定(11.89, 22.2, 255, 255, 255)
    Range("A5").Select
        Call 文字設定_POP(18, "赤", "中央")
    Range("B5:F5").Select
        Call 文字設定_POP(18, "黒", "中央")
    Range("G5").Select
        Call 文字設定_POP(18, "青", "中央")
    Range("A5:G5").Formula = Array("日", "月", "火", "水", "木", "金", "土")
    ' 日付欄
    Dim i As Byte
    Dim j As Byte
    For i = 6 To 11                     ' 6行目から11行目
        If i = 6 Then                   ' セルA6のみ例外処理
            Application.ReferenceStyle = xlR1C1
            Cells(6, 1).NumberFormatLocal = "d"
            Cells(6, 1) = "=R[-3]C[6]-WEEKDAY(R[-3]C[6])+1"
            Application.ReferenceStyle = xlA1
        Else
            Application.ReferenceStyle = xlR1C1
            Cells(i, 1).NumberFormatLocal = "d"
            Cells(i, 1) = "=R[-1]C[6]+1"
            Application.ReferenceStyle = xlA1
        End If
        For j = 2 To 7                  ' B列からG列まで
            Application.ReferenceStyle = xlR1C1
            Cells(i, j).NumberFormatLocal = "d"
            Cells(i, j) = "=RC[-1]+1"   ' 左の列+1
            Application.ReferenceStyle = xlA1
        Next j
    Next i
    '-----条件付き書式設定 の ルール設定-----
    Cells.FormatConditions.Delete
    Range("A6:G11").Select
    ' 条件設定① 今月以外を「白」
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=MONTH(A6)<>$D$3"
    Selection.FormatConditions(1).Font.Color = RGB(255, 255, 255)
    ' 条件設定② 祝日を「赤」
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=COUNTIF(holiday_j,A6)>0"
    Selection.FormatConditions(2).Font.Color = RGB(255, 0, 0)
    ' 条件設定③ 日曜日を「赤」
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=WEEKDAY(A6)=1"
    Selection.FormatConditions(3).Font.Color = RGB(255, 0, 0)
    Selection.FormatConditions(3).StopIfTrue = False
    ' 条件設定④ 土曜日を「青」
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=WEEKDAY(A6)=7"
    Selection.FormatConditions(4).Font.Color = RGB(0, 0, 255)
    Selection.FormatConditions(4).StopIfTrue = False
    '-----罫線設定-----
    Range("A6:G11").Borders.LineStyle = xlContinuous
End Sub


Function セル設定(幅 As Single,  As Single, 背景R As Byte, 背景G As Byte, 背景B As Byte)
'------------------------------------------------------------------
' 関数: セル設定
' 説明: 指定された列の幅、行の高さ、および背景色を設定する。
' 引数:
'   幅      - 設定する列の幅 (Single型)
'   高      - 設定する行の高さ (Single型)
'   背景R   - 背景色の赤成分 (Byte型、0~255)
'   背景G   - 背景色の緑成分 (Byte型、0~255)
'   背景B   - 背景色の青成分 (Byte型、0~255)
' 戻り値:
'   なし (選択範囲に対して直接適用)
'
' 使用例:
'   ' 列幅を11.89, 行の高さを13.2, 背景色を白色に設定
'   Call セル設定(11.89, 13.2, 255, 255, 255)
'------------------------------------------------------------------
    With Selection
        .ColumnWidth = 
        .RowHeight = 
        .Interior.Color = RGB(背景R, 背景G, 背景B)
    End With
End Function

Function 文字設定_POP(サイズ As Single, 文字色 As String, 横位置 As String)
'------------------------------------------------------------------
' 関数: 文字設定_角POP
' 説明: 指定されたフォントサイズ・文字色・横位置に基づいて、
'       選択範囲の文字のフォント設定を変更する。
' 引数:
'   サイズ   - 設定するフォントサイズ (Single型)
'   文字色   - 変更する文字色 ("黒"、"白"、"赤"、"緑"、"青"、"水"、"紫"、"黄" など)
'   横位置   - 水平方向の文字揃え ("左"、"中央"、"中"、"右" など)
' 戻り値:
'   なし (選択範囲に対して直接適用)
'
' 使用例:
'   ' 文字サイズを18pt、文字色を「赤」、横位置を「中央」に設定する
'   Call 文字設定_角POP(18, "赤", "中央")
'------------------------------------------------------------------
    Dim 色辞書 As Object, 位置辞書 As Object
    Set 色辞書 = CreateObject("Scripting.Dictionary")
    Set 位置辞書 = CreateObject("Scripting.Dictionary")
    ' 文字色のRGB定義
    色辞書.Add "黒", RGB(0, 0, 0)
    色辞書.Add "白", RGB(255, 255, 255)
    色辞書.Add "赤", RGB(255, 0, 0)
    色辞書.Add "緑", RGB(0, 255, 0)
    色辞書.Add "青", RGB(0, 0, 255)
    色辞書.Add "水", RGB(0, 255, 255)
    色辞書.Add "紫", RGB(255, 0, 255)
    色辞書.Add "黄", RGB(255, 255, 0)
    ' 横位置の定義
    位置辞書.Add "左", xlLeft
    位置辞書.Add "中央", xlCenter
    位置辞書.Add "中", xlCenterAcrossSelection
    位置辞書.Add "右", xlRight
    ' 設定適用
    With Selection
        .Font.Name = "HGP創英角ポップ体"
        .Font.FontStyle = "標準"
        .Font.Size = サイズ
        .Font.Color = IIf(色辞書.Exists(文字色), 色辞書(文字色), RGB(16, 16, 16))
        .VerticalAlignment = xlGeneral
        .HorizontalAlignment = IIf(位置辞書.Exists(横位置), 位置辞書(横位置), xlGeneral)
    End With
End Function

Array、辞書型変数に修正。😅

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?