pyOpenVBA 6.1.2__tar.gz → 6.2.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 (236) hide show
  1. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/PKG-INFO +12 -3
  2. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/README.md +11 -2
  3. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/architecture.md +10 -6
  4. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/excel_checklist.csv +72 -7
  5. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/host_completeness.md +3 -3
  6. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/ms-ovba-implementation-guide_v2.md +21 -6
  7. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/vba_runtime.md +182 -8
  8. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/pyproject.toml +1 -1
  9. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/__init__.py +1 -1
  10. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_host.py +42 -10
  11. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_oforms_pages.py +7 -2
  12. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_oforms_records.py +25 -1
  13. pyopenvba-6.2.0/src/pyopenvba/_relationships.py +90 -0
  14. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_autofill.py +1 -0
  15. pyopenvba-6.2.0/src/pyopenvba/apps/excel/_cell_styles.py +1120 -0
  16. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_clipboard.py +25 -0
  17. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_dimensions.py +2 -0
  18. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_editing.py +4 -1
  19. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_formats.py +73 -23
  20. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_formula_format.py +18 -0
  21. pyopenvba-6.2.0/src/pyopenvba/apps/excel/_hyperlinks.py +553 -0
  22. pyopenvba-6.2.0/src/pyopenvba/apps/excel/_hyperlinks_file.py +280 -0
  23. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_io.py +58 -27
  24. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_model.py +113 -0
  25. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_protection.py +7 -1
  26. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_row_formats.py +4 -0
  27. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_sheet_copy.py +5 -1
  28. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_sort.py +5 -0
  29. pyopenvba-6.2.0/src/pyopenvba/apps/excel/_styles.py +1404 -0
  30. pyopenvba-6.2.0/src/pyopenvba/apps/excel/_text_columns.py +428 -0
  31. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_typing.py +233 -69
  32. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/cfb.py +33 -15
  33. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/forms.py +389 -110
  34. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_runtime.py +3 -0
  35. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/vba.py +33 -8
  36. pyopenvba-6.1.2/src/pyopenvba/apps/excel/_styles.py +0 -862
  37. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/.gitignore +0 -0
  38. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/LICENSE.md +0 -0
  39. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/power_query.md +0 -0
  40. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/research/access_complex/README.md +0 -0
  41. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/research/access_designs/README.md +0 -0
  42. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/research/access_macros/README.md +0 -0
  43. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/research/access_write/README.md +0 -0
  44. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/research/pcode/README.md +0 -0
  45. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/docs/roadmap.md +0 -0
  46. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/__main__.py +0 -0
  47. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_a1.py +0 -0
  48. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_deflate.py +0 -0
  49. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_new_project.py +0 -0
  50. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_package_signature.py +0 -0
  51. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_ppt_container.py +0 -0
  52. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_references.py +0 -0
  53. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/__init__.py +0 -0
  54. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_database.accdb +0 -0
  55. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_database_module.accdb +0 -0
  56. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_document.docm +0 -0
  57. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_excel_addin.xlam +0 -0
  58. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_presentation.pptm +0 -0
  59. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsb +0 -0
  60. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsm +0 -0
  61. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/blank_workbook.xlsx +0 -0
  62. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.accdb +0 -0
  63. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/blank_files/engine_skeleton.mdb +0 -0
  64. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/form.blob +0 -0
  65. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/form.lvprop +0 -0
  66. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/form.propdata +0 -0
  67. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/form.prototypes +0 -0
  68. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/form.typeinfo +0 -0
  69. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/report.blob +0 -0
  70. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/report.lvprop +0 -0
  71. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/report.propdata +0 -0
  72. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/report.prototypes +0 -0
  73. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_templates/designs/report.typeinfo +0 -0
  74. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/_xml.py +0 -0
  75. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/__init__.py +0 -0
  76. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_alloc.py +0 -0
  77. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_btree.py +0 -0
  78. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_collation.py +0 -0
  79. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_collation_general_legacy.py +0 -0
  80. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_compact.py +0 -0
  81. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_complex.py +0 -0
  82. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_datapage.py +0 -0
  83. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_ddl.py +0 -0
  84. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_designs.py +0 -0
  85. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_facade.py +0 -0
  86. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_format.py +0 -0
  87. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_index.py +0 -0
  88. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_lval.py +0 -0
  89. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_macros.py +0 -0
  90. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_pages.py +0 -0
  91. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_props.py +0 -0
  92. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_queries.py +0 -0
  93. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_rows.py +0 -0
  94. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_schema.py +0 -0
  95. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_sql.py +0 -0
  96. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_storage.py +0 -0
  97. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_tdef.py +0 -0
  98. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_validate.py +0 -0
  99. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/_vba.py +0 -0
  100. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access/database.py +0 -0
  101. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/access_read.py +0 -0
  102. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/__init__.py +0 -0
  103. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/__init__.py +0 -0
  104. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_arrays.py +0 -0
  105. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_autofilter.py +0 -0
  106. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_bridge.py +0 -0
  107. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_calc.py +0 -0
  108. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_control_refs.py +0 -0
  109. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_controls.py +0 -0
  110. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_copy_names.py +0 -0
  111. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_duplicates.py +0 -0
  112. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_dynamic_file.py +0 -0
  113. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_engine_book.py +0 -0
  114. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_evaluate.py +0 -0
  115. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_events.py +0 -0
  116. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_find.py +0 -0
  117. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_font_rows.py +0 -0
  118. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_merges.py +0 -0
  119. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_named_api.py +0 -0
  120. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_names.py +0 -0
  121. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_notes.py +0 -0
  122. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_notes_file.py +0 -0
  123. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_number_format.py +0 -0
  124. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_radios.py +0 -0
  125. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_refresh.py +0 -0
  126. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_region.py +0 -0
  127. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_shape_api.py +0 -0
  128. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_shapes.py +0 -0
  129. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_shared.py +0 -0
  130. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_sheet_move.py +0 -0
  131. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_special_cells.py +0 -0
  132. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_spills.py +0 -0
  133. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_table_edits.py +0 -0
  134. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_tables.py +0 -0
  135. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_validation.py +0 -0
  136. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_visible.py +0 -0
  137. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_windows.py +0 -0
  138. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/excel/_worksheet_functions.py +0 -0
  139. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/powerpoint/__init__.py +0 -0
  140. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/powerpoint/_bridge.py +0 -0
  141. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/powerpoint/_io.py +0 -0
  142. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/powerpoint/_model.py +0 -0
  143. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/word/__init__.py +0 -0
  144. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/word/_bridge.py +0 -0
  145. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/word/_io.py +0 -0
  146. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/apps/word/_model.py +0 -0
  147. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/excel.py +0 -0
  148. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/exceptions.py +0 -0
  149. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/__init__.py +0 -0
  150. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_arity.py +0 -0
  151. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/__init__.py +0 -0
  152. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/catalog.py +0 -0
  153. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/cells.py +0 -0
  154. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/collate.py +0 -0
  155. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/dates.py +0 -0
  156. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/evaluator.py +0 -0
  157. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/__init__.py +0 -0
  158. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/aggregate.py +0 -0
  159. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/arithmetic.py +0 -0
  160. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/arrays.py +0 -0
  161. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/common.py +0 -0
  162. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/conditional.py +0 -0
  163. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/database.py +0 -0
  164. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/dates.py +0 -0
  165. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/distributions.py +0 -0
  166. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/engineering.py +0 -0
  167. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/financial.py +0 -0
  168. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/information.py +0 -0
  169. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/lambdas.py +0 -0
  170. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/logical.py +0 -0
  171. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/lookup.py +0 -0
  172. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/matrix.py +0 -0
  173. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/statistics.py +0 -0
  174. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/subtotal.py +0 -0
  175. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/functions/text.py +0 -0
  176. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/host.py +0 -0
  177. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/lexer.py +0 -0
  178. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/nodes.py +0 -0
  179. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/numbers.py +0 -0
  180. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/parser.py +0 -0
  181. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/precise.py +0 -0
  182. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/reference.py +0 -0
  183. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/registry.py +0 -0
  184. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/special.py +0 -0
  185. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_calc/values.py +0 -0
  186. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_deep.py +0 -0
  187. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_display.py +0 -0
  188. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_formula2.py +0 -0
  189. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_inventory.py +0 -0
  190. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_parse.py +0 -0
  191. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_prefixes.py +0 -0
  192. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_r1c1.py +0 -0
  193. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_spell.py +0 -0
  194. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_structured.py +0 -0
  195. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/formula/_values.py +0 -0
  196. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/__init__.py +0 -0
  197. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_ast.py +0 -0
  198. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_constants_data.py +0 -0
  199. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_intrinsics.py +0 -0
  200. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_inventory.py +0 -0
  201. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_inventory_data.py +0 -0
  202. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_lex.py +0 -0
  203. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_objects.py +0 -0
  204. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_parse.py +0 -0
  205. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_preprocess.py +0 -0
  206. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_scripting.py +0 -0
  207. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/interpreter/_values.py +0 -0
  208. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/__init__.py +0 -0
  209. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_eval.py +0 -0
  210. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_inventory.py +0 -0
  211. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_inventory_data.py +0 -0
  212. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_library.py +0 -0
  213. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_parse.py +0 -0
  214. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/mlang/_values.py +0 -0
  215. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerpoint.py +0 -0
  216. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/__init__.py +0 -0
  217. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_binary.py +0 -0
  218. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_files.py +0 -0
  219. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_mashup.py +0 -0
  220. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_metadata.py +0 -0
  221. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_opc.py +0 -0
  222. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_package.py +0 -0
  223. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_refresh.py +0 -0
  224. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_section.py +0 -0
  225. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/_sheets.py +0 -0
  226. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/powerquery/workbook.py +0 -0
  227. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/__init__.py +0 -0
  228. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_docx.py +0 -0
  229. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_docx_text.py +0 -0
  230. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_drawingml.py +0 -0
  231. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_pptx.py +0 -0
  232. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_values.py +0 -0
  233. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/shapes/_xlsx.py +0 -0
  234. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/vba_pcode.py +0 -0
  235. {pyopenvba-6.1.2 → pyopenvba-6.2.0}/src/pyopenvba/word.py +0 -0
  236. {pyopenvba-6.1.2 → pyopenvba-6.2.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.2
3
+ Version: 6.2.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
@@ -262,6 +262,9 @@ with ExcelFile("workbook.xlsm") as wb:
262
262
  wb.save("out.xlsm")
263
263
  ```
264
264
 
265
+ Deleting a UserForm's module takes the form's design with it, as the
266
+ editor does.
267
+
265
268
  ```python
266
269
  from pyopenvba import AccessDatabase, VBAModuleKind
267
270
 
@@ -380,7 +383,10 @@ None)` clears a property, so the control goes back to its default.
380
383
  MSForms stores a property only when it differs from the control's
381
384
  default, so `properties()` returns what the developer set, which no live
382
385
  host can tell you. Writing is lossless: an unedited form saves back byte
383
- for byte.
386
+ for byte. The stored fields are not always named as VBA names them:
387
+ [docs/userforms.md](docs/userforms.md) says where the designers store a
388
+ property that differs, such as `TextAlign`, and what setting one changes
389
+ besides.
384
390
 
385
391
  The command line shows the tree:
386
392
 
@@ -740,7 +746,9 @@ it, and a save adds only the stylesheet entries the file lacks, spelled
740
746
  as Excel spells them. Formatting whole rows, whole columns or the whole
741
747
  sheet keeps the row, column and sheet formats Excel keeps, with the
742
748
  cells Excel makes where they cross, and saves them as Excel does. Named
743
- 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.
744
752
 
745
753
  Row heights, column widths and hidden rows and columns behave as they do
746
754
  in Excel on a 96-DPI display, the one the model emulates: `RowHeight = 20`
@@ -1049,6 +1057,7 @@ For more:
1049
1057
  - [docs/architecture.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/architecture.md): internal layout and conventions.
1050
1058
  - [docs/access_engine.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/access_engine.md): the Access file format as measured, and what the engine reproduces.
1051
1059
  - [docs/power_query.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/power_query.md): how Excel stores Power Query, and how each rule was measured.
1060
+ - [docs/userforms.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/userforms.md): where the form designers store the UserForm properties VBA names otherwise, as measured.
1052
1061
  - [docs/ms-ovba-implementation-guide_v2.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/ms-ovba-implementation-guide_v2.md): a language-agnostic guide to re-implementing MS-OVBA.
1053
1062
  - [docs/roadmap.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/roadmap.md): per-feature status.
1054
1063
  - [docs/host_completeness.md](docs/host_completeness.md): whole-host completion criteria and the Excel coverage audit; Excel, then Word, then PowerPoint.
@@ -225,6 +225,9 @@ with ExcelFile("workbook.xlsm") as wb:
225
225
  wb.save("out.xlsm")
226
226
  ```
