在使用VBA将公式写入单元格时出现语法错误。
在使用VBA将公式写入单元格时出现语法错误。
不熟悉Visual Basic,但参考了一些资料来解决这个问题。我想问一下,因为我花了一个小时来弄清楚如何解决这个问题,也许我需要一些建议。在为Excel创建宏时,我遇到了这个错误。起初它是工作的,但在我添加了一些行之后,语法变成了红色,并且运行宏时出现了一个
编译错误:语法错误
Range("D2").Select ActiveCell.FormulaR1C1 = _ "=IF(ISNUMBER(SEARCH(""California"",RC[-2],1)),""California"", IF(ISNUMBER(SEARCH(""Florida"",RC[-2],1)),""Florida"", IF(ISNUMBER(SEARCH(""Texas"",RC[-2],1)),""Texas"", IF(ISNUMBER(SEARCH(""New Mexico"",RC[-2],1)),""New Mexico"", IF(ISNUMBER(SEARCH(""Alaska"",RC[-2],1)),""Alaska"", IF(ISNUMBER(SEARCH(""New Jersey"",RC[-2],1)),""New Jersey"", """"))))))&IF(ISNUMBER(SEARCH(""Marikina"",RC[-2],1)),""Marikina"", IF(ISNUMBER(SEARCH(""Maryland"",RC[-2],1)),""Maryland"", IF(ISNUMBER(SEARCH(""Nebraska"",RC[-2],1)),""Nebraska"", IF(ISNUMBER(SEARCH(""Pennsylvania"",RC[-2],1)),""Pennsylvania"", IF(ISNUMBER(SEARCH(""Illinois"",RC[-2],1)),""Illinois"", IF(ISNUMBER(SEARCH(""Colorado"",RC[-2],1)),""Colorado"",""""))))))& IF(ISNUMBER(SEARCH(""Louisiana"",RC[-2],1)),""Louisiana"", IF(ISNUMBER(SEARCH(""Idaho"",RC[-2],1)),""Idaho"", IF(ISNUMBER(SEARCH(""Hawaii"",RC[-2],1)),""Hawaii"", IF(ISNUMBER(SEARCH(""Vermont"",RC[-2],1)),""Vermont"", IF(ISNUMBER(SEARCH(""West Virginia"",RC[-2],1)),""West Virginia"", IF(ISNUMBER(SEARCH(""Connecticut"",RC[-2],1)), ""Connecticut"","""")))))" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D38"), Type:=xlFillDefault Range("D2:D38").Select ActiveWindow.SmallScroll Down:=-39 End Sub
Syntax Error trying to write a formula into a cell with VBA的问题是,无法直接添加换行符,需要将公式拆分成多个字符串,并使用&符号将它们连接起来。换行符需要使用_在行尾进行连接。
解决方法是创建一个函数,可以根据州名列表生成公式。首先创建一个存储州名的数组(ListOfStates),然后使用Join函数将所有块通过&连接起来,最后将生成的公式赋值给指定的单元格。
代码如下:
Option Explicit Public Sub Example() Dim ListOfStates() As Variant ListOfStates = Array("California", "Florida", "Texas", "New Mexico", "Alaska", "New Jersey", "Marikina", "Maryland", "Nebraska", "Pennsylvania", "Illinois", "Colorado", "Louisiana", "Idaho", "Hawaii", "Vermont", "West Virginia", "Connecticut") Range("D2").FormulaR1C1 = "=" & Join(CreateFormulaBlocks(ListOfStates), "&") 'join all blocks by & End Sub ' returns an array of all blocks (each 6 states) ' Public Function CreateFormulaBlocks(ByVal ListOfStates As Variant, Optional ByVal MaxPerBlock As Long = 6) As Variant ' how many blocks do we need Dim MaxBlocks As Long MaxBlocks = (UBound(ListOfStates) + 1) \ 6 ' note this is no normal division / but an integer division \ ' create array for blocks Dim ReturnBlocks() As Variant ReDim ReturnBlocks(MaxBlocks - 1) As Variant ' create blocks Dim iBlock As Long For iBlock = 0 To MaxBlocks - 1 Dim BlockStates() As Variant ReDim BlockStates(MaxPerBlock - 1) As Variant Dim iState As Long For iState = 0 To MaxPerBlock - 1 BlockStates(iState) = ListOfStates(iBlock * 6 + iState) Next iState ' create one block of 6 states ReturnBlocks(iBlock) = CreateFromulaBlock(BlockStates) Next iBlock ' return all blocks as array CreateFormulaBlocks = ReturnBlocks End Function ' returns one block of 6 states ' eg IF(ISNUMBER(SEARCH("California",RC[-2],1)),"California", IF(ISNUMBER(SEARCH("Florida",RC[-2],1)),"Florida", IF(ISNUMBER(SEARCH("Texas",RC[-2],1)),"Texas", IF(ISNUMBER(SEARCH("New Mexico",RC[-2],1)),"New Mexico", IF(ISNUMBER(SEARCH("Alaska",RC[-2],1)),"Alaska", IF(ISNUMBER(SEARCH("New Jersey",RC[-2],1)),"New Jersey", "")))))) ' Public Function CreateFromulaBlock(ByVal States As Variant) As String Dim FormulaString As String Dim State As Variant For Each State In States FormulaString = FormulaString & "IF(ISNUMBER(SEARCH(""" & State & """,RC[-2],1)),""" & State & """, " Next State CreateFromulaBlock = FormulaString & """""" & String(UBound(States) + 1, ")") End Function
这样可以解决问题。但是需要注意,如果在代码中添加太多的行连接符" _",会出现"Too many line continuations"错误。这是因为VBA对行连接符的数量有限制。为了避免这个问题,可以使用上述的函数生成公式,只需将州名添加到列表中即可。