R 使用XLConnect';将新行添加到现有Excel表中;附加工作表函数

R 使用XLConnect';将新行添加到现有Excel表中;附加工作表函数,r,excel,R,Excel,我试图实现的是将R中的一个对象中的一行添加到Excel文件中已经存在的表中(将表读作“Excel的表”) 使用以下代码,我完美地将该行添加到现有表中: library(XLConnect) setStyleAction(wb,XLC$"STYLE_ACTION.NONE") wb <- loadWorkbook("test.xlsx") appendWorksheet(wb, expense, sheet="expenses", header = FALSE) saveWorkbook(w

我试图实现的是将
R
中的一个对象中的一行添加到
Excel
文件中已经存在的表中(将表读作“Excel的表”)

使用以下代码,我完美地将该行添加到现有表中:

library(XLConnect)
setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
wb <- loadWorkbook("test.xlsx")
appendWorksheet(wb, expense, sheet="expenses", header = FALSE)
saveWorkbook(wb)
库(XLConnect)
setStyleAction(wb,XLC$“STYLE_ACTION.NONE”)

wb我建议编写一个简单的公式,将宏复制到电子表格中。当然,您需要调用它
test.xlsm
,而不是
test.xlsx
。如果您的电子表格如下所示:

Option Explicit

Sub MyMacro()
    Dim BottomRowOfData As Integer, BottomRowOfFormula As Integer, rowDiff As Integer

    With ThisWorkbook.Worksheets("expenses")
        BottomRowOfData = .Range("B1").End(xlDown).Row
        BottomRowOfFormula = .Range("C1").End(xlDown).Row
        rowDiff = BottomRowOfData - BottomRowOfFormula

        If (rowDiff > 0) Then
            .Range("C" & BottomRowOfFormula).Copy
            Call .Range(.Range("C" & BottomRowOfFormula + 1), .Range("C" & BottomRowOfData)).PasteSpecial
        End If
    End With

    ' Save your work
    ThisWorkbook.Save
End Sub

那么您的宏可能如下所示:

Option Explicit

Sub MyMacro()
    Dim BottomRowOfData As Integer, BottomRowOfFormula As Integer, rowDiff As Integer

    With ThisWorkbook.Worksheets("expenses")
        BottomRowOfData = .Range("B1").End(xlDown).Row
        BottomRowOfFormula = .Range("C1").End(xlDown).Row
        rowDiff = BottomRowOfData - BottomRowOfFormula

        If (rowDiff > 0) Then
            .Range("C" & BottomRowOfFormula).Copy
            Call .Range(.Range("C" & BottomRowOfFormula + 1), .Range("C" & BottomRowOfData)).PasteSpecial
        End If
    End With

    ' Save your work
    ThisWorkbook.Save
End Sub
根据我对的回答,您可以从R调用VBA宏。为了完整起见,以下是该问题的代码:

library(RDCOMClient)

# Open a specific workbook in Excel:
xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()$Open("C:\\TEMP\\test.xlsm")

# this line of code is only necessary if you want to see your spreadsheet getting updated:
xlApp[['Visible']] <- TRUE 

# Run the macro called "MyMacro":
xlApp$Run("MyMacro")

# Close the workbook and quit the app:
xlWbk$Close(FALSE)
xlApp$Quit()

# Release resources:
rm(xlWbk, xlApp)
gc()
库(RDCOMClient)
#在Excel中打开特定工作簿:

xlApp你的意思是把wb放入
wb吗?这是一个困难的问题:显而易见的解决方案应该包括将你的费用包含在一个Excel“表”对象中,并将
XLConnect
附加到该对象中。但是
XLConnect
只能
readTable
;它不能
writeTable
。我有一个涉及VBA宏的(不雅观的)解决方案,下面是一些工作。它可以顺利工作,但问题是我无法将宏添加到此特定文件(因为它用于没有宏的设备)。显然,你的答案是一个完全有效的方式来做这项工作。希望有一天他们能将这个“函数”添加到库中,因为我相信它对很多人都非常有用。除了弄清楚如何在R中执行更复杂的类似宏的Excel操作外,也许您可以在“master”
.xlsm
工作簿中编写一些VBA宏,该工作簿可以处理所有其他未启用宏的
.xlsx
工作簿?