2013-04-16 70 views
1

我有一個電子表格,它定義了幾個包含源數據和使用源數據的函數的Excel表格。例如,一個名爲MYTBL表由三個「源列」和一個式塔...如何在維護表格公式的同時使用VBA更新Excel表格

Part Price Qty Extended Price 
------ ----- --- -------------- 
Shoe 5.50 10 =(MyTbl[[#ThisRow],[Price]])*(MyTbl[[#ThisRow],[Qty]]) 
... 

週期性地,源列必須通過從CSV文件的值來代替,但是式柱(S)應該保持不受影響。該文件是這樣的:

Shoe,5.65,98 
Coat,12.65,223 
... 

如何「刷新」源列,同時保持Excel表及其公式的存在?我想在VBA中這樣做,因爲CSV文件沒有一致的名稱或路徑。

在此先感謝。

+0

你需要嘗試一些東西,即開始編寫一些代碼,所以我們有一些東西可以幫助你。我認爲最好的方法是刪除除表格第一行以外的所有行,使用Listobjects'Resize'方法獲取正確的行數並複製到新列中。我在我的博客上有一個[有點相關的帖子](http://yoursumbuddy.com/copy-table-data-while-not-breaking-references/)。 –

+0

這是Jan Karel Pieterse的[良好教程](http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp)。還有一件事 - 你會特別想看看ListColumn對象。 –

+0

@DougGlancy感謝您的指導和幫助。我能夠從您的博客和教程中加入代碼,以獲得我需要的結果。這裏是代碼: – user2286596

回答

1

感謝Doug Glancy的建議。

最初的問題是處理將.csv加載到listobject中。我結束了從csv的數據加載到一個新的工作表listobject。然後,我可以將源列表對象合併到目標列表對象中,同時使用以下過程維護目標所維護的額外列(和公式)。此過程將清除不需要的數據,如果源包含的行少於目標的行,則刪除行,複製數據並調整listobject的大小。此溶液內

假設
- 源列表對象包含的某些列數小於目標
- 兩個列表對象包含單個標題行(I沒有測試比單個標題行任何更多)

Private Sub CopyTableData(loSource As Excel.ListObject, loTarget As Excel.ListObject)
Dim lSourceRowCount As Long

With loTarget 
    If .DataBodyRange.Rows.Count <> loSource.DataBodyRange.Rows.Count Then 
     ' clear of target area should clear target num rows and source num columns 
     .Range(.Cells(1,1).Address, .Cells(.DataBodyRange.Rows.Count, lSource.RefersToRange.Columns.Count)).Clear 

     ' clear rows if source has less than target 
     If .DataBodyRange.Rows.Count > loSource.DataBodyRange.Rows.Count Then 
      For i = .DataBodyRange.Rows.Count To loSource.DataBodyRange.Rows.Count + 1 Step -1 
       .DataBodyRange.Rows(i).Clear 
      Next i 
     End If 

     ' resize list object 
     lSourceRowCount = loSource.HeaderRowRange.Rows.Count + _ 
          loSource.DataBodyRange.Rows.Count 

     .Resize .Range.Cells(1).Resize(lSourceRowCount, .Range.Columns.Count) 
    End If 
    loSource.DataBodyRange.Copy .DataBodyRange.Cells(1) 
End With 

End Sub

再次感謝。