2015-01-02 59 views
0

你好,我最近發現蠻快的方式通過一個變量數組Varriant陣列刪除Excel中的公式

With Sht 
     LongY = .Rows.Count 
     Dat = .Formula 

     For r = 5 To 6 'LongY 
      If (Dat(r, 1) = "" Or Dat(r, 4) = "") Then GoTo IgnoRow 

      LongX = .Columns.Count 
      For s = 26 To 27 'LongX 
      If (Dat(2, s) = 0 Or Dat(2, s) = "") Then GoTo IgnoCol 'Or Dat(1, s).EntireColumn.Hidden = True 
      Price = Dat(2, s) 
      Ammount = Dat(r, 4) 
      Base = Dat(r, s) 

      Material = Application.WorksheetFunction.RoundUp((Base * Ammount), 2) 'no .values => text 
      'MsgBox (Material) 
      'CPrice = Material * Price 
      'Cost = Cost + CPrice 
IgnoCol: 
       Next 

     'Dat(r, 5) = Cost 
     'Cost = "" 
IgnoRow: 
      Next 
     Sht.Formula = Dat 
    End With 

End Sub 

進行循環,但我不知道這是如何工作,給了我麻煩。我有大面積的輸入(也有公式),所以當我循環播放這個區域時,所有的EXCEL FORMULAS都會變成.values,我不知道如何避免這種情況。

謝謝你的任何想法。

+1

如果你想讓它引用的公式,而不是值,只需用'* DAT = .Formula'取代'* DAT = .Value'。 – TheEngineer

+2

...和'Table.Value = Dat'與'Table.Formula = Dat'。當你在這裏時,聲明並試圖使用名爲* Long *的變量是不明智的。 – Jeeped

+0

@TheEngineer現在它不是刪除公式,但如果我想在循環中使用該公式的值,它將其用作文本。 –

回答

1

以紅鯡魚取出,你原來的代碼做這個:

With Table   ' Note: Table is a Range 
    Dat = .Value ' Dat is now an array of values, with Table.Rows.Count rows 
        '  and Table.Columns.Count columns. 
    .Value = .Dat ' This copies all the values back into the Table cells, 
        '  replacing any existing formulas with their values. 
End With 

提取從Excel範圍內的所有值到一個數組VBA是我沒有見過的技術,但它是非常快並提供易於閱讀的代碼,因此我將從現在開始使用它。

但有了這個便利是一個成本。如果您將VBA數組中的所有值傳回範圍,則會清除所有公式。

如果您提取公式而不是值(因此您可以安全地複製),則無法訪問任何基於公式的單元格的值。這就是爲什麼你最近的代碼失敗。

最簡單的解決方案是提取值和公式,但只複製公式。

Dim Formulas() As Variant, Values() As Variant 
With Sht  ' Sht is a Range object 
    Values = .Value 
    Formulas = .Formula 
    For r = ... 
     For s = ... 
      price = Values(2, s) 
      Ammount = Values(r, 4) 
      Base = Values(r, s) 
      Material = Round(Base * Ammount + 0.005, 2) ' Round Up 
      Cost = ... 
     Next 
     Formulas(r, 5) = Cost 
    Next 
    .Formula = Formulas 
End With 
+0

另一種選擇是使用循環中的HasFormula屬性來檢查單元格是否有公式,並使用Evaluate函數返回函數的值。我認爲你的答案比我的要清晰。 – TheEngineer

+0

'HasFormula'不適用於數組值,只是原始單元格。做這種事情的傳統方式是直接使用單元格而不是值/公式的數組副本。在這種情況下,可以使用'HasFormula',但不需要它,因爲代碼可以直接與.Value一起使用,並且只更新作爲計算目標的單元。公式可能被覆蓋的唯一時間是成本的目標單元格已經包含公式,並且在這種情況下覆蓋它是所需的行爲。 –

+0

@TomRobinson再次感謝你,我想用你的名字來標記你的名字,因爲你幫助我發現了這種循環的順利方式。我希望這是我練習VBA的最後一步,但你永遠不知道。 也感謝TheEngineer的參與。 –