LinelistSpecs

Facade over the designer workbook. Before Prepare it answers the designer's own specifications. After Prepare it is also the handle on the domain managers that live on the generated linelist. Callers build one through LinelistSpecs.Create(workbook). Value reads one specification cell, Categories answers the choice categories of a variable, Prepare creates the output workbook and points the managers at it, LLWorkbook answers that workbook and ReleaseLLWorkbook lets it go. ResetCaches drops the loaded managers, and entries filed along the way leave through HasCheckings and CheckingValues.

WHICH WORKBOOK EACH COLLABORATOR POINTS AT

The type of a member says nothing about this, so the table is the contract.

dictionary, choices, exports, ana Linelist. Prepare sets them from InitTransfer. Reading one earlier raises and names Prepare. geo, passwords, translations Designer until Prepare runs, linelist afterwards. Prepare overwrites them. format, formulaData Designer, loaded on first read. Value, HasTemplate, DesWorkbook Designer. TemporarySheetName A constant table, backed by no sheet.

The four names on the first row had designer-side loaders until 2026-07-30. RequiredSheetNames() stopped asking for those four worksheets when the transfer began importing them straight from the setup file. They are guards now.

Depends on: LLdictionary, LLChoices, LLTranslation, LLGeo, LLExport, Analysis, Passwords, LLFormat, FormulaData, LLVariables, Formulas, InitTransfer, TemporaryRepos, ApplicationState, TranslationObject, HiddenNames, Checking, BetterArray

Version: 1.2 (2026-07-30)

Factory helpers

Create #

create

Create a new specification facade from a workbook

Signature:

Public Function Create(ByVal specsWorkbook As Workbook) As LinelistSpecs

Construction and identity accessors.

Validates the workbook structure upfront (checking for all required worksheets and named ranges), then constructs a new LinelistSpecs instance with caches initialised. Returns the LinelistSpecs interface.

Parameters:

  • specsWorkbook: Workbook. The specifications workbook to wrap.

Returns: LinelistSpecs. A fully initialised facade ready for use.

Throws:

  • ProjectError.ObjectNotInitialized When specsWorkbook is Nothing.
  • ProjectError.ElementNotFound When required worksheets are missing.

DesWorkbook #

des-workbook

Designer workbook backing all specification queries

Signature:

Public Property Get DesWorkbook() As Workbook

Returns the designer/specifications workbook reference. Raises an error if the workbook has not been assigned via the factory method.

Returns: Workbook. The designer workbook.

Throws:

  • ProjectError.ObjectNotInitialized When the workbook is not set.

Prepared #

prepared

Whether Prepare has run on this instance

Signature:

Public Property Get Prepared() As Boolean

Prepare imports the setup workbook into the linelist and points the collaborators at it. Linelist refuses to build until that has happened, and this is the flag it reads.

Returns: Boolean. True once Prepare has completed.


State management

ResetCaches #

reset-caches

Reset every cached collaborator

Signature:

Public Sub ResetCaches()

Cache invalidation for collaborator objects, translations, and categories.

Clears all cached collaborator objects, the translation scope cache, and the category cache. Call after importing new data so subsequent reads query the workbook again.


Category helpers

Categories #

categories

Resolve category values for a variable with caching

Signature:

Public Function Categories(ByVal varName As String, Optional ByVal useShortlabels As Boolean = False) As BetterArray

Category resolution and caching for choice-type variables.

Returns the list of category values for a choice-type variable (choice_manual, choice_multiple, choice_custom, or choice_formula). Results are cached using parallel key/value BetterArrays for efficient repeated access. Always returns a cloned BetterArray to prevent callers from modifying the cached copy.

Parameters:

  • varName: String. The variable name whose categories to resolve.
  • useShortlabels: Boolean. When True, returns short labels. Defaults to False.

Returns: BetterArray. Cloned list of category values.

Throws:

  • ProjectError.InvalidArgument When varName is empty.
  • ProjectError.ElementNotFound When the variable has no selectable categories.

Core accessors

Dictionary #

dictionary

Linelist dictionary

Signature:

