LoginSignup
28
28

Python pywin32(win32com) Excel 操作備忘録

Last updated at Posted at 2020-11-10

はじめに

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

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

メソッドの引数は、
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
sample.py
sample.with.print.and.input.py

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

:notebook_with_decorative_cover: sample.csv
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
:notebook_with_decorative_cover: sample.with.print.and.input.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()
:notebook_with_decorative_cover: sample.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()
28
28
0

Register as a new user and use Qiita more conveniently

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