变量w / Cell Address&式

时间:2018-03-13 22:35:39

标签: excel vba excel-vba

我多次访问过这个网站,以帮助在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个公式" Sum"数据给出范围H:J中列的总数。我想找到" Total"在我的数据末尾的行,并在适当的单元格中重建公式。举个例子,我有一个" Sum"细胞H47和J47中的分子式,分别为H4:H45和J4:J45。

通过所有这些解释,我如何创建一个宏序列,它将在具有可变行位置但静态列位置(通常)的特定单元格中自动重建公式?我为冗长的解释道歉,但感谢您的所有帮助。如果我需要澄清任何事情,请告诉我。祝你有美好的一天。

[编辑3-14-18 @ 8:43PDT]我的范围O:Q包含不需要复制到我的范围H:J的公式,我需要的只是复制的值。这是我的问题出现的地方,因为我的= Sum()函数在行位置不同,我无法弄清楚如何识别= Sum()发生的特定单元格并重新插入它。我做了一些研究,发现了以下三个功能

=指数(H:H,匹配(""总"",A:A,0))

= CELL(""地址"",索引(H:H,匹配(""总计"",A: A,0)))

=偏移(CELL(""地址"",索引(H:H,匹配(""总计"",答:A,0))), - 1,0)

但是我无法弄清楚如何正确设置我的变量然后能够重新插入= Sum()函数。谢谢你的帮助。

[编辑3/15/2018 @ 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))

1 个答案:

答案 0 :(得分:0)

编辑1:您需要学习如何不使用选择。这就是我认为你要求的。代码将“当前账单”中的所有新数据从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 & ")"