Public Property Get Dictionary() As LLdictionary

Public property accessors for each collaborator object, exposing the lazy-loaded instances through their respective interfaces.

The LLdictionary instance over the Dictionary worksheet of the LINELIST workbook. Prepare sets it from InitTransfer.

Returns: LLdictionary. The dictionary collaborator.

Throws:

  • ProjectError.ErrorUnexpectedState When Prepare has not run.

Choices #

choices

Choices catalogue

Signature:

Public Property Get Choices() As LLChoices

The LLChoices instance over the Choices worksheet of the LINELIST workbook. Prepare sets it from InitTransfer.

Returns: LLChoices. The choices collaborator.

Throws:

  • ProjectError.ErrorUnexpectedState When Prepare has not run.

DesignFormat #

design-format

Visual formatting specifications

Signature:

Public Property Get DesignFormat() As LLFormat

Returns the LLFormat instance providing sheet and cell formatting methods based on the __formatter worksheet. Lazy-loaded on first access.

Returns: LLFormat. The format collaborator.


AnalysisObject #

analysis

Analysis setup specifications

Signature:

Public Property Get AnalysisObject() As Analysis

The Analysis instance over the Analysis worksheet of the LINELIST workbook. Prepare sets it from InitTransfer.

Returns: Analysis. The analysis collaborator.

Throws:

  • ProjectError.ErrorUnexpectedState When Prepare has not run.

ExportObject #

export-object

Export column specifications

Signature:

Public Property Get ExportObject() As LLExport

The LLExport instance over the Exports worksheet of the LINELIST workbook. Prepare sets it from InitTransfer.

Returns: LLExport. The export collaborator.

Throws:

  • ProjectError.ErrorUnexpectedState When Prepare has not run.

Password #

password

Password manager

Signature:

Public Property Get Password() As Passwords

Returns the Passwords instance providing workbook and sheet protection utilities from the __pass worksheet. Lazy-loaded on first access.

Returns: Passwords. The password collaborator.


GeoObject #

geo-object

Geographic data manager

Signature:

Public Property Get GeoObject() As LLGeo

Returns the LLGeo instance providing geographic hierarchy lookups from the Geo worksheet. Lazy-loaded on first access.

Returns: LLGeo. The geo collaborator.


FormulaDataObject #

formula-data-object

Formula data provider

Signature:

Public Property Get FormulaDataObject() As FormulaData

Returns the FormulaData instance providing formula parsing support from the __formula worksheet. Lazy-loaded on first access.

Returns: FormulaData. The formula data collaborator.


HasTemplate #

has-template

Whether the workbook uses a ribbon template

Signature:

Public Property Get HasTemplate() As Boolean

Reads the RNG_LLTemp named range on the designer's Main worksheet and answers True when it holds anything. An absent range answers False.

Returns: Boolean. True when a template is configured.


Translations #

translations

Translation tables manager

Signature:

Public Property Get Translations() As LLTranslation

Returns the LLTranslation instance providing access to the linelist translation worksheet. Lazy-loaded on first access.

Returns: LLTranslation. The translations collaborator.


TransObject #

trans-object

Scoped translation object

Signature:

Public Property Get TransObject(Optional ByVal scopeValue As Byte = TranslationOfMessages) As TranslationObject

Returns an TranslationObject for the requested translation scope. Results are cached per scope using direct fields for each TranslationScope value (0-4), avoiding generic container overhead.

Parameters:

  • translationScope: Byte. The translation scope constant (e.g., TranslationOfMessages, TranslationOfDictionary). Defaults to TranslationOfMessages.

Returns: TranslationObject. The scoped translation object.

Throws:

  • ProjectError.ElementNotFound When the scope is not available.

TemporarySheetName #

temporary-sheet-name

Temporary sheet name for a given scope

Signature:

Public Property Get TemporarySheetName(ByVal scope As Byte) As String

Returns the fixed worksheet name used for temporary internal sheets, mapped from the TempSheetScope enum (TempSheetAnalysis, TempSheetList, etc.) to its canonical name string.

