如何使用vba变量在单元格中插入公式

时间:2017-05-30 16:41:28

标签: excel-vba vba excel

希望有人能够帮助我: 我试图从一个工作表上的长数据集中计算样本协方差,使用第二个工作表中的信息来选择每个样本。 第一个包含数据集的工作表,名为" C1%Norm"看起来像这样:

          |  A  |  B  |  C  |  D  |  E  |  F  |
       1  |throw|temp |depth|  s  |  c  | sp  |
       2    60    0,3  0,456 0,123  ...   ...  
       ..   ...   ...   ...   ...   ...   ...
      189   61   0,42   ...   ...   ...   ...
       ..   ...   ...   ...   ...   ...   ...
      375   62   0,35   ...   ...   ...   ...
       ..

第二个工作表包含每个" throw"的限制。或者要使用的样品,名为" Mapeo Lances"看起来像这样:

          |  A  |  B  |  C  | 
       1  |throw|lim i|lim s|
       2    60     2    188
       3    61    189   374
       4    62    375   ... 

基本上需要做的是计算样本协方差,例如" temp"和"深度"使用第2行和第188行(第一张工作表)之间的数据作为样本,然后使用第189-374行的数据作为样本,等等......

我写了这段代码:

    Sub covariances()

    Dim i As Integer
    Dim limi As Integer
    Dim lims As Integer
    Dim test As String

    i = 2
    Sheets("Mapeo Lances").Select

    While i < Cells(Rows.count, 1).End(xlUp).Row + 1

    limi = Range("B" & i).Value
    lims = Range("C" & i).Value

    test = "=covariance.s('C1% Norm'!B" & limi & ":B" & lims & ";'C1% Norm'!C" & limi & ":C" & lims & ")"
    Range("D" & i).Formula = test
    i = i + 1

    Wend

    End Sub

但是我收到以下错误: 运行时错误:&#39; 1004&#39; 应用程序定义的错误或对象定义的错误

我知道&#34;测试&#34;字符串正在连接;如果我删除&#34; =&#34;在字符串的开头签名,单元格中填充了所需的文本,没有错误。

我知道我可以使用它来实现它:

   ...
   dim range_i as Range
   dim range_s as Range

   ...
   while...
   ...
   set range_i = Worksheet("C1% Norm").Range("B" & limi & ":B" & lims)
   set range_s = Worksheet("C1% Norm").Range("C" & limi & ":C" & lims) 

   Range("D" & i).value = Application.WorksheetFunction.Covariance_S(range_i,range_s)

   wend  

但实际上我需要在每个单元格中使用公式用于教学目的......我做错了什么?

1 个答案:

答案 0 :(得分:2)

因此,您在区域设置中将;(分号)作为列表分隔符。这适用于Excel公式但不幸的是,不是从VBA设置公式时。从VBA设置时,请使用逗号:

test = "=covariance.s('C1% Norm'!B" & limi & ":B" & lims & ",'C1% Norm'!C" & limi & ":C" & lims & ")"
'                                                          ^^^

然后通过魔术,您会发现Excel中的逗号被;替换。似乎区域设置功能的理念是针对最终用户,而不是(VBA)程序员。

您也可以使用.FormulaLocal将VBA中的公式设置为它在Excel中的外观:

Range("D" & i).FormulaLocal = test