5

I have an excel vba code that finds a particular cell in a sheet. It uses the Find method form the excel libraries. Here is the code

objRange.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows)

I need to do the same thing in powershell. But this method has a total of 9 arguments. How to ignore the other optional arguments in powershell. Something like this?

$range.Find("*", "", "", "", $xlByRows, $xlPrevious, "", "", "")

Here is the documentation of Range.Find Method

2 Answers 2

10

$null doesn't work, but according to this answer you can use [Type]::Missing:

$default = [Type]::Missing
$xl.Cells.Find("*", $default, $default, $default, $xlByRows, $xlPrevious,
               $default, $default, $default)
Sign up to request clarification or add additional context in comments.

6 Comments

There must be some way to give default values to arguments which are not required
@Ammar, any luck figuring out a way to name only the optional values you care about, similarly to the VBA := syntax?
@Jay, I just used the solution provided by Ansgar.
@Jay, according to stackoverflow.com/questions/24520664/… it might not be possible.
@irh yeah, this is the kind of thing that requires actual syntax built into the language. I'd tend to think we'd see examples of how to do it if it could be done. There might be a way to build a FunctionWithOptionalArgumentCaller class that does this for me. Maybe it could use reflection to figure out the types and default values for the optional ones and expose a method to set the ones I cared about. Hardly seems worth it though.
|
1

I addressed this by creating overload methods that calls the core method with the value I want. e.g. I want the user to be able to specify the number of processed records or call the "Increment" method and then just call "WriteProgress" with no argument:

class UserFeedback {
[string]$Name
[int]$ThingCount
[datetime]$ProcessStartDateTime
[int]$ProcessedCount

UserFeedback ([string] $Name,[int]$ThingCount){
    $this.ProcessStartDateTime = Get-Date
    $this.Name = $Name
    $this.ThingCount = $ThingCount
    $this.ProcessedCount = 0
}

WriteProgress([int] $intProcessed){
    $this.ProcessStartDateTime        
    $SecondsElapsed = ((Get-Date) - $this.ProcessStartDateTime).TotalSeconds
    $SecondsRemaining = ($SecondsElapsed / ($intProcessed / $this.ThingCount)) - $SecondsElapsed
    Write-Progress -Activity $this.Name -PercentComplete (($intProcessed/$($this.ThingCount)) * 100) -CurrentOperation "$("{0:N2}" -f ((($intProcessed/$($this.ThingCount)) * 100),2))% Complete" -SecondsRemaining $SecondsRemaining
}

WriteProgress(){
    $this.WriteProgress($this.ProcessedCount)
}

Increment(){
    $this.ProcessedCount ++    
}

}

1 Comment

The old ways are the best ways, a nice pragmatic solution that's more elegant than others - thanks for the reminder

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.