Parameters:

  • scope: Byte. A TempSheetScope enum value.

Returns: String. The worksheet name string.

Throws:

  • ProjectError.InvalidArgument When the scope is not recognised.

Value #

value

Configuration value by tag name

Signature:

Public Property Get Value(ByVal tagName As String) As String

Answers one configuration value the user typed into the designer's Main worksheet. Most tags name a range on that worksheet; two read a hidden name on the designer workbook, and one counts the exports.

A tag this class does not know raises. It used to answer an empty string, and that is what hid the debugging password fault for weeks: the tag table asked for a range name that exists nowhere, the read failed under On Error Resume Next, and every generated linelist got an empty password with nothing said.

A tag the class knows whose RANGE is absent still answers an empty string. That is a designer the user has yet to fill in, and Prepare's caller validates the two values that have to be there.

Parameters:

  • tagName: String. The configuration key to look up.

Returns: String. The configuration value, or an empty string for an empty tag.

Throws:

  • ProjectError.InvalidArgument When the tag is unknown to this class.

Workbook orchestration

Prepare #

prepare

Prepare all specifications from the setup file and the designer

Signature:

Public Sub Prepare(ByVal setupPath As String)

Lifecycle methods for importing, preparing, exporting, and error-managing the specifications workbook.

Runs the whole preparation:

  1. Creates a temporary repository for working files.
  2. Creates the output workbook, from the template when one is configured.
  3. Hands the setup path and that workbook to InitTransfer, which fills it with the pass-through components taken straight from the setup, the designer-sourced ones (geo, passwords, translations, formatter, language hidden names), and the setup translation table.
  4. Builds the domain managers on the linelist workbook, which is what points the four pass-through collaborators at the linelist.
  5. Imports the geobase the user asked for.
  6. Prepares the dictionary with the preserved sheet names.
  7. Adds the "list auto" column when the dictionary has none.
  8. Translates and sorts the collaborators.
  9. Writes the debugging password into the linelist.

A failure anywhere closes the output workbook, drops the temporary repository and restores the application state, then re-raises. The caller creates its Linelist after this returns, so a Prepare that leaked left an orphaned workbook open and temporary files on disk every time.

The setup path is checked before any of that runs. The check InitTransfer does is the same one, and it is the one that matters, but by the time it runs a temporary folder and a workbook already exist.

Parameters:

  • setupPath: String. Full path to the setup workbook.

Throws:

  • ProjectError.ObjectNotInitialized When setupPath is empty.
  • ProjectError.ErrorUnexpectedState When an unexpected error occurs.

LLWorkbook #

ll-workbook

The output linelist workbook created during Prepare

Signature:

Public Property Get LLWorkbook() As Workbook

Returns the linelist workbook created by Prepare that received exported data from InitTransfer. Returns Nothing before Prepare is called.

Returns: Workbook. The linelist workbook, or Nothing.


ReleaseLLWorkbook #

release-ll-workbook

Drop the reference to the output workbook

Signature:

Public Sub ReleaseLLWorkbook()

Linelist.SaveLL closes the linelist, and both classes held a reference to it. A read of either one after the close reached a closed workbook and raised an automation error. The read that mattered is Linelist.ErrorManage, reached from clickGenerate's cleanup, so the failure landed inside the error handler and hid the error that got it there.


OutputTemporaryRepos #

temporary-repos

The temporary repository created during Prepare

Signature:

Public Property Get OutputTemporaryRepos() As TemporaryRepos

Returns the TemporaryRepos instance created by Prepare for working files. Returns Nothing before Prepare is called.

Returns: TemporaryRepos. The temporary repository, or Nothing.


ErrorManage #

error-manage

Display an error dialog for specification failures

Signature:

Public Sub ErrorManage(Optional ByVal textMessage As String = vbNullString)

Shows a message box describing the error and informing the user that the linelist creation process is being aborted.

Parameters:

  • textMessage: String. Error description. Defaults to vbNullString.

Checkings

HasCheckings #

has-checkings

Whether this instance has anything to report

Signature:

Public Property Get HasCheckings() As Boolean

