workbook.defined_name【名前定義】モジュール
メモ ( 概要 名前定義の追加・参照 数式内の使用 名前定義の削除 ) 例
クラス: DefinedName【名前定義】 DefinedNameList【名前定義リスト】
メモ
概要
- 名前定義に関連するモジュール
- Excelの [数式]-[定義された名前]タブ に対応
- Excelの [数式]-[定義された名前]タブ に対応
- モジュール内定義
- 範囲〔 例 〕
- ブック:ワークブック内で一意
- シート:ワークシート内で一意 (別のワークシートで同名の名前定義可)
- 関連モジュール
名前定義の追加・参照
〔 例 〕- 名前定義の追加 (下記のどちらか)
- Workbook【ワークブック】 の create_named_range【名前定義 作成・追加】メソッドで追加
- DefinedName【名前定義】(下記引数) を作成し、
Workbook【ワークブック】 の defined_names【名前定義リスト】プロパティ に append【名前定義 追加】メソッドで追加
name (定義名)
attr_text (参照範囲)
localSheetId (ワークシート Id) (範囲がシートの場合)
- 名前定義の参照 (範囲:ブック・シート 両用)
- Workbook【ワークブック】 の defined_names【名前定義リスト】 (DefinedNameList) プロパティの get【名前定義 取得】メソッドで DefinedName【名前定義】取得
※ 範囲がブックのみ:get【名前定義 取得】メソッドの 代わりに DefinedNameList [ name ]【名前定義 取得操作】でも可 - 取得した DefinedName【名前定義】の destinations【名前定義情報ジェネレータ】から シート名 と セルアドレス を取得し、Cell【セル】を参照
(単一セル以外のカンマ区切り・範囲指定は繰り返し処理)
- Workbook【ワークブック】 の defined_names【名前定義リスト】 (DefinedNameList) プロパティの get【名前定義 取得】メソッドで DefinedName【名前定義】取得
数式内の使用
〔 例 〕- 数式内で定義名アクセス
名前定義の削除
〔 例 〕外部リンク
- openpyxl (英語)
- ECMA-376:Office Open XML file formats (英語)
SpreadsheetML:- definedName (Defined Name)
- definedNames (Defined Names)
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_text | str | 参照範囲 sheet!range 形式 (複数:カンマ区切り) sheetシート名 注) スペースを含むシート名はシングルクォート (') で囲む rangeセルアドレス (各種指定可) 絶対参照:$B$2 相対参照:C3 複合参照:$D4・D$4 セル範囲:$B$2:$C$3 その他 |
comment | str | コメント |
customMenu | str | |
description | str | |
destinations | 名前定義情報ジェネレータ (シート名, セルアドレス) の tuple | |
function | bool | |
functionGroupId | int | |
help | str | |
hidden | bool | |
is_external | ||
is_reserved | ||
localSheetId | int | シート Id (ブック:None) |
name | str | 定義名 |
publishToServer | bool | |
shortcutKey | str | |
statusBar | str | |
tagname | str | タグ名 ('definedName') |
type | ||
value | str | attr_text【参照範囲】のエイリアス |
vbProcedure | bool | |
workbookParameter | bool | |
xlm | bool |
DefinedNameList【名前定義リスト】クラス
メモ
- DefinedName【名前定義】を管理
- Workbook【ワークブック】 の defined_names【名前定義リスト】プロパティで使用
クラス定義
クラス | 備考 |
---|---|
親:openpyxl.descriptors.serialisable.Serialisable | |
class DefinedNameList( definedName=() ) | 名前定義リスト definedName名前定義シーケンス ※ 直接作成することはない |
操作
操作 | 備考 |
---|---|
len( DefinedNameList ) | 名前定義数 |
name in DefinedNameList | 名前定義 存在判定 (範囲:ブックのみ) name定義名 |
DefinedNameList [name] | 名前定義 取得 (範囲:ブックのみ) name定義名 (参照:get【名前定義 取得】) |
del DefinedNameList [name] | 名前定義 削除 (範囲:ブックのみ) name定義名 (参照:delete【名前定義 削除】) |
プロパティ
プロパティ | 型 | 備考 |
---|---|---|
definedName | list tuple | 名前定義シーケンス |
tagname | str | タグ名 ('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)
数式内の使用
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)