簡體   English   中英

Excel VBA 2010:用VBA保存工作簿時,數據驗證中斷,但手動保存時,數據驗證不中斷

[英]Excel VBA 2010: Data validation breaks when workbook saved by VBA, but not when saved manually

上下文和工作簿我有一個用於創建調查表的工作簿。 用戶從多個選項卡的問題列表中進行選擇,然后運行一個宏,將選定的問題整理到新的工作簿中; 用戶會將新的“已發布”工作簿發送給他們的客戶。 也可以選擇帶有問題的回復類型; 例如,“是/否”,“ 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. 創建並保存新工作簿-“ Workbook-B”
  2. 復制“ DropDowns”標簽
  3. 對於“主工作簿”中“工作簿A”中的每個選項卡,如果該選項卡標記為“使用”,則將其復制到工作簿B(尚無數據驗證;僅是每個問題需要哪種響應類型的列表)
  4. 對於Workbook-B中的每個選項卡,將工作表上的內容縮減到客戶需要查看的內容(例如,刪除未使用的問題),並應用與所選響應類型相對應的數據驗證
  5. 再次保存工作簿

我嘗試過的事情

  • 進行驗證的單元將合並; 我已經嘗試過使用相同的驗證代碼向合並的單元格添加驗證,隱藏/顯示“下拉列表”,手動驗證以及使用代碼的新工作簿,並且只有在VBA創建並保存了工作簿的情況下,問題才會再次出現
  • 將文件另存為宏/非宏工作簿沒有任何區別:(xlsx,xlsm)
  • 嘗試將代碼復制到新模塊中以防損壞
  • 嘗試在.SaveAs命令中指定/不指定Excel文件類型; 嘗試了不同的文件類型過濾器

文件上的其他所有內容均符合預期

其他注意事項

  • 使用Excel 2010; 文件另存為xlsx; 再次在Excel 2010上打開文件
  • 我發現了另一個類似的線程,但是那里的問題與下拉框保持鏈接到源工作簿有關。 在我的情況下,這不會發生(我在代碼中先占),因為在工作簿存在並且所有復制的選項卡都放入其中之前,沒有數據驗證; 宏將添加數據驗證並將其指向工作簿中現有的“ DropDowns”選項卡。

還有其他人解決此問題嗎?

這是我在這里的第一篇文章,所以我希望我做的透徹。 謝謝。

我找到了問題的根源:一些其他數據驗證與我的選項卡一起復制,並且它們的源(列表類型驗證)仍鏈接到原始工作簿-這導致錯誤,並且當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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM