2017-03-15 1 views
-1

Ich schreibe ein VSTO, neu in C# und mit einem Problem erklären und bewerten den Rückgabewert. Diese Funktion gibt eine Excel.Range oder bool zurück. Ich möchte nichts tun, wenn es bool ist und doSomething(), wenn es eine Excel.Range ist.C# -Funktion gibt verschiedene Typen zurück. Wie deklariere ich den Rückgabewert? Rückgabewert auswerten?

[SomeType] range = Globals.ThisAddIn.Application.InputBox(Prompt: Prompt,Title: Title, Type: 8); 

if ([SomeConditionStatement]) { 
    doSomething(); } 
+3

welche Forschung haben Sie getan, wie wenn ein Objekt zu überprüfen ist von einem bestimmten Typ und welche Probleme hatten Sie bei der Anwendung Ihrer Situation? – Servy

+0

ist, GetType(), typeof, aber sie alle mit einer Ausnahme fehlschlagen, wenn ich den anderen Typ als Ich suche nach – bravogolfgolf

+1

'if (Bereich ist Excel.Range)'? Wahrscheinlich gibt Ihre 'InputBox'' Objekt' zurück? –

Antwort

0

Der Rückgabetyp InputBox ist object. Sie können das mit einem var aufnehmen und dann seinen tatsächlichen Typ mit dem is keyword übereinstimmen.

var range = Globals.ThisAddIn.Application.InputBox(Prompt: Prompt, Title: Title, Type: 8); 

if (range is Excel.Range) 
{ 
    doSomething(); 
} 

Beachten Sie, dass documentation nach, InputBox nichts anderes als eine Range zurückkehren würde, wenn der Parameter Type 8:

Wenn Typ 8 ist, gibt InputBox ein Range-Objekt.

+0

Was ich beobachtet habe, ist, dass eine InputBox des Typs 8 zwei Schaltflächen hat: OK und Abbrechen. Wenn ein Bereich eingegeben wird, gibt OK den Bereich zurück. Wenn OK ohne einen Bereich angeklickt wird, wird ein Fehler angezeigt. Wenn Sie auf Abbrechen klicken, wird false zurückgegeben. – bravogolfgolf

+0

Diese Funktion ist einmal in [MSDN-office dev center] (https://msdn.microsoft.com/en-us/library/office/ff839468.aspx) und ein zweites Mal in [MSDN interop docs] (https : //msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._application.inputbox.aspx). Das Office-Dev ist viel besser als das, das ich vorher verlinkt habe, es erklärt sogar, dass Cancel immer zu "false" führt, genau wie du es beobachtet hast> den Link aktualisiert – dlatikay

0

Ich finde es ein bisschen bequeme as expectedType stattdessen zu verwenden und prüfen, ob null:

Range range = Application.InputBox(Prompt, Title, Type: 8) as Range; 

if (range != null) 
{ 
    object[,] values = range.Value2 as object[,]; 
} 

Weitere Beispiele:

var s = range.Text as string; 

var c = range.Cells[1] as Range; 

var w = Application.Worksheets["Sheet1"] as Worksheet; 

var d = Application.Evaluate("COUNTA(A1:A9)") as double? ?? -1;