Returns: Boolean. True once one entry has been filed.


CheckingValues #

checking-values

The entries filed while the specifications were prepared

Signature:

Public Property Get CheckingValues() As Checking

Returns: Checking. The entries, or Nothing when none were filed.


Internal members (not exported)

Factory helpers

Seal #

seal

Seal the instance against further creation-only writes

Signature:

Public Sub Seal()

GuardNotSealed #

guard-not-sealed

Guard a creation-only setter against post-seal writes

Signature:

Private Sub GuardNotSealed(ByVal propName As String)

Parameters:


InternalWorkbook #

internal-workbook

Setter for the backing workbook reference

Signature:

Public Property Set InternalWorkbook(ByVal specsWorkbook As Workbook)

Used during construction to assign the workbook before caches are initialised. Not part of the public interface.


State management

ResetObjectCaches #

reset-object-caches

Clear all collaborator object references

Signature:

Private Sub ResetObjectCaches()

ResetTranslationCache #

reset-translation-cache

Clear the translation scope cache

Signature:

Private Sub ResetTranslationCache()

ResetCategoryCache #

reset-category-cache

Clear the category list cache

Signature:

Private Sub ResetCategoryCache()

Guard helpers

EnsureWorkbook #

ensure-workbook

Verify that the backing workbook is assigned

Signature:

Private Sub EnsureWorkbook()

Lazy-initialisation guards for the workbook and category arrays.

Throws:


EnsureCategoryCache #

ensure-category-cache

Create the category lookup if it does not exist

Signature:

Private Sub EnsureCategoryCache()

Worksheet resolution

ResolveSheet #

resolve-sheet

Resolve a worksheet of the designer workbook by name

Signature:

Private Function ResolveSheet(ByVal sheetName As String) As Worksheet

Direct worksheet lookups by name within the specifications workbook.

Looks a worksheet up in the designer workbook by name and raises a descriptive error when it is absent.

Parameters:

Returns: Worksheet. The resolved worksheet.

Throws:


MainSheet #

main-sheet

The designer's Main worksheet, resolved once per instance

Signature:

Private Function MainSheet() As Worksheet

Value used to call ResolveSheet on every read, and Prepare and Linelist together read a dozen tags. ResetCaches drops this reference.

Returns: Worksheet. The Main worksheet of the designer workbook.

Throws:


DesignerHiddenStore #

designer-hidden-store

The designer workbook's hidden name store, built once per instance

Signature:

Private Function DesignerHiddenStore() As HiddenNames

Building one runs EnsureReady and a full metadata rebuild, and Value used to build a fresh store for each of the two hidden-name tags. ResetCaches drops it.

Returns: HiddenNames. The store over the designer workbook.


External workbook helpers

EnterBusyState #

enter-busy-state

Transition the application into a busy state

Signature:

Private Sub EnterBusyState(ByRef busyScope As ApplicationState)

Utilities for opening, closing, and validating external workbooks during the Prepare workflow.

Creates or refreshes an ApplicationState snapshot and applies the busy state (suppressing screen updates and calculation) if not already busy.

Parameters:


ImportGeobase #

import-geobase

Import geobase data from the path the user gave

Signature:

Private Sub ImportGeobase(ByVal geoObj As LLGeo)

Reads the geobase file path from the designer's Main worksheet. An empty path is a choice the user made and the import is skipped. A path that is set and will not open is a failure the user has to hear about: the linelist comes out with no geographic data at all, so the reason is filed as a report entry naming the path.

The file is opened read only, the way ImportSetupToLinelist opens the setup workbook. The geobase is read and never written.

Parameters:


ExitBusyState #

exit-busy-state

Restore the application from a busy state

Signature:

Private Sub ExitBusyState(ByRef busyScope As ApplicationState)

Parameters:


BuildPreservedSheetNames #

build-preserved-sheet-names

Build the list of sheet names the dictionary must avoid

Signature:

Private Function BuildPreservedSheetNames(ByVal messageTranslations As TranslationObject) As BetterArray

