输入括号时,VBA创建公式会导致1004错误,并在输入空格时导致更新值框

时间:2015-09-03 18:42:18

标签: excel vba excel-vba excel-formula formula

我有一个带有TextBoxes的UserForm,用于从模板创建新工作表。

这一切如何运作的要点是VBA创建了一个"模板表的副本"隐藏在工作簿中的内容。它根据用户在表单文本框中输入的值来命名此副本。

此外,我有一个摘要表,顾名思义,是用户创建的表格中输入的不同信息的摘要。

为了减轻用户手动将信息复制到摘要表中的需要,我使用了一个与函数关联的公式,该函数将为它们更新摘要表。

现在,当用户完成将信息输入UserForm时,他们会单击Generate Workbook按钮,该按钮运行下面的代码,根据UserForm TextBox中输入的信息在Summary表中构建公式。

当VBA尝试将公式添加到摘要表中的单元格时,我遇到两个问题。

问题1: 当一个空格进入TextBox时,它会打开一个" Update Values"用户单击“生成工作簿”按钮时的对话框 示例 - 项目1234

问题2: 当括号输入TextBox时,当用户单击Generate Workbook按钮时会发生1004错误 示例 - Project1234(移动)

如果没有输入括号和空格,则一切正常。

UserForm中有25个可能的条目 每个条目都有三个TextBox:ProjectNameTXT,SheetNameTXT和ProjectNumTXT - 每个编号为1-25(即ProjectNameTXT1,SheetNameTXT1,ProjectNumTXT1)。 这两个问题属于SheetNameTXT TextBoxes。

csvRange是我之前提到的功能。

以下是相关代码。

UserForm1中的代码:

Private Sub GenerateWorkbook_Click()

    Dim ws As Worksheet
    Dim k As Long
    Dim strSName

    For k = 1 To 25

        strSName = Me.Controls("SheetNameTXT" & k).Text

            'Creates a data sheet for each project.
            'Uses the MASTER SHEET as a template.
            Set ws = ThisWorkbook.Worksheets("MASTER SHEET")
            ws.Copy ThisWorkbook.Sheets(Sheets.count)
            ActiveSheet.Name = strSName
            ActiveSheet.Visible = xlSheetHidden

            ThisWorkbook.Worksheets("Summary").Select

           'THIS IS THE CODE CAUSING THE ISSUES
            Range("B" & k + 3).Value = "=IF(ISERROR(csvRange(" & strSName & "!A2:A2500)),"""",csvRange(" & strSName & "!A2:A2500))"

    Next k

    Unload UserForm1

End Sub

功能csvRange的代码:

Function csvRange(myRange As Range)
    Dim csvRangeOutput
    For Each entry In myRange
        If Not IsEmpty(entry.Value) Then

            'Create comma separated value
            csvRangeOutput = csvRangeOutput & entry.Value & ", "

        End If
    Next

    'Removes the last comma and space.
    csvRange = Left(csvRangeOutput, Len(csvRangeOutput) - 2)

End Function

csvRange函数是muncherelli创建的此函数的修改版本: https://superuser.com/a/241233

我不是世界上最伟大的VBA编码器,如果我的语法或方法很糟糕,请道歉。如果您愿意,请随时改进并提供建议。

我搜索了StackOverflow并没有找到任何可以解决问题的方法。尝试了一些针对类似问题提出的解决方案,但没有运气让他们解决这些问题。

与往常一样,您的帮助和建设性批评非常受欢迎。

1 个答案:

答案 0 :(得分:2)

在公式中的工作表名称周围加上单引号。

"=IF(ISERROR(csvRange('" & strSName & "'!A2:A2500)),"""",csvRange('" & strSName & "'!A2:A2500))