Python pywin32(win32com) Excel 操作備忘録


## はじめに

ノンプログラマーの素人が記述をしたコードです。
狭い利用範囲と少ない利用頻度での確認ですので、
記載内容に間違いや勘違いがあるかもしれません。
下記内容を参照の際は自己責任でお願い致します。

## 名前付き引数と省略可能な引数

メソッドの引数は、
C++のデフォルト引数と同様、
途中の引数を省略することができなさそうです。

## pywin32(win32com)の参考にさせて頂いたサイト

https://excel-ubara.com/python/python025.html
https://qiita.com/kumarstack55/items/9ae3432446afca06497f

## ExcelVBAの参考にさせて頂いたサイト

https://excel-ubara.com/
http://www.eurus.dti.ne.jp/~yoneyama/

## Pythonのpywin32(win32com)でExcelPivotTable操作備忘録

https://feo52.hatenablog.jp/entry/2023/05/07/080000#main
https://feo52.hatenablog.jp/entry/2023/05/07/080000#code

## Pythonのpywin32(win32com)でExcel操作備忘録サンプル

[sample.csv](https://gist.github.com/feo52/4ed4632df7c91f32cfa7975b55a87f55#file-sample-csv)
[sample.py](https://gist.github.com/feo52/4ed4632df7c91f32cfa7975b55a87f55#file-sample-py)
[sample.with.print.and.input.py](https://gist.github.com/feo52/4ed4632df7c91f32cfa7975b55a87f55#file-sample-with-print-and-input-py)

## Pythonのpywin32(win32com)でExcel操作備忘録

<details>
<summary>:notebook_with_decorative_cover: sample.csv</summary>

```
14159,26535,89793,23846,26433,83279,5028,841971,69399,37510
58209,74944,59230,78164,06286,20899,8628,034825,34211,70679
82148,08651,32823,06647,09384,46095,5058,223172,53594,08128
48111,74502,84102,70193,85211,05559,6446,229489,54930,38196
44288,10975,66593,34461,28475,64823,3786,783165,27120,19091
45648,56692,34603,48610,45432,66482,1339,360726,02491,41273
72458,70066,06315,58817,48815,20920,9628,292540,91715,36436
78925,90360,01133,05305,48820,46652,1384,146951,94151,16094
33057,27036,57595,91953,09218,61173,8193,261179,31051,18548
07446,23799,62749,56735,18857,52724,8912,279381,83011,94912
98336,73362,44065,66430,86021,39494,6395,224737,19070,21798
60943,70277,05392,17176,29317,67523,8467,481846,76694,05132
00056,81271,45263,56082,77857,71342,7577,896091,73637,17872
14684,40901,22495,34301,46549,58537,1050,792279,68925,89235
42019,95611,21290,21960,86403,44181,5981,362977,47713,09960
51870,72113,49999,99837,29780,49951,0597,317328,16096,31859
50244,59455,34690,83026,42522,30825,3344,685035,26193,11881
71010,00313,78387,52886,58753,32083,8142,061717,76691,47303
59825,34904,28755,46873,11595,62863,8823,537875,93751,95778
18577,80532,17122,68066,13001,92787,6611,195909,21642,01989
```

</details>

<details>
<summary>:notebook_with_decorative_cover: sample.with.print.and.input.py</summary>

```py
# coding:utf-8

import os

import win32com.client
import win32con
import win32gui


def main():
    # ------------------------------------------------------------------
    # Excelの定数を設定
    # ------------------------------------------------------------------
    # https://excel-ubara.com/EXCEL/EXCEL905.html
    # https://docs.microsoft.com/en-us/office/vba/api/excel(enumerations)
    # https://docs.microsoft.com/ja-jp/office/vba/api/excel(enumerations)
    # ------------------------------------------------------------------
    # Excelの定数を取得する方法もあるようです。
    # https://stackoverflow.com/questions/28264548/
    # https://stackoverflow.com/questions/75154736/
    # https://stackoverflow.com/questions/50127959/
    # https://stackoverflow.com/questions/48257308/
    # https://wacky.hatenadiary.com/entry/20091011/1255240572
    # win32com.client.gencache.EnsureDispatch("Excel.Application")
    # ------------------------------------------------------------------
    # Excel Enum Constants
    # ------------------------------------------------------------------
    xlAbove = 0
    xlBelow = 1
    xlSolid = 1
    xlFirst = 0
    xlLast = 1
    xlLastCell = 11
    xlTopToBottom = 1
    xlLeftToRight = 2
    xlGeneral = 1
    xlAutomatic = -4105
    xlFormats = -4122
    xlNone = -4142
    xlCenter = -4108
    xlDistributed = -4117
    xlJustify = -4130
    xlBottom = -4107
    xlLeft = -4131
    xlRight = -4152
    xlTop = -4160
    xlRTL = -5004
    xlLTR = -5003
    xlContext = -5002
    # ------------------------------------------------------------------
    # Excel Enum XLBorderWeight
    # ------------------------------------------------------------------
    xlHairline = 1
    xlThin = 2
    xlThick = 4
    xlMedium = -4138
    # ------------------------------------------------------------------
    # Excel Enum XLBordersIndex
    # ------------------------------------------------------------------
    xlDiagonalDown = 5
    xlDiagonalUp = 6
    xlEdgeLeft = 7
    xlEdgeTop = 8
    xlEdgeBottom = 9
    xlEdgeRight = 10
    xlInsideHorizontal = 12
    xlInsideVertical = 11
    # ------------------------------------------------------------------
    # Excel Enum XlAutoFillType
    # ------------------------------------------------------------------
    xlFillDefault = 0
    xlFillCopy = 1
    xlFillSeries = 2
    xlFillFormats = 3
    xlFillValues = 4
    xlFillDays = 5
    xlFillWeekdays = 6
    xlFillMonths = 7
    xlFillYears = 8
    xlLinearTrend = 9
    xlGrowthTrend = 10
    xlFlashFill = 11
    # ------------------------------------------------------------------
    # Excel Enum XlAutoFilterOperator
    # ------------------------------------------------------------------
    xlAnd = 1
    xlOr = 2
    xlTop10Items = 3
    xlBottom10Items = 4
    xlTop10Percent = 5
    xlBottom10Percent = 6
    xlFilterValues = 7
    xlFilterCellColor = 8
    xlFilterFontColor = 9
    xlFilterIcon = 10
    xlFilterDynamic = 11
    # ------------------------------------------------------------------
    # Excel Enum XlCVError
    # ------------------------------------------------------------------
    xlErrDiv0 = 2007
    xlErrNA = 2042
    xlErrName = 2029
    xlErrNull = 2000
    xlErrNum = 2036
    xlErrRef = 2023
    xlErrValue = 2015
    # ------------------------------------------------------------------
    # Excel Enum XlCVError
    # ------------------------------------------------------------------
    xlErrSpill = 2045
    xlErrConnect = 2046
    xlErrBlocked = 2047
    xlErrUnknown = 2048
    xlErrField = 2049
    xlErrCalc = 2050
    # ------------------------------------------------------------------
    # Excel Enum XlCellType
    # ------------------------------------------------------------------
    xlCellTypeConstants = 2
    xlCellTypeBlanks = 4
    xlCellTypeLastCell = 11
    xlCellTypeVisible = 12
    xlCellTypeFormulas = -4123
    xlCellTypeComments = -4144
    xlCellTypeAllFormatConditions = -4172
    xlCellTypeSameFormatConditions = -4173
    xlCellTypeAllValidation = -4174
    xlCellTypeSameValidation = -4175
    # ------------------------------------------------------------------
    # Excel Enum XlColorIndex
    # ------------------------------------------------------------------
    xlColorIndexAutomatic = -4105
    xlColorIndexNone = -4142
    # ------------------------------------------------------------------
    # Excel Enum XlCutCopyMode
    # ------------------------------------------------------------------
    xlCopy = 1
    xlCut = 2
    # ------------------------------------------------------------------
    # Excel Enum XlDeleteShiftDirection
    # Excel Enum XlInsertShiftDirection
    # ------------------------------------------------------------------
    xlShiftUp = -4162
    xlShiftDown = -4121
    xlShiftToLeft = -4159
    xlShiftToRight = -4161
    # ------------------------------------------------------------------
    # Excel Enum XlDirection
    # ------------------------------------------------------------------
    xlUp = -4162
    xlDown = -4121
    xlToLeft = -4159
    xlToRight = -4161
    # ------------------------------------------------------------------
    # Excel Enum XlFileFormat
    # ------------------------------------------------------------------
    xlCSV = 6
    xlHtml = 44
    xlWorkbookDefault = 51
    xlOpenXMLWorkbook = 51
    xlOpenXMLWorkbookMacroEnabled = 52
    xlWorkbookNormal = -4143
    xlCurrentPlatformText = -4158
    # ------------------------------------------------------------------
    # Excel Enum XlFindLookIn
    # ------------------------------------------------------------------
    xlComments = -4144
    xlCommentsThreaded = -4184
    xlFormulas = -4123
    xlValues = -4163
    # ------------------------------------------------------------------
    # Excel Enum XlFixedFormatQuality
    # ------------------------------------------------------------------
    xlQualityStandard = 0
    xlQualityMinimum = 1
    # ------------------------------------------------------------------
    # Excel Enum XlFixedFormatType
    # ------------------------------------------------------------------
    xlTypePDF = 0
    xlTypeXPS = 1
    # ------------------------------------------------------------------
    # Excel Enum XlLineStyle
    # ------------------------------------------------------------------
    xlContinuous = 1
    xlDashDot = 4
    xlDashDotDot = 5
    xlSlantDashDot = 13
    xlDash = -4115
    xldot = -4118
    xlDouble = -4119
    xlLineStyleNone = -4142
    # ------------------------------------------------------------------
    # Excel Enum XlLookAt
    # ------------------------------------------------------------------
    xlPart = 2
    xlWhole = 1
    # ------------------------------------------------------------------
    # Excel Enum XlOrientation
    # ------------------------------------------------------------------
    xlHorizontal = -4128
    xlVertical = -4166
    xlDownward = -4170
    xlUpward = -4171
    # ------------------------------------------------------------------
    # Excel Enum XlPasteType
    # ------------------------------------------------------------------
    xlPasteValues = -4163
    xlPasteComments = -4144
    xlPasteFormulas = -4123
    xlPasteFormats = -4122
    xlPasteAll = -4104
    xlPasteValidation = 6
    xlPasteAllExceptBorders = 7
    xlPasteColumnWidths = 8
    xlPasteFormulasAndNumberFormats = 11
    xlPasteValuesAndNumberFormats = 12
    xlPasteAllUsingSourceTheme = 13
    xlPasteAllMergingConditionalFormats = 14
    # ------------------------------------------------------------------
    # Excel Enum XlReferenceStyle
    # ------------------------------------------------------------------
    xlA1 = 1
    xlR1C1 = -4150
    # ------------------------------------------------------------------
    # Excel Enum XlReferenceType
    # ------------------------------------------------------------------
    xlAbsolute = 1
    xlAbsRowRelColumn = 2
    xlRelRowAbsColumn = 3
    xlRelative = 4
    # ------------------------------------------------------------------
    # Excel Enum XlSearchDirection
    # ------------------------------------------------------------------
    xlNext = 1
    xlPrevious = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSearchOrder
    # ------------------------------------------------------------------
    xlByColumns = 2
    xlByRows = 1
    # ------------------------------------------------------------------
    # Excel Enum XlSheetVisibility
    # ------------------------------------------------------------------
    xlSheetVisible = -1
    xlSheetHidden = 0
    xlSheetVeryHidden = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortDataOption
    # ------------------------------------------------------------------
    xlSortNormal = 0
    xlSortTextAsNumbers = 1
    # ------------------------------------------------------------------
    # Excel Enum XlSortMethod
    # ------------------------------------------------------------------
    xlPinYin = 1
    xlStroke = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortOn
    # ------------------------------------------------------------------
    xlSortOnValues = 0
    xlSortOnCellColor = 1
    xlSortOnFontColor = 2
    xlSortOnIcon = 3
    # ------------------------------------------------------------------
    # Excel Enum XlSortOrder
    # ------------------------------------------------------------------
    xlAscending = 1
    xlDescending = 2
    xlManual = -4135
    # ------------------------------------------------------------------
    # Excel Enum XlSortOrientation
    # ------------------------------------------------------------------
    xlSortColumns = 1
    xlSortRows = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortType
    # ------------------------------------------------------------------
    xlSortValues = 1
    xlSortLabels = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSpecialCellsValue
    # ------------------------------------------------------------------
    xlNumbers = 1
    xlTextValues = 2
    xlLogical = 4
    xlErrors = 16
    # ------------------------------------------------------------------
    # Excel Enum XlUnderlineStyle
    # ------------------------------------------------------------------
    xlUnderlineStyleNone = -4142
    xlUnderlineStyleDouble = -4119
    xlUnderlineStyleSingle = 2
    xlUnderlineStyleSingleAccounting = 4
    xlUnderlineStyleDoubleAccounting = 5
    # ------------------------------------------------------------------
    # Excel Enum XlYesNoGuess
    # ------------------------------------------------------------------
    xlGuess = 0
    xlYes = 1
    xlNo = 2
    # ------------------------------------------------------------------

    print("# Excel起動 #")
    xlApp = win32com.client.Dispatch("Excel.Application")
    # print("press enter key to continue")  # NO POST #
    # input()  # NO POST #

    # https://stackoverflow.com/questions/2790825/
    print("# ExcelのWindow最大化 #")
    win32gui.ShowWindow(xlApp.hwnd, win32con.SW_MAXIMIZE)
    # print("press enter key to continue")  # NO POST #
    # input()  # NO POST #

    print("# Excel表示 #")
    xlApp.Visible = 1
    # print("press enter key to continue")  # NO POST #
    # input()  # NO POST #

    print("# Excelファイルオープン #")
    wb = xlApp.Workbooks.Open(f"{os.getcwd()}\\sample.csv")
    # print("press enter key to continue")  # NO POST #
    # input()  # NO POST #

    print("# Excelシートオブジェクト #")
    ws = wb.Worksheets(1)
    # print("press enter key to continue")  # NO POST #
    # input()  # NO POST #

    # ------------------------------------------------------ # NO POST #
    # NO POST #
    ws.Activate()  # NO POST #
    ws.Range("A1").RowHeight = 50  # NO POST #
    ws.Range("A1").ColumnWidth = 20  # NO POST #
    ws.Cells.VerticalAlignment = xlBottom  # NO POST #
    ws.Name = "Sheet1"  # NO POST #
    ws.Parent.Worksheets.Add()  # NO POST #
    ws.Move(Before=wb.Worksheets("Sheet2"))  # NO POST #
    ws.Activate()  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# 指定したシートを選択 #")
    print("# Select()の使用前にシートのActivate()が必要 #")
    ws.Activate()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルを選択 #")
    ws.Range("A1").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1～B2を選択 #")
    ws.Range("A1:B2").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1とB2とC3とD4を選択 #")
    ws.Range("A1,B2,C3,D4").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1～B2とC3～D4を選択 #")
    ws.Range("A1:B2,C3:D4").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルを選択 #")
    ws.Cells(1, 1).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1～B2を選択 #")
    ws.Range(ws.Cells(1, 1), ws.Cells(2, 2)).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 全セルを選択 #")
    ws.Cells.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 1～2行を選択 #")
    ws.Range("1:2").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A～B列を選択 #")
    ws.Range("A:B").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://www.relief.jp/docs/excel-vba-difference-range-rows-columns.html
    print("# 1～2行を選択 #")
    ws.Rows("1:2").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://www.relief.jp/docs/excel-vba-difference-range-columns.html
    print("# A～B列を選択 #")
    ws.Columns("A:B").Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 指定範囲の先頭行を選択 #")
    ws.Range("A1:D4").Rows(1).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の先頭列を選択 #")
    ws.Range("A1:D4").Columns(1).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# (A1セル基準で)行全体を選択 #")
    ws.Range("A1").EntireRow.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)列全体を選択 #")
    ws.Range("A1").EntireColumn.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# (A1セル基準で)最終列までの行を選択 #")
    ws.Range(ws.Range("A1"), ws.Cells(1, ws.Columns.Count).End(xlToLeft)).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)最終行までの列を選択 #")
    ws.Range(ws.Range("A1"), ws.Cells(ws.Rows.Count, 1).End(xlUp)).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# (A1セル基準で)現在の領域を選択 #")
    ws.Range("A1").CurrentRegion.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (現行シートの)使用中領域を選択 #")
    ws.UsedRange.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)最終右下セル選択 #")
    ws.Range("A1").SpecialCells(xlLastCell).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)可視状態セル選択 #")
    ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得 #")
    a = ws.UsedRange.Address
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得 #")
    a = ws.UsedRange.GetAddress()
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得 #")
    a = ws.UsedRange.GetAddress(True, True)
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を相対参照で取得 #")
    a = ws.UsedRange.GetAddress(False, False)
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を相対参照のA1形式で取得 #")
    a = ws.UsedRange.GetAddress(False, False, xlA1)
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を相対参照のR1C1形式で取得 #")
    a = ws.UsedRange.GetAddress(False, False, xlR1C1)
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲の参照範囲の文字列を行列両方を相対参照のxlA1形式の外部参照で取得 #")
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    print(a)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 数式的な文字列のセル参照をR1C1形式からA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, False)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列のセル参照をA1形式からR1C1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlR1C1)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列のセル参照を相対参照のA1形式から絶対参照のA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlA1, xlAbsolute)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列のセル参照を絶対参照のA1形式から相対参照のA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(True, True, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlA1, xlRelative)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列の外部参照のセル参照をA1形式からR1C1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, True)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlR1C1)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列の外部参照のセル参照をR1C1形式からA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列の外部参照のセル参照を相対参照のR1C1形式から絶対参照のA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1, xlAbsolute)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 数式的な文字列の外部参照のセル参照を絶対参照のR1C1形式から相対参照のA1形式に変更 #")
    a1 = ws.UsedRange.GetAddress(True, True, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1, xlRelative)
    print(a1)
    print(a2)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1形式の外部参照のセル参照の文字列でRangeを取得 #")
    print("# R1C1形式は使用不可 #")
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    rg = ws.Evaluate(a)
    print(rg.Address)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1形式の外部参照のセル参照の文字列でRangeを取得 #")
    print("# R1C1形式は使用不可 #")
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    rg = ws.Application.Evaluate(a)
    print(rg.Address)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://thecodingforums.com/threads/328174/
    print("# Range.Offset()Property用GetOffset()Method #")
    print("# 指定範囲をOffset #")
    ws.Range("A1:D4").GetOffset(2, 2).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Offset()Property用GetOffset()Method #")
    print("# 指定範囲をOffset #")
    ws.Range("A1:D4").GetOffset(RowOffset=3, ColumnOffset=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Offset()Property用GetOffset()Method #")
    print("# 指定範囲を縦方向にOffset #")
    ws.Range("A1:D4").GetOffset(RowOffset=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Offset()Property用GetOffset()Method #")
    print("# 指定範囲を横方向にOffset #")
    ws.Range("A1:D4").GetOffset(RowOffset=0, ColumnOffset=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://stackoverflow.com/questions/63112880/
    print("# Range.Resize()Property用GetResize()Method #")
    print("# 指定範囲をResize #")
    ws.Range("A1:H8").GetResize(2, 2).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Resize()Property用GetResize()Method #")
    print("# 指定範囲をResize #")
    ws.Range("A1:H8").GetResize(RowSize=3, ColumnSize=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Resize()Property用GetResize()Method #")
    print("# 指定範囲の縦方向をResize #")
    ws.Range("A1:H8").GetResize(RowSize=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Range.Resize()Property用GetResize()Method #")
    print("# 指定範囲の横方向をResize #")
    ws.Range("A1:H8").GetResize(RowSize=ws.Range("A1:H8").Rows.Count, ColumnSize=3).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 指定範囲から指定の文字列を含むセルを選択 #")
    rg = ws.UsedRange
    rg.find("56", rg.GetResize(1, 1), xlValues, xlPart, xlByRows, xlNext, True).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲から指定の文字列と合致のセルを選択 #")
    rg = ws.UsedRange
    rg.find("56", rg.GetResize(1, 1), xlValues, xlWhole, xlByRows, xlNext, True).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------ # NO POST #
    # NO POST #
    ws.Activate()  # NO POST #
    ws.Range("A1").Select()  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# 指定セルの行数を取得 #")
    n = ws.Range("A1").Row
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定セルの列数を取得 #")
    n = ws.Range("A1").Column
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲に含まれる行数を取得 #")
    n = ws.Range("A1:D4").Rows.Count
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 指定範囲に含まれる列数を取得 #")
    n = ws.Range("A1:D4").Columns.Count
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)最終行数を取得 #")
    n = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1セル基準で)最終列数を取得 #")
    n = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://binary-star.net/excel-vba-columnchange
    print("# 数字列を英字列に変換 #")
    a = (ws.Cells(1, 1).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 2).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 3).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 27).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 53).Address).split("$")[1]
    print(a)
    print("# 英字列を数字列に変換 #")
    n = ws.Cells(1, "A").Column
    print(n)
    n = ws.Cells(1, "B").Column
    print(n)
    n = ws.Cells(1, "C").Column
    print(n)
    n = ws.Cells(1, "AA").Column
    print(n)
    n = ws.Cells(1, "BA").Column
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルに値を設定 #")
    ws.Range("A1").Value = 99999
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルに数式を設定 #")
    ws.Range("A1").Formula = "=(3.14159-3)*100000"
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルの表示形式を設定 #")
    ws.Range("A1").NumberFormatLocal = "0.00"
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルの配置の縦位置を設定 #")
    ws.Range("A1").VerticalAlignment = xlCenter
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの配置の横位置を設定 #")
    ws.Range("A1").HorizontalAlignment = xlCenter
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字列の方向を設定 #")
    ws.Range("A1").Orientation = xlUpward
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字列の方向を設定 #")
    ws.Range("A1").Orientation = 45
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字列の方向を設定 #")
    ws.Range("A1").Orientation = 0
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルにフォントを設定 #")
    ws.Range("A1").Font.Name = "Yu Gothic UI"
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルのフォントのサイズを設定 #")
    ws.Range("A1").Font.Size = 12
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルのフォントを太字に設定 #")
    ws.Range("A1").Font.Bold = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルのフォントを斜体に設定 #")
    ws.Range("A1").Font.Italic = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルのフォントに下線を設定 #")
    ws.Range("A1").Font.Underline = xlUnderlineStyleSingle
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルのフォントに取消線を設定 #")
    ws.Range("A1").Font.Strikethrough = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルの文字の色を設定(R+Gx256+Bx256x256) #")
    ws.Range("A1").Font.Color = 255 + 0 * 256 + 0 * 256 * 256
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字の色を設定(指定順序BGR) #")
    ws.Range("A1").Font.Color = int("FF0000", 16)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字の色を設定(指定順序RGB) #")
    ws.Range("A1").Font.Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの文字の色を設定(デフォルト) #")
    ws.Range("A1").Font.ColorIndex = xlColorIndexAutomatic
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルの背景の色を設定(R+Gx256+Bx256x256) #")
    ws.Range("A1").Interior.Color = 255 + 255 * 256 + 0 * 256 * 256
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの背景の色を設定(指定順序BGR) #")
    ws.Range("A1").Interior.Color = int("FFFF00", 16)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの背景の色を設定(指定順序RGB) #")
    ws.Range("A1").Interior.Color = int("".join(list(reversed(["FFFF00"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの背景の色を設定(デフォルト) #")
    ws.Range("A1").Interior.ColorIndex = xlColorIndexNone
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルに罫線を設定 #")
    ws.Range("A1").Borders.Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    ws.Range("A1").Borders.LineStyle = xlContinuous
    ws.Range("A1").Borders.Weight = xlMedium
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの罫線を解除 #")
    ws.Range("A1").Borders.LineStyle = xlLineStyleNone
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの下側に罫線を設定 #")
    ws.Range("A1").Borders(xlEdgeBottom).Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    ws.Range("A1").Borders(xlEdgeBottom).LineStyle = xlContinuous
    ws.Range("A1").Borders(xlEdgeBottom).Weight = xlMedium
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの下側の罫線を解除 #")
    ws.Range("A1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルの値や数式を消去 #")
    ws.Range("A1").ClearContents()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルの書式を消去 #")
    ws.Range("A1").ClearFormats()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルを消去 #")
    ws.Range("A1").Clear()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルを削除 #")
    ws.Range("A1").Delete()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルを削除(上方向にシフト) #")
    ws.Range("A1").Delete(xlShiftUp)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルを削除(左方向にシフト) #")
    ws.Range("A1").Delete(xlShiftToLeft)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルに挿入 #")
    ws.Range("A1").Insert()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルに挿入(下方向にシフト) #")
    ws.Range("A1").Insert(xlShiftDown)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルに挿入(右方向にシフト) #")
    ws.Range("A1").Insert(xlShiftToRight)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# (A1行基準で)高さを設定 #")
    ws.Range("A1").RowHeight = 30
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1列基準で)横幅を設定 #")
    ws.Range("A1").ColumnWidth = 30
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1行基準で)高さを自動調整 #")
    ws.Range("A1").EntireRow.AutoFit()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# (A1列基準で)横幅を自動調整 #")
    ws.Range("A1").EntireColumn.AutoFit()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # 個別のグループ化の表示と非表示を行う方法
    # https://vbabeginner.net/%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%8c%96%e3%81%ae%e8%a1%a8%e7%a4%ba%e3%81%a8%e9%9d%9e%e8%a1%a8%e7%a4%ba/

    print("# 行のグループ化を設定 #")
    ws.Range("A1").EntireRow.Group()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 行のグループ化を非表示 #")
    ws.Outline.ShowLevels(RowLevels=1)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 行のグループ化を表示 #")
    ws.Outline.ShowLevels(RowLevels=8)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 行のグループ化を解除 #")
    ws.Range("A1").EntireRow.Ungroup()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    ws.Application.Goto(ws.Range("A1"), True)  # NO POST #
    # NO POST #
    print("# 列のグループ化を設定 #")
    ws.Range("A1").EntireColumn.Group()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 列のグループ化を非表示 #")
    ws.Outline.ShowLevels(RowLevels=0, ColumnLevels=1)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 列のグループ化を表示 #")
    ws.Outline.ShowLevels(RowLevels=0, ColumnLevels=8)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 列のグループ化を解除 #")
    ws.Range("A1").EntireColumn.Ungroup()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    ws.Application.Goto(ws.Range("A1"), True)  # NO POST #
    # NO POST #
    # ------------------------------------------------------ # NO POST #
    # NO POST #
    ws.Range("A1").Value = 11  # NO POST #
    ws.Range("B1").Value = 12  # NO POST #
    ws.Range("C1").Value = 13  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# A1セルをB1セルに複写 #")
    ws.Range("A1").Copy(ws.Range("B1"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルをSheet2のA1セルに複写 #")
    ws.Range("A1").Copy(wb.Worksheets("Sheet2").Range("A1"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域をSheet2のA1セル基準で複写 #")
    ws.Range("A1").CurrentRegion.Copy(wb.Worksheets("Sheet2").Range("A1"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルをクリップボードに複写 #")
    ws.Range("A1").Copy()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# クリップボードをB2セルに複写 #")
    ws.Activate()
    ws.Range("B2").Select()
    ws.Paste()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# クリップボードをC3セルに複写(値の貼り付け) #")
    ws.Range("C3").PasteSpecial(xlPasteValues)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# クリップボードをC3セルに複写(書式貼り付け) #")
    ws.Range("C3").PasteSpecial(xlPasteFormats)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# クリップボードをC3セルに複写(数式貼り付け) #")
    ws.Range("C3").PasteSpecial(xlPasteFormulas)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 切り取りモードまたはコピー モードを解除 #")
    ws.Application.CutCopyMode = False
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セルをB1セルに移動 #")
    ws.Range("A1").Cut(ws.Range("B1"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルをSheet2のA1セルに移動 #")
    ws.Range("A1").Cut(wb.Worksheets("Sheet2").Range("A1"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セルをクリップボードに移動 #")
    ws.Range("A1").Cut()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 切り取りモードまたはコピー モードを解除 #")
    ws.Application.CutCopyMode = False
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://excel-ubara.com/excelvba4/EXCEL254.html
    print("# A1～D5の範囲にG16～J20の範囲を一括複写(値の貼り付け) #")
    ws.Range("A1:D5").Value = ws.Range("G16:J20").Value
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1～D5の範囲にG16～J20の範囲を一括複写(値の貼り付け) #")
    ws.Range("A1").GetResize(ws.Range("G16:J20").Rows.Count, ws.Range("G16:J20").Columns.Count).Value = ws.Range("G16:J20").Value
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1～D4の範囲の左側の列の内容を範囲に一括複写 #")
    ws.Range("A1:D4").FillRight()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# E1～H4の範囲の上段の行の内容を範囲に一括複写 #")
    ws.Range("E1:H4").FillDown()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A5～D8の範囲の右側の列の内容を範囲に一括複写 #")
    ws.Range("A5:D8").FillLeft()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# E5～H8の範囲の下段の行の内容を範囲に一括複写 #")
    ws.Range("E5:H8").FillUp()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    ws.Range("A1").Value = 11  # NO POST #
    ws.Range("B1").Value = 12  # NO POST #
    ws.Range("C1").Value = 13  # NO POST #
    ws.Range("D1").Value = 14  # NO POST #
    ws.Range("E1").Value = 15  # NO POST #
    ws.Range("F1").Value = 16  # NO POST #
    ws.Range("G1").Value = 17  # NO POST #
    ws.Range("H1").Value = 18  # NO POST #
    # NO POST #
    print("# A1～H1の範囲をA1～H8の範囲にAutoFill #")
    ws.Range("A1:H1").AutoFill(ws.Range("A1:H8"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    ws.Range("A1").Value = 11  # NO POST #
    ws.Range("B1").Value = 12  # NO POST #
    ws.Range("C1").Value = 13  # NO POST #
    ws.Range("D1").Value = 14  # NO POST #
    ws.Range("E1").Value = 15  # NO POST #
    ws.Range("F1").Value = 16  # NO POST #
    ws.Range("G1").Value = 17  # NO POST #
    ws.Range("H1").Value = 18  # NO POST #
    # NO POST #
    ws.Range("A2").Value = 21  # NO POST #
    ws.Range("B2").Value = 22  # NO POST #
    ws.Range("C2").Value = 23  # NO POST #
    ws.Range("D2").Value = 24  # NO POST #
    ws.Range("E2").Value = 25  # NO POST #
    ws.Range("F2").Value = 26  # NO POST #
    ws.Range("G2").Value = 27  # NO POST #
    ws.Range("H2").Value = 28  # NO POST #
    # NO POST #
    print("# A1～H2の範囲をA1～H8の範囲にAutoFill #")
    ws.Range("A1:H2").AutoFill(ws.Range("A1:H8"), xlFillDefault)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------ # NO POST #
    # NO POST #
    ws.Activate()  # NO POST #
    ws.Range("A1").Select()  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# A1セル基準の現在の領域をAutoFilter #")
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(Field=1, Criteria1=">30")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域をAutoFilter #")
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(Field=1, Criteria1=">30", Operator=xlAnd, Criteria2="<80")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域をAutoFilter #")
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域をAutoFilter #")
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域をAutoFilter #")
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")
    ws.Range("A1").CurrentRegion.AutoFilter(2, ">40", xlAnd, "<60")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# AutoFilterの範囲を選択 #")
    ws.AutoFilter.Range.Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# AutoFilterの範囲の可視状態セル選択 #")
    ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# AutoFilterの範囲の可視状態セル行数 #")
    n = int(ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Count / ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Columns.Count)
    print(n)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    ws.Range("A1").Select()  # NO POST #
    ws.Range("A5").Value = 99999  # NO POST #
    # NO POST #
    print("# AutoFilterの適用 #")
    ws.AutoFilter.ApplyFilter()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# AutoFilterの絞り込み解除 #")
    if ws.FilterMode:
        ws.ShowAllData()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# AutoFilterの解除 #")
    if ws.AutoFilterMode:
        ws.AutoFilterMode = False
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# A1セル基準の現在の領域を並び替え ( Range Sort Method ) #")
    print("# Typeを省略するとType以降のOrder2等の指定が無視される。 #")
    print("# TypeをNoneにするとエラーにはならないのだが誤動作する。 #")
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Range("A1").CurrentRegion.Sort(
        Key1=ws.Range("A1"),
        Order1=xlDescending,
        Key2=ws.Range("B1"),
        Type=None,
        Order2=xlDescending,
        Key3=ws.Range("C1"),
        Order3=xlAscending,
        Header=xlYes,
        MatchCase=False,
        Orientation=xlSortColumns,
        SortMethod=xlPinYin,
        DataOption1=xlSortNormal,
        DataOption2=xlSortNormal,
        DataOption3=xlSortNormal,
    )
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# A1セル基準の現在の領域を並び替え ( Sort Object ) #")
    print("# MicrosoftのVBAのリファレンスでは省略可能とされていますが、 #")
    print("# 省略すると正常に並び替えされない場合があるので注意が必要。 #")
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Sort.SortFields.Clear()
    ws.Sort.SortFields.Add(Key=ws.Range("A1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    ws.Sort.SortFields.Add(Key=ws.Range("B1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    ws.Sort.SortFields.Add(Key=ws.Range("C1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.Sort.SetRange(ws.Range("A1").CurrentRegion)
    ws.Sort.Header = xlYes
    ws.Sort.MatchCase = False
    ws.Sort.Orientation = xlSortColumns
    ws.Sort.SortMethod = xlPinYin
    ws.Sort.Apply()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# AutoFilterを行なった上で並び替え ( Sort Object ) #")
    print("# MicrosoftのVBAのリファレンスでは省略可能とされていますが、 #")
    print("# 省略すると正常に並び替えされない場合があるので注意が必要。 #")
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")
    ws.AutoFilter.Sort.SortFields.Clear()
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("A1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("B1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("C1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    # ws.AutoFilter.Sort.SetRange()
    ws.AutoFilter.Sort.Header = xlYes
    ws.AutoFilter.Sort.MatchCase = False
    ws.AutoFilter.Sort.Orientation = xlSortColumns
    ws.AutoFilter.Sort.SortMethod = xlPinYin
    ws.AutoFilter.Sort.Apply()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# シートの非表示 #")
    ws.Visible = xlSheetHidden
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートの表示 #")
    ws.Visible = xlSheetVisible
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------ # NO POST #
    # NO POST #
    ws.Activate()  # NO POST #
    ws.Range("A1").Select()  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# シートの保護の設定 #")
    ws.Protect()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートの保護の解除 #")
    ws.Unprotect()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートをパスワード付きで保護の設定 #")
    ws.Protect(Password="hoge")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートのパスワード付きの保護の解除 #")
    ws.Unprotect(Password="hoge")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# ブックの保護の設定 #")
    wb.Protect()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックの保護の解除 #")
    wb.Unprotect()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックをパスワード付きで保護の設定 #")
    wb.Protect(Password="hoge")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックのパスワード付きの保護の解除 #")
    wb.Unprotect(Password="hoge")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://learn.microsoft.com/en-us/office/vba/api/excel.windows
    # Note that the active window is always Windows(1).
    print("# ズームの倍率の設定 #")
    ws.Activate()
    ws.Range("A1").Select()
    ws.Parent.Windows(1).Zoom = 90
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://excelwork.info/excel/freezepanes/
    # https://stackoverflow.com/questions/43146073/
    print("# 枠の固定 #")
    ws.Activate()
    ws.Range("C3").Select()
    ws.Parent.Windows(1).FreezePanes = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    # https://excel-ubara.com/excelvba4/EXCEL272.html
    print("# CTRL+HOME的A1セル選択 #")
    ws.Activate()
    ws.Range("A1").Select()
    ws.Application.Goto(ws.Range("A1"), True)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://qiita.com/Tachy_Pochy/items/64fe16ec076c52556b2d
    print("# CTRL+HOME的選択 ( AutoFilter使用時は残念 ) #")
    ws.Activate()
    r = int(ws.Parent.Windows(1).SplitRow) + 1
    c = int(ws.Parent.Windows(1).SplitColumn) + 1
    ws.Cells(r, c).Select()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# CTRL+HOME的関数 #")

    def SpecialCells_xlHomeCell(ws):
        r = int(ws.Parent.Windows(1).SplitRow) + 1
        c = int(ws.Parent.Windows(1).SplitColumn) + 1
        rg = ws.Cells(r, c)
        if ws.Parent.Windows(1).FreezePanes and ws.Parent.Windows(1).SplitRow and ws.AutoFilterMode and ws.FilterMode:
            rg = rg.GetResize(ws.Cells.Rows.Count - rg.Row + 1, ws.Cells.Columns.Count - rg.Column + 1)
            rg = ws.Application.Intersect(ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible), rg)
            rg = rg.GetResize(1, 1)
        return rg

    print("# CTRL+HOME的選択 #")
    ws.Activate()
    rg = SpecialCells_xlHomeCell(ws)
    rg.Select()
    ws.Application.Goto(rg, True)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# 再計算 #")
    ws.Calculate()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# 再計算 #")
    xlApp.Calculate()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Excelの警告メッセージの表示の停止 #")
    xlApp.DisplayAlerts = False
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Excelの警告メッセージの表示の開始 #")
    xlApp.DisplayAlerts = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Excelの画面の更新を停止 #")
    xlApp.ScreenUpdating = False
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Excelの画面の更新を開始 #")
    xlApp.ScreenUpdating = True
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://stackoverflow.com/questions/3735378/#8561483
    print("# Excelの画面の更新を強制 #")
    xlApp.ActiveWindow.SmallScroll()
    xlApp.WindowState = xlApp.WindowState
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# ActiveWorkbookの取得 #")
    wb = xlApp.ActiveWorkbook
    print(wb.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ActiveWindowの取得 #")
    aw = xlApp.ActiveWindow
    print(aw.Caption)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ActiveSheetの取得 #")
    ws = xlApp.ActiveSheet
    print(ws.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ActiveSheetの取得 #")
    ws = wb.ActiveSheet
    print(ws.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ActiveCellをRangeで取得 #")
    rg = xlApp.ActiveCell
    print(rg.Address)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Application オブジェクトの取得 #")
    xl = rg.Application
    print(xl.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Application オブジェクトの取得 #")
    xl = ws.Application
    print(xl.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# Application オブジェクトの取得 #")
    xl = wb.Application
    print(xl.Name)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# シートの名称の変更 #")
    wb.Worksheets("Sheet2").Name = "Sheet9"
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートの追加 #")
    ws = wb.Worksheets.Add()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートの複写 ( 指定シートの前に複写 ) #")
    ws.Copy(Before=wb.Worksheets("Sheet9"))
    ws = wb.Worksheets(wb.Worksheets("Sheet9").Index - 1)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://stackoverflow.com/questions/52685699/
    print("# シートの複写 ( 指定シートの後に複写 ) #")
    ws.Copy(Before=None, After=wb.Worksheets("Sheet9"))
    ws = wb.Worksheets(wb.Worksheets("Sheet9").Index + 1)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# シートの移動 ( 指定シートの前に移動 ) #")
    ws.Move(Before=wb.Worksheets("Sheet9"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # https://stackoverflow.com/questions/52685699/
    print("# シートの移動 ( 指定シートの後に移動 ) #")
    ws.Move(Before=None, After=wb.Worksheets("Sheet9"))
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    xlApp.DisplayAlerts = False  # NO POST #
    # NO POST #
    print("# シートの削除 #")
    wb.Worksheets("Sheet3").Delete()
    wb.Worksheets("Sheet9").Delete()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    ws = wb.Worksheets("Sheet1")  # NO POST #
    ws.Activate()  # NO POST #
    xlApp.DisplayAlerts = True  # NO POST #
    # NO POST #
    # ------------------------------------------------------------------

    print("# シートをPDF出力 #")
    ws.ExportAsFixedFormat(Type=xlTypePDF, Quality=xlQualityStandard, Filename=f"{os.getcwd()}\\output.pdf")
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# ブックをファイルに上書き保存 #")
    # wb.Save()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックをXLSXファイルに保存 #")
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.xlsx", FileFormat=xlOpenXMLWorkbook)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックをXLSファイルに保存 #")
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.xls", FileFormat=xlWorkbookNormal)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックをCSVファイルに保存 #")
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.csv", FileFormat=xlCSV)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# ブックをクローズ #")
    # wb.Close()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    print("# ブックを保存せずにクローズ #")
    wb.Close(SaveChanges=False)
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------

    print("# Excel終了 #")
    xlApp.Quit()
    print("press enter key to continue")  # NO POST #
    input()  # NO POST #

    # ------------------------------------------------------------------
    # NO POST #
    print("press enter key to exit")  # NO POST #
    input()  # NO POST #


if __name__ == "__main__":
    main()
```

</details>

<details open>
<summary>:notebook_with_decorative_cover: sample.py</summary>

```py
# coding:utf-8

import os

import win32com.client
import win32con
import win32gui


def main():
    # ------------------------------------------------------------------
    # Excelの定数を設定
    # ------------------------------------------------------------------
    # https://excel-ubara.com/EXCEL/EXCEL905.html
    # https://docs.microsoft.com/en-us/office/vba/api/excel(enumerations)
    # https://docs.microsoft.com/ja-jp/office/vba/api/excel(enumerations)
    # ------------------------------------------------------------------
    # Excelの定数を取得する方法もあるようです。
    # https://stackoverflow.com/questions/28264548/
    # https://stackoverflow.com/questions/75154736/
    # https://stackoverflow.com/questions/50127959/
    # https://stackoverflow.com/questions/48257308/
    # https://wacky.hatenadiary.com/entry/20091011/1255240572
    # win32com.client.gencache.EnsureDispatch("Excel.Application")
    # ------------------------------------------------------------------
    # Excel Enum Constants
    # ------------------------------------------------------------------
    xlAbove = 0
    xlBelow = 1
    xlSolid = 1
    xlFirst = 0
    xlLast = 1
    xlLastCell = 11
    xlTopToBottom = 1
    xlLeftToRight = 2
    xlGeneral = 1
    xlAutomatic = -4105
    xlFormats = -4122
    xlNone = -4142
    xlCenter = -4108
    xlDistributed = -4117
    xlJustify = -4130
    xlBottom = -4107
    xlLeft = -4131
    xlRight = -4152
    xlTop = -4160
    xlRTL = -5004
    xlLTR = -5003
    xlContext = -5002
    # ------------------------------------------------------------------
    # Excel Enum XLBorderWeight
    # ------------------------------------------------------------------
    xlHairline = 1
    xlThin = 2
    xlThick = 4
    xlMedium = -4138
    # ------------------------------------------------------------------
    # Excel Enum XLBordersIndex
    # ------------------------------------------------------------------
    xlDiagonalDown = 5
    xlDiagonalUp = 6
    xlEdgeLeft = 7
    xlEdgeTop = 8
    xlEdgeBottom = 9
    xlEdgeRight = 10
    xlInsideHorizontal = 12
    xlInsideVertical = 11
    # ------------------------------------------------------------------
    # Excel Enum XlAutoFillType
    # ------------------------------------------------------------------
    xlFillDefault = 0
    xlFillCopy = 1
    xlFillSeries = 2
    xlFillFormats = 3
    xlFillValues = 4
    xlFillDays = 5
    xlFillWeekdays = 6
    xlFillMonths = 7
    xlFillYears = 8
    xlLinearTrend = 9
    xlGrowthTrend = 10
    xlFlashFill = 11
    # ------------------------------------------------------------------
    # Excel Enum XlAutoFilterOperator
    # ------------------------------------------------------------------
    xlAnd = 1
    xlOr = 2
    xlTop10Items = 3
    xlBottom10Items = 4
    xlTop10Percent = 5
    xlBottom10Percent = 6
    xlFilterValues = 7
    xlFilterCellColor = 8
    xlFilterFontColor = 9
    xlFilterIcon = 10
    xlFilterDynamic = 11
    # ------------------------------------------------------------------
    # Excel Enum XlCVError
    # ------------------------------------------------------------------
    xlErrDiv0 = 2007
    xlErrNA = 2042
    xlErrName = 2029
    xlErrNull = 2000
    xlErrNum = 2036
    xlErrRef = 2023
    xlErrValue = 2015
    # ------------------------------------------------------------------
    # Excel Enum XlCVError
    # ------------------------------------------------------------------
    xlErrSpill = 2045
    xlErrConnect = 2046
    xlErrBlocked = 2047
    xlErrUnknown = 2048
    xlErrField = 2049
    xlErrCalc = 2050
    # ------------------------------------------------------------------
    # Excel Enum XlCellType
    # ------------------------------------------------------------------
    xlCellTypeConstants = 2
    xlCellTypeBlanks = 4
    xlCellTypeLastCell = 11
    xlCellTypeVisible = 12
    xlCellTypeFormulas = -4123
    xlCellTypeComments = -4144
    xlCellTypeAllFormatConditions = -4172
    xlCellTypeSameFormatConditions = -4173
    xlCellTypeAllValidation = -4174
    xlCellTypeSameValidation = -4175
    # ------------------------------------------------------------------
    # Excel Enum XlColorIndex
    # ------------------------------------------------------------------
    xlColorIndexAutomatic = -4105
    xlColorIndexNone = -4142
    # ------------------------------------------------------------------
    # Excel Enum XlCutCopyMode
    # ------------------------------------------------------------------
    xlCopy = 1
    xlCut = 2
    # ------------------------------------------------------------------
    # Excel Enum XlDeleteShiftDirection
    # Excel Enum XlInsertShiftDirection
    # ------------------------------------------------------------------
    xlShiftUp = -4162
    xlShiftDown = -4121
    xlShiftToLeft = -4159
    xlShiftToRight = -4161
    # ------------------------------------------------------------------
    # Excel Enum XlDirection
    # ------------------------------------------------------------------
    xlUp = -4162
    xlDown = -4121
    xlToLeft = -4159
    xlToRight = -4161
    # ------------------------------------------------------------------
    # Excel Enum XlFileFormat
    # ------------------------------------------------------------------
    xlCSV = 6
    xlHtml = 44
    xlWorkbookDefault = 51
    xlOpenXMLWorkbook = 51
    xlOpenXMLWorkbookMacroEnabled = 52
    xlWorkbookNormal = -4143
    xlCurrentPlatformText = -4158
    # ------------------------------------------------------------------
    # Excel Enum XlFindLookIn
    # ------------------------------------------------------------------
    xlComments = -4144
    xlCommentsThreaded = -4184
    xlFormulas = -4123
    xlValues = -4163
    # ------------------------------------------------------------------
    # Excel Enum XlFixedFormatQuality
    # ------------------------------------------------------------------
    xlQualityStandard = 0
    xlQualityMinimum = 1
    # ------------------------------------------------------------------
    # Excel Enum XlFixedFormatType
    # ------------------------------------------------------------------
    xlTypePDF = 0
    xlTypeXPS = 1
    # ------------------------------------------------------------------
    # Excel Enum XlLineStyle
    # ------------------------------------------------------------------
    xlContinuous = 1
    xlDashDot = 4
    xlDashDotDot = 5
    xlSlantDashDot = 13
    xlDash = -4115
    xldot = -4118
    xlDouble = -4119
    xlLineStyleNone = -4142
    # ------------------------------------------------------------------
    # Excel Enum XlLookAt
    # ------------------------------------------------------------------
    xlPart = 2
    xlWhole = 1
    # ------------------------------------------------------------------
    # Excel Enum XlOrientation
    # ------------------------------------------------------------------
    xlHorizontal = -4128
    xlVertical = -4166
    xlDownward = -4170
    xlUpward = -4171
    # ------------------------------------------------------------------
    # Excel Enum XlPasteType
    # ------------------------------------------------------------------
    xlPasteValues = -4163
    xlPasteComments = -4144
    xlPasteFormulas = -4123
    xlPasteFormats = -4122
    xlPasteAll = -4104
    xlPasteValidation = 6
    xlPasteAllExceptBorders = 7
    xlPasteColumnWidths = 8
    xlPasteFormulasAndNumberFormats = 11
    xlPasteValuesAndNumberFormats = 12
    xlPasteAllUsingSourceTheme = 13
    xlPasteAllMergingConditionalFormats = 14
    # ------------------------------------------------------------------
    # Excel Enum XlReferenceStyle
    # ------------------------------------------------------------------
    xlA1 = 1
    xlR1C1 = -4150
    # ------------------------------------------------------------------
    # Excel Enum XlReferenceType
    # ------------------------------------------------------------------
    xlAbsolute = 1
    xlAbsRowRelColumn = 2
    xlRelRowAbsColumn = 3
    xlRelative = 4
    # ------------------------------------------------------------------
    # Excel Enum XlSearchDirection
    # ------------------------------------------------------------------
    xlNext = 1
    xlPrevious = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSearchOrder
    # ------------------------------------------------------------------
    xlByColumns = 2
    xlByRows = 1
    # ------------------------------------------------------------------
    # Excel Enum XlSheetVisibility
    # ------------------------------------------------------------------
    xlSheetVisible = -1
    xlSheetHidden = 0
    xlSheetVeryHidden = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortDataOption
    # ------------------------------------------------------------------
    xlSortNormal = 0
    xlSortTextAsNumbers = 1
    # ------------------------------------------------------------------
    # Excel Enum XlSortMethod
    # ------------------------------------------------------------------
    xlPinYin = 1
    xlStroke = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortOn
    # ------------------------------------------------------------------
    xlSortOnValues = 0
    xlSortOnCellColor = 1
    xlSortOnFontColor = 2
    xlSortOnIcon = 3
    # ------------------------------------------------------------------
    # Excel Enum XlSortOrder
    # ------------------------------------------------------------------
    xlAscending = 1
    xlDescending = 2
    xlManual = -4135
    # ------------------------------------------------------------------
    # Excel Enum XlSortOrientation
    # ------------------------------------------------------------------
    xlSortColumns = 1
    xlSortRows = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSortType
    # ------------------------------------------------------------------
    xlSortValues = 1
    xlSortLabels = 2
    # ------------------------------------------------------------------
    # Excel Enum XlSpecialCellsValue
    # ------------------------------------------------------------------
    xlNumbers = 1
    xlTextValues = 2
    xlLogical = 4
    xlErrors = 16
    # ------------------------------------------------------------------
    # Excel Enum XlUnderlineStyle
    # ------------------------------------------------------------------
    xlUnderlineStyleNone = -4142
    xlUnderlineStyleDouble = -4119
    xlUnderlineStyleSingle = 2
    xlUnderlineStyleSingleAccounting = 4
    xlUnderlineStyleDoubleAccounting = 5
    # ------------------------------------------------------------------
    # Excel Enum XlYesNoGuess
    # ------------------------------------------------------------------
    xlGuess = 0
    xlYes = 1
    xlNo = 2
    # ------------------------------------------------------------------

    # Excel起動
    xlApp = win32com.client.Dispatch("Excel.Application")

    # https://stackoverflow.com/questions/2790825/
    # ExcelのWindow最大化
    win32gui.ShowWindow(xlApp.hwnd, win32con.SW_MAXIMIZE)

    # Excel表示
    xlApp.Visible = 1

    # Excelファイルオープン
    wb = xlApp.Workbooks.Open(f"{os.getcwd()}\\sample.csv")

    # Excelシートオブジェクト
    ws = wb.Worksheets(1)

    # ------------------------------------------------------------------

    # 指定したシートを選択
    # Select()の使用前にシートのActivate()が必要
    ws.Activate()

    # ------------------------------------------------------------------

    # A1セルを選択
    ws.Range("A1").Select()

    # A1～B2を選択
    ws.Range("A1:B2").Select()

    # A1とB2とC3とD4を選択
    ws.Range("A1,B2,C3,D4").Select()

    # A1～B2とC3～D4を選択
    ws.Range("A1:B2,C3:D4").Select()

    # ------------------------------------------------------------------

    # A1セルを選択
    ws.Cells(1, 1).Select()

    # A1～B2を選択
    ws.Range(ws.Cells(1, 1), ws.Cells(2, 2)).Select()

    # ------------------------------------------------------------------

    # 全セルを選択
    ws.Cells.Select()

    # ------------------------------------------------------------------

    # 1～2行を選択
    ws.Range("1:2").Select()

    # A～B列を選択
    ws.Range("A:B").Select()

    # https://www.relief.jp/docs/excel-vba-difference-range-rows-columns.html
    # 1～2行を選択
    ws.Rows("1:2").Select()

    # https://www.relief.jp/docs/excel-vba-difference-range-columns.html
    # A～B列を選択
    ws.Columns("A:B").Select()

    # ------------------------------------------------------------------

    # 指定範囲の先頭行を選択
    ws.Range("A1:D4").Rows(1).Select()

    # 指定範囲の先頭列を選択
    ws.Range("A1:D4").Columns(1).Select()

    # ------------------------------------------------------------------

    # (A1セル基準で)行全体を選択
    ws.Range("A1").EntireRow.Select()

    # (A1セル基準で)列全体を選択
    ws.Range("A1").EntireColumn.Select()

    # ------------------------------------------------------------------

    # (A1セル基準で)最終列までの行を選択
    ws.Range(ws.Range("A1"), ws.Cells(1, ws.Columns.Count).End(xlToLeft)).Select()

    # (A1セル基準で)最終行までの列を選択
    ws.Range(ws.Range("A1"), ws.Cells(ws.Rows.Count, 1).End(xlUp)).Select()

    # ------------------------------------------------------------------

    # (A1セル基準で)現在の領域を選択
    ws.Range("A1").CurrentRegion.Select()

    # (現行シートの)使用中領域を選択
    ws.UsedRange.Select()

    # (A1セル基準で)最終右下セル選択
    ws.Range("A1").SpecialCells(xlLastCell).Select()

    # (A1セル基準で)可視状態セル選択
    ws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select()

    # ------------------------------------------------------------------

    # 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得
    a = ws.UsedRange.Address
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得
    a = ws.UsedRange.GetAddress()
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を絶対参照で取得
    a = ws.UsedRange.GetAddress(True, True)
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を相対参照で取得
    a = ws.UsedRange.GetAddress(False, False)
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を相対参照のA1形式で取得
    a = ws.UsedRange.GetAddress(False, False, xlA1)
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を相対参照のR1C1形式で取得
    a = ws.UsedRange.GetAddress(False, False, xlR1C1)
    print(a)

    # 指定範囲の参照範囲の文字列を行列両方を相対参照のxlA1形式の外部参照で取得
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    print(a)

    # ------------------------------------------------------------------

    # 数式的な文字列のセル参照をR1C1形式からA1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, False)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1)
    print(a1)
    print(a2)

    # 数式的な文字列のセル参照をA1形式からR1C1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlR1C1)
    print(a1)
    print(a2)

    # 数式的な文字列のセル参照を相対参照のA1形式から絶対参照のA1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlA1, xlAbsolute)
    print(a1)
    print(a2)

    # 数式的な文字列のセル参照を絶対参照のA1形式から相対参照のA1形式に変更
    a1 = ws.UsedRange.GetAddress(True, True, xlA1, False)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlA1, xlRelative)
    print(a1)
    print(a2)

    # 数式的な文字列の外部参照のセル参照をA1形式からR1C1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlA1, True)
    a2 = ws.Application.ConvertFormula(a1, xlA1, xlR1C1)
    print(a1)
    print(a2)

    # 数式的な文字列の外部参照のセル参照をR1C1形式からA1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1)
    print(a1)
    print(a2)

    # 数式的な文字列の外部参照のセル参照を相対参照のR1C1形式から絶対参照のA1形式に変更
    a1 = ws.UsedRange.GetAddress(False, False, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1, xlAbsolute)
    print(a1)
    print(a2)

    # 数式的な文字列の外部参照のセル参照を絶対参照のR1C1形式から相対参照のA1形式に変更
    a1 = ws.UsedRange.GetAddress(True, True, xlR1C1, True)
    a2 = ws.Application.ConvertFormula(a1, xlR1C1, xlA1, xlRelative)
    print(a1)
    print(a2)

    # ------------------------------------------------------------------

    # A1形式の外部参照のセル参照の文字列でRangeを取得
    # R1C1形式は使用不可
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    rg = ws.Evaluate(a)
    print(rg.Address)

    # A1形式の外部参照のセル参照の文字列でRangeを取得
    # R1C1形式は使用不可
    a = ws.UsedRange.GetAddress(False, False, xlA1, True)
    rg = ws.Application.Evaluate(a)
    print(rg.Address)

    # ------------------------------------------------------------------

    # https://thecodingforums.com/threads/328174/
    # Range.Offset()Property用GetOffset()Method
    # 指定範囲をOffset
    ws.Range("A1:D4").GetOffset(2, 2).Select()

    # Range.Offset()Property用GetOffset()Method
    # 指定範囲をOffset
    ws.Range("A1:D4").GetOffset(RowOffset=3, ColumnOffset=3).Select()

    # Range.Offset()Property用GetOffset()Method
    # 指定範囲を縦方向にOffset
    ws.Range("A1:D4").GetOffset(RowOffset=3).Select()

    # Range.Offset()Property用GetOffset()Method
    # 指定範囲を横方向にOffset
    ws.Range("A1:D4").GetOffset(RowOffset=0, ColumnOffset=3).Select()

    # ------------------------------------------------------------------

    # https://stackoverflow.com/questions/63112880/
    # Range.Resize()Property用GetResize()Method
    # 指定範囲をResize
    ws.Range("A1:H8").GetResize(2, 2).Select()

    # Range.Resize()Property用GetResize()Method
    # 指定範囲をResize
    ws.Range("A1:H8").GetResize(RowSize=3, ColumnSize=3).Select()

    # Range.Resize()Property用GetResize()Method
    # 指定範囲の縦方向をResize
    ws.Range("A1:H8").GetResize(RowSize=3).Select()

    # Range.Resize()Property用GetResize()Method
    # 指定範囲の横方向をResize
    ws.Range("A1:H8").GetResize(RowSize=ws.Range("A1:H8").Rows.Count, ColumnSize=3).Select()

    # ------------------------------------------------------------------

    # 指定範囲から指定の文字列を含むセルを選択
    rg = ws.UsedRange
    rg.find("56", rg.GetResize(1, 1), xlValues, xlPart, xlByRows, xlNext, True).Select()

    # 指定範囲から指定の文字列と合致のセルを選択
    rg = ws.UsedRange
    rg.find("56", rg.GetResize(1, 1), xlValues, xlWhole, xlByRows, xlNext, True).Select()

    # ------------------------------------------------------------------

    # 指定セルの行数を取得
    n = ws.Range("A1").Row
    print(n)

    # 指定セルの列数を取得
    n = ws.Range("A1").Column
    print(n)

    # 指定範囲に含まれる行数を取得
    n = ws.Range("A1:D4").Rows.Count
    print(n)

    # 指定範囲に含まれる列数を取得
    n = ws.Range("A1:D4").Columns.Count
    print(n)

    # (A1セル基準で)最終行数を取得
    n = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    print(n)

    # (A1セル基準で)最終列数を取得
    n = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    print(n)

    # ------------------------------------------------------------------

    # https://binary-star.net/excel-vba-columnchange
    # 数字列を英字列に変換
    a = (ws.Cells(1, 1).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 2).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 3).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 27).Address).split("$")[1]
    print(a)
    a = (ws.Cells(1, 53).Address).split("$")[1]
    print(a)
    # 英字列を数字列に変換
    n = ws.Cells(1, "A").Column
    print(n)
    n = ws.Cells(1, "B").Column
    print(n)
    n = ws.Cells(1, "C").Column
    print(n)
    n = ws.Cells(1, "AA").Column
    print(n)
    n = ws.Cells(1, "BA").Column
    print(n)

    # ------------------------------------------------------------------

    # A1セルに値を設定
    ws.Range("A1").Value = 99999

    # A1セルに数式を設定
    ws.Range("A1").Formula = "=(3.14159-3)*100000"

    # ------------------------------------------------------------------

    # A1セルの表示形式を設定
    ws.Range("A1").NumberFormatLocal = "0.00"

    # ------------------------------------------------------------------

    # A1セルの配置の縦位置を設定
    ws.Range("A1").VerticalAlignment = xlCenter

    # A1セルの配置の横位置を設定
    ws.Range("A1").HorizontalAlignment = xlCenter

    # A1セルの文字列の方向を設定
    ws.Range("A1").Orientation = xlUpward

    # A1セルの文字列の方向を設定
    ws.Range("A1").Orientation = 45

    # A1セルの文字列の方向を設定
    ws.Range("A1").Orientation = 0

    # ------------------------------------------------------------------

    # A1セルにフォントを設定
    ws.Range("A1").Font.Name = "Yu Gothic UI"

    # A1セルのフォントのサイズを設定
    ws.Range("A1").Font.Size = 12

    # A1セルのフォントを太字に設定
    ws.Range("A1").Font.Bold = True

    # A1セルのフォントを斜体に設定
    ws.Range("A1").Font.Italic = True

    # A1セルのフォントに下線を設定
    ws.Range("A1").Font.Underline = xlUnderlineStyleSingle

    # A1セルのフォントに取消線を設定
    ws.Range("A1").Font.Strikethrough = True

    # ------------------------------------------------------------------

    # A1セルの文字の色を設定(R+Gx256+Bx256x256)
    ws.Range("A1").Font.Color = 255 + 0 * 256 + 0 * 256 * 256

    # A1セルの文字の色を設定(指定順序BGR)
    ws.Range("A1").Font.Color = int("FF0000", 16)

    # A1セルの文字の色を設定(指定順序RGB)
    ws.Range("A1").Font.Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)

    # A1セルの文字の色を設定(デフォルト)
    ws.Range("A1").Font.ColorIndex = xlColorIndexAutomatic

    # ------------------------------------------------------------------

    # A1セルの背景の色を設定(R+Gx256+Bx256x256)
    ws.Range("A1").Interior.Color = 255 + 255 * 256 + 0 * 256 * 256

    # A1セルの背景の色を設定(指定順序BGR)
    ws.Range("A1").Interior.Color = int("FFFF00", 16)

    # A1セルの背景の色を設定(指定順序RGB)
    ws.Range("A1").Interior.Color = int("".join(list(reversed(["FFFF00"[i : i + 2] for i in range(0, 6, 2)]))), 16)

    # A1セルの背景の色を設定(デフォルト)
    ws.Range("A1").Interior.ColorIndex = xlColorIndexNone

    # ------------------------------------------------------------------

    # A1セルに罫線を設定
    ws.Range("A1").Borders.Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    ws.Range("A1").Borders.LineStyle = xlContinuous
    ws.Range("A1").Borders.Weight = xlMedium

    # A1セルの罫線を解除
    ws.Range("A1").Borders.LineStyle = xlLineStyleNone

    # A1セルの下側に罫線を設定
    ws.Range("A1").Borders(xlEdgeBottom).Color = int("".join(list(reversed(["FF0000"[i : i + 2] for i in range(0, 6, 2)]))), 16)
    ws.Range("A1").Borders(xlEdgeBottom).LineStyle = xlContinuous
    ws.Range("A1").Borders(xlEdgeBottom).Weight = xlMedium

    # A1セルの下側の罫線を解除
    ws.Range("A1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone

    # ------------------------------------------------------------------

    # A1セルの値や数式を消去
    ws.Range("A1").ClearContents()

    # A1セルの書式を消去
    ws.Range("A1").ClearFormats()

    # A1セルを消去
    ws.Range("A1").Clear()

    # A1セルを削除
    ws.Range("A1").Delete()

    # A1セルを削除(上方向にシフト)
    ws.Range("A1").Delete(xlShiftUp)

    # A1セルを削除(左方向にシフト)
    ws.Range("A1").Delete(xlShiftToLeft)

    # A1セルに挿入
    ws.Range("A1").Insert()

    # A1セルに挿入(下方向にシフト)
    ws.Range("A1").Insert(xlShiftDown)

    # A1セルに挿入(右方向にシフト)
    ws.Range("A1").Insert(xlShiftToRight)

    # ------------------------------------------------------------------

    # (A1行基準で)高さを設定
    ws.Range("A1").RowHeight = 30

    # (A1列基準で)横幅を設定
    ws.Range("A1").ColumnWidth = 30

    # (A1行基準で)高さを自動調整
    ws.Range("A1").EntireRow.AutoFit()

    # (A1列基準で)横幅を自動調整
    ws.Range("A1").EntireColumn.AutoFit()

    # ------------------------------------------------------------------

    # 個別のグループ化の表示と非表示を行う方法
    # https://vbabeginner.net/%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e5%8c%96%e3%81%ae%e8%a1%a8%e7%a4%ba%e3%81%a8%e9%9d%9e%e8%a1%a8%e7%a4%ba/

    # 行のグループ化を設定
    ws.Range("A1").EntireRow.Group()

    # 行のグループ化を非表示
    ws.Outline.ShowLevels(RowLevels=1)

    # 行のグループ化を表示
    ws.Outline.ShowLevels(RowLevels=8)

    # 行のグループ化を解除
    ws.Range("A1").EntireRow.Ungroup()

    # 列のグループ化を設定
    ws.Range("A1").EntireColumn.Group()

    # 列のグループ化を非表示
    ws.Outline.ShowLevels(RowLevels=0, ColumnLevels=1)

    # 列のグループ化を表示
    ws.Outline.ShowLevels(RowLevels=0, ColumnLevels=8)

    # 列のグループ化を解除
    ws.Range("A1").EntireColumn.Ungroup()

    # ------------------------------------------------------------------

    # A1セルをB1セルに複写
    ws.Range("A1").Copy(ws.Range("B1"))

    # A1セルをSheet2のA1セルに複写
    ws.Range("A1").Copy(wb.Worksheets("Sheet2").Range("A1"))

    # A1セル基準の現在の領域をSheet2のA1セル基準で複写
    ws.Range("A1").CurrentRegion.Copy(wb.Worksheets("Sheet2").Range("A1"))

    # A1セルをクリップボードに複写
    ws.Range("A1").Copy()

    # クリップボードをB2セルに複写
    ws.Activate()
    ws.Range("B2").Select()
    ws.Paste()

    # クリップボードをC3セルに複写(値の貼り付け)
    ws.Range("C3").PasteSpecial(xlPasteValues)

    # クリップボードをC3セルに複写(書式貼り付け)
    ws.Range("C3").PasteSpecial(xlPasteFormats)

    # クリップボードをC3セルに複写(数式貼り付け)
    ws.Range("C3").PasteSpecial(xlPasteFormulas)

    # 切り取りモードまたはコピー モードを解除
    ws.Application.CutCopyMode = False

    # ------------------------------------------------------------------

    # A1セルをB1セルに移動
    ws.Range("A1").Cut(ws.Range("B1"))

    # A1セルをSheet2のA1セルに移動
    ws.Range("A1").Cut(wb.Worksheets("Sheet2").Range("A1"))

    # A1セルをクリップボードに移動
    ws.Range("A1").Cut()

    # 切り取りモードまたはコピー モードを解除
    ws.Application.CutCopyMode = False

    # ------------------------------------------------------------------

    # https://excel-ubara.com/excelvba4/EXCEL254.html
    # A1～D5の範囲にG16～J20の範囲を一括複写(値の貼り付け)
    ws.Range("A1:D5").Value = ws.Range("G16:J20").Value

    # A1～D5の範囲にG16～J20の範囲を一括複写(値の貼り付け)
    ws.Range("A1").GetResize(ws.Range("G16:J20").Rows.Count, ws.Range("G16:J20").Columns.Count).Value = ws.Range("G16:J20").Value

    # ------------------------------------------------------------------

    # A1～D4の範囲の左側の列の内容を範囲に一括複写
    ws.Range("A1:D4").FillRight()

    # E1～H4の範囲の上段の行の内容を範囲に一括複写
    ws.Range("E1:H4").FillDown()

    # A5～D8の範囲の右側の列の内容を範囲に一括複写
    ws.Range("A5:D8").FillLeft()

    # E5～H8の範囲の下段の行の内容を範囲に一括複写
    ws.Range("E5:H8").FillUp()

    # ------------------------------------------------------------------

    # A1～H1の範囲をA1～H8の範囲にAutoFill
    ws.Range("A1:H1").AutoFill(ws.Range("A1:H8"))

    # A1～H2の範囲をA1～H8の範囲にAutoFill
    ws.Range("A1:H2").AutoFill(ws.Range("A1:H8"), xlFillDefault)

    # ------------------------------------------------------------------

    # A1セル基準の現在の領域をAutoFilter
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(Field=1, Criteria1=">30")

    # A1セル基準の現在の領域をAutoFilter
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(Field=1, Criteria1=">30", Operator=xlAnd, Criteria2="<80")

    # A1セル基準の現在の領域をAutoFilter
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30")

    # A1セル基準の現在の領域をAutoFilter
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")

    # A1セル基準の現在の領域をAutoFilter
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")
    ws.Range("A1").CurrentRegion.AutoFilter(2, ">40", xlAnd, "<60")

    # AutoFilterの範囲を選択
    ws.AutoFilter.Range.Select()

    # AutoFilterの範囲の可視状態セル選択
    ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Select()

    # AutoFilterの範囲の可視状態セル行数
    n = int(ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Count / ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Columns.Count)
    print(n)

    # AutoFilterの適用
    ws.AutoFilter.ApplyFilter()

    # AutoFilterの絞り込み解除
    if ws.FilterMode:
        ws.ShowAllData()

    # AutoFilterの解除
    if ws.AutoFilterMode:
        ws.AutoFilterMode = False

    # ------------------------------------------------------------------

    # A1セル基準の現在の領域を並び替え ( Range Sort Method )
    # Typeを省略するとType以降のOrder2等の指定が無視される。
    # TypeをNoneにするとエラーにはならないのだが誤動作する。
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Range("A1").CurrentRegion.Sort(
        Key1=ws.Range("A1"),
        Order1=xlDescending,
        Key2=ws.Range("B1"),
        Type=None,
        Order2=xlDescending,
        Key3=ws.Range("C1"),
        Order3=xlAscending,
        Header=xlYes,
        MatchCase=False,
        Orientation=xlSortColumns,
        SortMethod=xlPinYin,
        DataOption1=xlSortNormal,
        DataOption2=xlSortNormal,
        DataOption3=xlSortNormal,
    )

    # A1セル基準の現在の領域を並び替え ( Sort Object )
    # MicrosoftのVBAのリファレンスでは省略可能とされていますが、
    # 省略すると正常に並び替えされない場合があるので注意が必要。
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Sort.SortFields.Clear()
    ws.Sort.SortFields.Add(Key=ws.Range("A1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    ws.Sort.SortFields.Add(Key=ws.Range("B1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    ws.Sort.SortFields.Add(Key=ws.Range("C1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.Sort.SetRange(ws.Range("A1").CurrentRegion)
    ws.Sort.Header = xlYes
    ws.Sort.MatchCase = False
    ws.Sort.Orientation = xlSortColumns
    ws.Sort.SortMethod = xlPinYin
    ws.Sort.Apply()

    # ------------------------------------------------------------------

    # AutoFilterを行なった上で並び替え ( Sort Object )
    # MicrosoftのVBAのリファレンスでは省略可能とされていますが、
    # 省略すると正常に並び替えされない場合があるので注意が必要。
    ws.Activate()
    ws.Range("A1").CurrentRegion.Select()
    ws.Range("A1").CurrentRegion.AutoFilter()
    ws.Range("A1").CurrentRegion.AutoFilter(1, ">30", xlAnd, "<80")
    ws.AutoFilter.Sort.SortFields.Clear()
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("A1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("B1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlDescending)
    ws.AutoFilter.Sort.SortFields.Add(Key=ws.Range("C1"), SortOn=xlSortOnValues, DataOption=xlSortNormal, Order=xlAscending)
    # ws.AutoFilter.Sort.SetRange()
    ws.AutoFilter.Sort.Header = xlYes
    ws.AutoFilter.Sort.MatchCase = False
    ws.AutoFilter.Sort.Orientation = xlSortColumns
    ws.AutoFilter.Sort.SortMethod = xlPinYin
    ws.AutoFilter.Sort.Apply()

    # ------------------------------------------------------------------

    # シートの非表示
    ws.Visible = xlSheetHidden

    # シートの表示
    ws.Visible = xlSheetVisible

    # ------------------------------------------------------------------

    # シートの保護の設定
    ws.Protect()

    # シートの保護の解除
    ws.Unprotect()

    # シートをパスワード付きで保護の設定
    ws.Protect(Password="hoge")

    # シートのパスワード付きの保護の解除
    ws.Unprotect(Password="hoge")

    # ------------------------------------------------------------------

    # ブックの保護の設定
    wb.Protect()

    # ブックの保護の解除
    wb.Unprotect()

    # ブックをパスワード付きで保護の設定
    wb.Protect(Password="hoge")

    # ブックのパスワード付きの保護の解除
    wb.Unprotect(Password="hoge")

    # ------------------------------------------------------------------

    # https://learn.microsoft.com/en-us/office/vba/api/excel.windows
    # Note that the active window is always Windows(1).
    # ズームの倍率の設定
    ws.Activate()
    ws.Range("A1").Select()
    ws.Parent.Windows(1).Zoom = 90

    # ------------------------------------------------------------------

    # https://excelwork.info/excel/freezepanes/
    # https://stackoverflow.com/questions/43146073/
    # 枠の固定
    ws.Activate()
    ws.Range("C3").Select()
    ws.Parent.Windows(1).FreezePanes = True

    # ------------------------------------------------------------------

    # https://excel-ubara.com/excelvba4/EXCEL272.html
    # CTRL+HOME的A1セル選択
    ws.Activate()
    ws.Range("A1").Select()
    ws.Application.Goto(ws.Range("A1"), True)

    # https://qiita.com/Tachy_Pochy/items/64fe16ec076c52556b2d
    # CTRL+HOME的選択 ( AutoFilter使用時は残念 )
    ws.Activate()
    r = int(ws.Parent.Windows(1).SplitRow) + 1
    c = int(ws.Parent.Windows(1).SplitColumn) + 1
    ws.Cells(r, c).Select()

    # CTRL+HOME的関数

    def SpecialCells_xlHomeCell(ws):
        r = int(ws.Parent.Windows(1).SplitRow) + 1
        c = int(ws.Parent.Windows(1).SplitColumn) + 1
        rg = ws.Cells(r, c)
        if ws.Parent.Windows(1).FreezePanes and ws.Parent.Windows(1).SplitRow and ws.AutoFilterMode and ws.FilterMode:
            rg = rg.GetResize(ws.Cells.Rows.Count - rg.Row + 1, ws.Cells.Columns.Count - rg.Column + 1)
            rg = ws.Application.Intersect(ws.AutoFilter.Range.SpecialCells(xlCellTypeVisible), rg)
            rg = rg.GetResize(1, 1)
        return rg

    # CTRL+HOME的選択
    ws.Activate()
    rg = SpecialCells_xlHomeCell(ws)
    rg.Select()
    ws.Application.Goto(rg, True)

    # ------------------------------------------------------------------

    # 再計算
    ws.Calculate()

    # 再計算
    xlApp.Calculate()

    # Excelの警告メッセージの表示の停止
    xlApp.DisplayAlerts = False

    # Excelの警告メッセージの表示の開始
    xlApp.DisplayAlerts = True

    # Excelの画面の更新を停止
    xlApp.ScreenUpdating = False

    # Excelの画面の更新を開始
    xlApp.ScreenUpdating = True

    # https://stackoverflow.com/questions/3735378/#8561483
    # Excelの画面の更新を強制
    xlApp.ActiveWindow.SmallScroll()
    xlApp.WindowState = xlApp.WindowState

    # ------------------------------------------------------------------

    # ActiveWorkbookの取得
    wb = xlApp.ActiveWorkbook
    print(wb.Name)

    # ActiveWindowの取得
    aw = xlApp.ActiveWindow
    print(aw.Caption)

    # ActiveSheetの取得
    ws = xlApp.ActiveSheet
    print(ws.Name)

    # ActiveSheetの取得
    ws = wb.ActiveSheet
    print(ws.Name)

    # ActiveCellをRangeで取得
    rg = xlApp.ActiveCell
    print(rg.Address)

    # Application オブジェクトの取得
    xl = rg.Application
    print(xl.Name)

    # Application オブジェクトの取得
    xl = ws.Application
    print(xl.Name)

    # Application オブジェクトの取得
    xl = wb.Application
    print(xl.Name)

    # ------------------------------------------------------------------

    # シートの名称の変更
    wb.Worksheets("Sheet2").Name = "Sheet9"

    # シートの追加
    ws = wb.Worksheets.Add()

    # シートの複写 ( 指定シートの前に複写 )
    ws.Copy(Before=wb.Worksheets("Sheet9"))
    ws = wb.Worksheets(wb.Worksheets("Sheet9").Index - 1)

    # https://stackoverflow.com/questions/52685699/
    # シートの複写 ( 指定シートの後に複写 )
    ws.Copy(Before=None, After=wb.Worksheets("Sheet9"))
    ws = wb.Worksheets(wb.Worksheets("Sheet9").Index + 1)

    # シートの移動 ( 指定シートの前に移動 )
    ws.Move(Before=wb.Worksheets("Sheet9"))

    # https://stackoverflow.com/questions/52685699/
    # シートの移動 ( 指定シートの後に移動 )
    ws.Move(Before=None, After=wb.Worksheets("Sheet9"))

    # シートの削除
    wb.Worksheets("Sheet3").Delete()
    wb.Worksheets("Sheet9").Delete()

    # ------------------------------------------------------------------

    # シートをPDF出力
    ws.ExportAsFixedFormat(Type=xlTypePDF, Quality=xlQualityStandard, Filename=f"{os.getcwd()}\\output.pdf")

    # ------------------------------------------------------------------

    # ブックをファイルに上書き保存
    # wb.Save()

    # ブックをXLSXファイルに保存
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.xlsx", FileFormat=xlOpenXMLWorkbook)

    # ブックをXLSファイルに保存
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.xls", FileFormat=xlWorkbookNormal)

    # ブックをCSVファイルに保存
    wb.SaveAs(Filename=f"{os.getcwd()}\\outputSaveAs.csv", FileFormat=xlCSV)

    # ------------------------------------------------------------------

    # ブックをクローズ
    # wb.Close()

    # ブックを保存せずにクローズ
    wb.Close(SaveChanges=False)

    # ------------------------------------------------------------------

    # Excel終了
    xlApp.Quit()

    # ------------------------------------------------------------------


if __name__ == "__main__":
    main()
```

</details>