2016-12-18 2 views
0

Ich bin dabei, eine VBA-Prozedur in ein C# -Projekt zu portieren. Ich bin kurz davor, alles komplett fertig zu haben, aber ich habe noch 2 Fehler. Dies ist die Syntax:C# Verwenden der Excel-Suchfunktion

public static void ExcelPort() 
{ 
object What = "*"; 
object After = xlWorkSheet.get_Range("A1", "IV65536"); 
object LookIn = Excel.XlFindLookIn.xlValues; 
object LookAt = Excel.XlLookAt.xlPart; 
object SearchOrder = Excel.XlSearchOrder.xlByRows; 
Excel.XlSearchDirection SearchDirection = Excel.XlSearchDirection.xlNext; 
object MatchCase = System.Reflection.Missing.Value; 
object MatchByte = System.Reflection.Missing.Value; 
object SearchFormat = System.Reflection.Missing.Value; 

currentsheet = (Excel._Worksheet)(xlWorkBook.ActiveSheet); 
activeworkbook = (Excel.Workbook)xlApp.ActiveWorkbook; 
int lastrow = 0; 

foreach (Excel.Worksheet sheet in activeworkbook.Worksheets) 
{ 
    if (usedrows = (double)xlApp.WorksheetFunction.CountA(sheet.Cells) != 0) 
    { 
     lastrow = sheet.Cells.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat); 
    } 
    else 
    { 
     lastrow = 1; 
    } 
} 
} 

Fehlerliste & Linien

//This line throws an error 
(double)xlApp.WorksheetFunction.CountA(sheet.Cells) != 0 

//Error: 
Cannot implicitly convert type 'bool' to 'double' 

//This line throws an error  sheet.Cells.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat) 

//Error: 
Cannot implicitly convert type 'Microsoft.Office.Interop.Excel.Range' to 'int' 
+0

@stuartd - wenn ich die Zeile ändern, um if (usedrows = (double) (xlApp.WorksheetFunction.CountA (sheet.Cells))! = 0) Ich bekomme immer noch den gleichen Fehler –

+0

@stuartd - double usedrows; –

+0

Find() gibt einen Verweis auf die übereinstimmende Zelle zurück (wenn es exIst) oder Nothing/Null, wenn keine Übereinstimmung gefunden wird. 'lastrow = sheet.Cells.Find (...). Row ist wahrscheinlich, was du hier willst. –

Antwort

0

Für Ihren ersten Fehler, das ist einfach falsch C# Syntax und hat nichts mit Excel zu tun:

if (usedrows = (double)xlApp.WorksheetFunction.CountA(sheet.Cells) != 0) 

Es beschweren sich über den Versuch, das Ergebnis des != 0-Vergleichs, der ein bool ist, zu usedrows, die eine double ist. Verwenden Klammern das Ergebnis der Zuordnung zu 0 vergleichen:

if ((usedrows = (double)xlApp.WorksheetFunction.CountA(sheet.Cells)) != 0) 

Der zweite Fehler ist, dass .Find Gibt ein Excel.Range, kein int. In VBA wird es das Standardelement eines Referenztyps aufrufen, wenn Sie es einem Nicht-Referenztyp zuweisen. C# macht das nicht - Sie müssen explizit anrufen. Das Standardelement eines Range ist .Value, aber durch den Kontext Ich gehe davon aus, dass Sie suchen die Zeilennummer:

var found = sheet.Cells.Find(What, After, LookIn, LookAt, SearchOrder, 
    SearchDirection, MatchCase, MatchByte, SearchFormat); 
lastrow = found != null ? found.Row : 1; 
+0

@Comintrn - Sie sind richtig mit Ihrer Annahme, ich bin auf der Suche nach der Zeile Nummer, so dass ich 1 hinzufügen kann, dann fügen Sie eine "Summen" Zeile. –

+0

Auf deiner Linie lastrow = gefunden! = Null? found.Row: 1; - Ich erhalte einen Fehler von Kann den Typ 'int' nicht implizit in 'Microsoft.Office.Interop.Excel.Range' umwandeln –

+0

@StarsFlyFreeFromCozyNights - Ich kann diesen Fehler überhaupt nicht replizieren. Hast du die Deklaration 'int lastrow = 0;' geändert? – Comintern