workbook.defined_name【名前定義】モジュール

メモ ( 概要 名前定義の追加・参照 数式内の使用 名前定義の削除 )
クラス: DefinedName【名前定義】 DefinedNameList【名前定義リスト】

メモ

概要

名前定義の追加・参照

数式内の使用

  • 数式内で定義名アクセス

名前定義の削除


DefinedName【名前定義】クラス

クラス定義

クラス備考
親:openpyxl.descriptors.serialisable.Serialisable
class DefinedName(
    name=None,
    comment=None,
    customMenu=None,
    description=None,
    help=None,
    statusBar=None,
    localSheetId=None,
    hidden=None,
    function=None,
    vbProcedure=None,
    xlm=None,
    functionGroupId=None,
    shortcutKey=None,
    publishToServer=None,
    workbookParameter=None,
    attr_text=None)
名前定義
name (str)定義名
comment (str)コメント
customMenu (str)
description (str)
help (str)
statusBar (str)
localSheetId (int)シートId (ブック:None)
hidden (bool)
function (bool)
vbProcedure (bool)
xlm (bool)
functionGroupId (int)
shortcutKey (str)
publishToServer (bool)
workbookParameter (bool)
attr_text参照範囲

操作

操作備考
for attr in DefinedName : 繰り返し処理
(プロパティ名, プロパティ値) の tuple
attr_text【参照範囲】以外

プロパティ

プロパティ備考
attr_textstr 参照範囲
sheet!range 形式 (複数:カンマ区切り)

