Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 复制模板工作表并从另一个工作表中的数据表填充_Excel_Vba - Fatal编程技术网

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

Excel 复制模板工作表并从另一个工作表中的数据表填充,excel,vba,Excel,Vba,我希望实现以下目标 使用模板(“AmortTemplate”)在同一工作簿中创建新工作表 创建新工作表(“AmortTemplate(2)”)后,从同一工作簿中现有工作表(“AssetInfo”)中的表填充此工作表中的特定字段 将新工作表(“AmortTemplate(2)”重命名为新工作表中特定字段的值,例如工作表中单元格G7中的“ABC 123 GP” 使用“AssetInfo”工作表中的参考表重复创建新工作表和填充字段,直到为参考表中的所有记录(行)创建工作表和填充字段 我已成功创建了如下

我希望实现以下目标

  • 使用模板(“AmortTemplate”)在同一工作簿中创建新工作表

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

  • 将新工作表(“AmortTemplate(2)”重命名为新工作表中特定字段的值,例如工作表中单元格G7中的“ABC 123 GP”

  • 使用“AssetInfo”工作表中的参考表重复创建新工作表和填充字段,直到为参考表中的所有记录(行)创建工作表和填充字段

  • 我已成功创建了如下所示的简单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
    

    你不可能对你的问题给出一个完整的答案,但它可以在你的道路上帮助你

    宏记录器可以提供帮助,但它是有限的。它记录了你在做什么。它产生语法正确的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。在第四个示例中,我使用了一些变量,这些变量以前会设置为指定要更改的单元格所需的值

    对于语法不确定的单个复杂语句,我使用宏记录器。例如,我发现宏记录器是获取复杂
    排序
    find
    的代码的最佳方法,因为我使用这些语句的频率不足以记住它们的语法

    宏记录器不会帮助您处理
    If
    Do
    For
    语句。你必须自己编写代码

    在尝试其他操作之前,您必须至少学习VBA的基础知识。您无法从宏录制器或在本网站或其他网站上找到的代码片段中学习VBA。搜索“Excel VBA教程”。有许多在线教程可供选择,因此请找到一个与您的学习风格相匹配的教程。我更喜欢书。我参观了一个很好的图书馆,复习了他们的Excel VBA入门,借了最有希望在家继续学习的书,然后买了一本我认为最好的书作为永久参考

    您选择的教程或初级读物将教您有关变量、ifs、循环以及访问工作表和工作簿的知识。这可以为您提供足够的信息来编写宏。如果没有,请尝试搜索单个目标。例如,搜索“Excel VBA复制工作表”。这将带您到解释“工作表.复制方法(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
    
    我可能误解了一些相对地址,但我不这么认为

    注:

  • 范围(“G6”)。值
    (无前导周期)指的是活动工作表
  • .Cells(8,“C”).Value
    (前导周期)指由
    With
    语句标识的工作表
  • 范围(“C8”)
    单元格(8,“C”)
    具有相同的含义。我选择了
    单元格
    格式,原因很清楚
  • 您提到在工作表“AssetInfo”中有一个表。我假设第8行是表的第一行。如果我是正确的,您将需要围绕以下代码进行循环:

    For RowCrnt = 8 to RowLast
      :
    Next
    
    您还需要将
    .Cells(8,“C”).Value替换为
    .Cells(RowCrnt,“C”).Value
    。对所有其他
    .Cells(8,“X”).Value
    s重复上述操作

    如果搜索“Excel VBA查找最后一行”,您将找到许多网站,这些网站将告诉您如何设置
    RowLast
    的值


    我希望这会让你开始。

    不可能对你的问题给出一个完整的答案,但可以在路上帮助你

    宏记录器可以提供帮助,但它是有限的。它记录了你在做什么。它产生语法正确的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。在第四个示例中,我使用了一些变量,这些变量以前会设置为指定要更改的单元格所需的值

    对于语法不确定的单个复杂语句,我使用宏记录器。例如,我发现宏记录器是获取复杂
    排序
    find
    的代码的最佳方法,因为我使用这些语句的频率不足以记住它们的语法

    宏记录器不会帮助您处理
    If
    Do
    For
    语句。你必须自己编写代码

    在尝试其他操作之前,您必须至少学习VBA的基础知识。您无法从宏录制器或在本网站或其他网站上找到的代码片段中学习VBA。搜索“Excel VBA教程”。有许多在线教程可供选择,因此请找到一个与您的学习风格相匹配的教程。我更喜欢书。我参观了一个很好的图书馆,复习了他们的Excel VBA入门,借了最有希望在家继续学习的书,然后买了一本我认为最好的书作为永久书