2011-05-18 46 views
2

我需要使用宏在我的工作表中添加一個函數。自從myWorkbooksheetName以後,我需要將一個變量傳遞給Excel函數,它將引用它,它是可變的。Excel宏 - 錯誤設置單元格公式

MyRange = Workbooks(myWorkbook).Sheets(sheetName).Range("H11:H32") 

theFormula = "=SUM(" & MyRange & ")" 

Range("B2").Select 
    ActiveCell.FormulaR1C1 = theFormula 

我得到錯誤13:Type Mismatch

我不是一個狂熱的VBA程序員,這讓我非常頭疼。我試圖將字符串定義爲theFormula,但沒有希望。

回答

-1

這是不行的 - 你說的單元格公式應該等於「= SUM(」& MyRange &「) - 然而,這是實際評估?

確實theFormula = SUM( 「& MyRange &」)

工作?

+1

不,我已經嘗試過與實際..我想通過這種粘貼以字符串編輯單元格...我需要的...如果我這樣做「=」&範圍1它的工作原理..這是奇怪的..所以當我添加一個Excel函數將停止工作... – Matias 2011-05-18 11:58:12

+0

這是錯誤的。 'MyRange'是一個變量,該行將正確計算爲= = SUM([MyRange的值])。其他答案解釋瞭如何解決這個問題。 – Gaffi 2012-07-26 13:48:06

3

您需要將Range對象轉換爲範圍的字符串表示形式,例如將公式設置爲=SUM($H$11:$H$32);

Dim MyRange As Range 
set MyRange = Workbooks(myWorkbook).Sheets(sheetName).Range("H11:H32") 

theFormula = "=SUM(" & MyRange.Address(ReferenceStyle:=xlR1C1) & ")" 

Range("B2").Select 
ActiveCell.FormulaR1C1 = theFormula 

或者如果你不想R1C1符號,你可以;

ActiveCell.Formula = "=SUM(H11:H32)" 
+0

這seeems工作,但即使我引用一個不同的工作簿,我有相同的工作簿所需的範圍..你有什麼可能是錯的? – Matias 2011-05-18 12:18:24

+0

不確定我關注,你的意思是B2在不同的書/表單中?如果更改爲'ThisWorkbook.ActiveSheet.Range(「B2」)。Formula =「= SUM(」&MyRange.Address(External:= True)&「)」' – 2011-05-18 12:31:16

2
Sub MakeSum(sBookName As String, sSheetName As String) 

    Dim rMyRange As Range 

    Set rMyRange = Workbooks(sBookName).Sheets(sSheetName).Range("H11:H32") 

    If rMyRange.Parent.Parent.Name = ActiveWorkbook.Name Then 
     With ActiveSheet 
      'same sheet, so just use address 
      If rMyRange.Parent.Name = .Name Then 
       .Range("B2").Formula = "=SUM(" & rMyRange.Address & ")" 
      Else 
      'same workbook, different sheet, so prepend sheet name 
      'single quotes prevent error when there's a space in the sheet name 
       .Range("B2").Formula = "=SUM('" & rMyRange.Parent.Name & "'!" & rMyRange.Address & ")" 
      End If 
     End With 
    Else 
     'not the same workbook, use external address 
     ActiveSheet.Range("B2").Formula = "=SUM(" & rMyRange.Address(, , , True) & ")" 
    End If 

End Sub