Excel

2015-04-27 23 views
5

içindeki hücre aralığına formül atanamadı. Projede bir başkasının kodu düzeltilmeye çalışıyorum. FormulaMatrix(i, j) her zaman String değerdirExcel

listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j)

. Rastgele/test değeri ne olursa olsun, bir formül olduğunda, örneğin, başarılı bir şekilde atanıyor. Ben formülün başında = işaretini kaldırırsanız

=IF(LENGTH([@Units])>0;[@SalesAmount]-[@DiscountAmount]0)

, doğru atanır, ancak bir formül değil çünkü o zaman, yararsız. Sütun referansları/adları.

Yani, bir formül atarken, bir özel durum HRESULT: 0x800A03EC olsun. Açıklama alabilmek için in this answer numaralı telefonu inceledim ve talimatların bazılarını takip ettim. Sorunumun aşağıdaki olduğunu belirledim: sorun, bir hücreye girilen bir işlevden kaynaklanıyor ve başka bir hücreyi güncellemeye çalışıyor.

(tekrar tekrar çalıştırın ve eşittir işareti koymak sonra = olmadan sadece formüller koyarak ve benzeri) oldukça farklı denedik da this post. kontrol etti, ancak aynı sorun.

Buna nasıl yaklaşacağımın hiçbir fikrim yok.

+0

bu diğer işlevidir? Ne yapıyor ve hangi hücreyi güncellemeye çalışıyor? – nwhaught

+1

Bu Excel Interop mu? Formülü doğrudan .FormulaR1C1 yerine .Value veya .FormulaLocal ile dize olarak deneyin. R1C1 şeyinin benim için hiç işe yaramadığını doğru hatırlarsam. – Jaxedin

+3

Ayrıca, sorunuzdaki formül geçerli değil ... '= IF (LEN ([@ Üniteler])> 0, [@ SalesAmount] - [@ DiscountAmount], 0)' demek istiyor musunuz? – nwhaught

cevap

1

Hata şu anki verilerinizden, sırasıyla, sayfa düzeninden geliyor olabilir. Formülü atamadan önce listO.Range(i, j).FormulaR1C1'un içinde ne olduğunu kontrol etmenizi öneririm.

Aralığın içinde zaten yanlış veriler olduğunu ve garip bir şekilde, nedenini bilmiyorum, yeni formülü atayamıyorum.

Bu durumda - aralığının değerini temizlemeyi ve ardından formülü atama deneyin:

listO.Range(i, j).FormulaR1C1 = "" 
listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j) 
+0

Bu kadar basit ... Aralığın her formülde yanlış değerleri vardı. Herhangi bir nedenle, her sütun referansından önce ek bir metin vardı ... Bir başkasının kodunu düzeltdiğinizde/yükselttiğinizde bu gerçekleşir. – Syspect

-1

Sorun, formülü ile olabilir. Bu işe yaramazsa bu-

=IF(LEN([@Units])>0,[@SalesAmount]-[@DiscountAmount],0) 

deneyin yerine .formulaR1C1 ait .formula yöntemini .. R1C1 başvuruları kullanan özellikle bir sebebi var mı kullanmayı deneyin ki?

4

.formulalocal (ederken .formula, .value ve .formular1c1 yok.)

Sadece VB.NET ile çalışmaya başlayan çok benzer bir sorunu haline geldi ettik. Bu (Sheet1 içinde Table1) ilk başta benim basitleştirilmiş verileri:

before

Sonra bu vardı aşağıdaki kodu uyguladıktan sonra:

after

form için bütün kod:

Imports Excel = Microsoft.Office.Interop.Excel 

Public Class Form1 
    '~~> Define your Excel Objects 
    Dim xlApp As New Excel.Application 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkSheet As Excel.Worksheet 
    Dim strAddress As String = "C:\Temp\SampleNew.xlsx" 
    Dim list1 As Object 


    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click 
     '~~> Add a New Workbook (IGNORING THE TWO DOT RULE) 
     xlWorkBook = xlApp.Workbooks.Open(strAddress) 

     '~~> Display Excel 
     xlApp.Visible = True 

     '~~> Set the relevant sheet that we want to work with 
     xlWorkSheet = xlWorkBook.Sheets("Sheet1") 

     With xlWorkSheet 

      '~~> Change the range into a tabular format 
      list1 = .ListObjects("Table1") 

     End With 

     list1.range(2, 4).formulalocal = "=IF(LEN([@Month])>5;[@Income]-[@MoneySpent];0)" 

     '~~> Save the file 
     xlApp.DisplayAlerts = False 
     xlWorkBook.SaveAs(Filename:=strAddress, FileFormat:=51) 
     xlApp.DisplayAlerts = True 

     '~~> Close the File 
     xlWorkBook.Close() 

     '~~> Quit the Excel Application 
     xlApp.Quit() 

     '~~> Clean Up 
     releaseObject(xlApp) 
     releaseObject(xlWorkBook) 
    End Sub 


    '~~> Release the objects 
    Private Sub releaseObject(ByVal obj As Object) 
     Try 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
      obj = Nothing 
     Catch ex As Exception 
      obj = Nothing 
     Finally 
      GC.Collect() 
     End Try 
    End Sub 
End Class 

@Siddharth Rout bu c'yi oluşturmak için çok yardımcı oldu Ode, bu muhteşem sitenin sahibi olduğu gibi: http://www.siddharthrout.com/

+1

Haha yup kullanmak daha güvenlidir. FormulaLocal, Interop ile bir projede kullandığım şeydir. Bundan sonra, Excel'in kurulu olması gerektiğinden Excel Interop'u kullanmayı bırakıyorum ve ofis sürümünü/dilini değiştirirseniz kodunuz çalışmayabilir !. Biliyorum 'infragistics' ödenir, ancak Excel kütüphanesi sadece harika ve hatta ofise bile ihtiyacınız yok. – Jaxedin

+0

Hayır, tüm FormulaLocal', 'Value' ve' Formula' denedim ve ne çalışır. Hala aynı istisnai durumum var ... – Syspect

+1

Kodumu sizinkiyle karşılaştırabilir ve farklılıklarla geri dönebilir misiniz? Daha da iyisi - ** belki bir demo oluşturabilirsiniz, böylece herkes hatayı yeniden oluşturabilir mi? Bu belirli hata, konuyla ilgili bir süre aradığım için çok geniş. Muhtemelen seçeneklerden biri, kodunuzda 0'dan saymaya başlayan bir döngüye sahip olmanızdır. Excel'in 1'den başlamasına gerek duyarken, lütfen kodunuzu araştırın. Bir [Minimal, Tam ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) yapıştırın. – ZygD