复制模板工作表并从另一个工作表中的数据表填充

时间:2016-01-07 19:36:50

标签: excel-vba vba excel

我想实现以下

  1. 使用模板(" AmortTemplate")在同一工作簿中创建新工作表

  2. 创建新工作表后(" AmortTemplate(2)"),从现有工作表中的表中填充此工作表中的特定字段(" AssetInfo")在同一工作簿中

  3. 将新工作表(" AmortTemplate(2)")重命名为新工作表中特定字段的值,例如: " ABC 123 GP",来自表格中的单元格G7

  4. 使用" AssetInfo"中的参考表重复新的工作表创建和字段填充。工作表直到创建工作表并为参考表中的所有记录(行)填充字段

  5. 我已设法创建简单的VBA宏(使用Excel 2016中的宏记录功能),如下所示,但需要将操作组合并重复,如上所述。

    Sub Copy_Amort_Template()
    '
    ' Copy_Amort_Template Macro
    '
        Sheets("AmortTemplate").Select
        Sheets("AmortTemplate").Copy Before:=Sheets(2)
    End Sub
    
    
    
    Sub Insert_Asset_Info()
    '
    ' Insert_Asset_Info Macro
    '
        Sheets("Amort Template (2)").Select
        Range("G6").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[2]C[-4]"
        Range("G7").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[1]C[-5]"
        Range("G8").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!RC"
        Range("G9").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-1]C[-3]"
        Range("G10").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-2]C[-1]"
        Range("G11").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-3]C[1]"
        Range("G14").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-6]C[-2]"
        Range("E15").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-7]C[8]"
        Range("G15").Select
        ActiveCell.FormulaR1C1 = "=AssetInfo!R[-7]C[5]"
        Range("G7").Select
        Selection.Copy
        Sheets("Amort Template (2)").Select
        Sheets("Amort Template (2)").Name = "ABC 123 GP"
    End Sub
    

1 个答案:

答案 0 :(得分:0)

不可能对你的问题给出完整的答案,但是可以帮助你。

宏记录器可以是一个帮助,但它是有限的。它会记录您的操作。它产生语法正确的VBA但不是很好的VBA。例如,假设我单击一个单元格,输入一个值并按 Enter ,它将记录:

Range("A1").Select
ActiveCell.FormulaR1C1 = "5"
Range("A2").Select

没有程序员会输入类似的东西。他们会输入类似以下其中一种选择:

Range("A1").Value = "5"
Cells(1, "A").Value = "5"
Cells(1, 1).Value = "5"
Cells(RowCrnt, ColCrnt) .Value = "5"

在前三个语句中,我使用了不同的方法来指定单元格A1。在第四个中,我使用了以前设置的变量来指定我想要更改的单元格所必需的值。

我将宏记录器用于我不确定语法的单个复杂语句。例如,我发现宏记录器是获取复杂SortFind代码的最佳方式,因为我不经常使用这些语句来记住它们的语法。

宏记录器无法帮助您处理IfDoFor语句。那些你必须自己编码的。

在尝试其他任何事情之前,你必须至少学习VBA的基础知识。您无法从Macro Recorder或您在此站点或其他站点上找到的代码片段中学习VBA。搜索“Excel VBA教程”。有许多在线教程可供选择,因此找到一个符合您学习风格的教程。我更喜欢书。我参观了一个很好的图书馆,审查了他们的Excel VBA引物,借用了最有希望在家里进一步研究的东西,然后购买了我认为最好的永久参考。

您选择的教程或入门将教您变量,ifs,循环以及访问工作表和工作簿。这可以为您提供足够的信息来编写宏。如果没有,请尝试搜索单个目标。例如,搜索“Excel VBA复制工作表”。这将带你到https://msdn.microsoft.com/en-us/library/office/ff837784.aspx解释“Worksheet.Copy Method(Excel)”。

不要使用相对单元格地址。有时相对地址可能有用但我不相信这是其中之一。使用相对地址,您可以非常快速地找到自己的位置。如果你想围绕代码循环,那就更是如此。

整理你当前的代码给出:

  Worksheets("Amort Template").Copy Before:=Worksheets(2)
  ' Sheets("Amort Template (2)").Select  ' Not necessary; the new worksheet is the active worksheet
  With Worksheets("AssetInfo")
    Range("G6").Value = .Cells(8, "C").Value
    Range("G7").Value = .Cells(8, "B").Value
    Range("G8").Value = .Cells(8, "G").Value
    Range("G9").Value = .Cells(8, "D").Value
    Range("G10").Value = .Cells(8, "F").Value
    Range("G11").Value = .Cells(8, "H").Value
    Range("G14").Value = .Cells(8, "E").Value
    Range("E15").Value = .Cells(8, "M").Value
    Range("G15").Value = .Cells(8, "L").Value
    ActiveSheet.Name = .Cells(8, "B").Value
  End With

我可能错误地转换了一些相对地址,但我不这么认为。

注意:

  1. Range("G6").Value(无前导期)是指活动工作表。
  2. .Cells(8, "C").Value(领先期)是指With语句标识的工作表。
  3. Range("C8")Cells(8, "C")具有相同的含义。我选择Cells格式的原因很明显。
  4. 您提到在工作表“AssetInfo”中有一个表。我假设第8行是表的第一行。如果我是正确的,你需要围绕这段代码循环:

    For RowCrnt = 8 to RowLast
      :
    Next
    

    您还需要将.Cells(8, "C").Value替换为.Cells(RowCrnt, "C").Value。对所有其他.Cells(8, "X").Value重复。

    如果您搜索“Excel VBA查找最后一行”,您会发现许多网站会告诉您如何设置RowLast的值。

    我希望这会让你开始。