我有一个带有文本框的用户窗体,用于从模板创建新工作表。
这一切的工作原理是 VBA 创建隐藏在工作簿中的“模板表”的副本。它根据用户在表单的文本框中输入的值来命名此副本。
此外,我还有一个摘要表,顾名思义,它是用户创建的表中输入的不同信息的摘要。
为了减轻用户手动将信息复制到摘要表中的需要,我使用了一个与函数绑定(bind)的公式,该函数将为他们更新摘要表。
现在,当用户在用户表单中输入完信息后,他们单击“生成工作簿”按钮,该按钮运行下面的代码,根据用户表单文本框中输入的信息将公式构建到“摘要”表中。
当 VBA 尝试向摘要表中的单元格添加公式时,我遇到两个问题。
问题 1:
当在文本框中输入空格时,当用户单击“生成工作簿”按钮时,它会打开一个“更新值”对话框。
示例 - 项目 1234
问题 2:
当在文本框中输入括号时,用户单击“生成工作簿”按钮时会出现 1004 错误。
示例 - Project1234(移动)
如果没有输入括号和空格,一切正常。
用户表单中有 25 个可能的条目。
每个条目都有三个文本框:ProjectNameTXT、SheetNameTXT 和 ProjectNumTXT - 每个编号为 1-25(即 ProjectNameTXT1、SheetNameTXT1、ProjectNumTXT1)。
这两个问题仅与 SheetNameTXT 文本框有关。
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,但没有找到任何可以解决问题的内容。尝试了一些针对类似问题建议的解决方案,但没有成功让他们解决这些问题。
一如既往,非常感谢您的帮助和建设性批评。
最佳答案
在公式中的工作表名称两边加上单引号。
"=IF(ISERROR(csvRange('" & strSName & "'!A2:A2500)),"""",csvRange('" & strSName & "'!A2:A2500))
关于当输入括号时,VBA 创建公式会导致 1004 错误,并在输入空格时导致更新值框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383187/