227
227
 
228
+ Deleting a UserForm's module takes the form's design with it, as the
229
+ editor does.
230
+
228
231
  ```python
229
232
  from pyopenvba import AccessDatabase, VBAModuleKind
230
233
 
@@ -343,7 +346,10 @@ None)` clears a property, so the control goes back to its default.
343
346
  MSForms stores a property only when it differs from the control's
344
347
  default, so `properties()` returns what the developer set, which no live
345
348
  host can tell you. Writing is lossless: an unedited form saves back byte
346
- for byte.
349
+ for byte. The stored fields are not always named as VBA names them:
350
+ [docs/userforms.md](docs/userforms.md) says where the designers store a
351
+ property that differs, such as `TextAlign`, and what setting one changes
352
+ besides.
347
353
 
348
354
  The command line shows the tree:
349
355
 
@@ -703,7 +709,9 @@ it, and a save adds only the stylesheet entries the file lacks, spelled
703
709
  as Excel spells them. Formatting whole rows, whole columns or the whole
704
710
  sheet keeps the row, column and sheet formats Excel keeps, with the
705
711
  cells Excel makes where they cross, and saves them as Excel does. Named
706
- 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.
707
715
 
708
716
  Row heights, column widths and hidden rows and columns behave as they do
709
717
  in Excel on a 96-DPI display, the one the model emulates: `RowHeight = 20`
