我正在尝试编写一个例程,该例程会自动添加新列并填写它们。我在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',下标超出范围”
我希望有人能帮助我
答案 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