The dictionary generates one data-entry worksheet per sheet name it holds, and a generated name that collides with a worksheet already in the linelist breaks the build. This is the list of names it has to keep clear of.

It is read off the output workbook itself. Prepare has already run every exporter against that workbook by the time it calls this, so the real worksheets are the honest answer, and a list of constants drifts away from them on every change to the architecture. The constant list this replaced still carried a Translations worksheet the designer gave up, and it named Metadata as a temporary sheet when LLGeo creates a real one.

On top of the real worksheets go the temporary names that do not exist yet, and the translated names of the worksheets the build is about to create.

Parameters:

Returns: BetterArray. The list of preserved sheet names.


SafeTranslatedValue #

safe-translated-value

Look up a translation key, falling back to the key itself on failure

Signature:

Private Function SafeTranslatedValue(ByVal translations As TranslationObject, ByVal key As String) As String

Parameters:

Returns: String. The translated value, or the key if translation fails.


ResetPostImportCaches #

reset-post-import-caches

Clear caches that become stale after importing new data

Signature:

Private Sub ResetPostImportCaches()

Resets the variables object, category cache, and translation cache so they are rebuilt from the freshly imported data.


Workbook validation

ValidateWorkbookReference #

validate-workbook-reference

Validate a workbook reference and its structure

Signature:

Private Sub ValidateWorkbookReference(ByVal specsWorkbook As Workbook)

Structural validation of specifications workbooks.

Throws:


ValidateWorkbookStructure #

validate-workbook-structure

Check that a workbook contains all required worksheets and named ranges

Signature:

Private Sub ValidateWorkbookStructure(ByVal specsWorkbook As Workbook)

Iterates the list of required sheet names and collects any that are missing. If the format sheet exists, also validates that the DESIGNTYPE named range is present.

Parameters:

Throws:


RequiredSheetNames #

required-sheet-names

Return the array of required designer worksheet names

Signature:

Private Function RequiredSheetNames() As Variant

Only includes sheets that LinelistSpecs reads directly from the designer workbook. Pass-through sheets (Dictionary, Choices, Analysis, Export) are excluded because InitTransfer imports them from the setup file directly into the linelist.

Returns: Variant. Array of sheet name strings.


WorksheetExistsInternal #

worksheet-exists-internal

Test whether a worksheet exists in a workbook

Signature:

Private Function WorksheetExistsInternal(ByVal specsWorkbook As Workbook, _
                                         ByVal sheetName As String) As Boolean

Parameters:

Returns: Boolean. True when the worksheet exists.


RangeExistsInternal #

range-exists-internal

Test whether a named range exists on a worksheet

Signature:

Private Function RangeExistsInternal(ByVal hostSheet As Worksheet, _
                                     ByVal rangeName As String) As Boolean

Parameters:

Returns: Boolean. True when the named range exists.


JoinNames #

join-names

Join a BetterArray of names into a comma-separated, quoted string

Signature:

Private Function JoinNames(ByVal values As BetterArray) As String

Parameters:

Returns: String. Formatted string like "'Sheet1', 'Sheet2'".


SafeWorkbookName #

safe-workbook-name

Safely retrieve a workbook's name, returning "" on error

Signature:

Private Function SafeWorkbookName(ByVal specsWorkbook As Workbook) As String

Parameters:

Returns: String. The workbook name or "".


Collaborator ensures

RequirePrepared #

require-prepared

Refuse a read of a collaborator Prepare has to supply

Signature:

Private Sub RequirePrepared(ByVal memberName As String)

How each collaborator is obtained. Read the residency table in the class description first: it says which workbook each one is backed by.

The collaborators that live on the DESIGNER are built here on first read, from a worksheet RequiredSheetNames() guarantees is present.

The four that live on the LINELIST have no loader. Prepare sets them from the transfer, and their accessors raise before that. A loader for them used to resolve a designer worksheet the designer no longer carries.

The four pass-through collaborators are imported from the setup file straight into the linelist. Reading one before Prepare has run is a caller mistake, and this is the message that says so.

Parameters:

Throws:


EnsureTranslations #

ensure-translations

Load the translations collaborator on first read

