背景和Workbook的作用 我有一个用于创建问卷调查的工作簿;用户可以在多个选项卡中从问题列表中选择,然后运行宏,将所选问题汇编成新的工作簿;用户会将新的“发布”工作簿发送给他们的客户。问题的响应类型也可以通过问题进行选择;例如,“是/否”,“1到5分”的评分等。当问题和选项卡被汇编时,响应类型会作为数据验证添加到新工作簿中;带有下拉列表的选项卡存在于新工作簿中并被隐藏。
我看到的行为 在创建后仍打开工作簿时所有东西都能正常工作;但是当我关闭并重新打开时,我会收到标准错误“发现无法读取的内容...是否要修复...”Excel的修复会删除所有选项卡上的数据验证!这只会在通过VBA创建和保存文件时发生;手动创建和保存文件时不会出现此错误。例如,我还尝试使用相同的VBA代码添加数据验证,在我自己创建的新工作簿上,而这个问题就不会发生。
关于代码、工作流程以及我尝试过的内容,请参见以下说明:
创建和保存新工作簿的代码
outFileName = Application.GetSaveAsFilename(InitialFileName:=standardName, FileFilter:="Excel Files (*.xlsm), *.xlsm", Title:="Save As")
If outFileName = "FALSE" Then
MsgBox ("Export NOT completed")
GoTo endSafely
Else
outFileName = outFileName
End If
Set outBook = Workbooks.Add
'Activate and save the workbook
outBook.Activate
outBook.SaveAs Filename:=outFileName, FileFormat:=52
应用数据验证的代码
Sub addResponseFormatting(targetBook, targetSheet, targetRow, targetColumn, typeResponse)
Set targetBook = Workbooks(targetBook)
Set thisBook = Workbooks(ThisWorkbook.Name)
'---------------------------------------------------------------------------------------------------
' PROCESS
'---------------------------------------------------------------------------------------------------
targetBook.Activate
targetBook.Sheets(targetSheet).Activate
Dim targetCell As Range
With targetBook.Sheets(targetSheet).Cells(targetRow, targetColumn).Validation
Select Case typeResponse
Case "Yes/No"
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=DropDowns!$D$4:$D$5"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
Case "1 to 5"
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=DropDowns!$C$4:$C$8"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
Case Else
'Do nothing; leave open as free text
'Removes all validation; note this may also remove tooltip messages if we've applied these
.Delete
End Select
End With
End Sub
工作流程
- 创建并保存新的工作簿 - “工作簿-B”
- 复制“DropDowns”选项卡
- 对于主工作簿“Workbook A”中的每个选项卡,如果该选项卡被标记为“使用”,则将其复制到“Workbook-B”中(尚未进行数据验证;仅在每个问题旁边列出所需响应类型的列表)
- 对于工作簿“Workbook-B”中的每个选项卡,将表格内容减少到客户需查看的内容(例如,删除未使用的问题),并应用对应于所选响应类型的数据验证
- 再次保存工作簿
我尝试过的事情
- 进行验证的单元格已合并;我尝试了一个带有相同验证代码的新工作簿,隐藏/显示Dropdown选项卡,手动与代码应用验证,但问题始终发生,仅当VBA创建并保存了工作簿时
- 将文件保存为宏/非宏工作簿没有区别:(xlsx,xlsm)
- 尝试将代码复制到新模块中,以防损坏
- 尝试指定/不指定.SaveAs命令中的Excel文件类型;尝试不同的文件类型筛选器
文件中的其他内容都如预期一样
其他说明
- 使用Excel 2010;文件保存为xlsx;文件再次在Excel 2010中打开
- 我找到了另一个类似的主题,但在那里问题与下拉框仍然链接到源工作簿有关;这在我的情况下不会发生(我在代码中预先处理),因为在工作簿存在并且已经将所有复制的选项卡添加到其中之前,没有数据验证;宏将添加数据验证并将其指向现有于工作簿中的DropDowns选项卡。
有其他人遇到并解决过这个问题吗?
这是我第一次在这里发布,希望我已经讲清楚了。谢谢。