sheetシート名
    注) スペースを含むシート名はシングルクォート (') で囲む
rangeセルアドレス (各種指定可)
    絶対参照:$B$2
    相対参照:C3
    複合参照:$D4・D$4
    セル範囲:$B$2:$C$3
    その他
commentstrコメント
customMenustr
descriptionstr
destinations 名前定義情報ジェネレータ
(シート名, セルアドレス) の tuple
functionbool
functionGroupIdint
helpstr
hiddenbool
is_external
is_reserved
localSheetIdintシート Id (ブック:None)
namestr定義名
publishToServerbool
shortcutKeystr
statusBarstr
tagnamestrタグ名 ('definedName')
type
valuestrattr_text【参照範囲】のエイリアス
vbProcedurebool
workbookParameterbool
xlmbool

DefinedNameList【名前定義リスト】クラス

メモ

クラス定義

クラス備考
親:openpyxl.descriptors.serialisable.Serialisable
class DefinedNameList(
    definedName=() )
名前定義リスト
definedName名前定義シーケンス
※ 直接作成することはない

操作

操作備考
len( DefinedNameList ) 名前定義数
name in DefinedNameList 名前定義 存在判定 (範囲:ブックのみ)
name定義名
DefinedNameList [name] 名前定義 取得 (範囲:ブックのみ)
name定義名
(参照:get【名前定義 取得】)
del DefinedNameList [name] 名前定義 削除 (範囲:ブックのみ)
name定義名
(参照:delete【名前定義 削除】)

プロパティ

プロパティ備考
definedNamelist
tuple
名前定義シーケンス
tagnamestrタグ名 ('definedNames')

メソッド

メソッド備考
append(defn) 名前定義 追加
defn (DefinedName)名前定義
delete(
    name,
    scope=None)
名前定義 削除
name (str)定義名
scope範囲 (ブック:None / シート:シートId)
(参照:del DefinedNameList [name]【名前定義 削除操作】)
get(
    name,
    scope=None)
名前定義 取得
戻り値 (DefinedName)名前定義
name (str)定義名
scope範囲 (ブック:None / シート:シートId)
(参照:DefinedNameList [name]【名前定義 取得操作】)
localnames(scope) 定義名リスト取得
戻り値定義名リスト
scope範囲 (ブック:None / シート:シートId)

範囲

from openpyxl import Workbook
from openpyxl.workbook.defined_name import DefinedName

# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws_x = wb.active
ws_x.title = 'SheetX'
ws_y = wb.create_sheet('SheetY')

# 名前定義 (範囲:ブック)
NAME_BOOK = 'name_book'
# [SheetX]
def_name = DefinedName(
    NAME_BOOK,
    attr_text='SheetX!$B$2',
)
wb.defined_names.append(def_name)
# [SheetY]
def_name = DefinedName(
    NAME_BOOK,
    attr_text='SheetY!$B$2',
)
# wb.defined_names.append(def_name)
# 例外:ValueError: DefinedName with the same name and scope already exists

# 名前定義 (範囲:シート)
NAME_SHEET = 'name_sheet'
# [SheetX]
def_name = DefinedName(
    NAME_SHEET,
    attr_text='SheetX!$B$4',
    localSheetId=wb.index(ws_x),
)
wb.defined_names.append(def_name)
# [SheetY]
def_name = DefinedName(
    NAME_SHEET,
    attr_text='SheetY!$B$4',
    localSheetId=wb.index(ws_y),
)
wb.defined_names.append(def_name)

# 名前定義参照
for dfn in wb.defined_names.definedName:
    print(dfn.name, dfn.localSheetId, dfn.attr_text)
# 出力:
# name_book None SheetX!$B$2
# name_sheet 0 SheetX!$B$4
# name_sheet 1 SheetY!$B$4

# ワークブック保存
wb.save(WORKBOOK)

名前定義範囲のサンプル画像


名前定義の追加・参照

from openpyxl import Workbook
from openpyxl.workbook.defined_name import DefinedName
from openpyxl.cell import Cell

# 名前定義セルに値設定 (範囲:ブック・シート 両用)
def set_value(name, value, scope=None):
    dests = wb.defined_names.get(name, scope).destinations
    idx = 1
    for title, coord in dests:
        print(title, coord)
        ws_name = wb[title]
        cells = ws_name[coord]
        print(cells)
        if type(cells) is Cell:
            cells.value = f'{value}-{idx}'
            idx += 1
        else:
            for row in cells:
                for cell in row:
                    cell.value = f'{value}-{idx}'
                    idx += 1


# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws_active = wb.active
ws_active.title = 'SheetX'
ws_active['B2'] = '[SheetX]'
ws_sp = wb.create_sheet('Sheet SP')  # スペースを含むシート名
ws_sp['B2'] = '[Sheet SP]'

# 名前定義 (範囲:ブック)
NAME_BOOK_1 = 'name_book_1'
NAME_BOOK_COL = 'name_book_col'
NAME_BOOK_ROW = 'name_book_row'
NAME_BOOK_CELLS = 'name_book_cells'
NAME_BOOK_MULTI = 'name_book_multi'
# 単一セル (Workbook メソッド:Worksheet 指定なし)
wb.create_named_range(NAME_BOOK_1, None, 'SheetX!$B$4')
# 1行セル (Workbook メソッド:Worksheet 指定)
wb.create_named_range(NAME_BOOK_COL, ws_active, '$D$4:$F$4')
# 1列セル (Workbook プロパティに追加)
def_name = DefinedName(
    NAME_BOOK_ROW,
    attr_text='SheetX!$B$6:$B$8',
)
wb.defined_names.append(def_name)
# 行・列 セル (Workbook プロパティに追加)
def_name = DefinedName(
    NAME_BOOK_CELLS,
    attr_text='SheetX!$D$6:$F$8',
)
wb.defined_names.append(def_name)
# 非連続セル (Workbook プロパティに追加・スペースを含むシート名)
def_name = DefinedName(
    NAME_BOOK_MULTI,
    attr_text="'Sheet SP'!$B$4," +
              "'Sheet SP'!$C$5," +
              "'Sheet SP'!$D$6",
)
wb.defined_names.append(def_name)

# 名前定義セル参照 (範囲:ブック)
set_value(NAME_BOOK_1, 'CELL')
# 出力:
# SheetX $B$4
# <Cell 'SheetX'.B4>
set_value(NAME_BOOK_COL, 'COL')
# 出力:
# SheetX $D$4:$F$4
# ((<Cell 'SheetX'.D4>, <Cell 'SheetX'.E4>, <Cell 'SheetX'.F4>),)
set_value(NAME_BOOK_ROW, 'ROW')
# 出力:
# SheetX $B$6:$B$8
# ((<Cell 'SheetX'.B6>,), (<Cell 'SheetX'.B7>,), (<Cell 'SheetX'.B8>,))
set_value(NAME_BOOK_CELLS, 'CELLS')
# 出力:
# SheetX $D$6:$F$8
# ((<Cell 'SheetX'.D6>, <Cell 'SheetX'.E6>, <Cell 'SheetX'.F6>),
#  (<Cell 'SheetX'.D7>, <Cell 'SheetX'.E7>, <Cell 'SheetX'.F7>),
#  (<Cell 'SheetX'.D8>, <Cell 'SheetX'.E8>, <Cell 'SheetX'.F8>))
set_value(NAME_BOOK_MULTI, 'MULTI')
# 出力:
# Sheet SP $B$4
# <Cell 'Sheet SP'.B4>
# Sheet SP $C$5
# <Cell 'Sheet SP'.C5>
# Sheet SP $D$6
# <Cell 'Sheet SP'.D6>

# 名前定義 (範囲:シート)
NAME_SHEET_1 = 'name_sheet_1'
NAME_SHEET_COL = 'name_sheet_col'
NAME_SHEET_ROW = 'name_sheet_row'
NAME_SHEET_CELLS = 'name_sheet_cells'
NAME_SHEET_MULTI = 'name_sheet_multi'
sheet_id = wb.index(ws_active)
# 単一セル (Workbook メソッド:Worksheet 指定なし)
wb.create_named_range(NAME_SHEET_1, None, 'SheetX!$B$11', sheet_id)
# 1行セル (Workbook メソッド:Worksheet 指定)
wb.create_named_range(NAME_SHEET_COL, ws_active, '$D$11:$F$11', sheet_id)
# 1列セル (Workbook プロパティに追加)
def_name = DefinedName(
    NAME_SHEET_ROW,
    attr_text='SheetX!$B$13:$B$15',
    localSheetId=sheet_id,
)
wb.defined_names.append(def_name)
# 行・列 セル (Workbook プロパティに追加)
def_name = DefinedName(
    NAME_SHEET_CELLS,
    attr_text='SheetX!$D$13:$F$15',
    localSheetId=sheet_id,
)
wb.defined_names.append(def_name)
# 非連続セル (Workbook プロパティに追加・スペースを含むシート名)
def_name = DefinedName(
    NAME_SHEET_MULTI,
    attr_text="'Sheet SP'!$B$9," +
              "'Sheet SP'!$C$10," +
              "'Sheet SP'!$D$11",
    localSheetId=sheet_id,
)
wb.defined_names.append(def_name)

# 名前定義セル参照 (範囲:シート)
set_value(NAME_SHEET_1, 'cell', sheet_id)
# 出力:
# SheetX $B$11
# <Cell 'SheetX'.B11>
set_value(NAME_SHEET_COL, 'col', sheet_id)
# 出力:
# SheetX $D$11:$F$11
# ((<Cell 'SheetX'.D11>, <Cell 'SheetX'.E11>, <Cell 'SheetX'.F11>),)
set_value(NAME_SHEET_ROW, 'row', sheet_id)
# 出力:
# SheetX $B$13:$B$15
# ((<Cell 'SheetX'.B13>,), (<Cell 'SheetX'.B14>,), (<Cell 'SheetX'.B15>,))
set_value(NAME_SHEET_CELLS, 'cells', sheet_id)
# 出力:
# SheetX $D$13:$F$15
# ((<Cell 'SheetX'.D13>, <Cell 'SheetX'.E13>, <Cell 'SheetX'.F13>),
#  (<Cell 'SheetX'.D14>, <Cell 'SheetX'.E14>, <Cell 'SheetX'.F14>),
#  (<Cell 'SheetX'.D15>, <Cell 'SheetX'.E15>, <Cell 'SheetX'.F15>))
set_value(NAME_SHEET_MULTI, 'multi', sheet_id)
# 出力:
# Sheet SP $B$9
# <Cell 'Sheet SP'.B9>
# Sheet SP $C$10
# <Cell 'Sheet SP'.C10>
# Sheet SP $D$11
# <Cell 'Sheet SP'.D11>

# ワークブック保存
wb.save(WORKBOOK)

名前定義の追加・参照のサンプル画像1

名前定義の追加・参照のサンプル画像2


数式内の使用

from openpyxl import Workbook
from openpyxl.workbook.defined_name import DefinedName

# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active

# 名前定義
NAME_VALUE_1 = 'name_value1'
NAME_VALUE_2 = 'name_value2'
NAME_VALUE_3 = 'name_value3'

# 値1
def_name = DefinedName(
    NAME_VALUE_1,
    attr_text='Sheet!$B$2',
)
wb.defined_names.append(def_name)
ws['$B$2'] = 2
# 値2
def_name = DefinedName(
    NAME_VALUE_2,
    attr_text='Sheet!$C$3',
)
wb.defined_names.append(def_name)
ws['$C$3'] = 3
# 数式
ws['$D$4'] = f'={NAME_VALUE_1} * {NAME_VALUE_2}'
print(ws['D4'].value)
# 出力:=name_value1 * name_value2

# 値3
def_name = DefinedName(
    NAME_VALUE_3,
    attr_text='Sheet!$B$6:$B$8',
)
wb.defined_names.append(def_name)
ws['$B$6'] = 4
ws['$B$7'] = 5
ws['$B$8'] = 6
# 数式
ws['$B$10'] = f'=SUM({NAME_VALUE_3})'
print(ws['$B$10'].value)
# 出力:=SUM(name_value3)

# ワークブック保存
wb.save(WORKBOOK)

数式内の使用のサンプル画像


名前定義の削除

from openpyxl import Workbook
from openpyxl.workbook.defined_name import DefinedName

# ワークブック作成
WORKBOOK = 'sample.xlsx'
wb = Workbook()
ws = wb.active

# 名前定義 (範囲:ブック)
NAME_BOOK_1 = 'name_book_1'
NAME_BOOK_2 = 'name_book_2'
NAME_BOOK_3 = 'name_book_3'
def_name = DefinedName(
    NAME_BOOK_1,
    attr_text='Sheet!$B$2',
)
wb.defined_names.append(def_name)
def_name = DefinedName(
    NAME_BOOK_2,
    attr_text='Sheet!$B$3',
)
wb.defined_names.append(def_name)
def_name = DefinedName(
    NAME_BOOK_3,
    attr_text='Sheet!$B$4',
)
wb.defined_names.append(def_name)
print(wb.defined_names.localnames(None))
# 出力:['name_book_1', 'name_book_2', 'name_book_3']
del wb.defined_names[NAME_BOOK_1]
print(wb.defined_names.localnames(None))
# 出力:['name_book_2', 'name_book_3']
wb.defined_names.delete(NAME_BOOK_2)
print(wb.defined_names.localnames(None))
# 出力:['name_book_3']

# 名前定義 (範囲:シート)
NAME_SHEET_1 = 'name_sheet_1'
NAME_SHEET_2 = 'name_sheet_2'
sheet_id = wb.index(ws)
def_name = DefinedName(
    NAME_SHEET_1,
    attr_text='Sheet!$B$6',
    localSheetId=sheet_id,
)
wb.defined_names.append(def_name)
def_name = DefinedName(
    NAME_SHEET_2,
    attr_text='Sheet!$B$7',
    localSheetId=sheet_id,
)
wb.defined_names.append(def_name)
print(wb.defined_names.localnames(sheet_id))
# 出力:['name_sheet_1', 'name_sheet_2']
wb.defined_names.delete(NAME_SHEET_1, sheet_id)
print(wb.defined_names.localnames(sheet_id))
# 出力:['name_sheet_2']

# 名前定義参照
for dfn in wb.defined_names.definedName:
    print(dfn.name, dfn.localSheetId, dfn.attr_text)
# 出力:
# name_book_3 None Sheet!$B$4
# name_sheet_2 0 Sheet!$B$7

# ワークブック保存
wb.save(WORKBOOK)

名前定義の削除のサンプル画像