2017-03-05 80 views
1

我有一个工作簿,其中有多个名称不同的工作表,但每个工作表的内容结构保持不变。只有一个表格名称始终为常数pie将Excel公式复制到多张工作表的最后一行

我想在小区N2适用的公式,然后向下复制公式至最后一个活动行中的所有工作表,除了一个名叫pie 我到目前为止的代码是适用于一个循环,但然后我得到错误“Range类的自动填充方法失败” 我已经使用

Lastrow = Range("M" & Rows.Count).End(xlUp).Row 

,以确定最后一行的M列始终是完整的。 任何帮助来完成,这将是非常赞赏 代码,我是:

Sub ConcatForm() 

Dim wSht As Worksheet 

Lastrow = Range("M" & Rows.Count).End(xlUp).Row 
Application.ScreenUpdating = False 
For Each wSht In Worksheets 
    If wSht.Name <> "Pie" Then 
     wSht.Range("N2").FormulaR1C1 = "=CONCATENATE(RC[-3],RC[-2],RC[-1])" 
     wSht.Range("N2").AutoFill Destination:=Range("N2:N" & Lastrow) 
    End If 
Next wSht 

Application.ScreenUpdating = True 

End Sub 
+0

嗨安迪,请选择以下答案为“接受”的答案(刻度线的那一个的答案)。请同时提供您认为有用的答案。 – CallumDA

回答

0

你只是一个wSht参考偏离目标:

Sub ConcatForm() 
    Dim wSht As Worksheet 

    lastRow = Range("M" & Rows.count).End(xlUp).row '<--| without explicit worksheet qualification it will reference a range in the "active" sheet 
    Application.ScreenUpdating = False 
    For Each wSht In Worksheets 
     If wSht.Name <> "Pie" Then 
      wSht.Range("N2").FormulaR1C1 = "=CONCATENATE(RC[-3],RC[-2],RC[-1])" 
      wSht.Range("N2").AutoFill Destination:=wSht.Range("N2:N" & lastRow) '<--| this will reference a range in 'wSht' worksheet 
     End If 
    Next 
    Application.ScreenUpdating = True 
End Sub 
+0

如此接近。所以我只需要将wSht变量声明为自动填充目标? – Andybrute

+0

是的,与目标范围的工作表资格完全一致。如果没有这种限定条件,“活动”工作表就隐含地假设为 – user3598756

+0

@Andybrute,你通过了吗? – user3598756

-2

使用下面的子...

Sub ConcatForm() 
    Dim wSht As Worksheet 

    Lastrow = Range("A" & Rows.Count).End(xlUp).Row 
    Application.ScreenUpdating = False 
    For Each wSht In Worksheets 
    With wSht 
     If .Name <> "Pie" Then 
      .Select 
      .Range("N2").FormulaR1C1 = "=CONCATENATE(RC[-3],RC[-2],RC[-1])" 
      .Range("N2").AutoFill Destination:=Range("N2:N" & Lastrow) 
     End If 
    End With 
    Next wSht 

    Application.ScreenUpdating = True 

End Sub 
+1

请不要推广使用'.Select'。 – CallumDA

+0

再次,这工作正常,但我更喜欢使用直接公式。 @CallumDA为什么'.select'不好用? – Andybrute

+0

嗨@Andybrute,有大量关于使用.Select的文章 - 一个快速的Google应该透露所有! :) – CallumDA

1

你并不需要使用Autofill实现这一目标。

  1. 就直接套用公式的范围和使用相对引用,即K2,而不是绝对引用,即$K$2。它会填充下来并更新你的公式。
  2. 确保您完全符合您的参考资格。例如,请参阅我使用的地址ThisWorkbook以及如何初始化lastrow的更新。否则,Excel可能会感到困惑并抛出其他错误。
  3. 您的lastrow变量尚未标注尺寸,因此它是隐含的Variant。你最好将它的尺寸标注为Long

Sub ConcatForm() 
    Application.ScreenUpdating = False 

    Dim wSht As Worksheet 
    Dim lastrow As Long 

    With ThisWorkbook.Worksheets("Sheet1") 'which worksheet to get last row? 
     lastrow = .Range("M" & .Rows.Count).End(xlUp).Row 
    End With 

    For Each wSht In ThisWorkbook.Worksheets 
     If wSht.Name <> "Pie" Then 
      wSht.Range("N2:N" & lastrow).Formula = "=CONCATENATE(K2,L2,M2)" 
     End If 
    Next wSht 

    Application.ScreenUpdating = True 
End Sub 
+0

这很有用@CallumDA和我更喜欢直接应用公式。我唯一的问题是从PERSONAL.XLSB运行此脚本,因为“With ThisWorkbook.Worksheets(”Sheet1“)'工作表获取最后一行?”有没有一种方法可以应用于任何工作簿? – Andybrute

+0

@Andybrute,在这种情况下,您可以在两个地方将'ThisWorkbook'更改为'ActiveWorkbook'。不要忘记upvote任何有用的答案,如果这解决了你的问题,请将此答案标记为已接受,点击此答案左侧的灰色刻度标记:) – CallumDA

+0

@andybrute另一种选择是只删除ThisWorkbook,使用隐含的活动工作簿而无需指定'ActiveWorkbook' – CallumDA

相关问题