【发布时间】:2016-11-03 19:21:31
【问题描述】:
回答!感谢大卫指出我的问题。如果它对其他人有帮助,我留下了这个问题。请参阅下面的答案。
我有一个 VBA 脚本,可以将每个工作表保存到一个新工作簿,但是当我打开新工作簿时,前一个工作表的验证不起作用。我还发现,当旧工作簿和新工作簿都打开时,验证在两个工作表上都有效。当我关闭旧工作簿时,新工作簿上的验证不起作用。
我已阅读,如果版本早于 2013 年,则验证必须在同一页面上或在指定范围内。这两种方法我都试过了,但没有任何改变。
如何获得验证以在新工作簿上工作?
编辑:当旧书打开时验证工作的原因是因为验证将命名范围连接到旧书中的命名范围。如果我更改新书上的单元格,验证不会改变。因此(见编辑 2)
编辑 2:如果是这种情况,我如何重命名新工作表中的范围并验证该范围的单元格?例如,我需要一些 VBA 来指定范围 AF2:AF8 的名称,然后验证另一个范围 O2:O25000 以便它只能使用第一个范围作为可能性。
编辑 3 一个潜在的解决方法是在我将工作表保存到新工作簿之前为范围创建新的验证。我已经尝试使用下面的代码来做到这一点,但它仍然无法正常工作:
vRange = ThisWorkbook.Worksheets(2).Range("A1:G200")
'Assigning my ranges
IdCo = ThisWorksheet.Range("AF2:AF8")
MeE = ThisWorksheet.Range("AG2:AG7")
GrReEf = ThisWorksheet.Range("AH2:AH5")
CyRePl = ThisWorksheet.Range("AI2:AI4")
IdCo1 = ThisWorksheet.Range("O2:O25000")
For i = 5 To ThisWorkbook.Worksheets.Count
ThisWorkbook.Worksheets(i).Range("AF1:AL200").Value = vRange
'Actually doing the validations
With IdCo.Validation
.Delete 'delete previous validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Formula1:="='" & ws.Name & "'!" & IdCo1.Address
End With
Next i
这是原始代码:
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim Destwb As Workbook
Dim sh As Worksheet
Dim DateString As String
Dim FolderName As String
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
'Copy every sheet from the workbook with this macro
Set Sourcewb = ThisWorkbook
'Create new folder to save the new files in
DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")
FolderName = Sourcewb.Path & "\" & Sourcewb.Name & " " & DateString
MkDir FolderName
'Copy every visible sheet to a new workbook
For Each sh In Sourcewb.Worksheets
'If the sheet is visible then copy it to a new workbook
If sh.Visible = -1 Then
sh.Copy
'Set Destwb to the new workbook
Set Destwb = ActiveWorkbook
'Determine the Excel version and file extension/format
With Destwb
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
'This is the line I put an m in
FileExtStr = ".xlsm": FileFormatNum = -4143
Else
'You use Excel 2007-2013
If Sourcewb.Name = .Name Then
MsgBox "Your answer is NO in the security dialog"
GoTo GoToNextSheet
Else
Select Case Sourcewb.FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
End If
End With
'Change all cells in the worksheet to values if you want
' If Destwb.Sheets(1).ProtectContents = False Then
' With Destwb.Sheets(1).UsedRange
' .Cells.Copy
' .Cells.PasteSpecial xlPasteValues
' .Cells(1).Select
' End With
' Application.CutCopyMode = False
' End If
'Save the new workbook and close it
With Destwb
.SaveAs FolderName _
& "\" & Destwb.Sheets(1).Name & FileExtStr, _
FileFormat:=FileFormatNum
.Close False
End With
End If
GoToNextSheet:
Next sh
MsgBox "You can find the files in " & FolderName
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
结束子
【问题讨论】:
-
Re: Edit 3 -- 一个潜在的解决方法是为范围创建一个新的验证之后我将我的工作表保存到一个新的工作簿中。 (请参阅我的编辑,之后而不是之前)因此,将范围分配给
DestWB对象。但是,您当前的代码仅查看ThisWorkbook.Sheets(2),但看起来您正在将 每个 可见工作表复制到新工作簿 (DestWB)。DestWB中的验证不能引用回另一个工作簿 (ThisWorkbook.Sheets(2)),它需要引用DestWB中的工作表。 -
好点大卫。工作簿中的每个工作表都是从原始工作表(工作表 5)创建的,该工作表过滤一行并创建 95 个新工作表,一个用于我在一列中的每个筛选器。我希望由于表格只是被复制,验证将与他们一起进行(这似乎是真的,尽管现在我需要去仔细检查它)。也许我需要将验证保留在工作表的其他地方,看看这是否能让事情正常进行。问题是过滤器把所有东西都弄乱了,所以我目前正在创建工作表后重新复制过滤后的单元格。谢谢!
-
这给了我一个想法......我会写一些建议作为答案:)
-
我发现了一个有趣的想法
-
呃,我的想法破灭了。不过,干杯。
标签: vba excel validation