mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
100 lines
5.9 KiB
PowerShell
100 lines
5.9 KiB
PowerShell
Function Add-ExcelDataValidationRule {
|
|
<#
|
|
.Synopsis
|
|
Adds data validation to a range of cells
|
|
.Example
|
|
>
|
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'E2:E1001' -ValidationType Integer -Operator between -Value 0 -Value2 100 `
|
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'Percentage must be a whole number between 0 and 100'
|
|
|
|
This defines a validation rule on cells E2-E1001; it is an integer rule and requires a number between 0 and 100
|
|
If a value is input with a fraction, negative number, or positive number > 100 a stop dialog box appears.
|
|
.Example
|
|
>
|
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'B2:B1001' -ValidationType List -Formula 'values!$a$2:$a$1000'
|
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'You must select an item from the list'
|
|
This defines a list rule on Cells B2:1001, and the posible values are in a sheet named "values" at cells A2 to A1000
|
|
Blank cells in this range are ignored. If $ signs are left out of the fomrmula B2 would be checked against A2-A1000
|
|
B3, against A3-A1001, B4 against A4-A1002 up to B1001 beng checked against A1001-A1999
|
|
.Example
|
|
>
|
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'I2:N1001' -ValidationType List -ValueSet @('yes','YES','Yes')
|
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody "Select Yes or leave blank for no"
|
|
Similar to the previous example but this time provides a value set; Excel comparisons are case sesnsitive, hence 3 versions of Yes.
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
Param(
|
|
#The range of cells to be validate, e.g. "B2:C100"
|
|
[Parameter(ValueFromPipeline = $true,Position=0)]
|
|
[Alias("Address")]
|
|
$Range ,
|
|
#The worksheet where the cells should be validated
|
|
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
|
#An option corresponding to a choice from the 'Allow' pull down on the settings page in the Excel dialog. Any means "any allowed" i.e. no Validation
|
|
[ValidateSet('Any','Custom','DateTime','Decimal','Integer','List','TextLength','Time')]
|
|
$ValidationType,
|
|
#The operator to apply to Decimal, Integer, TextLength, DateTime and time fields, e.g. equal, between
|
|
[OfficeOpenXml.DataValidation.ExcelDataValidationOperator]$Operator = [OfficeOpenXml.DataValidation.ExcelDataValidationOperator]::equal ,
|
|
#For Decimal, Integer, TextLength, DateTime the [first] data value
|
|
$Value,
|
|
#When using the between operator, the second data value
|
|
$Value2,
|
|
#The [first] data value as a formula. Use absolute formulas $A$1 if (e.g.) you want all cells to check against the same list
|
|
$Formula,
|
|
#When using the between operator, the second data value as a formula
|
|
$Formula2,
|
|
#When using the list validation type, a set of values (rather than refering to Sheet!B$2:B$100 )
|
|
$ValueSet,
|
|
#Corresponds to the the 'Show Error alert ...' check box on error alert page in the Excel dialog
|
|
[switch]$ShowErrorMessage,
|
|
#Stop, Warning, or Infomation, corresponding to to the style setting in the Excel dialog
|
|
[OfficeOpenXml.DataValidation.ExcelDataValidationWarningStyle]$ErrorStyle,
|
|
#The title for the message box corresponding to to the title setting in the Excel dialog
|
|
[String]$ErrorTitle,
|
|
#The error message corresponding to to the Error message setting in the Excel dialog
|
|
[String]$ErrorBody,
|
|
#Corresponds to the the 'Show Input message ...' check box on input message page in the Excel dialog
|
|
[switch]$ShowPromptMessage,
|
|
#The prompt message corresponding to to the Input message setting in the Excel dialog
|
|
[String]$PromptBody,
|
|
#The title for the message box corresponding to to the title setting in the Excel dialog
|
|
[String]$PromptTitle,
|
|
#By default the 'Ignore blank' option will be selected, unless NoBlank is sepcified.
|
|
[String]$NoBlank
|
|
)
|
|
if ($Range -is [Array]) {
|
|
$null = $PSBoundParameters.Remove("Range")
|
|
$Range | Add-ExcelDataValidationRule @PSBoundParameters
|
|
}
|
|
else {
|
|
#We should accept, a worksheet and a name of a range or a cell address; a table; the address of a table; a named range; a row, a column or .Cells[ ]
|
|
if (-not $WorkSheet -and $Range.worksheet) {$WorkSheet = $Range.worksheet}
|
|
if ($Range.Address) {$Range = $Range.Address}
|
|
|
|
if ($Range -isnot [string] -or -not $WorkSheet) {Write-Warning -Message "You need to provide a worksheet and range of cells." ;return}
|
|
#else we assume Range is a range.
|
|
|
|
$validation = $WorkSheet.DataValidations."Add$ValidationType`Validation"($Range)
|
|
if ($validation.AllowsOperator) {$validation.Operator = $Operator}
|
|
if ($PSBoundParameters.ContainsKey('value')) {
|
|
$validation.Formula.Value = $Value
|
|
}
|
|
elseif ($Formula) {$validation.Formula.ExcelFormula = $Formula}
|
|
elseif ($ValueSet) {Foreach ($v in $ValueSet) {$validation.Formula.Values.Add($V)}}
|
|
if ($PSBoundParameters.ContainsKey('Value2')) {
|
|
$validation.Formula2.Value = $Value2
|
|
}
|
|
elseif ($Formula2) {$validation.Formula2.ExcelFormula = $Formula}
|
|
$validation.ShowErrorMessage = [bool]$ShowErrorMessage
|
|
$validation.ShowInputMessage = [bool]$ShowPromptMessage
|
|
$validation.AllowBlank = -not $NoBlank
|
|
|
|
if ($PromptTitle) {$validation.PromptTitle = $PromptTitle}
|
|
if ($ErrorTitle) {$validation.ErrorTitle = $ErrorTitle}
|
|
if ($PromptBody) {$validation.Prompt = $PromptBody}
|
|
if ($ErrorBody) {$validation.Error = $ErrorBody}
|
|
if ($ErrorStyle) {$validation.ErrorStyle = $ErrorStyle}
|
|
}
|
|
}
|