pyOpenVBA 6.1.3__tar.gz → 6.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/PKG-INFO +16 -2
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/README.md +15 -1
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/architecture.md +11 -9
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/excel_checklist.csv +72 -7
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/host_completeness.md +3 -3
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_write/README.md +87 -3
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/vba_runtime.md +182 -8
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/pyproject.toml +1 -1
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/__init__.py +1 -1
- pyopenvba-6.3.0/src/pyopenvba/_relationships.py +90 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_designs.py +131 -8
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_macros.py +1 -3
- pyopenvba-6.3.0/src/pyopenvba/access/_storage.py +238 -0
- pyopenvba-6.3.0/src/pyopenvba/access/_themes.py +200 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_vba.py +200 -20
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/database.py +398 -135
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access_read.py +253 -731
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_autofill.py +1 -0
- pyopenvba-6.3.0/src/pyopenvba/apps/excel/_cell_styles.py +1120 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_clipboard.py +25 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_dimensions.py +2 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_editing.py +4 -1
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_formats.py +73 -23
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_formula_format.py +18 -0
- pyopenvba-6.3.0/src/pyopenvba/apps/excel/_hyperlinks.py +553 -0
- pyopenvba-6.3.0/src/pyopenvba/apps/excel/_hyperlinks_file.py +280 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_io.py +58 -27
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_model.py +113 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_protection.py +7 -1
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_row_formats.py +4 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sheet_copy.py +5 -1
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sort.py +5 -0
- pyopenvba-6.3.0/src/pyopenvba/apps/excel/_styles.py +1404 -0
- pyopenvba-6.3.0/src/pyopenvba/apps/excel/_text_columns.py +428 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_typing.py +233 -69
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_runtime.py +3 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/vba.py +38 -73
- pyopenvba-6.1.3/src/pyopenvba/_templates/designs/form.propdata +0 -0
- pyopenvba-6.1.3/src/pyopenvba/_templates/designs/report.propdata +0 -0
- pyopenvba-6.1.3/src/pyopenvba/access/_storage.py +0 -119
- pyopenvba-6.1.3/src/pyopenvba/apps/excel/_styles.py +0 -862
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/.gitignore +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/LICENSE.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/ms-ovba-implementation-guide_v2.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/power_query.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_complex/README.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_designs/README.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_macros/README.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/pcode/README.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/roadmap.md +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/__main__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_a1.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_deflate.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_host.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_new_project.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_oforms_pages.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_oforms_records.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_package_signature.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_ppt_container.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_references.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_database.accdb +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_database_module.accdb +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_document.docm +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_excel_addin.xlam +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_presentation.pptm +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsb +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsm +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsx +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.accdb +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.mdb +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.blob +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.lvprop +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.prototypes +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.typeinfo +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.blob +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.lvprop +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.prototypes +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.typeinfo +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_xml.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_alloc.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_btree.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_collation.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_collation_general_legacy.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_compact.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_complex.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_datapage.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_ddl.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_facade.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_format.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_index.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_lval.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_pages.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_props.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_queries.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_rows.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_schema.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_sql.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_tdef.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_validate.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_arrays.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_autofilter.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_bridge.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_calc.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_control_refs.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_controls.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_copy_names.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_duplicates.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_dynamic_file.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_engine_book.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_evaluate.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_events.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_find.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_font_rows.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_merges.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_named_api.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_names.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_notes.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_notes_file.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_number_format.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_radios.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_refresh.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_region.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shape_api.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shapes.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shared.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sheet_move.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_special_cells.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_spills.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_table_edits.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_tables.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_validation.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_visible.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_windows.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_worksheet_functions.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_bridge.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_io.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_model.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_bridge.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_io.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_model.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/cfb.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/excel.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/exceptions.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/forms.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_arity.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/catalog.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/cells.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/collate.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/dates.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/evaluator.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/aggregate.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/arithmetic.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/arrays.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/common.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/conditional.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/database.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/dates.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/distributions.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/engineering.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/financial.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/information.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/lambdas.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/logical.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/lookup.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/matrix.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/statistics.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/subtotal.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/text.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/host.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/lexer.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/nodes.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/numbers.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/parser.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/precise.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/reference.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/registry.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/special.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/values.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_deep.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_display.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_formula2.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_inventory.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_parse.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_prefixes.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_r1c1.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_spell.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_structured.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_values.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_ast.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_constants_data.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_intrinsics.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_inventory.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_inventory_data.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_lex.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_objects.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_parse.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_preprocess.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_scripting.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_values.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_eval.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_inventory.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_inventory_data.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_library.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_parse.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_values.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerpoint.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_binary.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_files.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_mashup.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_metadata.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_opc.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_package.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_refresh.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_section.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_sheets.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/workbook.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/__init__.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_docx.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_docx_text.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_drawingml.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_pptx.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_values.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_xlsx.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/vba_pcode.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/word.py +0 -0
- {pyopenvba-6.1.3 → pyopenvba-6.3.0}/tests/fuzz_corpus/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pyOpenVBA
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.3.0
|
|
4
4
|
Summary: Read and write VBA macros and Excel Power Query in pure Python, no dependencies.
|
|
5
5
|
Project-URL: Homepage, https://github.com/WilliamSmithEdward/pyOpenVBA
|
|
6
6
|
Project-URL: Repository, https://github.com/WilliamSmithEdward/pyOpenVBA
|
|
@@ -746,7 +746,9 @@ it, and a save adds only the stylesheet entries the file lacks, spelled
|
|
|
746
746
|
as Excel spells them. Formatting whole rows, whole columns or the whole
|
|
747
747
|
sheet keeps the row, column and sheet formats Excel keeps, with the
|
|
748
748
|
cells Excel makes where they cross, and saves them as Excel does. Named
|
|
749
|
-
cell styles
|
|
749
|
+
cell styles (`Range.Style`, `Workbook.Styles` and the `Style` object)
|
|
750
|
+
and hyperlinks (`Hyperlinks.Add` and the `Hyperlink` object) behave and
|
|
751
|
+
save as Excel's do. Conditional formats are not implemented yet.
|
|
750
752
|
|
|
751
753
|
Row heights, column widths and hidden rows and columns behave as they do
|
|
752
754
|
in Excel on a 96-DPI display, the one the model emulates: `RowHeight = 20`
|
|
@@ -934,6 +936,18 @@ A project its application would not write is not written here either:
|
|
|
934
936
|
Excel writes only the code names for one with no code in it, and
|
|
935
937
|
PowerPoint nothing for one with no module.
|
|
936
938
|
|
|
939
|
+
An Access database answers the same way until its first module, since
|
|
940
|
+
Access makes no project for a database that has never held code.
|
|
941
|
+
`AccessDatabase.add_vba_project()` gives it the one Access makes:
|
|
942
|
+
|
|
943
|
+
```python
|
|
944
|
+
with AccessDatabase("orders.accdb") as db:
|
|
945
|
+
if not db.has_vba_project():
|
|
946
|
+
db.add_vba_project()
|
|
947
|
+
db.add_module("Module1", "Public Function Ping() As Long\r\n Ping = 1\r\nEnd Function")
|
|
948
|
+
db.save()
|
|
949
|
+
```
|
|
950
|
+
|
|
937
951
|
### Access
|
|
938
952
|
|
|
939
953
|
| Extension | What it is | Read | Write | create_new |
|
|
@@ -709,7 +709,9 @@ it, and a save adds only the stylesheet entries the file lacks, spelled
|
|
|
709
709
|
as Excel spells them. Formatting whole rows, whole columns or the whole
|
|
710
710
|
sheet keeps the row, column and sheet formats Excel keeps, with the
|
|
711
711
|
cells Excel makes where they cross, and saves them as Excel does. Named
|
|
712
|
-
cell styles
|
|
712
|
+
cell styles (`Range.Style`, `Workbook.Styles` and the `Style` object)
|
|
713
|
+
and hyperlinks (`Hyperlinks.Add` and the `Hyperlink` object) behave and
|
|
714
|
+
save as Excel's do. Conditional formats are not implemented yet.
|
|
713
715
|
|
|
714
716
|
Row heights, column widths and hidden rows and columns behave as they do
|
|
715
717
|
in Excel on a 96-DPI display, the one the model emulates: `RowHeight = 20`
|
|
@@ -897,6 +899,18 @@ A project its application would not write is not written here either:
|
|
|
897
899
|
Excel writes only the code names for one with no code in it, and
|
|
898
900
|
PowerPoint nothing for one with no module.
|
|
899
901
|
|
|
902
|
+
An Access database answers the same way until its first module, since
|
|
903
|
+
Access makes no project for a database that has never held code.
|
|
904
|
+
`AccessDatabase.add_vba_project()` gives it the one Access makes:
|
|
905
|
+
|
|
906
|
+
```python
|
|
907
|
+
with AccessDatabase("orders.accdb") as db:
|
|
908
|
+
if not db.has_vba_project():
|
|
909
|
+
db.add_vba_project()
|
|
910
|
+
db.add_module("Module1", "Public Function Ping() As Long\r\n Ping = 1\r\nEnd Function")
|
|
911
|
+
db.save()
|
|
912
|
+
```
|
|
913
|
+
|
|
900
914
|
### Access
|
|
901
915
|
|
|
902
916
|
| Extension | What it is | Read | Write | create_new |
|
|
@@ -230,7 +230,8 @@ follows and how it was measured is in
|
|
|
230
230
|
[docs/access_engine.md](access_engine.md).
|
|
231
231
|
|
|
232
232
|
`AccessDatabase` exposes the same surface as the other hosts:
|
|
233
|
-
`
|
|
233
|
+
`has_vba_project()` and `add_vba_project()` for a database that has
|
|
234
|
+
never held code, `module_names()`, `get_module()`, `set_module()`, `vba_project()` with
|
|
234
235
|
`add_module` / `rename_module` / `delete_module`, `pull_modules()` /
|
|
235
236
|
`push_modules()`, `forms()` and `add_form()` with `add_control` /
|
|
236
237
|
`remove_control` / `set_property` on the result, `save()`, `create_new()`.
|
|
@@ -246,11 +247,12 @@ the project from the module streams on the next open, as Access's own
|
|
|
246
247
|
`/decompile` does. The code has to compile; a live gate has Access run
|
|
247
248
|
what was written and compares the value the code returns.
|
|
248
249
|
|
|
249
|
-
`AccessReader` predates the engine
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
`
|
|
250
|
+
`AccessReader` predates the engine and now reads through it: modules,
|
|
251
|
+
the project's streams and `MSysObjects` come from the rows the engine
|
|
252
|
+
finds them in, and text is decoded in the project's code page. It keeps
|
|
253
|
+
its read API (`get_module`, `vba_modules`, `read_project_info`,
|
|
254
|
+
`identifiers`, `disassemble_module`, the catalog readers,
|
|
255
|
+
`pull_modules`) and `pull_access` still uses it; it writes nothing. The chronicle of the
|
|
254
256
|
attempts that came before the engine is
|
|
255
257
|
[docs/msaccess_lessons_learned.md](msaccess_lessons_learned.md).
|
|
256
258
|
|
|
@@ -488,9 +490,9 @@ tests/
|
|
|
488
490
|
test_powerpoint.py PowerPointFile facade, end-to-end
|
|
489
491
|
test_pull_push.py Disk workflow
|
|
490
492
|
test_gates.py Per-roadmap-gate regression tests
|
|
491
|
-
test_access.py AccessReader read path:
|
|
492
|
-
|
|
493
|
-
byte-for-byte oracle parity
|
|
493
|
+
test_access.py AccessReader read path: modules through
|
|
494
|
+
MSysAccessStorage, code pages,
|
|
495
|
+
byte-for-byte oracle parity
|
|
494
496
|
test_access_engine.py Storage engine read layer against the
|
|
495
497
|
Access-authored fixtures
|
|
496
498
|
test_live_access_engine_gate.py
|
|
@@ -432,7 +432,7 @@ Font,Strikethrough,property,As Variant,,VERIFIED,tests/fixtures/range_format.jso
|
|
|
432
432
|
Font,Subscript,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
433
433
|
Font,Superscript,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
434
434
|
Font,ThemeColor,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
435
|
-
Font,ThemeFont,property,As XlThemeFont,,
|
|
435
|
+
Font,ThemeFont,property,As XlThemeFont,,PARTIAL,tests/fixtures/cell_styles/style_changes.json,Read; setting it on a range reports unsupported.
|
|
436
436
|
Font,TintAndShade,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
437
437
|
Font,Underline,property,As Variant,,PARTIAL,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,"Values other than the five styles, True, False and 3 report unsupported."
|
|
438
438
|
GroupShapes,_Default,method,_Default(Index As Variant) As Shape,,MISSING,,
|
|
@@ -443,6 +443,31 @@ GroupShapes,Creator,"property, read-only",As XlCreator,,MISSING,,
|
|
|
443
443
|
GroupShapes,Item,method,Item(Index As Variant) As Shape,,UNASSESSED,,
|
|
444
444
|
GroupShapes,Parent,"property, read-only",As Object,,MISSING,,
|
|
445
445
|
GroupShapes,Range,"property, read-only",As ShapeRange,,MISSING,,
|
|
446
|
+
Hyperlink,Address,property,As String,,PARTIAL,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,"Kept as Excel tidies it -- an http, https or ftp address's scheme and host in lower case, its path resolved, a # splitting off the subaddress -- for the kinds of address measured; saved with a DOS path relative to the workbook's folder. Setting it keeps the subaddress unless the new address has a # of its own."
|
|
447
|
+
Hyperlink,AddToFavorites,method,AddToFavorites(),,EXCLUDED,,Adds the address to the browser's favourites.
|
|
448
|
+
Hyperlink,Application,"property, read-only",As Application,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
449
|
+
Hyperlink,CreateNewDocument,method,"CreateNewDocument(Filename As String, EditNow As Boolean, Overwrite As Boolean)",,EXCLUDED,,Creates and opens a document of another application.
|
|
450
|
+
Hyperlink,Creator,"property, read-only",As XlCreator,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
451
|
+
Hyperlink,Delete,method,Delete(),,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"Its cells go back to the default format, merges kept. On a protected sheet a locked cell keeps its link, error 1004."
|
|
452
|
+
Hyperlink,EmailSubject,property,As String,,PARTIAL,tests/fixtures/hyperlinks/hyperlinks.json,"The subject of a mailto address, which setting it writes in, in place of one it names, or takes out; """" for no address; another address fails. Set on a link with no address, which leaves Excel refusing every change after it, it reports unsupported."
|
|
453
|
+
Hyperlink,Follow,method,"Follow([NewWindow As Variant], [AddHistory As Variant], [ExtraInfo As Variant], [Method As Variant], [HeaderInfo As Variant])",,EXCLUDED,,Opens the address in another application.
|
|
454
|
+
Hyperlink,Name,"property, read-only",As String,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"The text to show it was given, or ""address - subaddress"", which follows a new address; read from a file without a display, its cell's text. Setting it is error 450."
|
|
455
|
+
Hyperlink,Parent,"property, read-only",As Object,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,Its cells.
|
|
456
|
+
Hyperlink,Range,"property, read-only",As Range,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
457
|
+
Hyperlink,ScreenTip,property,As String,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,
|
|
458
|
+
Hyperlink,Shape,"property, read-only",As Shape,,PARTIAL,tests/fixtures/hyperlinks/hyperlinks.json,Error 1004 for a link on cells; a link on a shape is not implemented.
|
|
459
|
+
Hyperlink,SubAddress,property,As String,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,Setting it takes the address away.
|
|
460
|
+
Hyperlink,TextToDisplay,property,As String,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,"The text the first cell holds, """" for a number or a formula; setting it writes the first cell and names the link, """" doing nothing."
|
|
461
|
+
Hyperlink,Type,"property, read-only",As Long,,PARTIAL,tests/fixtures/hyperlinks/hyperlinks.json,0 for a link on cells; a link on a shape is not implemented.
|
|
462
|
+
Hyperlinks,_Default,"property, read-only",As Hyperlink,,MISSING,,
|
|
463
|
+
Hyperlinks,_NewEnum,"property, read-only",As IUnknown,,MISSING,,
|
|
464
|
+
Hyperlinks,Add,method,"Add(Anchor As Object, Address As String, [SubAddress As Variant], [ScreenTip As Variant], [TextToDisplay As Variant]) As Object",,PARTIAL,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,"A link on each area of the anchor, the last answered; over the very cells of a link it takes that link's place. The cells take the Hyperlink style, and the first the text to show or, when empty, the address. SubAddress, ScreenTip and TextToDisplay not strings are error 5. A protected sheet needs AllowInsertingHyperlinks and unlocked cells. A shape anchor reports unsupported."
|
|
465
|
+
Hyperlinks,Application,"property, read-only",As Application,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
466
|
+
Hyperlinks,Count,"property, read-only",As Long,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
467
|
+
Hyperlinks,Creator,"property, read-only",As XlCreator,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,
|
|
468
|
+
Hyperlinks,Delete,method,Delete(),,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"Every link the collection holds goes, its cells back to the default format."
|
|
469
|
+
Hyperlinks,Item,"property, read-only",As Hyperlink,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"By place in the sheet's order or by name; 0, past the last and an unknown name are error 9."
|
|
470
|
+
Hyperlinks,Parent,"property, read-only",As Object,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"The worksheet, a range's collection's too."
|
|
446
471
|
Interior,Application,"property, read-only",As Application,,UNASSESSED,,
|
|
447
472
|
Interior,Color,property,As Variant,,PARTIAL,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,A gradient fill reports unsupported.
|
|
448
473
|
Interior,ColorIndex,property,As Variant,,PARTIAL,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,A gradient fill reports unsupported.
|
|
@@ -631,7 +656,7 @@ Range,Clear,method,Clear() As Variant,,PARTIAL,tests/fixtures/excel_model/probes
|
|
|
631
656
|
Range,ClearComments,method,ClearComments(),,VERIFIED,tests/fixtures/excel_model/probes.txt,
|
|
632
657
|
Range,ClearContents,method,ClearContents([RemoveControls As Variant]) As Variant,no RemoveControls,PARTIAL,tests/fixtures/excel_model/probes.txt; tests/fixtures/row_formats/row_formats.json; tests/fixtures/autofilter_edits.json,"An emptied cell in the format its row or column gives it goes. On a filtered sheet only the visible cells clear, and clearing a filter's whole header row turns the filter off."
|
|
633
658
|
Range,ClearFormats,method,ClearFormats() As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py; tests/fixtures/row_formats/row_formats.json; tests/fixtures/autofilter_edits.json,"Whole rows and columns lose their own formats, and positions a column's or row's format still reaches get a cell in the default format. On a filtered sheet only the visible cells, and clearing a filter's whole header row turns the filter off."
|
|
634
|
-
Range,ClearHyperlinks,method,ClearHyperlinks(),,
|
|
659
|
+
Range,ClearHyperlinks,method,ClearHyperlinks(),,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,The links the range holds go; their cells keep their formats.
|
|
635
660
|
Range,ClearNotes,method,ClearNotes() As Variant,,VERIFIED,tests/fixtures/excel_model/probes.txt,The same as ClearComments.
|
|
636
661
|
Range,ClearOutline,method,ClearOutline() As Variant,,MISSING,,
|
|
637
662
|
Range,Column,"property, read-only",As Long,,PARTIAL,tests/fixtures/excel_model/probes.txt,
|
|
@@ -697,7 +722,7 @@ Range,HasSpill,"property, read-only",As Variant,,VERIFIED,tests/fixtures/dynamic
|
|
|
697
722
|
Range,Height,"property, read-only",As Variant,,PARTIAL,tests/fixtures/dimensions.json; tests/fixtures/dimensions/dimensions_answers.json; tests/fixtures/font_rows.json,"A row grows with its fonts from a measured table of eleven families; one resting on another font, a mix of tables, super- or subscript, or wrapped or turned text keeps its file's height until it changes, then reports unsupported."
|
|
698
723
|
Range,Hidden,property,As Variant,,PARTIAL,tests/fixtures/dimensions.json; tests/fixtures/dimensions/dimensions_answers.json; tests/fixtures/autofilter_edits.json,"Hiding every row, or rows down to the last one, makes hidden the sheet's default as Excel does; a block that stops short of the last row is hidden row by row, and whether Excel switches over for a large one was not measured. On a filtered sheet a block with shown rows reaches only those, so showing it does nothing; showing columns there over hidden ones reports itself unsupported."
|
|
699
724
|
Range,HorizontalAlignment,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
700
|
-
Range,Hyperlinks,"property, read-only",As Hyperlinks,,
|
|
725
|
+
Range,Hyperlinks,"property, read-only",As Hyperlinks,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json,"The links inside one of its areas, and for one area the link it lies in."
|
|
701
726
|
Range,ID,property,As String,,MISSING,,
|
|
702
727
|
Range,IndentLevel,property,As Variant,,VERIFIED,tests/fixtures/range_format.json; tests/fixtures/format/formats_answers.json; tests/test_live_excel_model_gate.py,
|
|
703
728
|
Range,Insert,method,"Insert([Shift As Variant], [CopyOrigin As Variant]) As Variant",,PARTIAL,tests/fixtures/range_edit.json; tests/fixtures/excel_model/probes.txt; tests/fixtures/row_formats/row_formats.json; tests/fixtures/autofilter_edits.json; tests/fixtures/cell_shifts.json,"Whole rows and columns rewrite references, and a new row or column takes the formats beside it. Cells shifted down or right rewrite references as Excel does and take the formats above or to the left; with no Shift a range taller than it is wide shifts right. Sheets with merges or shapes and several areas of cells report unsupported. Shifting cells on a sheet whose rows or columns carry formats, and CopyOrigin:=xlFormatFromRightOrBelow, report unsupported. On a filtered sheet whole rows go in as many as the range shows, at its top, and inserting cells is error 1004."
|
|
@@ -778,13 +803,13 @@ Range,Speak,method,"Speak([SpeakDirection As Variant], [SpeakFormulas As Variant
|
|
|
778
803
|
Range,SpecialCells,method,"SpecialCells(Type As XlCellType, [Value As Variant]) As Range",,PARTIAL,tests/fixtures/special_cells.json; tests/fixtures/excel_model/probes.txt,"Constants and formulas by kind, blanks, the last cell, visible cells and the cells with notes, split into areas as Excel splits them; validation and conditional formats report themselves unsupported."
|
|
779
804
|
Range,SpillingToRange,"property, read-only",As Range,,VERIFIED,tests/fixtures/dynamic_arrays.json,The block a dynamic-array formula in the first cell spilled into; Nothing for any other cell.
|
|
780
805
|
Range,SpillParent,"property, read-only",As Range,,VERIFIED,tests/fixtures/dynamic_arrays.json,The cell of the dynamic-array formula whose answer spilled over the first cell; Nothing where none did.
|
|
781
|
-
Range,Style,property,As Variant,,
|
|
806
|
+
Range,Style,property,As Variant,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,"The cells' style, Nothing where they differ; set by name in any case or by Style object, the parts the style includes replaced and the rest kept. Error 450 for any other name or value, and on a protected sheet unless AllowFormattingCells."
|
|
782
807
|
Range,SubscribeTo,method,"SubscribeTo(Edition As String, [Format As XlSubscribeToFormat]) As Variant",,MISSING,,
|
|
783
808
|
Range,Subtotal,method,"Subtotal(GroupBy As Long, Function As XlConsolidationFunction, TotalList As Variant, [Replace As Variant], [PageBreaks As Variant], [SummaryBelowData As XlSummaryRow]) As Variant",,MISSING,,
|
|
784
809
|
Range,Summary,"property, read-only",As Variant,,MISSING,,
|
|
785
810
|
Range,Table,method,"Table([RowInput As Variant], [ColumnInput As Variant]) As Variant",,MISSING,,
|
|
786
811
|
Range,Text,"property, read-only",As Variant,,PARTIAL,tests/fixtures/excel_model/probes.txt; tests/fixtures/number_formats.json; tests/fixtures/number_spelling.json; tests/fixtures/value_typing.json,"Excel's number formats on a US English system, in a column wide enough for the value; a value a format cannot show fills the column with #. A * fill reports itself unsupported, and a value too wide for its column, which Excel cuts to # or fewer digits, is not modelled."
|
|
787
|
-
Range,TextToColumns,method,"TextToColumns([Destination As Variant], [DataType As XlTextParsingType], [TextQualifier As XlTextQualifier], [ConsecutiveDelimiter As Variant], [Tab As Variant], [Semicolon As Variant], [Comma As Variant], [Space As Variant], [Other As Variant], [OtherChar As Variant], [FieldInfo As Variant], [DecimalSeparator As Variant], [ThousandsSeparator As Variant], [TrailingMinusNumbers As Variant]) As Variant",,
|
|
812
|
+
Range,TextToColumns,method,"TextToColumns([Destination As Variant], [DataType As XlTextParsingType], [TextQualifier As XlTextQualifier], [ConsecutiveDelimiter As Variant], [Tab As Variant], [Semicolon As Variant], [Comma As Variant], [Space As Variant], [Other As Variant], [OtherChar As Variant], [FieldInfo As Variant], [DecimalSeparator As Variant], [ThousandsSeparator As Variant], [TrailingMinusNumbers As Variant]) As Variant",,PARTIAL,tests/fixtures/text_to_columns.json,"Delimited and fixed width, every delimiter, runs of them, qualifiers, typing, FieldInfo's kinds and how each date order reads a field, separators, a trailing minus and a destination as Excel does them. FieldInfo pairs that do not number the columns 1, 2, 3 in order, a column of formulas and a sheet with merged cells report themselves unsupported; an omitted argument takes its default, whether Excel carries one over from an earlier call not being measured."
|
|
788
813
|
Range,TogglePythonMarshalMode,method,TogglePythonMarshalMode([MarshalMode As Variant]),,MISSING,,
|
|
789
814
|
Range,Top,"property, read-only",As Variant,,PARTIAL,tests/fixtures/dimensions.json; tests/fixtures/dimensions/dimensions_answers.json; tests/fixtures/font_rows.json,"A row grows with its fonts from a measured table of eleven families; one resting on another font, a mix of tables, super- or subscript, or wrapped or turned text keeps its file's height until it changes, then reports unsupported."
|
|
790
815
|
Range,Ungroup,method,Ungroup() As Variant,,MISSING,,
|
|
@@ -1031,6 +1056,46 @@ SortFields,Count,"property, read-only",As Long,,VERIFIED,tests/fixtures/sort.jso
|
|
|
1031
1056
|
SortFields,Creator,"property, read-only",As XlCreator,,MISSING,,
|
|
1032
1057
|
SortFields,Item,"property, read-only",As SortField,,UNASSESSED,,
|
|
1033
1058
|
SortFields,Parent,"property, read-only",As Object,,MISSING,,
|
|
1059
|
+
Style,_Default,"property, read-only",As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1060
|
+
Style,AddIndent,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1061
|
+
Style,Application,"property, read-only",As Application,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1062
|
+
Style,Borders,"property, read-only",As Borders,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"xlLeft, xlRight, xlTop and xlBottom, and 1 to 4, are its edges and 5 and 6 its diagonals, set as a range's are; Borders(7) to Borders(12) read -4142 and 2 where edge 1 to 6 has a line in the automatic colour, else Null, and setting one does nothing. A property set on the collection sets all six; one read reports unsupported."
|
|
1063
|
+
Style,BuiltIn,"property, read-only",As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Setting it is error 450, as in Excel."
|
|
1064
|
+
Style,Creator,"property, read-only",As XlCreator,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1065
|
+
Style,Delete,method,Delete() As Variant,,PARTIAL,tests/fixtures/cell_styles/style_changes.json,"Its cells go to Normal, every part they did not set themselves following Normal from then on; a built-in style stays in the file, hidden. Normal is error 1004, as is a workbook with a protected sheet."
|
|
1066
|
+
Style,Font,"property, read-only",As Font,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Read and set as a range's are; Superscript and Subscript read False while the style leaves its font out. Normal's font takes colours and strikethrough; its size, face, bold, italic and underline, which the sheets' geometry rests on, report unsupported."
|
|
1067
|
+
Style,FormulaHidden,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1068
|
+
Style,HorizontalAlignment,property,As XlHAlign,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1069
|
+
Style,IncludeAlignment,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1070
|
+
Style,IncludeBorder,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1071
|
+
Style,IncludeFont,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1072
|
+
Style,IncludeNumber,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1073
|
+
Style,IncludePatterns,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1074
|
+
Style,IncludeProtection,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set: a part included again reaches the cells that took it from the style; one left out stays with them as it is.
|
|
1075
|
+
Style,IndentLevel,property,As Long,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Null unless aligned left, right or distributed and not turned. Read and set; each cell that follows the style follows it while the style includes the part."
|
|
1076
|
+
Style,Interior,"property, read-only",As Interior,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Read and set as a range's are, but its automatic pattern colour stays white or black, as it is, where a cell's turns black."
|
|
1077
|
+
Style,Locked,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1078
|
+
Style,MergeCells,property,As Variant,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,"Error 1004, as Excel's is."
|
|
1079
|
+
Style,Name,"property, read-only",As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Setting it is error 450, as in Excel."
|
|
1080
|
+
Style,NameLocal,"property, read-only",As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Setting it is error 1004, as in Excel."
|
|
1081
|
+
Style,NumberFormat,property,As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1082
|
+
Style,NumberFormatLocal,property,As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1083
|
+
Style,Orientation,property,As XlOrientation,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1084
|
+
Style,Parent,"property, read-only",As Object,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1085
|
+
Style,ReadingOrder,property,As Long,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1086
|
+
Style,ShrinkToFit,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1087
|
+
Style,Value,"property, read-only",As String,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"Setting it is error 450, as in Excel."
|
|
1088
|
+
Style,VerticalAlignment,property,As XlVAlign,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1089
|
+
Style,WrapText,property,As Boolean,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,Read and set; each cell that follows the style follows it while the style includes the part.
|
|
1090
|
+
Styles,_Default,"property, read-only",As Style,,MISSING,,
|
|
1091
|
+
Styles,_NewEnum,"property, read-only",As IUnknown,,MISSING,,
|
|
1092
|
+
Styles,Add,method,"Add(Name As String, [BasedOn As Variant]) As Style",,PARTIAL,tests/fixtures/cell_styles/cell_styles.json; tests/fixtures/cell_styles/style_changes.json,"A copy of Normal, or of the first cell of BasedOn without the parts its cells do not share. A name with no characters (Excel's Style 1) reports unsupported."
|
|
1093
|
+
Styles,Application,"property, read-only",As Application,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1094
|
+
Styles,Count,"property, read-only",As Long,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1095
|
+
Styles,Creator,"property, read-only",As XlCreator,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1096
|
+
Styles,Item,"property, read-only",As Style,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,By name in any case or by place in the sorted list.
|
|
1097
|
+
Styles,Merge,method,Merge(Workbook As Variant) As Variant,,PARTIAL,tests/fixtures/cell_styles/style_changes.json,"A style named as one here takes its place, keeping this workbook's spelling, and reaches the cells that follow it; the rest come in the order their names sort. A workbook with another theme, a Normal that differs and a built-in style this workbook deleted report unsupported."
|
|
1098
|
+
Styles,Parent,"property, read-only",As Object,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,
|
|
1034
1099
|
TextFrame,Application,"property, read-only",As Application,,MISSING,,
|
|
1035
1100
|
TextFrame,AutoMargins,property,As Boolean,,MISSING,,
|
|
1036
1101
|
TextFrame,AutoSize,property,As Boolean,no setter,UNASSESSED,,
|
|
@@ -1366,7 +1431,7 @@ Workbook,ShowPivotTableFieldList,property,As Boolean,,MISSING,,
|
|
|
1366
1431
|
Workbook,Signatures,"property, read-only",As SignatureSet,,MISSING,,
|
|
1367
1432
|
Workbook,SlicerCaches,"property, read-only",As SlicerCaches,,MISSING,,
|
|
1368
1433
|
Workbook,SmartDocument,"property, read-only",As SmartDocument,,MISSING,,
|
|
1369
|
-
Workbook,Styles,"property, read-only",As Styles,,
|
|
1434
|
+
Workbook,Styles,"property, read-only",As Styles,,PARTIAL,tests/fixtures/cell_styles/cell_styles.json,"Excel's 47 built-in styles and every one the file or a macro adds, in the order Windows word sort puts their names."
|
|
1370
1435
|
Workbook,Sync,event,Sync(SyncEventType As MsoSyncEventType),,MISSING,,
|
|
1371
1436
|
Workbook,TableStyles,"property, read-only",As TableStyles,,MISSING,,
|
|
1372
1437
|
Workbook,TemplateRemoveExtData,property,As Boolean,,MISSING,,
|
|
@@ -1466,7 +1531,7 @@ Worksheet,ExportAsFixedFormat,method,"ExportAsFixedFormat(Type As XlFixedFormatT
|
|
|
1466
1531
|
Worksheet,FilterMode,"property, read-only",As Boolean,,PARTIAL,tests/fixtures/autofilter.json; tests/fixtures/autofilter_file/autofilter_file.json; tests/test_live_excel_model_gate.py,
|
|
1467
1532
|
Worksheet,FollowHyperlink,event,FollowHyperlink(Target As Hyperlink),,MISSING,,
|
|
1468
1533
|
Worksheet,HPageBreaks,"property, read-only",As HPageBreaks,,MISSING,,
|
|
1469
|
-
Worksheet,Hyperlinks,"property, read-only",As Hyperlinks,,
|
|
1534
|
+
Worksheet,Hyperlinks,"property, read-only",As Hyperlinks,,VERIFIED,tests/fixtures/hyperlinks/hyperlinks.json; tests/test_live_excel_model_gate.py,"In the order they were added, a link replaced keeping its place."
|
|
1470
1535
|
Worksheet,Index,"property, read-only",As Long,,PARTIAL,tests/fixtures/excel_model/probes.txt,
|
|
1471
1536
|
Worksheet,LensGalleryRenderComplete,event,LensGalleryRenderComplete(),,MISSING,,
|
|
1472
1537
|
Worksheet,ListObjects,"property, read-only",As ListObjects,,PARTIAL,tests/fixtures/tables/tables.json,"The sheet's tables, read from a file or made by ListObjects.Add."
|
|
@@ -138,12 +138,12 @@ entry tracked explicitly.
|
|
|
138
138
|
| VBA projects and forms | In-scope MS-OVBA gates, designer round trips and live file gates exist; shared library-reference add/remove operations pass native Excel/Word/PowerPoint checks and Access persistence tests | Reconcile every operation with its format and protection/signing limits; distinguish form design from form runtime; linked VBA-project creation and arbitrary library runtime resolution remain separate gaps |
|
|
139
139
|
| VBA language and runtime | Measured semantics, classes, errors and control flow exist; every constant of VBA's own type library, the colour, key-code and system-colour modules included, typed as declared; Scripting.Dictionary in memory, its key matching measured | Audit complete syntax, type system, lifetime, references and intrinsics; track file I/O, external calls and known typing gaps explicitly |
|
|
140
140
|
| Application, workbooks and sheets | Core collections, cells, names and queries exist; sheet protection -- Protect, Unprotect, the Protection object and every edit a protected sheet refuses a macro, with Excel's own errors -- follows 168 live cases, and is saved and read as Excel saves and reads it, SHA-512 and legacy passwords included, over 13 files and a live gate; workbook protection -- Protect, Unprotect and the sheet changes a protected structure refuses -- follows 41 cases and 5 files, with a live gate; windows -- ActiveWindow, Windows, Goto, each sheet's zoom, view, display settings, scrolling, frozen panes and selection, the tabs and the window order -- follow 113 live workbooks, saved and read as Excel saves and reads them | Map all reference members; identify stubs, missing collections and incomplete arguments; allowed edit ranges and copying or moving sheets between workbooks while one is protected; a split that is not frozen, which Excel keeps in twips of the window; NewWindow, hidden windows and a window's size and state |
|
|
141
|
-
| Ranges and editing | Values, formulas, areas and basic movement exist; written values are typed as Excel types them, with the formats typing brings, prefix characters, Text cells and Value/Value2 types, pinned by
|
|
141
|
+
| Ranges and editing | Values, formulas, areas and basic movement exist; written values are typed as Excel types them, with the formats typing brings, prefix characters, Text cells and Value/Value2 types, pinned by 4,902 live writes and a saved workbook; formulas a macro writes are spelled as Excel spells them over 120 live formulas; NumberFormat codes round-trip Excel's spelling on both sides; Range.Text, TEXT and WorksheetFunction.Text follow Excel's number-format engine over 156 live codes and 28 values, and round times as Excel does over 152 times on the half second; CurrentRegion and End pass 34 live layouts, FillDown/Up/Right/Left 16 and SpecialCells 18; single-area Find/FindNext/FindPrevious pass 48 native cases; Replace passes 80 live layouts and the formula-bar text of 20 numbers in 26 formats; the clipboard's Copy, Cut, Paste and PasteSpecial pass 49; Range.Sort and the Sort object pass 58, in Excel's order for ASCII text over 583 values; AutoFill passes 208 layouts and 520 columns, its series of numbers, dates, times, text and names to the last digit; RemoveDuplicates passes 98; TextToColumns passes 54 of 57 live cases of delimiters, qualifiers, typing, FieldInfo and its six date orders, separators and fixed widths, the other 3, FieldInfo pairs out of order, reporting themselves unsupported; Range.Range passes 29 live probes and a space-separated intersection 5; AutoFilter passes 113 layouts, reads and writes 41 filters as Excel saves them, and passes a live gate; edits on a filtered sheet -- writes, formats, clears, fills, copies, sorts, deletes and inserts, and the filter following rows and columns -- match 190 of 195 live layouts, the other 5 reporting themselves unsupported (two-dimensional arrays over several areas); SUBTOTAL passes 31 live layouts over hidden, filtered and nested rows and references that functions and operators give; every edit above meets sheet protection as Excel's does; Cut moves the references that overlap it as Excel does over 24 live layouts; cell shifts -- Insert and Delete with a Shift or none -- move references, names, the filter's range and formats as Excel does over 47 live layouts; merged-range geometry/value operations pass 21 native cases and four persistence gates; FormulaR1C1 scalar and array writes/reads pass 27 native cases and five persistence gates; A1 Formula array writes share the implementation and pass 15 native cases plus four persistence gates | Complete multi-area/comment/format/MatchByte searches, complex across/multi-area merges and merge formatting; Range.Text with a `*` fill and in columns too narrow for a value (both need text widths in pixels); typing a space before a month's name and a time, or digits after AM or PM and a point, which Excel misreads into numbers; audit insertion, deletion, copying, sorting and filtering |
|
|
142
142
|
| Named ranges | Workbook/worksheet CRUD, validation, scope precedence, rename/retarget/delete, visibility/comments and Python snapshots share one implementation; 19 native cases and three persistence gates | Active-cell-relative name semantics, locale translation, Excel 4 macro metadata and arbitrary named-formula evaluation remain incomplete |
|
|
143
143
|
| Multiple workbooks and sheet copying | Add/open/activate/close; VBA sheet Copy/Move before/after or into a new book, matching native held-object invalidation on cross-book moves; inter-book range copies import used names and aliases with reuse/rename/error policies, backed by native probes and persistence gates | External workbook links, independent VBA projects, sheet-copy/move name conflicts, relative/other-sheet name imports, transferred drawings/controls, sheet modules and advanced worksheet metadata remain incomplete |
|
|
144
144
|
| Structural edits | Whole-row/column insertion/deletion and formula/name reference updates pass 12 native cases and four persistence gates; occupied-edge insertion is atomic | Partial-cell reference rewriting, relative name context, merges/shapes, formatting inheritance/CopyOrigin and table/validation/chart metadata updates remain incomplete |
|
|
145
145
|
| Range copying | Explicit-destination copies pass 17 native cases and five persistence gates: overlap, blanks, repeated blocks, formulas, cross-sheet copying and measured formatting | Merged-cell and multi-area copies, destinations larger than 1,048,576 cells, clipboard/paste behavior and full formatting fidelity remain incomplete |
|
|
146
|
-
| Formatting and layout | Cell formats are complete for Font, Interior, Borders, alignment, protection, NumberFormat and ClearFormats: 161 live probes, an Excel-authored workbook read back value for value, the border storage rules, a live gate for model-written formats, and
|
|
146
|
+
| Formatting and layout | Cell formats are complete for Font, Interior, Borders, alignment, protection, NumberFormat and ClearFormats: 161 live probes, an Excel-authored workbook read back value for value, the border storage rules, a live gate for model-written formats, and the stylesheet Excel writes for the same edits, entry for entry. Row heights, column widths and hidden rows and columns follow Excel on a 96-DPI display: 185 live probes, Excel-authored and foreign files read back, the saved XML Excel's, and a live gate. Rows grow with their fonts from a 25,662-row table measured for eleven font families in four styles, beside the Normal font and alone on a row. Row, column and sheet-wide formats follow Excel: 149 live probes, Excel's saved workbook read back, 16 foreign files read and written back as Excel does, the model's saved XML Excel's, and a live gate. Medium, thick and double borders make rows taller as Excel's do, 39 more probes in the same fixture. Data validation reads, adds, changes, deletes and checks rules as Excel does, each rule moving with inserts and deletes, splitting round a delete or a Clear and carried by a copy, over 39 live workbooks and the dataValidations element Excel saves. Named cell styles -- `Range.Style`, `Styles` with `Add` and `Merge`, and the `Style` object's properties, read, set and deleted -- answer as Excel's do over 11,147 live reads and 6,459 more of styles a macro changes, deletes and merges: the 47 built-in styles given to cells in both orders, styles over formats and formats over styles, which cells follow a changed style, Normal's font, protected sheets; the stylesheet Excel writes for them, in the order its tables hold what a session made, under two themes and after a reopen, over 45 saved workbooks, files holding entries nothing uses, entries twice and custom formats out of order among them, and a live gate opens ten of the model's in Excel, which reads them as its own; an edge two cells' styles both draw reads as Excel reads it over 415 pairs | Normal's font size, face, bold, italic and underline, which the sheets' geometry rests on; a style of a workbook that is not the active one, which Excel changes in the active workbook; conditional formatting and page setup; a validation list read from another sheet, which Excel keeps in the worksheet's x14 extension; cell shifts (`Insert`/`Delete` with `Shift`) on sheets with row or column formats; rows mixing fonts from different tables, unmeasured fonts, super/subscript and wrapped or turned text; a thick border along a hidden row; column AutoFit; Normal fonts other than Aptos Narrow 11 and Calibri 11 |
|
|
147
147
|
| Tables and structured references | Power Query reads workbook tables and writes load targets; ListObjects reads a file's tables and makes new ones as Excel does -- headers, generated column names, the header row put in, the name and style -- with ListObject, ListColumns and ListRows answering, and saves them in the parts Excel writes, over 8 live workbooks and 15 live questions; a table read from a file keeps its part until it changes, and whole rows inserted or deleted through it carry it. Structured references are read, spelled, saved and worked out as Excel does over 80 live formulas and a 50-name character sweep: this row, special items, spans, escapes, the table's name left out inside it, a column read as this row's cell where one value is wanted, Range and Evaluate, AutoFill along the columns, and renaming a table or its columns through every formula. The totals row shows and hides as Excel does over 20 live workbooks, with its default label and function, every TotalsCalculation, and labels, SUBTOTALs and formulas written into it. ListRows.Add and Delete, ListColumns.Add and Delete, Resize and Delete, calculated columns, and a table growing over what a macro writes beside it, with the references it stretches, match 28 live workbooks and 21 live writes | Unlist, which turns the table style into cell formats; a copy or fill beside a table, which puts a table row in first; whole columns inserted or deleted through a table; the dxf a calculated column made from one cell brings; and a header holding a carriage return, which VBA reads as a line feed |
|
|
148
148
|
| Formulas and calculation | Cells are worked out by pyOfficeEditor's engine, 493 of Excel's 525 functions, which comes to what Excel cached for all 10,958 formulas of its corpus over the model's workbook; formula parser, dependency invalidation and manual mode exist; a formula's last sum set to zero when it cancels, comparisons to fifteen digits and lookups to the bit follow Excel over 1,788 live pairs of doubles; defined names that stand for a formula work out where they are used, as array formulas; a range or array where one value is wanted is cut to the formula's row or column or run item by item, SUMPRODUCT, INDEX, ROWS and COLUMNS work their arguments out as arrays, and a value where a function reads cells is refused, as 232 live formulas show and as each of the engine's 493 functions measured there does, 15 of them taken; a call with too few or too many arguments, a LET's or a LAMBDA's name that is none, and a formula past Excel's limits on text, brackets, calls, signs and length are refused, over 14,377 live formulas, every function with 25 counts of arguments; a running total 3000 rows down and the deepest formulas Excel takes work out as Excel does; a formula written in the other notation, `Formula = "=R[-1]C+1"` or `FormulaR1C1 = "=A1"`, reads as Excel reads it, over 79 live formulas; LET's and LAMBDA's names, those looking like cells among them, and LAMBDA's optional parameters read, work out and save as Excel's do, over 24 live formulas; a formula written to a General cell takes the number format Excel gives it, over 111 live cases; `FormulaArray`, `HasArray` and `CurrentArray` follow Excel over 78 live cases, array formulas saved and read as Excel does; the range operator, intersections, unions and INDEX, OFFSET, INDIRECT, CHOOSE, IF, IFS, SWITCH and XLOOKUP as references follow Excel over 45 live formulas, and INDEX with one index into rows and columns and a `+` before a reference over 26 more; `Formula2` and `Formula2R1C1` read a legacy formula with Excel's `@` over 2100 live formulas, every function in every way it takes an argument; an `@` or a call of SINGLE written through `Formula`, `Formula2`, `FormulaR1C1` or `Value` is kept, left out, read back and saved as Excel does, over 274 live writes and a saved workbook; dynamic arrays spill, grow, shrink and are #SPILL! where something is in the way, with `HasSpill`, `SpillParent`, `SpillingToRange`, `A1#` and their file format, over 42 live cases, 18 expressions and two saved workbooks | Complete function and argument coverage, spills and structural edits (sort, insert and delete through a spill), copying part of an array formula, relative R1C1 in INDIRECT and unions for functions beyond the aggregates, errors, circular/iterative calculation, cached-value persistence and names with relative references |
|
|
149
149
|
| VBA WorksheetFunction and Evaluate | WorksheetFunction.X and the late-bound Application.X call the cell formula engine for the 388 WorksheetFunction members it has, with arguments, answers and errors converted as 160 live calls made both ways show; Evaluate, `[...]` and Worksheet.Evaluate work out expressions through the same engine as Excel does over 91 live cases: a Range for cells, blocks whole, error values, ROW() as an array of one | The WorksheetFunction members the engine lacks: the cube functions, WEBSERVICE, STOCKHISTORY and the like; the members registered with the engine checked through VBA one by one |
|
|
@@ -152,7 +152,7 @@ entry tracked explicitly.
|
|
|
152
152
|
| Charts | Existing chart parts can be preserved and shapes identified | Audit chart objects, creation, series, axes, formatting, data links and round trips |
|
|
153
153
|
| Pivots, caches and data model | Unmodelled content is preserved in existing files | Inventory and implement headless operations; preservation alone is not runtime support |
|
|
154
154
|
| Power Query | Packaging, M evaluation, local refresh and sheet load targets exist | Complete language/library conformance, data types, errors, query dependency behavior, connectors and refresh settings |
|
|
155
|
-
| Other workbook features | Coverage varies and needs classification; notes, which VBA calls comments, are added, read, edited, moved with their cells, copied and saved as Excel does, over 89 live probes and a saved workbook of every kind of note, its parts written byte for byte | Inventory names, links, threaded comments,
|
|
155
|
+
| Other workbook features | Coverage varies and needs classification; notes, which VBA calls comments, are added, read, edited, moved with their cells, copied and saved as Excel does, over 89 live probes and a saved workbook of every kind of note, its parts written byte for byte. Hyperlinks are added, read, set, taken away, moved, copied, pasted, cut, sorted and saved as Excel does, with the Hyperlink style and the HYPERLINK function's, over 26 sections of live Excel and 21 workbooks it saved, their links, relationships, cell styles and stylesheets matched, and a live gate opens the model's in Excel, which reads them as its own; a part's relationships come in Excel's order, from the hash Office places their ids by, over every count to 160 and 17 larger ones up to 65,530 | Inventory names, links, threaded comments, protection, metadata, embedded objects, connections and remaining reference/file features; a note's box a macro moves or resizes, and notes under Sort and RemoveDuplicates; a hyperlink on a shape, EmailSubject on a link with no address, Follow, a paste of links turned or from several areas, and the relationship order of a part with more than 65,536 |
|
|
156
156
|
| Fidelity and release verification | Offline tests, live gates, language matrix and cross-platform CI exist | Add real-world mixed-feature cases, malformed/foreign-author packages and scale tests; require live evidence for new persisted behavior |
|
|
157
157
|
|
|
158
158
|
## Execution order within Excel
|
|
@@ -720,11 +720,18 @@ What it writes:
|
|
|
720
720
|
`Modules`, a 13-byte `PropData` under it, and the module's stream under
|
|
721
721
|
`VBA` with a row name of 28 random capitals
|
|
722
722
|
* an entry in `Modules/PropData`, the list of those folders:
|
|
723
|
-
`05 09 02 <folder name, one UTF-16 character> "CB0"`, eleven bytes each
|
|
723
|
+
`05 09 02 <folder name, one UTF-16 character> "CB0"`, eleven bytes each.
|
|
724
|
+
The `09` and `02` are sizes, of the rest of the entry and of the name,
|
|
725
|
+
so a two-digit folder is `05 0b 04 "10" "CB0"` (GitHub issue #34).
|
|
726
|
+
*2026-09-27:* Access writes this entry, and the module's
|
|
727
|
+
`MSysNavPaneGroupToObjects` row, the next time it opens the database,
|
|
728
|
+
not when it adds the module, so the library now leaves both to it
|
|
729
|
+
(`tests/live_access_test/first_module_reopened.accdb`)
|
|
724
730
|
* a dir block of eleven records and PROJECTMODULES up by one
|
|
725
731
|
* entries in DirData, PROJECTwm and PROJECT
|
|
726
732
|
* an `MSysObjects` row of type -32761, a `MSysNavPaneObjectIDs` row and a
|
|
727
|
-
`MSysNavPaneGroupToObjects` row in group 8
|
|
733
|
+
`MSysNavPaneGroupToObjects` row in group 8 (the last, since 2026-09-27,
|
|
734
|
+
left to Access, which adds it on its next open)
|
|
728
735
|
* the `Version` word of `_VBA_PROJECT` set to a value VBA does not know
|
|
729
736
|
|
|
730
737
|
It works on the shipped blank template too, which an earlier note had
|
|
@@ -733,6 +740,20 @@ all it needed.
|
|
|
733
740
|
|
|
734
741
|
### Three allocations that are computed, not chosen
|
|
735
742
|
|
|
743
|
+
> **Corrected 2026-09-27.** The folder base of `4` and the id step of four
|
|
744
|
+
> below were measured with Access driven through pyvbaharness, which
|
|
745
|
+
> injects three modules of its own (`PyVbaHarnessRunner`,
|
|
746
|
+
> `PyVbaHarnessCall`, `PyVbaUserCode`) into the project it runs code in.
|
|
747
|
+
> While they exist they hold folders `1`, `2`, `3` and the next three ids,
|
|
748
|
+
> so the module Access added took `4` and an id four higher; the `{0, 5}`
|
|
749
|
+
> case reusing `4` is the same effect. Access driven over COM alone gives
|
|
750
|
+
> the lowest free folder counting from `0` and the next id
|
|
751
|
+
> (`tests/live_access_test/modules_added.accdb`), the library now does
|
|
752
|
+
> the same, and the live gate lists and runs modules in folders `1` and
|
|
753
|
+
> up. The `AllModules(i).Name` failures that seemed to confirm the old
|
|
754
|
+
> rules came from `\x03DirData` naming folder `4` for every module, which
|
|
755
|
+
> was fixed the same day.
|
|
756
|
+
|
|
736
757
|
Both were found the same way -- a created module that the VBE listed and
|
|
737
758
|
ran, while `CurrentProject.AllModules(i).Name` failed with "refers to an
|
|
738
759
|
object that is closed or doesn't exist".
|
|
@@ -743,7 +764,10 @@ not folders>)`. `Modules` holds four such rows -- `PropData`,
|
|
|
743
764
|
`PropDataCopy`, `DirData` and `DirDataCopy` -- so its folders start at
|
|
744
765
|
`4`, which is why the second module in a database gets `4` and never `1`.
|
|
745
766
|
Only the computed name works: on the blank template `1`, `9` and `A` all
|
|
746
|
-
fail while `4` succeeds.
|
|
767
|
+
fail while `4` succeeds. Past `9` the name is the number in decimal,
|
|
768
|
+
`10`, not the character after `9`: Access filled every container of the
|
|
769
|
+
template past folder 9 and named them `10`, `11` and `12` (GitHub issue
|
|
770
|
+
#34, `tests/live_access_test/folders_past_nine.accdb`).
|
|
747
771
|
|
|
748
772
|
Two rules fit the first four measurements and only one fits all six. A
|
|
749
773
|
count, `chr(0x30 + children - 1)`, works while folders stay contiguous.
|
|
@@ -765,6 +789,66 @@ next id: the step is what an object reserves, not a global stride.
|
|
|
765
789
|
|
|
766
790
|
That last line is the whole trick, and it is why the list is short.
|
|
767
791
|
|
|
792
|
+
### The order of `\x03DirData` and `PropData`: an `std::unordered_map`
|
|
793
|
+
|
|
794
|
+
Access does not append a new object's entry. Adding `Macro1` to
|
|
795
|
+
`Macro11` gave `Macro1`, `Macro10`, `Macro2`, `Macro11`, `Macro3` and on
|
|
796
|
+
to `Macro9`, in one session or in eleven. Forms named `Macro1` to
|
|
797
|
+
`Macro11` come out the same way and macros named `Form1` to `Form11` in
|
|
798
|
+
order, so the order follows the names. Adding `Mod2` to `Mod13` one
|
|
799
|
+
session each, with a copy of the file after every session, showed
|
|
800
|
+
entries that the session never touched changing places:
|
|
801
|
+
|
|
802
|
+
```
|
|
803
|
+
after Mod5 Module1 Mod2 Mod3 Mod4 Mod5
|
|
804
|
+
after Mod6 Mod6 Module1 Mod2 Mod3 Mod4 Mod5
|
|
805
|
+
after Mod7 Module1 Mod6 Mod2 Mod3 Mod4 Mod5 Mod7
|
|
806
|
+
after Mod11 Module1 Mod6 Mod11 Mod2 Mod3 Mod4 Mod5 Mod7 Mod8 Mod9 Mod10
|
|
807
|
+
after Mod13 Module1 Mod6 Mod11 Mod2 Mod12 Mod3 Mod13 Mod4 Mod5 Mod7 Mod8 Mod9 Mod10
|
|
808
|
+
```
|
|
809
|
+
|
|
810
|
+
Guessing the hash from orders like these went nowhere, so the answer
|
|
811
|
+
came from `MSACCESS.EXE`. The storage names sit in a table beside a
|
|
812
|
+
stream class whose reader inserts each entry it reads into a container
|
|
813
|
+
that guards itself with "unordered_map/set too long". A container's
|
|
814
|
+
`\x03DirData` is an MSVC `std::unordered_map` keyed by object name, its
|
|
815
|
+
`PropData` folder list another keyed by folder name, and each stream is
|
|
816
|
+
the map's own order. From the code, and checked against every probe:
|
|
817
|
+
|
|
818
|
+
- **The hash** (at `0x14006c060`) is 16 bits: for each character that
|
|
819
|
+
counts, `h = (h << 5) + (h >> 13) + 1 + (c & 0x1f)`. So case does not
|
|
820
|
+
matter and `0` hashes as `P`. A byte table decides what counts among
|
|
821
|
+
ASCII characters: `"`, `'`, `~` and control characters are skipped,
|
|
822
|
+
and a space or tab counts as 0. A leading `.` is skipped. From the
|
|
823
|
+
first character past ASCII, the rest of the name goes through the
|
|
824
|
+
system code page (`WideCharToMultiByte`, no best fit) and
|
|
825
|
+
`LCMapStringA` upper-casing, a byte at a time, every byte above 1
|
|
826
|
+
counting. A Turkish UI turns two bytes into `I`, which is not
|
|
827
|
+
reproduced.
|
|
828
|
+
- **The map** starts with 8 buckets; a key's bucket is `hash & (buckets
|
|
829
|
+
- 1)`. A new key goes in front of the first key of its bucket, or at
|
|
830
|
+
the end when its bucket is empty. An insert that would leave more keys
|
|
831
|
+
than buckets first grows the map to a power of two at least the new
|
|
832
|
+
size, and eightfold while it is under 512 buckets. The rehash walks the
|
|
833
|
+
list and moves each key to the front of its new bucket.
|
|
834
|
+
- **Loading** inserts the stored entries in their order. That is why a
|
|
835
|
+
session reverses some pairs and not others: the ninth entry grows the
|
|
836
|
+
map, so the first eight are reversed twice and the rest once.
|
|
837
|
+
- **Writing** happens only when the map changed. A delete erases; a
|
|
838
|
+
rename erases and inserts, in both lists under `DoCmd.Rename`, while a
|
|
839
|
+
module renamed in the VBE leaves `PropData` alone. A new object's
|
|
840
|
+
`PropData` line waits for the next open, when the missing lines are
|
|
841
|
+
inserted in DirData's order.
|
|
842
|
+
|
|
843
|
+
Checked on 13 histories, every snapshot included: 36 one-character names
|
|
844
|
+
made in one session forwards and backwards and then reopened, `Mod2` to
|
|
845
|
+
`Mod13` one session each, `Macro1` to `Macro11` both ways, the forms and
|
|
846
|
+
reports, `modules_added.accdb` and three small fixtures. Also on a
|
|
847
|
+
delete, two renames, seven names past ASCII and four with skipped
|
|
848
|
+
characters, and on `_container_order.ps1`'s delete and rename of
|
|
849
|
+
modules, a form and a report in copies of `folders_past_nine.accdb`.
|
|
850
|
+
The library writes these orders (`_storage.access_order`).
|
|
851
|
+
|
|
768
852
|
### `_VBA_PROJECT` is a cache, so invalidate it instead of forging it
|
|
769
853
|
|
|
770
854
|
*This is what shipped; see `pyopenvba/access/_vba.py`.*
|