2016-12-18 4 views
0

Я в процессе переноса процедуры VBA в проект C#. Я близок к тому, что все полностью закончено, но у меня осталось 2 ошибки. Это синтаксис:C# Использование функции поиска Excel

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; 
    } 
} 
} 

Список ошибок & Линии

//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 - если я изменить строку, если (usedrows = (двойные) (xlApp.WorksheetFunction.CountA (sheet.Cells))! = 0) Я все равно получаю ту же ошибку –

+0

@stuartd - double usedrows; –

+0

Find() возвращает ссылку на соответствующую ячейку (если она exIsts) или Nothing/Null, если совпадение не найдено. 'lastrow = sheet.Cells.Find (...). Строка - это, вероятно, то, что вы хотите здесь. –

ответ

0

Для вашей первой ошибки, это просто неправильно C# синтаксис и не имеет ничего общего с Excel:

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

Это жалуется на попытку присвоить результат сравнения != 0, который является bool, до usedrows, который является double. Используйте круглые скобки, чтобы сравнить результат выполнения задания 0:

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

Вторая ошибка в том, что .Find возвращает Excel.Range, не int. В VBA он будет вызывать элемент по умолчанию ссылочного типа, если вы назначаете его не ссылочному типу. C# этого не делает - вам нужно сделать явный вызов. Элемент по умолчанию из Range является .Value, но из контекста я предполагаю, что вы ищете номер строки:

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

@Comintrn - вы правы с вашего предположения, я ищу номер строки, поэтому я могу добавить 1 к нему, а затем добавить строку «итоговые». –

+0

На вашей линии lastrow = found! = Null? found.Row: 1; - Я получаю сообщение об ошибке Не могу неявно преобразовать тип 'int' в 'Microsoft.Office.Interop.Excel.Range' –

+0

@StarsFlyFreeFromCozyNights - я не могу воспроизвести эту ошибку вообще. Вы изменили объявление 'int lastrow = 0;'? – Comintern

 Смежные вопросы

  • Нет связанных вопросов^_^