2014-02-09 2 views
0

Код NET (Microsoft.Office.Interop уже импортирован). Когда я пытаюсь отлаживать, он ничего не говорит, но когда я запускаю его, открывается 2 файла (List.xls и File3.xlsm) и когда он приходит на Если sh1.Cells (x + 1, 2) <> "" Тогда говорит InvalisCastException. Что это означает? Как я могу исправить код?VB .NET InvalisCastException с использованием Microsoft.Office.Interop

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim oXL As Excel.Application 
    Dim Wk1, Wk2, Wk3 As Excel.Workbook 
    Dim Sh1, Sh2, Sh3, Sh4 As Excel.Worksheet 
    Dim nomefile As Object, seleziona As Object 
    Dim x As Integer, y As Integer, v As Integer, u As Integer, w As Integer, t As Integer, z As Integer 
    ' Start Excel and get Application object. 
    oXL = CreateObject("Excel.Application") 
    oXL.Visible = True 
    'set and open first Workbook 
    Wk1 = oXL.Workbooks.Open(Filename:="C:\xxx\List.xls") 
    'set and open third Workbook 
    Wk3 = oXL.Workbooks.Open(Filename:="C:\xxx\File3.xlsm") 
    'set first sheet (list.xls) 
    Sh1 = Wk1.Worksheets("List") 
    'set third sheet (File3.xlsm) 
    Sh3 = Wk3.Worksheets("All") 

    For x = 1 To 1000 
     **If sh1.Cells(x + 1, 2) <> "" Then** 
      'select filename from sh1 (list.xls) 
      seleziona = Sh1.Cells(x + 1, 2) 
      nomefile = "C:\xxx\" & Left(seleziona, 1) & "\" & seleziona & ".xls" 
      'set and open filename from list 
      Wk2 = oXL.Workbooks.Open(Filename:=nomefile) 
      'set second sheet (nomefile.xls) 
      Sh2 = Wk2.Worksheets("ESAMI") 
      'set forth sheet (nomefile.xls) 
      Sh4 = Wk2.Worksheets("Foglio3") 

      z = 0 
      y = 0 
      v = 1 
      u = 1 
      w = 0 
      t = 0 
      While z = 0 
       If sh2.Cells(1, y + 4) <> "" Then 
        'find empty cells on sh2 first row 
        y = y + 1 
       Else : sh2.Range(sh2.Cells(1, 4), sh2.Cells(114, (y + 4) - 1)).Copy() 
        'copy/paste from sh2 to sh4 of not-empty data (last not-empty row is always 114) 
        Sh4.Range("C1").PasteSpecial(Excel.XlPasteType.xlPasteValuesAndNumberFormats, SkipBlanks:=False, Transpose:=True) 
        'clear clipboard 
        Clipboard.Clear() 
        While w = 0 
         If Sh4.Cells(v, 3) <> "" Then 
          'set column 2 on sh4 equal to file's name 
          Sh4.Cells(v, 2) = seleziona 
          v = v + 1 
         Else : Sh4.Cells(v - 1, 1) = "u" 
          'find last non empty row on sh4 and put a "u" on first row 
          Sh4.Range(Sh4.Cells(1, 1), Sh4.Cells(v - 1, 116)).Copy() 

          While t = 0 
           If Sh3.Cells(u, 2) <> "" Then 
            'copy all from sh4 (nomefile.xls) to sh3 (file3.xlsm) 
            u = u + 1 
           Else 
            Sh3.Range(Sh3.Cells(u, 1), Sh3.Cells(u, 1)).PasteSpecial(Excel.XlPasteType.xlPasteFormulasAndNumberFormats, SkipBlanks:=False, Transpose:=False) 
            Clipboard.Clear() 
            t = 1 
           End If 
          End While 
          w = 1 
         End If 
        End While 
        z = 1 
       End If 
      End While 
      Clipboard.Clear() 
      'close opened file from list 
      Wk2.Close(False) 

     End If 

    Next 
    wk2 = Nothing 
    sh1 = Nothing 
    sh2 = Nothing 
    sh3 = Nothing 
    Wk1.Close(False) 





End Sub 



End Class 
+0

Попробуйте 'sh1.Cells (x + 1, 2) .Value <>" "' –

+0

Работает только в том случае, если установлен параметр «Strict Off». Кроме того, свойство Cells возвращает объект 'Excel.Range'. – Styxxy

+0

С .value У меня есть: Слишком много аргументов для «Значение открытого свойства ([RangeValueDataType As Object]) Как объект ' – user3023582

ответ

0

Вы пытаетесь оценить Range объект в виде строки, и именно поэтому вы получите сообщение об ошибке. Это все равно, что делать:

Dim x as Integer 
x = 4 
If x = "banana" Then ... 

Поскольку х представляет собой целое число не может быть оценен в виде строки, ведущие к подобной ошибке.

Как сказано в комментариях предложили, попробуйте использовать If sh1.Cells(x + 1, 2).Value <> "" Then ...

0

Если sh1.Cells (х + 1, 2) .Value <> "" Тогда

Готово и работает, но теперь у меня есть еще одна проблема с левый

nomefile = "C: \ ххх \" & Left (seleziona, 1) & "\" & seleziona & ".xls"

Как я могу получить первый символ переменной seleziona, если Left не работает?

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