2015-10-30 3 views
0

Так что у меня что-то вроде этого:#NAME? Ошибка в Excel VBA

 A  B  C  ... 
1  11  12  13 
2  10  20  15 
3  1  -8  -2 
... 

A3 Так, B3 и C3 генерируется путем вычитания A1 для A2 и так далее.

Если вы посмотрите на верхнюю часть листа, появится длинная панель формул, которая показывает формулу ячейки, когда вы нажимаете на нее. Если вы заполняете лист вручную, вы можете набрать в нем что-то вроде = A1 - A2, и оно заполнит A3 для вас.

В моем случае, я использую .Formula = "IFERROR(A1 - A2, ""N/A""") в своем коде.

Проблема Я имею в том, что, когда лист генерируется, вместо требуемого выхода было показано выше, это отображение что-то вроде этого

 A  B  C  ... 
1  11  12  13 
2  10  20  15 
3  #NAME? #NAME? #NAME? 
... 

Если я щелкнуть на ячейке, формула бар фактически показывает что он применяет правильную формулу, и если я нажму Enter после нажатия на панель формул, появятся правильные цифры. Это похоже на то, что я вручную вводил формулу.

Это мой код. ConvertToLetter() принимает целое число и преобразуется в символ столбца.

Public Function ProcessExcelRpt(dataArray(,) As Object) As Integer 
    Dim ws As Worksheet 
    Dim r As Range 

    Try 
     For i As Integer = 1 To xlWorkBook.Sheets.Count 
      ws = xlWorkBook.Sheets(i) 

      r = ws.Range("A8") 
      ws.Range("A8").Resize(dataArray.GetUpperBound(0) + 1, dataArray.GetUpperBound(1) + 1).Value2 = dataArray 
      ws.Range("A2").Value2 = ws.Range("A2").Value2.ToString() & FormatDate(ReportDate, "MMMM dd, yyyy") 

      FormatColumns(ws, 8, dataArray.GetUpperBound(0) + 8) 
      excel.CalculateFull() 

      xlWorkBook.SaveAs(saveAs) 
      Exit For 
     Next 
    Catch ex As Exception  
     Return -1 
    End Try 

    Return 0 
End Function 

Public Sub FormatColumns(ws As Worksheet, ByVal firstRow As Integer, ByVal lastRow As Integer) 
    Dim rng As Range 

    Try 
     Dim colCnt, rowCnt, i As Integer 
     i = 0 
     For rowCnt = firstRow To lastRow 
      Dim row1, row2 As Integer 

      row1 = rowCnt - 2 ' go back 2 rows 
      row2 = rowCnt - 1 ' go back 1 row 

      ' Apply formula to each cell in each row 
      For colCnt = 1 To 3 
       rng = ws.Range(ConvertToLetter(colCnt) & rowCnt) ' A1 for ex 
       rng.Formula = "=IFERROR(" & ConvertToLetter(colCnt) & row1 & "-" & ConvertToLetter(colCnt) & row2 & ", ""N/A"")" 
      Next 

     Next  
    Catch ex As Exception 

    End Try 
End Sub 
+0

, что если вы делаете '.Formula = "= ЕСЛИОШИБКА (А1 - А2 "" N/A" "")' –

+0

Или попробуйте это '.Formula = "= ЕСЛИОШИБКА (" & Ячейки (1, colcnt) .address (false, false) & "-" & Cells (2, colcnt) .address (false, false) & "," "N/A" ")' –

+0

'workheet' похоже, undefined ... И ваш код запускается через UDF 'Function'? Или через' Sub'? Я бы ожидал, что он сработает, если запустится как функция. –

ответ

1

Если запустить это как Sub он работает для меня:

Sub foo(firstRow, lastRow) 
Dim rng As Range 
For rowCnt = firstRow To lastRow 
    Dim row1, row2 As Integer 

    row1 = rowCnt - 2 ' go back 2 rows 
    row2 = rowCnt - 1 ' go back 1 row 

    ' Apply formula to each cell in each row 
    For colCnt = 1 To 3 
     Set rng = Cells(rowCnt, colCnt) ' A1 for ex 
     rng.Formula = "=IFERROR(" & Cells(row1, colCnt).Address & "-" & Cells(row2, colCnt).Address & ", ""N/A"")" 
    Next 

Next 
End Sub 

Если вы пытаетесь выполнить это из Function вызова в формате UDF, он не будет работать из-за явных ограничений о том, какие UDF могут манипулировать на листе, в частности, вы не можете:

Изменить значение другой ячейки.

https://support.microsoft.com/en-us/kb/170787

+0

Я просто запустил отладчик и обнаружил, что лист пуст при вызове этого суб. – PTN

+0

То, как работает моя программа, заключается в том, что это должна быть функция форматирования, и она заполнит лист массивами из целых чисел после того, как это называется – PTN

+1

Это не может быть сделано как «Функция», вызванная из листа, без некоторые рекомендуемые обходные пути. Существует несколько вопросов и ответов о том, как использовать Application.Evaluate, чтобы пробиться через это ограничение, но я обычно предпочел бы избежать этого. –