在Excel VBA中包含很长的功​​能?

时间:2012-09-13 11:04:23

标签: r vba rexcel

如果要通过RExcel在VBA中使用R功能,则必须使用

RInterface.RRun "..."

然后,如果你想定义自己的R函数,你可以简单地

RInterface.RRun "y <- function(x) { ... }"

如果y由多个命令行组成,您可以将每行与;分开,就像您在R环境中所做的那样。

但是......如果你的y函数非常长,该怎么办?

在VBA中,这种20~30行的R函数难以用这种方式写出来;并且VBA句子的长度有限制。

所以:我怎么包裹?

这是一个很长的R函数的例子:你能告诉我如何使用RExcel输入VBA吗?

bestIV <- function(dT, IVTS.t, Spot, r) {
  b <- r
  xout <- seq(0, max(T), dT)
  sfm <- matrix(NA, nrow = length(K), ncol = length(xout))
  for(i in 1:length(K)) {
    sfm[i,] <- approx(x = T, y = IVTS.t[i,], xout = xout, rule = 2)$y
  }
  sfm[,1] <- sfm[,1] + sfm[,2] - sfm[,3]
  rownames(sfm) <- K
  colnames(sfm) <- xout
  Option <- matrix(NA, nrow = length(K), ncol = length(xout))
  for(i in 1:length(K)) {
    for(j in 1:length(xout)) {
      TypeFlag <- ifelse(K[i] < Spot, 'p', 'c')
      Option[i,j] <- GBSOption(TypeFlag = TypeFlag, S = Spot, X = K[i], 
                               Time = xout[j] / 365, r = r, b = b, 
                               sigma = sfm[i,j] / 100)@price
    }
  }
  rownames(Option) <- K
  colnames(Option) <- xout
  dP <- (cbind(0, -t(apply(X = Option, MARGIN = 1, FUN = diff))) / Option)[,-(1:2)]
  dV <- dP / dT
  min.V <- which(dV == min(dV), arr.ind = TRUE, useNames = TRUE)
  Strike <- as.numeric(dimnames(min.V)[1])
  Maturity <- as.numeric(unlist(dimnames(dV)[2]))[min.V[2]]
  Days <- dT
  Mat <- c(dV[which(dV == min(dV))], Strike, Maturity, Days)
  names(Mat) <- c('Value', 'Strike', 'Maturity', 'Days')
  return(Mat)
}

谢谢,

2 个答案:

答案 0 :(得分:2)

将您的R代码放入您的spreadhseet(在一系列单元格中)并改为使用此函数:

  

RInterface.RunRCodeFromRange范围

     

在工作表上执行范围内的命令           (允许使用为R执行交互式执行的命令在宏代码中运行)

答案 1 :(得分:1)

您正在将字符串作为参数传递给VBA函数。因此,您的问题简化为“如何在VBA中连接字符串”。

答案是使用连接运算符&,如下所示:

"a" & "b"

假设你有一个R函数:

y <- function(x, a, b){
  return(x)
}

然后你可以在VBA中执行此操作:

RInterface.RRun "y <- function(x, a, b) {" &
  "return(x)" &
  "}"
相关问题