2013-12-18 20 views
5

R (3.0.2)/MSOffice 2013/Win7Esportazione dei dati da R a Excel: formule non ricalcolare

Supponiamo di avere un data.xlsx file esistente con due fogli - "dati" e "calc".

scheda "Dati" viene riempita attraverso R con:

require(XLConnect) 
df <- data.frame(c(1,2,3,4,5), c(2,3,4,5,6)) 
wb <- loadWorkbook("data.xlsx", create=F) 
setStyleAction(wb, type=XLC$"STYLE_ACTION.NONE") 
writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
saveWorkbook(wb) 

Così qui viene il problema - ho foglio "calc" che fa riferimento a "dati" foglio con le formule. Per qualche motivo l'aggiornamento dei dati non viene ricalcolato anche se le formule si riferiscono alle celle appena compilate.

L'opzione di calcolo in Excel è impostata su automatico, anche se si passa a manuale e premendo F9 per forzare per il ricalcolo non viene eseguito lavoro.

Ho trovato alcuni modi strani per farlo funzionare: 1. selezionare una particolare cella che contiene la formula appropriata e premere Invio (per ciascuna cella) 2. trascinare nuovamente le formule su celle malfunzionanti (sovrascrivere la formula con la stessa esatta formula ..) 3. Fare riferimento alla scheda tecnica da altri file (ad esempio, data2.xlsx) funziona ma questa per me è l'ultima opzione. Non voglio gonfiare la struttura dei file con file di dati separati. Inoltre, considera questo orribile requisito di aprire entrambi i file per farlo funzionare.

Grazie in anticipo.

+0

fa un salvataggio farlo? – pnuts

+1

No, non è così. –

+0

Posso riprodurre questo problema esatto con Excel2010 su Win7. La mia raccomandazione è di presentare una segnalazione di bug all'autore di XLConnect e nel frattempo provare a lavorare con il pacchetto 'xlsx'. A proposito, ho provato a saltare la riga 'setStyleAction', senza modificare i risultati.Penso che qualcosa in XLConnect rompa ciò che Excel usa per "collegare" le formule alle loro celle di riferimento. –

risposta

2

Guardando che questo legame diventa alcuni clic e la soluzione è nascosta nella sezione commenti, ecco la risposta:

wb$setForceFormulaRecalculation(T)

Questo dovrebbe funzionare per la maggior parte dei pacchetti (almeno quelle basate su Rjava) come questo java il metodo viene passato all'interno di Excel, quindi non è determinato dal linguaggio R.

-1

È possibile inserire questa macro VBA in un modulo del documento Excel ed eseguirla (da Excel) dopo il trasferimento dei dati.

Anche più semplice: premere F9 in Excel, forza il calcolo di tutte le formule.

Mi dispiace per la mia risposta precedente.

questa macro funziona per me, appena testato:

Sub refresh2() 
Dim sht As Worksheet 

Dim rng0 As Range 
Dim rng1 As Range 
Dim c As Range 

'loop through the sheets 
For Each sht In ActiveWorkbook.Worksheets 

    'limit the search to the UsedRange 
    Set rng0 = sht.UsedRange 
    On Error Resume Next ' in case of no formulas 

    'reduce looping further 
    Set rng1 = rng0.SpecialCells(xlCellTypeFormulas) 

    For Each c In rng1 'loop through the SpecialCells only 
     c.Formula = c.Formula 
    Next 

Next 
End Sub 
+0

Non è quello che ha detto l'OP: ha già provato questo, come ho fatto io. Il problema è più profondo di un semplice ricalcolo. –

+0

Sospetto che la macro sia più o meno la stessa di quando si preme F9. E ... penso di averlo già menzionato provandolo nel post. –

+0

Questa è una soluzione molto creativa, ma ho due obiezioni. Innanzitutto, è probabile che vada fuori controllo se ci sono altre formule nel foglio di lavoro. In secondo luogo, poiché è abbastanza chiaro, 'XLConnect' sta facendo qualcosa che le cartelle di lavoro' xlsx' non piacciono, è il pacchetto 'R' che dovrebbe essere corretto, piuttosto che permettere a un errore di propagandare. –

0

So che questo post è di 2,5 anni, ma ho appena avuto esattamente lo stesso problema con te. Ho il sospetto che ci siano alcuni problemi con XLConnect. Ho usato write.csv e ha funzionato. Il problema che ho con write.csv è che il mio dataframe ha più di 16384 colonne e non posso aggiungere un altro foglio al file.

+0

Sì, lo sto vivendo anch'io – user2981639

1

Dopo aver caricato una cartella di lavoro e aver scritto i dati, forzare il ricalcolo della formula prima di salvare la cartella di lavoro in una directory.

Questo dovrebbe funzionare per voi:

writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
setForceFormulaRecalculation(wb,"data",TRUE) 
saveWorkbook(wb) 
Problemi correlati