我想实现以下
使用模板(" AmortTemplate")在同一工作簿中创建新工作表
创建新工作表后(" AmortTemplate(2)"),从现有工作表中的表中填充此工作表中的特定字段(" AssetInfo")在同一工作簿中
将新工作表(" AmortTemplate(2)")重命名为新工作表中特定字段的值,例如: " ABC 123 GP",来自表格中的单元格G7
使用" 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
答案 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。在第四个中,我使用了以前设置的变量来指定我想要更改的单元格所必需的值。
我将宏记录器用于我不确定语法的单个复杂语句。例如,我发现宏记录器是获取复杂Sort
或Find
代码的最佳方式,因为我不经常使用这些语句来记住它们的语法。
宏记录器无法帮助您处理If
,Do
或For
语句。那些你必须自己编码的。
在尝试其他任何事情之前,你必须至少学习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
我可能错误地转换了一些相对地址,但我不这么认为。
注意:
Range("G6").Value
(无前导期)是指活动工作表。.Cells(8, "C").Value
(领先期)是指With
语句标识的工作表。Range("C8")
与Cells(8, "C")
具有相同的含义。我选择Cells
格式的原因很明显。您提到在工作表“AssetInfo”中有一个表。我假设第8行是表的第一行。如果我是正确的,你需要围绕这段代码循环:
For RowCrnt = 8 to RowLast
:
Next
您还需要将.Cells(8, "C").Value
替换为.Cells(RowCrnt, "C").Value
。对所有其他.Cells(8, "X").Value
重复。
如果您搜索“Excel VBA查找最后一行”,您会发现许多网站会告诉您如何设置RowLast
的值。
我希望这会让你开始。