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.
Files changed (238) hide show
  1. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/PKG-INFO +16 -2
  2. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/README.md +15 -1
  3. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/architecture.md +11 -9
  4. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/excel_checklist.csv +72 -7
  5. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/host_completeness.md +3 -3
  6. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_write/README.md +87 -3
  7. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/vba_runtime.md +182 -8
  8. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/pyproject.toml +1 -1
  9. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/__init__.py +1 -1
  10. pyopenvba-6.3.0/src/pyopenvba/_relationships.py +90 -0
  11. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_designs.py +131 -8
  12. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_macros.py +1 -3
  13. pyopenvba-6.3.0/src/pyopenvba/access/_storage.py +238 -0
  14. pyopenvba-6.3.0/src/pyopenvba/access/_themes.py +200 -0
  15. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_vba.py +200 -20
  16. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/database.py +398 -135
  17. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access_read.py +253 -731
  18. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_autofill.py +1 -0
  19. pyopenvba-6.3.0/src/pyopenvba/apps/excel/_cell_styles.py +1120 -0
  20. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_clipboard.py +25 -0
  21. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_dimensions.py +2 -0
  22. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_editing.py +4 -1
  23. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_formats.py +73 -23
  24. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_formula_format.py +18 -0
  25. pyopenvba-6.3.0/src/pyopenvba/apps/excel/_hyperlinks.py +553 -0
  26. pyopenvba-6.3.0/src/pyopenvba/apps/excel/_hyperlinks_file.py +280 -0
  27. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_io.py +58 -27
  28. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_model.py +113 -0
  29. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_protection.py +7 -1
  30. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_row_formats.py +4 -0
  31. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sheet_copy.py +5 -1
  32. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sort.py +5 -0
  33. pyopenvba-6.3.0/src/pyopenvba/apps/excel/_styles.py +1404 -0
  34. pyopenvba-6.3.0/src/pyopenvba/apps/excel/_text_columns.py +428 -0
  35. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_typing.py +233 -69
  36. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_runtime.py +3 -0
  37. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/vba.py +38 -73
  38. pyopenvba-6.1.3/src/pyopenvba/_templates/designs/form.propdata +0 -0
  39. pyopenvba-6.1.3/src/pyopenvba/_templates/designs/report.propdata +0 -0
  40. pyopenvba-6.1.3/src/pyopenvba/access/_storage.py +0 -119
  41. pyopenvba-6.1.3/src/pyopenvba/apps/excel/_styles.py +0 -862
  42. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/.gitignore +0 -0
  43. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/LICENSE.md +0 -0
  44. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/ms-ovba-implementation-guide_v2.md +0 -0
  45. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/power_query.md +0 -0
  46. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_complex/README.md +0 -0
  47. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_designs/README.md +0 -0
  48. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/access_macros/README.md +0 -0
  49. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/research/pcode/README.md +0 -0
  50. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/docs/roadmap.md +0 -0
  51. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/__main__.py +0 -0
  52. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_a1.py +0 -0
  53. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_deflate.py +0 -0
  54. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_host.py +0 -0
  55. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_new_project.py +0 -0
  56. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_oforms_pages.py +0 -0
  57. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_oforms_records.py +0 -0
  58. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_package_signature.py +0 -0
  59. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_ppt_container.py +0 -0
  60. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_references.py +0 -0
  61. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/__init__.py +0 -0
  62. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_database.accdb +0 -0
  63. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_database_module.accdb +0 -0
  64. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_document.docm +0 -0
  65. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_excel_addin.xlam +0 -0
  66. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_presentation.pptm +0 -0
  67. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsb +0 -0
  68. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsm +0 -0
  69. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsx +0 -0
  70. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.accdb +0 -0
  71. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.mdb +0 -0
  72. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.blob +0 -0
  73. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.lvprop +0 -0
  74. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.prototypes +0 -0
  75. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/form.typeinfo +0 -0
  76. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.blob +0 -0
  77. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.lvprop +0 -0
  78. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.prototypes +0 -0
  79. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_templates/designs/report.typeinfo +0 -0
  80. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/_xml.py +0 -0
  81. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/__init__.py +0 -0
  82. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_alloc.py +0 -0
  83. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_btree.py +0 -0
  84. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_collation.py +0 -0
  85. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_collation_general_legacy.py +0 -0
  86. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_compact.py +0 -0
  87. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_complex.py +0 -0
  88. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_datapage.py +0 -0
  89. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_ddl.py +0 -0
  90. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_facade.py +0 -0
  91. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_format.py +0 -0
  92. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_index.py +0 -0
  93. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_lval.py +0 -0
  94. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_pages.py +0 -0
  95. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_props.py +0 -0
  96. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_queries.py +0 -0
  97. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_rows.py +0 -0
  98. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_schema.py +0 -0
  99. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_sql.py +0 -0
  100. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_tdef.py +0 -0
  101. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/access/_validate.py +0 -0
  102. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/__init__.py +0 -0
  103. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/__init__.py +0 -0
  104. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_arrays.py +0 -0
  105. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_autofilter.py +0 -0
  106. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_bridge.py +0 -0
  107. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_calc.py +0 -0
  108. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_control_refs.py +0 -0
  109. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_controls.py +0 -0
  110. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_copy_names.py +0 -0
  111. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_duplicates.py +0 -0
  112. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_dynamic_file.py +0 -0
  113. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_engine_book.py +0 -0
  114. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_evaluate.py +0 -0
  115. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_events.py +0 -0
  116. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_find.py +0 -0
  117. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_font_rows.py +0 -0
  118. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_merges.py +0 -0
  119. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_named_api.py +0 -0
  120. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_names.py +0 -0
  121. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_notes.py +0 -0
  122. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_notes_file.py +0 -0
  123. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_number_format.py +0 -0
  124. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_radios.py +0 -0
  125. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_refresh.py +0 -0
  126. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_region.py +0 -0
  127. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shape_api.py +0 -0
  128. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shapes.py +0 -0
  129. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_shared.py +0 -0
  130. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_sheet_move.py +0 -0
  131. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_special_cells.py +0 -0
  132. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_spills.py +0 -0
  133. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_table_edits.py +0 -0
  134. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_tables.py +0 -0
  135. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_validation.py +0 -0
  136. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_visible.py +0 -0
  137. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_windows.py +0 -0
  138. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/excel/_worksheet_functions.py +0 -0
  139. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/__init__.py +0 -0
  140. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_bridge.py +0 -0
  141. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_io.py +0 -0
  142. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/powerpoint/_model.py +0 -0
  143. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/__init__.py +0 -0
  144. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_bridge.py +0 -0
  145. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_io.py +0 -0
  146. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/apps/word/_model.py +0 -0
  147. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/cfb.py +0 -0
  148. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/excel.py +0 -0
  149. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/exceptions.py +0 -0
  150. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/forms.py +0 -0
  151. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/__init__.py +0 -0
  152. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_arity.py +0 -0
  153. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/__init__.py +0 -0
  154. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/catalog.py +0 -0
  155. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/cells.py +0 -0
  156. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/collate.py +0 -0
  157. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/dates.py +0 -0
  158. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/evaluator.py +0 -0
  159. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/__init__.py +0 -0
  160. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/aggregate.py +0 -0
  161. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/arithmetic.py +0 -0
  162. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/arrays.py +0 -0
  163. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/common.py +0 -0
  164. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/conditional.py +0 -0
  165. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/database.py +0 -0
  166. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/dates.py +0 -0
  167. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/distributions.py +0 -0
  168. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/engineering.py +0 -0
  169. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/financial.py +0 -0
  170. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/information.py +0 -0
  171. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/lambdas.py +0 -0
  172. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/logical.py +0 -0
  173. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/lookup.py +0 -0
  174. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/matrix.py +0 -0
  175. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/statistics.py +0 -0
  176. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/subtotal.py +0 -0
  177. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/functions/text.py +0 -0
  178. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/host.py +0 -0
  179. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/lexer.py +0 -0
  180. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/nodes.py +0 -0
  181. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/numbers.py +0 -0
  182. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/parser.py +0 -0
  183. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/precise.py +0 -0
  184. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/reference.py +0 -0
  185. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/registry.py +0 -0
  186. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/special.py +0 -0
  187. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_calc/values.py +0 -0
  188. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_deep.py +0 -0
  189. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_display.py +0 -0
  190. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_formula2.py +0 -0
  191. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_inventory.py +0 -0
  192. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_parse.py +0 -0
  193. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_prefixes.py +0 -0
  194. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_r1c1.py +0 -0
  195. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_spell.py +0 -0
  196. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_structured.py +0 -0
  197. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/formula/_values.py +0 -0
  198. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/__init__.py +0 -0
  199. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_ast.py +0 -0
  200. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_constants_data.py +0 -0
  201. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_intrinsics.py +0 -0
  202. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_inventory.py +0 -0
  203. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_inventory_data.py +0 -0
  204. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_lex.py +0 -0
  205. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_objects.py +0 -0
  206. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_parse.py +0 -0
  207. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_preprocess.py +0 -0
  208. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_scripting.py +0 -0
  209. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/interpreter/_values.py +0 -0
  210. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/__init__.py +0 -0
  211. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_eval.py +0 -0
  212. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_inventory.py +0 -0
  213. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_inventory_data.py +0 -0
  214. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_library.py +0 -0
  215. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_parse.py +0 -0
  216. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/mlang/_values.py +0 -0
  217. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerpoint.py +0 -0
  218. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/__init__.py +0 -0
  219. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_binary.py +0 -0
  220. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_files.py +0 -0
  221. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_mashup.py +0 -0
  222. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_metadata.py +0 -0
  223. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_opc.py +0 -0
  224. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_package.py +0 -0
  225. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_refresh.py +0 -0
  226. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_section.py +0 -0
  227. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/_sheets.py +0 -0
  228. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/powerquery/workbook.py +0 -0
  229. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/__init__.py +0 -0
  230. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_docx.py +0 -0
  231. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_docx_text.py +0 -0
  232. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_drawingml.py +0 -0
  233. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_pptx.py +0 -0
  234. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_values.py +0 -0
  235. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/shapes/_xlsx.py +0 -0
  236. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/vba_pcode.py +0 -0
  237. {pyopenvba-6.1.3 → pyopenvba-6.3.0}/src/pyopenvba/word.py +0 -0
  238. {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.1.3
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 and conditional formats are not implemented yet.
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 and conditional formats are not implemented yet.
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
- `module_names()`, `get_module()`, `set_module()`, `vba_project()` with
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: a page scanner that finds the MS-OVBA
250
- blobs by signature and decodes `MSysObjects` on its own. It keeps its
251
- read API (`get_module`, `vba_modules`, `read_project_info`, `identifiers`,
252
- `disassemble_module`, the catalog readers, `pull_modules`) and
253
- `pull_access` still uses it; it writes nothing. The chronicle of the
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: page walk,
492
- LVAL chain walk, MS-OVBA blob decode,
493
- byte-for-byte oracle parity (EXPERIMENTAL)
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,,MISSING,,
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(),,MISSING,,
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,,MISSING,,
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,,MISSING,,
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",,MISSING,,
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,,MISSING,,
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,,MISSING,,
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 3,947 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; 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); audit insertion, deletion, copying, sorting and filtering |
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 a stylesheet Excel's for the same edits except one font-order quirk. 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`), 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 |
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, hyperlinks, 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 |
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`.*