【发布时间】:2018-05-04 15:49:57
【问题描述】:
我正在尝试使用RDCOMClient 库将值写入垂直Range。由于 RDCOMClient 允许您编写与 VBA 非常相似的代码,因此我一直在寻找在 VBA 中执行此操作然后转换为 R 的方法。
创建excel的基本R代码是:
app <- COMCreate("Excel.Application")
app[['Visible']] <- TRUE
workbook <- app$WorkBooks()$Open(path)
sheet <- workbook$Worksheets(sheet_name)
sheet$Activate()
如果我的Range 是水平的,那么我可以简单地写成:
-
VBA
Range("A1:C1").Value = Array(1,2,3) -
R
range <- sheet$Range('A1:C1') range[['Value']] <- c(1,2,3)
由于Range 是垂直,因此代码为:
-
VBA
Range("A1:A3").Value = Application.Transpose(Array(1, 2, 3)) -
R
range <- sheet$Range('A1:A3') range[['Value']] <- app$Transpose(c(1,2,3))
问题在于 垂直大小写的 R“翻译”不起作用。
在控制台打印range[['Value']]显示:
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
NULL
[[1]][[3]]
NULL
app$Transpose(c(1,2,3)) 显示:
[[1]]
[[1]][[1]]
[1] 1
[[1]][[2]]
[1] 2
[[1]][[3]]
[1] 3
为什么没有正确设置值?这样做的正确方法是什么?
我也尝试过使用矩阵:
range[['Value']] <- matrix(nrow = 3, c(1,2,3))
但它给出了一个错误:
Can't attach the RDCOMServer package needed to create a generic COM object
我也尝试直接设置range[['Value']][[1]],但没有成功。
【问题讨论】:
-
打印之前或之后的结果是否相同无关紧要。我知道他们做同样的事情,但是你编写代码的方式有点不同,这就是我说非常相似的原因。 @Parfait
-
打印控制台和excel。分配前后的打印输出相同(无值)。 excel 保持空白,没有值。
-
你可以运行代码,它就在那里。只需更改路径即可。
-
我也看到了。我通过
values <- 1:3; rng <- sheet$Range("A3:A5"); for (i in 1:rng$Cells()$Count()) { cell <- rng$Cells(i); cell[["Value"]] <- values[i] }之类的方式解决了这个问题。
标签: r rdcomclient