2016-07-25 18 views
0

Zum Beispiel, ich suche die folgende Logik, um zu bestimmen:fest, ob Zelle existiert in einem bestimmten Bereich w/Powershell Excel COM

if (B2 in A1:B20) # if cell B2 is within the range A1:B20 
{ 
    return $true 
} 

Gibt es eine Funktion in Excel, die für so etwas wie diese verwendet werden können, ? Ich habe über = COUNTFIF() -Funktion gelesen, war aber nicht in der Lage, es zum Laufen zu bringen. Auch dies verwendet ein Excel-COM-Objekt in Powershell.

Dank

Antwort

1

Da Zellnamen grundsätzlich koordiniert werden, ist dies lediglich eine Frage der Arithmetik Vergleich einzubeziehen keine Notwendigkeit Excel selbst:

function Test-CellInRange 
{ 
    param(
     [ValidatePattern('^[A-Z]+\d+$')] 
     [string]$Cell, 
     [ValidatePattern('^[A-Z]+\d+\:[A-Z]+\d+$')] 
     [string]$Range 
    ) 

    # Grab X and Y coordinates from Range input, sort in ascending order (low to high) 
    $P1,$P2 = $Range -split ':' 
    $Xpoints = ($P1 -replace '\d'),($P2 -replace '\d') |Sort-Object 
    $Ypoints = ($P1 -replace '\D'),($P2 -replace '\D') |Sort-Object 

    # Grab X and Y coordinate from cell 
    $CellX = $Cell -replace '\d' 
    $CellY = $Cell -replace '\D' 

    # Test whether cell coordinates are within range 
    return ($CellX -ge $Xpoints[0] -and $CellX -le $Xpoints[1] -and $CellY -ge $Ypoints[0] -and $CellY -le $Ypoints[1]) 
} 

Verwenden Sie es mögen:

if(Test-CellInRange -Cell B2 -Range A1:B20){ 
    "B2 is in A1:B20" 
} 
+0

Danke dafür! Können Sie ein Beispiel dafür zeigen, wie Sie diese Funktion aufrufen würden? Ich habe ein wenig Probleme beim Verständnis der Regex Muster – Quanda

+0

@Quanda Ein Beispiel hinzugefügt! Die ValidatePattern-Attribute stellen lediglich sicher, dass die Zellenkoordinaten immer das richtige Format haben (dh. '[Ein oder mehrere Buchstaben] [eine oder mehrere Zahlen]'). –

+0

Es funktioniert wunderbar, danke! @Mathias R. Jessen – Quanda

1

Ich bin mir nicht sicher über die COM-Schnittstelle (nie benutzt), aber wenn Sie Zugriff auf die INTERSECT Method haben, dann könnten Sie etwas wie diese schreiben:

If Not Application.Intersect(Range("B2"), Range("A1:B20")) Is Nothing Then 
    CODE_IF_TRUE 
End If 

Es ist nur eine Schnittmenge der beiden Bereiche. Wenn sie sich nicht schneiden, dann ist die eine definitiv keine Untermenge der anderen. Wenn Sie nach einer geeigneten Untergruppe suchen müssen, müssen Sie kreativer arbeiten und prüfen, ob die Schnittmenge mit der gesamten gewünschten Untermenge übereinstimmt. Denken Sie daran, Ihre Set-Logik und überprüfen Sie die UNION Method - zwischen diesen Dingen sollten Sie in der Lage sein, jede Art von Operationen, die Sie wollen.