【问题标题】:How to update Excel Table using VBA while maintaining table's formulas如何在维护表格公式的同时使用 VBA 更新 Excel 表格
【发布时间】:2013-04-08 22:42:47
【问题描述】:

我有一个电子表格,它定义了几个 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 文件没有一致的名称或路径。

提前致谢。

【问题讨论】:

  • 您需要尝试一些事情,即开始编写一些代码,因此我们可以为您提供帮助。我认为最好的方法是删除表的第一行以外的所有内容,使用 Listobjects Resize 方法获取正确的行数并复制到新列中。我的博客上有somewhat related post
  • 这是 Jan Karel Pieterse 的good tutorial。还有一件事 - 你会特别想看看 ListColumn 对象。
  • @DougGlancy 感谢您的指导和帮助。我能够合并您博客和教程中的代码以获得我需要的结果。这是代码:
  • @DougGlancy 我认为你的 cmets 很有用,但我没有这样做的必要声誉。
  • 我很高兴他们有帮助。

标签: excel vba


【解决方案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

结束子

再次感谢。

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多