1

我有一个电子表格,它定义了几个 Excel 表,其中包括源数据和使用源数据的函数。例如,一个名为 MyTbl 的表由三个“源列”和一个公式列组成......

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

必须定期将源列替换为 CSV 文件中的值,但公式列应保持不受影响。该文件类似于:

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

如何在保持 Excel 表及其公式存在的同时“刷新”源列?我想在 VBA 中执行此操作,因为 CSV 文件没有一致的名称或路径。

提前致谢。

4

1 回答 1

1

感谢 Doug Glancy 的建议。

最初的问题涉及将 .csv 加载到列表对象中。我最终将 csv 中的数据加载到新工作表上的 listobject 中。然后,我能够将源列表对象合并到目标列表对象中,同时使用以下过程维护目标维护的其他列(和公式)。此过程清除不需要的数据,如果源包含的行少于目标,则删除行,复制数据并调整列表对象的大小。

此解决方案中的假设
- 源列表对象包含的列数少于目标
- 两个列表对象都包含一个标题行(我没有测试超过一个标题行)

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

再次感谢。

于 2013-04-29T17:22:16.917 回答