セルの範囲を通過するVBAコードを記述して、各セルにデータ検証があるかどうかを確認し(ドロップダウンメニュー)、ない場合は別のシートのリストからセルに割り当てます。
現在、現在のセルにすでにデータ検証があるかどうかをチェックする行に問題があります。 「セルが見つかりませんでした」というエラー1004が表示されます。
Sub datavalidation()
Dim nlp As Range
Dim lrds As Long
Dim wp As Double
Dim ddrange As Range
Sheets("DataSheet").Select
lrds = ActiveSheet.Range("A1").Offset(ActiveSheet.rows.Count - 1, 0).End(xlUp).Row
Set nlp = Range("I3:I" & lrds)
For Each cell In nlp
'error on following line
If cell.SpecialCells(xlCellTypeSameValidation).Cells.Count < 1 Then
wp = cell.Offset(0, -8).Value
Set ddrange = ddrangefunc(wp)
End If
Next
End Sub
何か案は?ありがとうございました
Dim cell As Range, v As Long
For Each cell In Selection.Cells
v = 0
On Error Resume Next
v = cell.SpecialCells(xlCellTypeSameValidation).Count
On Error GoTo 0
If v = 0 Then
Debug.Print "No validation"
Else
Debug.Print "Has validation"
End If
Next
この質問は古いことは知っていますが、「Excel vbaでセルに検証があるかどうかを確認する」という質問が表示されるので、塩を追加することにしました。
Range
を呼び出すSpecialCells
オブジェクトが単一のセルのみを表す場合、一致するものを見つけるためにシート全体がスキャンされます。非常に大量のデータがある場合、前の回答で提供された方法は少し遅くなる可能性があります。
したがって、単一のセルに検証があるかどうかを確認するためのより効率的な方法は次のとおりです。
Function HasValidation(cell As Range) As Boolean
Dim t: t = Null
On Error Resume Next
t = cell.Validation.Type
On Error GoTo 0
HasValidation = Not IsNull(t)
End Function
アクティブセルのみをテストする場合は、次のようにします。
Sub dural()
Dim r As Range
On Error GoTo noval
Set r = Cells.SpecialCells(xlCellTypeAllValidation)
If Intersect(r, ActiveCell) Is Nothing Then GoTo noval
MsgBox "Active cell has validation."
Exit Sub
noval:
MsgBox "Active cell has no validation."
On Error GoTo 0
End Sub
また、検証Source
を取得したい場合は、次を使用できます...
Dim cell as Range
Dim rng as Range
Set rng = Range("A1:A10") 'enter your range
On Error Resume Next 'will skip over the cells with no validation
For Each cell In rng
msgbox cell.Validation.Formula1
Next cell
次にエラーを回避してこれを処理する方法を探しています。これは私が実装する方法です。
Option Explicit
' https://stackoverflow.com/questions/18642930/determine-if-cell-contains-data-validation
' Use this if you want to omit doing something to the cell added: http://dailydoseofexcel.com/archives/2007/08/17/two-new-range-functions-union-and-subtract/
Sub ValidationCells()
Dim theSheet As Worksheet
Dim lastCell As Range
Dim validationRange As Range
Dim validationCell As Range
Application.EnableEvents = False ' optional
Set theSheet = ThisWorkbook.Worksheets(1)
theSheet.Unprotect ' optional
' Add a cell with a value and some validation to bypass specialcells error
Set lastCell = theSheet.Cells(1, theSheet.Cells.Columns.Count)
With lastCell
.Value2 = 1
.Validation.Add xlValidateWholeNumber, xlValidAlertInformation, xlEqual, "1"
End With
' If usedrange is greater than 1 (as we added a single cell previously)
If theSheet.UsedRange.Rows.Count > 1 Or theSheet.UsedRange.Columns.Count > 1 Then
Set validationRange = theSheet.UsedRange.SpecialCells(xlCellTypeAllValidation)
MsgBox validationRange.Address
For Each validationCell In validationRange
If validationCell.Address <> lastCell.Address Then
MsgBox validationCell.Address
End If
Next validationCell
End If
lastCell.Clear
Set validationRange = Nothing
Set lastCell = Nothing
theSheet.Protect ' optional
Application.EnableEvents = True ' optional
End Sub
これは私のために働きます
Sub test()
On Error Resume Next
If ActiveCell.SpecialCells(xlCellTypeSameValidation).Cells.Count < 1 Then
MsgBox "validation"
Else
MsgBox "no Validation"
End If
On Error GoTo 0
End Sub
約4年後、私も細胞の妥当性検査を探しています。ここでの答えからいくつかを組み合わせて、これは私が思いついたものです:
Option Explicit
Public Sub ShowValidationInfo()
Dim rngCell As Range
Dim lngValidation As Long
For Each rngCell In ActiveSheet.UsedRange
lngValidation = 0
On Error Resume Next
lngValidation = rngCell.SpecialCells(xlCellTypeSameValidation).Count
On Error GoTo 0
If lngValidation <> 0 Then
Debug.Print rngCell.Address
Debug.Print rngCell.Validation.Formula1
Debug.Print rngCell.Validation.InCellDropdown
End If
Next
End Sub