@@ -1012,6 +1020,7 @@ For more:
1012
1020
  - [docs/architecture.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/architecture.md): internal layout and conventions.
1013
1021
  - [docs/access_engine.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/access_engine.md): the Access file format as measured, and what the engine reproduces.
1014
1022
  - [docs/power_query.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/power_query.md): how Excel stores Power Query, and how each rule was measured.
1023
+ - [docs/userforms.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/userforms.md): where the form designers store the UserForm properties VBA names otherwise, as measured.
1015
1024
  - [docs/ms-ovba-implementation-guide_v2.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/ms-ovba-implementation-guide_v2.md): a language-agnostic guide to re-implementing MS-OVBA.
1016
1025
  - [docs/roadmap.md](https://github.com/WilliamSmithEdward/pyOpenVBA/blob/main/docs/roadmap.md): per-feature status.
1017
1026
  - [docs/host_completeness.md](docs/host_completeness.md): whole-host completion criteria and the Excel coverage audit; Excel, then Word, then PowerPoint.
@@ -345,12 +345,16 @@ written one needs (`scripts/measure_first_macro.py`).
345
345
 
346
346
  ## 5a. UserForm designer streams
347
347
 
348
- A form's design lives beside the VBA storage, not inside it: a root
349
- storage named for the form, holding `f` (the sites: which controls, in
350
- what order), `o` (each control's own property record), and the
351
- `VBFrame` text. Containers nest into storages of their own, named
352
- for the site id -- a `Frame`'s children in `i02`, a `MultiPage`'s Pages
353
- in `i08` / `i09` under its own `i06`.
348
+ A form's design lives beside the VBA storage, not inside it: a storage
349
+ named for the form in the project's storage, holding `f` (the sites:
350
+ which controls, in what order), `o` (each control's own property
351
+ record), and the `VBFrame` text. Containers nest into storages of their
352
+ own, named for the site id -- a `Frame`'s children in `i02`, a
353
+ `MultiPage`'s Pages in `i08` / `i09` under its own `i06`. The project's
354
+ storage is the root of `vbaProject.bin` and of a `.ppt`'s embedded
355
+ project, and `_VBA_PROJECT_CUR` or `Macros` in a `.xls` or `.doc`, which
356
+ hold the document too (`VBAHostFile._project_root`,
357
+ tests/fixtures/binary_forms.json).
354
358
 
355
359
  `forms.py` reads that tree and writes it back; `_oforms_records.py`
356
360
  carries one property table per control class. It never guesses: every
@@ -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
@@ -466,6 +466,7 @@ Document=ThisWorkbook/&H00000000
466
466
  Document=Sheet1/&H00000000
467
467
  Module=Module1
468
468
  Class=Class1
469
+ Package={AC9F2F90-E877-11CE-9F68-00AA00574A4F}
469
470
  BaseClass=UserForm1
470
471
  Name="VBAProject"
471
472
  HelpContextID="0"
@@ -497,6 +498,15 @@ entries together. Do not create `Document=` lines (host-owned). Do
497
498
  not create `BaseClass=` lines unless you also emit a designer
498
499
  sub-storage.
499
500
 
501
+ The editor writes `Package={AC9F2F90-E877-11CE-9F68-00AA00574A4F}`,
502
+ the Forms designer's package, once: immediately before the
503
+ `BaseClass=` line of a form added to a stream that has no such line.
504
+ It never moves or removes the line afterwards, even when the last
505
+ form goes, and a declaration added later goes after it as after any
506
+ other. A project that declares a form without the line gets it only
507
+ with its next new form. Keep every line a mutation does not touch
508
+ byte for byte; a `[Workspace]` value can end in a space.
509
+
500
510
  ---
501
511
 
502
512
  ## 9. The `PROJECTwm` stream
@@ -530,17 +540,20 @@ deprecated control surface.
530
540
 
531
541
  ## 11. UserForms / designer storages
532
542
 
533
- For each `BaseClass=` module there is a **sub-storage** at the CFB root
534
- with the same name as the module. It contains designer streams:
543
+ For each `BaseClass=` module there is a **sub-storage** in the project's
544
+ storage, beside `/VBA`, with the same name as the module: at the CFB
545
+ root of `vbaProject.bin`, in `_VBA_PROJECT_CUR` in a `.xls` and in
546
+ `Macros` in a `.doc`. It contains designer streams:
535
547
  typically `f`, `o`, `\x01CompObj`, `\x03VBFrame`, and sometimes more.
536
548
 
537
549
  Editing the **code-behind** of a UserForm is identical to editing any
538
550
  other module's source: the form's *code* lives in `/VBA/<FormName>` and
539
551
  is round-tripped through the same compressed-source pipeline.
540
552
 
541
- Editing the **layout** (controls, properties, positions) requires the
542
- Office Forms binary format and is out of scope for v1. Preserve the
543
- designer sub-storage byte-for-byte.
553
+ Editing the **layout** (controls, properties, positions) means writing
554
+ the Office Forms binary format, [MS-OFORMS]. pyOpenVBA reads and writes
555
+ it in `forms.py` (docs/architecture.md, section 5a). A writer that does
556
+ not must preserve the designer sub-storage byte for byte.
544
557
 
545
558
  ---
546
559
 
@@ -726,10 +739,12 @@ For each operation, every step must succeed or you must abort.
726
739
  | Drop declaration line | `PROJECT` |
727
740
  | Drop `[Workspace]` entry | `PROJECT` |
728
741
  | Drop NAMEMAP pair | `PROJECTwm` |
742
+ | Remove a form's designer sub-storage | beside `/VBA` |
729
743
  | Invalidate + drop SRP + signatures | as above |
730
744
 
731
745
  Forbidden: deleting `Document=` modules (host-owned), deleting
732
- designer modules without also removing their sub-storage.
746
+ designer modules without also removing their sub-storage. The
747
+ `Package=` line stays when the last form goes.
733
748
 
734
749
  ---
735
750