Signature:

Private Sub EnsureTranslations()

Creates the LLTranslation instance from the designer's linelist translation worksheet. Prepare replaces it with the copy on the linelist.


EnsureGeo #

ensure-geo

Load the geo collaborator on first read

Signature:

Private Sub EnsureGeo()

Built over the designer's Geo worksheet. Prepare replaces it with the copy on the linelist.


EnsurePasswords #

ensure-passwords

Load the passwords collaborator on first read

Signature:

Private Sub EnsurePasswords()

Built over the designer's password worksheet. Prepare replaces it with the copy on the linelist.


EnsureFormulaData #

ensure-formula-data

Load the formula data collaborator on first read

Signature:

Private Sub EnsureFormulaData()

EnsureVariables #

ensure-variables

Build the variables collaborator over the dictionary

Signature:

Private Sub EnsureVariables()

Reads the dictionary through its accessor, so a call before Prepare raises there and names Prepare.


EnsureFormat #

ensure-format

Load the format collaborator on first read

Signature:

Private Sub EnsureFormat()

Resolves the design name from the DESIGNTYPE named range on the designer's format worksheet, then creates the LLFormat instance.


ResolveDesignName #

resolve-design-name

Extract the design name from the format worksheet's DESIGNTYPE range

Signature:

Private Function ResolveDesignName(ByVal formatSheet As Worksheet) As String

Parameters:

Returns: String. The trimmed design type name.

Throws:


EnsureCategoryLookup #

ensure-category-lookup

Ensure choices, variables and the category lookup are ready

Signature:

Private Sub EnsureCategoryLookup()

Choices reads through its accessor, so a call before Prepare raises there.


NumberOfExports #

number-of-exports

Return the number of exports defined in the export specifications

Signature:

Private Function NumberOfExports() As Long

Returns: Long. The export count.


List auto helpers

AddListAuto #

add-list-auto

Populate the "list auto" dictionary column for list_auto variables

Signature:

Private Sub AddListAuto()

Automatic list column generation for formula-based variables.

Adds a "list auto" column to the dictionary, then reads the control details of every list_auto variable. Those details name the DIRECT origin, the variable whose entered values the automatic list collects, and each one is tagged list_auto_origin. An origin that is itself a formula is followed through RecursiveListAuto, and everything found down that chain is tagged list_auto_indirect_origin: it is watched for changes and never collected from.

The direct tag is written over whatever is there. A variable can be reached as an indirect origin of one list and be the direct origin of another, and the two arrive in whichever order the dictionary happens to hold, so the stronger tag has to win rather than the earlier one.


RecursiveListAuto #

recursive-list-auto

Mark the variables a formula origin is built on

Signature:

Private Sub RecursiveListAuto(ByVal varName As String)

Parses the control details of a formula-type variable using the Formulas engine, extracts the list of referenced variables, tags each of them list_auto_indirect_origin, and recurses into any that are themselves formulas or case_when types.

These variables are NOT collected from. A list built out of them would be a list of whatever happens to sit under a variable that merely feeds a formula -- an ordinary choice column, most of the time. They carry the tag so an edit to one still tells the workbook that an automatic list may have moved.

The write is onEmpty:=True, so a variable already tagged as a direct origin keeps that tag.

Parameters:


Category helpers

CachedCategories #

cached-categories

Read one category list out of the lookup

Signature:

Private Function CachedCategories(ByVal cacheKey As String) As BetterArray

A Collection raises on a key it does not hold, which is how a miss is read. The lookup this replaced was two parallel BetterArrays walked one entry at a time, and every walk opened with a full copy of the internal array. A 500-variable dictionary spent about 125,000 item reads on cache misses alone.

Parameters:

Returns: BetterArray. The cached list, or Nothing when the key is absent.


ResolveCategoryList #

resolve-category-list

Build a category list from the choices sheet for a given variable

Signature:

Private Function ResolveCategoryList(ByVal varName As String, _
                                     ByVal useShortlabels As Boolean) As BetterArray

Determines the category name from the variable's control type and control details, then queries the choices collaborator.

