【发布时间】:2018-03-16 12:33:18
【问题描述】:
我曾多次访问该网站以寻求在 Excel 的 VBA 编辑器中创建宏的帮助。事实上,我使用这个网站帮助创建了一个半自动更新我们公司计费电子表格的宏。但是,我想将人为错误因素排除在流程之外,并使其更加万无一失。我只是不知道如何搜索或表达我想要做的事情来找到可以工作的代码序列。这是我当前运行良好的代码,但为人为错误留下了空间:
' Copy of "New Totals" columns to "Previous Billing" columns of new "Current Billing" worksheet
Sheets("Current Billing").Select
Range("o4").Select
Set Rng1 = Application.InputBox("Select complete range of New Totals" & vbNewLine & vbNewLine & _
"Please start at O4:Q4 and proceed to the end, but do not include the Totals at the bottom", _
"New Totals Selection", Type:=8)
Rng1.Select
Rng1.Copy
Sheets("Current Billing (2)").Select
Range("h4").Select
Range("h4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("h4").Select
通过要求用户选择需要复制的单元格,我为错误留出了空间,以防复制时遗漏单元格或复制了错误的单元格。我想尽量减少这种可能性。我遇到了其他人推荐的用于复制数据的更好方法的代码:
Dim Rng1 As Range
Dim rng4 As Range
Sheets("Current Billing").Select
Sheets("Current Billing").Copy Before:=Sheets(2)
Sheets("Current Billing").Select
Set Rng1 = Sheets("Current Billing").Range("o:q")
'Range o:q is "New Totals" referenced above
Set rng4 = Sheets("Current Billing (2)").Range("h:j")
'Range h:j is "Previous Billing" referenced above
rng4.Value = Rng1.Value
但这样做是擦除 3 个公式,我有“求和”数据以给出 H:J 范围内的列的总数。我想在我的数据末尾找到“总计”行,并在适当的单元格中重建公式。例如,我在单元格 H47 和 J47 中有一个“求和”公式,范围分别为 H4:H45 和 J4:J45。
通过所有这些解释,我如何创建一个宏序列,该序列将自动重建特定单元格中的公式,该单元格将具有可变的行位置,但静态列位置(通常)?对于冗长的解释,我深表歉意,但感谢您的所有帮助。如果我需要澄清任何事情,请告诉我。祝你有美好的一天。
[编辑 3-14-18 @ 8:43PDT] 我的范围 O:Q 包含不需要复制到我的范围 H:J 的公式,我只需要复制的值。这就是我的问题出现的地方,因为我的 =Sum() 函数在行位置上有所不同,我无法弄清楚如何识别 =Sum() 发生的特定单元格并重新插入它。我做了一些研究,发现了以下三个功能
=index(H:H, Match(""total"", A:A, 0))
=CELL(""address"",index(H:H, Match(""total"", A:A, 0)))
=offset(CELL(""address"",index(H:H, Match(""total"", A:A, 0))),-1,0)
但我无法弄清楚如何正确设置我的变量,然后才能重新插入 =Sum() 函数。谢谢你的帮助。
[编辑 2018 年 3 月 15 日 @ 9:10 PDT] 以下是修改后的代码,该代码基于 GMalc 创建的代码,适用于请求的 2 个澄清。如何将实际的 =Sum() 函数插入最后一个 Total 单元格而不是值;以及如何防止在最后一个总计行的正下方添加额外的数据行。
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = ThisWorkbook.Sheets("Current Billing")
Set ws2 = ThisWorkbook.Sheets("Current Billing (2)")
Dim lRow As Long
Dim lRowa As Long
lRow = ws1.Cells(Rows.Count, 15).End(xlUp).Row
lRowa = ws2.Cells(Rows.Count, 15).End(xlUp).Row
ws2.Range("H4:J" & lRowa).Value = ws1.Range("O4:Q" & lRow).Value
'ws2.Range("H4").Value
Dim lRow2 As Long
Dim fRow As Long
lRow2 = ws2.Range("H4:J" & Rows.Count).End(xlUp).Row
fRow = lRow + 1
ws2.Range("H" & fRow) = WorksheetFunction.Sum(Range("H4:H" & lRow2))
【问题讨论】:
-
所以我不确定我是否理解,但您想自动选择包含
=SUM()公式的单元格范围?您是否知道这些通常在哪里,或者它们可以在工作表上的任何位置? -
嗨,Jason,在回答您的第二个问题时,包含 =Sum() 函数的 Total 行可能出现在电子表格中的任何行,具体取决于我们试图为项目跟踪的数据量计费。在我复制了上个月的账单数据后,我希望能够找到“总计”行并将我的 =Sum() 函数重新插入到位。我将在我的问题中添加更多说明,并提供更多信息。