Excel VBA 2010: 当工作簿由VBA保存时数据验证会出错,但手动保存时不会出错。

3

背景和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

工作流程

  1. 创建并保存新的工作簿 - “工作簿-B”
  2. 复制“DropDowns”选项卡
  3. 对于主工作簿“Workbook A”中的每个选项卡,如果该选项卡被标记为“使用”,则将其复制到“Workbook-B”中(尚未进行数据验证;仅在每个问题旁边列出所需响应类型的列表)
  4. 对于工作簿“Workbook-B”中的每个选项卡,将表格内容减少到客户需查看的内容(例如,删除未使用的问题),并应用对应于所选响应类型的数据验证
  5. 再次保存工作簿

我尝试过的事情

  • 进行验证的单元格已合并;我尝试了一个带有相同验证代码的新工作簿,隐藏/显示Dropdown选项卡,手动与代码应用验证,但问题始终发生,仅当VBA创建并保存了工作簿时
  • 将文件保存为宏/非宏工作簿没有区别:(xlsx,xlsm)
  • 尝试将代码复制到新模块中,以防损坏
  • 尝试指定/不指定.SaveAs命令中的Excel文件类型;尝试不同的文件类型筛选器

文件中的其他内容都如预期一样

其他说明

  • 使用Excel 2010;文件保存为xlsx;文件再次在Excel 2010中打开
  • 我找到了另一个类似的主题,但在那里问题与下拉框仍然链接到源工作簿有关;这在我的情况下不会发生(我在代码中预先处理),因为在工作簿存在并且已经将所有复制的选项卡添加到其中之前,没有数据验证;宏将添加数据验证并将其指向现有于工作簿中的DropDowns选项卡。

有其他人遇到并解决过这个问题吗?

这是我第一次在这里发布,希望我已经讲清楚了。谢谢。

1个回答

0
我找到了问题的根源:我的选项卡中复制了一些其他数据验证,并且它们的源(列表类型验证)仍然链接到原始工作簿 - 这会导致错误,当Excel尝试修复文件时,它会从选项卡中删除所有数据验证(不仅是出现错误的数据验证)。
为了确定哪些单元格获得和失去了数据验证,我使用了这个简单的代码来突出显示具有验证的单元格:

子程序 (数据验证检查函数如下)

Sub runascan()

Set targetBook = Workbooks("test25")

targetBook.Activate

For Each sheetsIn In targetBook.Sheets

    sheetsIn.Activate

    For Each cellin In Range("A1:Z100")

        If checkVal(cellin) = 1 Then
            cellin.Interior.Color = RGB(0, 255, 0)
        Else

        End If
   Next cellin

Next sheetsIn

End Sub

检查单元格中的数据验证功能

Function checkVal(tRange)

Workbooks(ThisWorkbook.Name).Activate

x = 0
On Error Resume Next
x = tRange.SpecialCells(xlCellTypeSameValidation).Count

On Error GoTo 0

If x = 0 Then
    checkVal = 0
Else
    checkVal = 1
End If

End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接