Parameters:

Returns: BetterArray. The resolved category list.

Throws:


NormaliseControlType #

normalise-control-type

Strip parenthesised suffixes from a control type string

Signature:

Private Function NormaliseControlType(ByVal controlValue As String) As String

Parameters:

Returns: String. The normalised, lower-cased control type.


ExtractChoiceFormula #

extract-choice-formula

Extract the choice name from a CHOICE_FORMULA(...) control details string

Signature:

Private Function ExtractChoiceFormula(ByVal controlDetails As String) As String

Parameters:

Returns: String. The extracted choice name.


Core accessors

ResolveTranslationScope #

resolve-translation-scope

Query the translations collaborator for a given scope

Signature:

Private Function ResolveTranslationScope(ByVal scopeValue As Byte) As TranslationObject

Parameters:

Returns: TranslationObject. The resolved translation object.

Throws:


Workbook orchestration

EmptyFirstSheet #

empty-first-sheet

The first worksheet of a workbook, when it carries nothing

Signature:

Private Function EmptyFirstSheet(ByVal outWkb As Workbook) As Worksheet

The placeholder Excel puts in a new workbook, and the one a template ships. Its name is localised -- Sheet1, Feuille1, Hoja1 -- so the name is no test at all and the CONTENT is what is read: a worksheet holding no value, no table, no shape and no pivot is a placeholder whatever it is called.

It is only ever called before the first exporter writes, so "empty now" and "empty because nothing has been put there yet" are the same thing. Called later it would happily answer a real worksheet that has not been filled in.

Parameters:

Returns: Worksheet. The placeholder, or Nothing when the first sheet holds something.


Checkings

Checks #

checks

The report entries of this instance

Signature:

Private Property Get Checks() As Checking

What this class reports into the generation log. GenerationLog.Harvest collects these after Prepare, alongside the entries of the dictionary, the choices, the exports, the analysis, the passwords and the format.

Returns: Checking. The entries, created on first use.


LogCheck #

log-check

File one report entry

Signature:

Private Sub LogCheck(ByVal message As String, _
                     Optional ByVal scope As Byte = checkingNote)

Checking.Add raises on a duplicate key, and one report carries the entries of several classes, so the key names this class and a counter.

Parameters:


Error handling

ThrowError #

throw-error

Raise a project error with the class name as source

Signature:

Private Sub ThrowError(ByVal errNumber As Long, ByVal messageText As String)

Internal error-raising utility.

Parameters:


Test support

TestAssignDictionary #

test-assign-dictionary

Inject a dictionary collaborator for testing

Signature:

Public Sub TestAssignDictionary(ByVal dict As LLdictionary)

Backdoor setters for injecting mock collaborators during testing.

Parameters:


TestAssignLLWorkbook #

test-assign-ll-workbook

Inject the output workbook for testing

Signature:

Public Sub TestAssignLLWorkbook(ByVal wkb As Workbook)

Lets a suite drive Linelist's worksheet members over a plain workbook, without running Prepare. Prepare is the only production writer of this field.

Parameters:


TestAssignDesignFormat #

test-assign-design-format

Inject a design-format collaborator for testing

Signature:

Public Sub TestAssignDesignFormat(ByVal fmt As LLFormat)

Parameters:


TestAssignFormulaData #

test-assign-formula-data

Inject a formula-data collaborator for testing

Signature:

Public Sub TestAssignFormulaData(ByVal data As FormulaData)

Parameters:


TestAssignChoices #

test-assign-choices

Inject a choices collaborator for testing

Signature:

Public Sub TestAssignChoices(ByVal choicesObj As LLChoices)

Lets a suite reach Categories, and through it every dropdown a variable can carry, without running Prepare.

Parameters:


TestAssignTransObject #

test-assign-trans-object

Inject one TranslationObject for every translation scope

Signature:

Public Sub TestAssignTransObject(ByVal trans As TranslationObject)

Sets all five scope-cache fields so TransObject returns the same object regardless of scope, mirroring the former single-object test stubs.

Parameters:


Used in (36 file(s))