【问题标题】:Variables w/ Cell Address & Formulas带有单元格地址和公式的变量
【发布时间】: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() 函数重新插入到位。我将在我的问题中添加更多说明,并提供更多信息。

标签: vba excel


【解决方案1】:

编辑 1:您需要了解如何不使用 Select。这就是我认为你所要求的。代码将 O4 中“当前帐单”中的所有新数据复制到最后一行。然后将数据粘贴到单元格 H4 的“当前帐单 (2)”中。然后在最后一行下方的单元格中添加 Sum 函数,将 H4 中的数据加到最后一行。您应该可以将 I 和 J 行的总和相加。我已经多次测试过,您应该没有问题。

Dim ws1 As Worksheet
Dim ws2 As Worksheet
'Ensure your worksheet names are correct
Set ws1 = ThisWorkbook.Sheets("Current Billing")
Set ws2 = ThisWorkbook.Sheets("Current Billing (2)")

'Set the last row in column 15, to copy the dynamic range.
Dim LastRow As Long
LastRow = ws1.Cells(Rows.Count, 15).End(xlUp).Row
    'Copy your range from "Current Billing" to "Current Billing (2)" starting at H4
    ws1.Range("O4:Q" & LastRow).Copy ws2.Range("H4")

'Set the last row variable for the "Current Billing (2)" worksheet because it will be different then the "Current Billing" worksheet
Dim LastRow2 As Long
'Set the variable for the empty cell below the last row in column H
Dim fRow As Long

LastRow2 = ws2.Cells(Rows.Count, "H").End(xlUp).Row
fRow = LastRow2 + 1

'Insert the sum formula in the empty cell below the last row in column H
ws2.Cells(fRow, "H").Formula = "=SUM(H4:H" & LastRow2 & ")"

【讨论】:

  • 您好 GMalc,感谢您对代码的建议。我尝试运行它,发现了两个问题,可能还有第三个。首先,我的 Range O:Q 包含显示 H 列和 L 列之和的公式。复制发生时,公式也被复制,单元格中有 #Value 错误,我需要复制的只是值.第二个是运行时错误“1004”:对象“_Global”的方法“范围”在第 1Row2 行失败。我看到的第三个潜在问题是 xlUp 命令。数据中可能存在可能导致该命令丢失数据的间隙。
  • [上面的继续评论]我将编辑我的原始问题以添加更多信息。感谢您的帮助。
  • 早上好@GMalc。如上所述,您的代码几乎可以正常工作,我必须进行一些修改,我将在编辑我的问题时发布这些修改,以便您可以看到我所做的更改。有了这些变化,它就可以工作了!谢谢!关于代码,我有 2 个后续问题。有没有办法将 =Sum() 函数实际插入“Total”行而不是插入 =Sum() 值?我的第二个问题是,“H4”中的第一个数据单元格正在被复制到我的总单元格正下方的单元格中。这可能是什么原因造成的?再次感谢大家的帮助!!祝你有美好的一天。
  • 您能否解释一下代码是如何/为什么工作的?我足够了解进行修改或模仿代码以使其工作,但我不完全理解函数的语法以在不同的工作表中再次使用它们。再次感谢你的帮助。祝你有美好的一天。
  • @Elliot,我已经用 cmets 编辑了我的答案。如果要将求和公式放在其他两列中,请复制代码行并更改列字母,如下所示...ws2.Cells(fRow, "I").Formula = "=SUM(I4:I" & LastRow2 & ")"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多