自动添加列和公式,然后填写

时间:2020-06-19 08:00:29

标签: excel vba

我正在尝试编写一个例程,该例程会自动添加新列并填写它们。我在VBA中使用以下代码来自动执行该过程,

Sub AddHeader()
    Worksheets(1).Range("Y1").Formula = "Alder"
    Worksheets(1).Range("Z1").Formula = "Premier"
End Sub


Sub AddFormula()
    Dim Formulas(1 To 2) As Double
    With ThisWorkbook.Worksheets
        Formulas(1) = "=INT((TODAY()-J2)/365,25)"
        Formulas(2) = "=IF(L2="";0;L2)"
        .Range("Y2:Z2").Formula = Formulas
        .Range("Y:Z").NumberFormat = "General"
    End With
End Sub

Sub FillColumnY()
    Dim LastRow As Long
    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Range("Y2:Y" & LastRow).FillDown
End Sub

Sub FillColumnZ()

    Dim LastRow As Long
    LastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Range("Z2:Z" & LastRow).FillDown
End Sub

我的问题是AddFormula()程序,它提供以下错误消息:

“编译错误-找不到数据或成员”

当我尝试手动编译AddFormula()时,出现以下错误:

“运行时错误'9',下标超出范围”

我希望有人能帮助我

2 个答案:

答案 0 :(得分:0)

尝试更改

Dim Formulas(1 To 2) As Double

Dim Formulas(1 To 2) As Variant

但这不是您出错的原因。它会显示“类型不匹配”。 您在数组中输入字符串。无论公式结果是什么...

With ThisWorkbook.Worksheets在VBA中没有任何意义,在这种情况下,这一行是有问题的,从而引发了讨论中的错误。

它必须是With ThisWorkbook.Worksheets(1)With ThisWorkbook.Worksheets("My Sheet")甚至是With ActiveSheet ...

而且,如果您尝试使用它来复制所有工作表中的阵列,则必须以其他方式完成。我会告诉你,如果这是你的意图...

补充,以这种方式"=IF(L2="";0;L2)"编写的公式可能无法根据您的需要工作。即使根据本地化,公式分隔符为“;”,也最好使用"=IF(L2="",0,L2)"。 Excel 将进行适当的转换,如果在带有逗号分隔符的计算机上使用工作簿,则不会出现任何错误。因此,您可能还会在.Range("Y2:Z2").Formula = Formulas行收到错误消息。您可以按照我上面建议的方式解决它...

实际上,您的函数必须如下所示:

Sub AddFormula()
    Dim Formulas(1 To 2) As Variant
    With ActiveSheet 'ThisWorkbook.Worksheets
        Formulas(1) = "=INT((TODAY()-J2)/365.25)"
        Formulas(2) = "=IF(L2="""",0,L2)"
        .Range("Y2:Z2").Formula = Formulas
        .Range("Y:Z").NumberFormat = "General"
    End With
End Sub

您收到一个错误,因为两个公式字符串都包含错误:365,25必须为365.25。否则,VBA认为这是另一个列表分隔符(,),并且会发生错误,并且每个双引号字符必须在字符串中加倍。我的意思是"=IF(L2="",0,L2)"必须成为"=IF(L2="""",0,L2)"

现在,当我确定上述功能可以正常工作时,我将在另一个步骤中发布另一个(一次)填充您需要填充的所有列的列:

Sub AddFormulaBis()
    Dim Formulas(1 To 2) As Variant, lastRow As Long
    With ActiveSheet 'ThisWorkbook.Worksheets
        lastRow = .Range("J" & Rows.Count).End(xlUp).row
        Formulas(1) = "=INT((TODAY()-J2)/365.25)"
        Formulas(2) = "=IF(L2="""",0,L2)"
        .Range("Y2:Z" & lastRow).Formula = Formulas
        .Range("Y2:Z" & lastRow).NumberFormat = "General"
    End With
End Sub

答案 1 :(得分:0)

在使用With ThisWorkbook.Worksheets的过程中,您首先会遇到错误-您没有告诉它哪个工作表-它试图查看所有工作表。 尝试With ThisWorkbook.Worksheets(1)

接下来,您将公式定义为双精度型-仅接受数字。
然后,您尝试为其分配文本字符串"=INT((TODAY()-J2)/365,25)"

尝试这样的事情:

 Public Sub All_Together()

    Dim LastRow As Long

    With ThisWorkbook.Worksheets("Sheet1")
        .Range("Y1:Z1") = Array("Alder", "Premier")
        '.Range("Y2").Formula = "=INT((TODAY()-J2)/365.25)"
        '.Range("Z2").Formula = "=IF(L2="""",0,L2)" 'Note doubling up of quotes in string.

        .Range("Y2").Formula = "=INT((TODAY()-J2)/365,25)"
        .Range("Z2").Formula = "=IF(L2="""";0;L2)"

        'If there's no data on the sheet LastRow will throw an error.
        On Error Resume Next
            LastRow = .Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            If LastRow = 0 Then LastRow = 1
        On Error GoTo 0

        .Range("Y2:Z" & LastRow).FillDown
    End With

End Sub
相关问题