DataSheet
Provides low-level data manipulation on a worksheet with a table-like structure identified by a starting row and column. Unlike CustomTable, DataSheet does not require a ListObject — it works directly with cell ranges. Supports column lookup, filtering (single and multi-column), import/export to other DataSheets or CustomTables, and formatting transfer for designated columns. Consumers interact through the IDataSheet interface.
Depends on: Checking, BetterArray, HiddenNames, Formated columns list, checking objects
Version: 1.0 (2026-02-09)
Factory
Create #
create
Create a DataSheet wrapper around a worksheet
Signature:
Public Function Create(ByVal sh As Worksheet, ByVal startLn As Long, _
ByVal startCl As Long, _
Optional ByVal forceEndRow As Boolean = False, _
Optional ByVal objName As String = vbNullString) As IDataSheet
Entry point for creating DataSheet instances. Wraps the supplied worksheet with convenience methods for column lookup, filtering, import/export, and formatting transfer. The data structure is identified by a starting row and column; end row and column are computed dynamically. Unlike CustomTable, no ListObject is required.
Parameters:
sh: Worksheet. The worksheet hosting the data.startLn: Long. The 1-based header row index.startCl: Long. The 1-based starting column index.forceEndRow: Optional Boolean. When True, scans all columns to find the last row. Defaults to False.objName: Optional String. Object name. Defaults to the worksheet name.
Returns: IDataSheet. A fully initialised DataSheet instance.
Throws:
- ProjectError.ObjectNotInitialized When sh is Nothing.
- ProjectError.InvalidArgument When startLn or startCl is less than 1.
Depends on:
- Checking
- BetterArray
Elements
Wksh #
wksh
Worksheet backing the DataSheet
Signature:
Public Property Get Wksh() As Worksheet
Properties that expose the worksheet layout and column access. Returns the worksheet that hosts the table-like data.
Returns: Worksheet. The host worksheet.
DataStartRow #
data-start-row
First row of data (header row)
Signature:
Public Property Get DataStartRow() As Long
Returns: Long. The 1-based header row index.
DataStartColumn #
data-start-column
First column of data
Signature:
Public Property Get DataStartColumn() As Long
Returns: Long. The 1-based starting column index.
Name #
name
Name of the DataSheet
Signature:
Private Property Get Name() As String
Returns the assigned object name. When no name was provided during creation, defaults to the worksheet name.
Returns: String. The DataSheet name.
DataEndRow #
data-end-row
Last row containing data
Signature:
Private Property Get DataEndRow() As Long
Dynamically computes the last occupied row. When StrictEnd is True, scans all non-formula columns for the furthest row. Guarantees at least one data row below the header.
Returns: Long. The 1-based last data row index.
DataEndColumn #
data-end-column
Last column containing data
Signature:
Private Property Get DataEndColumn() As Long
Returns: Long. The 1-based last column index.
HeaderRange #
header-range
Header row Range
Signature:
Public Property Get HeaderRange() As Range
Returns the Range spanning from the start column to the end column on the header row.
Returns: Range. The header row range.
ColumnExists #
column-exists
Check whether a column exists in the DataSheet
Signature:
Private Function ColumnExists(ByVal colName As String, _
Optional ByVal strictSearch As Boolean = True, _
Optional ByVal matchCase As Boolean = True) As Boolean
Searches the header row for the specified column name using Range.Find. Returns False for empty column names.
Parameters:
colName: String. Column header to search for.strictSearch: Optional Boolean. When True, uses exact whole-string matching. Defaults to True.matchCase: Optional Boolean. When True, matching is case-sensitive. Defaults to True.
Returns: Boolean. True when the column is found.
ColumnIndex #
column-index
Resolve the column index for a header name
Signature:
Private Function ColumnIndex(ByVal colName As String, _
Optional ByVal inDataRange As Boolean = False, _
Optional ByVal shouldExist As Boolean = False, _
Optional ByVal strictSearch As Boolean = True, _
Optional ByVal matchCase As Boolean = True) As Long
Returns the worksheet column index, or the data-range-relative index when inDataRange is True. Returns -1 when the column is not found and shouldExist is False; raises an error when shouldExist is True.
Parameters:
colName: String. Column header to look up.inDataRange: Optional Boolean. When True, returns the index relative to the data range. Defaults to False.shouldExist: Optional Boolean. When True, raises an error if not found. Defaults to False.strictSearch: Optional Boolean. When True, uses exact whole-string matching. Defaults to True.matchCase: Optional Boolean. When True, matching is case-sensitive. Defaults to True.
Returns: Long. The column index, or -1 when not found.
Throws:
- ProjectError.ElementNotFound When the column is not found and shouldExist is True.
DataRange #
data-range
Range of a column or the entire data body
Signature:
Public Property Get DataRange(Optional ByVal colName As String = "__all__", _
Optional ByVal includeHeaders As Boolean = False, _
Optional ByVal strictSearch As Boolean = True, _
Optional ByVal matchCase As Boolean = True) As Range
Returns a data Range for the specified column, or the entire data body when colName is "all". When strictSearch is False, partial matching is used. Use strictSearch when column names share common text.
Parameters:
colName: Optional String. Column header to retrieve. Defaults to "all".includeHeaders: Optional Boolean. When True, includes the header row. Defaults to False.strictSearch: Optional Boolean. When True, uses exact matching. Defaults to True.matchCase: Optional Boolean. When True, matching is case-sensitive. Defaults to True.
Returns: Range. The requested data range.
RenameColumn #
rename-column
Rename a header in the DataSheet
Signature:
Public Sub RenameColumn(ByVal currentName As String, _
ByVal newName As String, _
Optional ByVal strictSearch As Boolean = True, _
Optional ByVal matchCase As Boolean = False)
Replaces the header text of the matched column with newName. Raises an error when newName is empty or the column is not found.
Parameters:
currentName: String. Current column header to find.newName: String. New header text to assign.strictSearch: Optional Boolean. When True, uses exact matching. Defaults to True.matchCase: Optional Boolean. When True, matching is case-sensitive. Defaults to False.
Throws:
- ProjectError.InvalidArgument When newName is empty.
- ProjectError.ElementNotFound When the column is not found.
Operations
Clean #
clean
Clear all non-formula columns
Signature:
Private Sub Clean()
Filtering, cleaning, import, and export operations. Iterates every column in the header row and clears the contents of those that do not contain formulas in their first data cell.
FilterData #
filter-data
Filter data on a single column and return the result
Signature:
Private Function FilterData(ByVal varName As String, _
ByVal criteriaName As String, _
ByVal returnedColumnName As String, _
Optional ByVal includeHeaders As Boolean = False, _
Optional ByVal matchCase As Boolean = True) _
Applies an AutoFilter on varName with criteriaName, extracts the visible rows from returnedColumnName into a temporary output area, reads them into a BetterArray, then cleans up. The filter is removed after the operation, leaving the DataSheet untouched.
Parameters:
varName: String. Column to filter on.criteriaName: String. Filter criteria to apply.returnedColumnName: String. Column whose values to return ("all" for all columns).includeHeaders: Optional Boolean. When True, includes the header row. Defaults to False.matchCase: Optional Boolean. When True, column lookup is case-sensitive. Defaults to True.
Returns: BetterArray. The filtered values.
FiltersData #
filters-data
Filter data on multiple columns and return the result
Signature:
Private Function FiltersData(ByVal varData As BetterArray, _
ByVal criteriaData As BetterArray, _
ByVal returnedColumnsData As BetterArray) As BetterArray
Applies multiple AutoFilters (one per entry in varData/criteriaData) and returns the visible values from each column in returnedColumnsData as a two-dimensional BetterArray. Exits when varData and criteriaData have different lengths.
Parameters:
varData: BetterArray. Column names to filter on.criteriaData: BetterArray. Criteria corresponding to each column.returnedColumnsData: BetterArray. Columns whose values to return.
Returns: BetterArray. A two-dimensional array of filtered values.
Import #
import
Import data from another DataSheet or CustomTable
Signature:
Private Sub Import(ByVal importData As Object, Optional ByVal strictColumnSearch As Boolean = True)
Cleans this DataSheet, then iterates the source headers and copies matching column data. Formula columns are preserved. Applies format import for registered formatting columns after the data copy.
Parameters:
importData: Object. A DataSheet or CustomTable to import from.strictColumnSearch: Optional Boolean. When True, uses case-sensitive column matching. Defaults to True.
ImportFormat #
import-format
Import column formatting from a source object
Signature:
Private Sub ImportFormat(ByVal importData As Object, Optional ByVal matchColumnsCase As Boolean = True)
Copies visual formatting (colours, font weight, italic) from the source for all columns registered via AddFormatsColumns. Logs a warning when the source and destination row counts differ.
Parameters:
importData: Object. A DataSheet or CustomTable to copy formatting from.matchColumnsCase: Optional Boolean. When True, uses case-sensitive column matching. Defaults to True.
Export #
export
Export the DataSheet to a workbook
Signature:
Private Sub Export(ByVal Wkb As Workbook, Optional ByVal filteredVarName As String = "__all__", _
Optional ByVal filteredCondition As String = "<>", _
Optional ByVal Hide As Long = xlSheetHidden, _
Optional ByVal includeNames As Boolean = False)
Creates (or clears) a worksheet in the target workbook with the same name as this DataSheet, then writes all data. Optionally filters rows on a single column before export. The exported sheet is hidden by default. Applies formatting for registered columns and optionally exports hidden names.
Parameters:
Wkb: Workbook. Destination workbook.filteredVarName: Optional String. Column used for filtering. Defaults to "all" (no filter).filteredCondition: Optional String. Filter criteria. Defaults to "<>".Hide: Optional Long. Worksheet visibility after export. Defaults to xlSheetHidden.includeNames: Optional Boolean. When True, exports hidden names alongside data. Defaults to False.
Checkings
HasCheckings #
has-checkings
Whether the DataSheet has logged diagnostic messages
Signature:
Private Property Get HasCheckings() As Boolean
Returns: Boolean. True when diagnostic entries exist.
CheckingValues #
checking-values
Retrieve the diagnostic log entries
Signature:
Private Property Get CheckingValues() As Object
Returns: Object. An IChecking instance, or Nothing.
Internal members (not exported)
Factory
Self #
self
Current object instance
Signature:
Public Property Get Self() As IDataSheet
Returns: IDataSheet. Reference to the current object.
Wksh #
wksh-set
Assign the worksheet reference
Signature:
Public Property Set Wksh(ByVal sh As Worksheet)
Parameters:
sh: Worksheet. The worksheet to assign.
DataStartRow #
data-start-row-set
Assign the header row index
Signature:
Public Property Let DataStartRow(ByVal startLn As Long)
Parameters:
startLn: Long. The 1-based header row index.
DataStartColumn #
data-start-column-set
Assign the starting column index
Signature:
Public Property Let DataStartColumn(ByVal startCl As Long)
Parameters:
startCl: Long. The 1-based starting column index.
StrictEnd #
strict-end-set
Assign the strict end row flag
Signature:
Public Property Let StrictEnd(ByVal forceEnd As Boolean)
Parameters:
forceEnd: Boolean. When True, scans all columns for the last row.
Name #
name-set
Assign the DataSheet name
Signature:
Public Property Let Name(ByVal objName As String)
Parameters:
objName: String. The name to assign.
Elements
StrictEnd #
strict-end
Whether to scan all columns for the last row
Signature:
Public Property Get StrictEnd() As Boolean
Returns: Boolean. True when all columns are scanned.
MatchedColumnName #
matched-column-name
Return the actual header text for a column name match
Signature:
Private Function MatchedColumnName(ByVal colName As String, _
Optional ByVal strictSearch As Boolean = True, _
Optional ByVal matchCase As Boolean = True) As String
Searches the header row and returns the exact text of the matched cell. Returns vbNullString when no match is found.
Parameters:
colName: String. Column name to search for.strictSearch: Optional Boolean. When True, uses exact matching. Defaults to True.matchCase: Optional Boolean. When True, matching is case-sensitive. Defaults to True.
Returns: String. The matched header text, or vbNullString.
Operations
RemoveAutoFilter #
remove-autofilter
Turn off AutoFilter on the host worksheet
Signature:
Private Sub RemoveAutoFilter()
Reliably removes any active AutoFilter. Called before and after filtering operations to guarantee a clean state.
ApplyFormat #
apply-format
Copy formatting from one Range to another
Signature:
Private Sub ApplyFormat(ByVal actRng As Range, ByVal impRng As Range)
Transfers interior colour, font colour, bold, and italic from each cell in impRng to the corresponding cell in actRng.
Parameters:
actRng: Range. Destination range to format.impRng: Range. Source range with formatting to copy.
Checkings
LogInfo #
log-info
Log a diagnostic message
Signature:
Private Sub LogInfo(ByVal label As String, _
Optional ByVal scope As Byte = checkingNote)
Diagnostic logging and error handling. Adds a message to the internal IChecking object, creating it on first use. The checkCounter provides a unique key for each entry.
Parameters:
label: String. The message to record.scope: Optional Byte. Severity level from CheckingScope. Defaults to checkingNote.
ShowDebug #
show-debug
Print a debug trace to the Immediate window
Signature:
Private Sub ShowDebug()
ThrowError #
throw-error
Raise a ProjectError-based exception
Signature:
Private Sub ThrowError(ByVal errNumb As Long, ByVal errorMessage As String)
Parameters:
errNumb: Long. ProjectError code.errorMessage: String. Descriptive message.
Throws:
- ProjectError.
Always raises the specified error.
ThrowErrorEmptySheetGiven #
throw-error-empty-sheet
Raise an error for a Nothing worksheet
Signature:
Private Sub ThrowErrorEmptySheetGiven()
Throws:
- ProjectError.ObjectNotInitialized Always.
ThrowErrorStartNumber #
throw-error-start-number
Raise an error for an invalid start row or column
Signature:
Private Sub ThrowErrorStartNumber(Optional ByVal startNumber As Long = -1, _
Optional ByVal startLabel As String = "start row")
Parameters:
startNumber: Optional Long. The invalid value. Defaults to -1.startLabel: Optional String. Label identifying the parameter. Defaults to "start row".
Throws:
- ProjectError.InvalidArgument Always.
ThrowErrorUnFoundColumn #
throw-error-unfound-column
Raise an error for a missing column
Signature:
Private Sub ThrowErrorUnFoundColumn(ByVal colName As String)
Parameters:
colName: String. The column name that was not found.
Throws:
- ProjectError.ElementNotFound Always.
Interface
IDataSheet_Wksh #
Signature:
Private Property Get IDataSheet_Wksh() As Worksheet
Delegated members satisfying the IDataSheet contract.
IDataSheet_AddFormatsColumns #
add-formats-columns
Register columns for formatting import/export
Signature:
Private Sub IDataSheet_AddFormatsColumns(ByVal matchColumnsCase As Boolean, ByVal resetColumns As Boolean, ParamArray lsCols() As Variant)
Adds the specified column names to the internal formatting list so that Import and Export preserve their visual formatting. Validates each column exists before registering it.
Parameters:
matchColumnsCase: Boolean. When True, uses case-sensitive column matching.resetColumns: Boolean. When True, clears the existing list before adding.lsCols: ParamArray Variant. Column names to register for formatting.
Used in (21 file(s))
- LLExporter.cls
- LLImporter.cls
- ILLdictionary.cls
- ILLExport.cls
- LLdictionary.cls
- LLExport.cls
- LLSheets.cls
- LLVariables.cls
- DataSheet.cls
- IDataSheet.cls
- ILLChoices.cls
- LLChoices.cls
- Linelist.cls
- MasterSetupVariables.cls
- SetupImportService.cls
- TestLLdictionary.bas
- TestCustomTable.bas
- TestDataSheet.bas
- TestSetupErrors.bas
- AnalysisDictionaryStub.cls
- DictionaryMinimalStub.cls