2011-05-18 45 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