このように開始日と終了日に基づいてテーブルからデータを取得する動的に定義された名前付き範囲がExcelのssにあります
=OFFSET(Time!$A$1,IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),1,MATCH(Date_Range_End,AllDates)-IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),4)
ただし、日付範囲にテーブル内のデータがない場合、範囲は存在しません(または何か、idk)。この範囲が存在するかどうかをテストするコードをVBAでどのように記述できますか?
私は何かを試しました
If Not Range("DateRangeData") Is Nothing Then
しかし、「実行時エラー1004、オブジェクト '_Global'のメソッド 'Range'が失敗しました。」と表示されます。
VBAで一致を複製して、行数の範囲を使用する前にカウントするか、エラー処理を使用できます。
On Error Resume Next
Debug.Print range("DateRangeData").Rows.Count
If Err = 1004 Then
MsgBox "Range Empty"
Exit Sub
Else
MsgBox "Range full"
End If
Err.Clear
On Error GoTo 0
以下は、名前付き範囲が存在するかどうかを返すためにたたいた関数です。それはあなたを助けるかもしれません。
Function RangeExists(R As String) As Boolean
Dim Test As Range
On Error Resume Next
Set Test = ActiveSheet.Range(R)
RangeExists = Err.Number = 0
End Function
これは別のアプローチです。テストしたいコンテナーと名前を使用する利点があります。つまり、たとえば、シート名またはワークブック名をテストできます。
このような:
If NamedRangeExists(ActiveSheet.Names, "Date") Then
...
Else
...
End If
または
If NamedRangeExists(ActiveWorkbook.Names, "Date") Then
...
Else
...
End If
Public Function NamedRangeExists(ByRef Container As Object, item As String) As Boolean
Dim obj As Object
Dim value As Variant
On Error GoTo NamedRangeExistsError:
value = Container(item)
If Not InStr(1, CStr(value), "#REF!") > 0 Then
NamedRangeExists = True
End If
Exit Function
Exit Function
NamedRangeExistsError:
NamedRangeExists = False
End Function
実行しているアプリケーションによっては、辞書の使用を検討することをお勧めします。これらは、何かが存在するかどうかを確認するときに特に役立ちます。この例を見てみましょう:
Dim dictNames as Scripting.Dictionary
Sub CheckRangeWithDictionary()
Dim nm As Name
'Initially, check whether names dictionary has already been created
If Not dictNames Is Nothing Then
'if so, dictNames is set to nothing
Set dictNames = Nothing
End If
'Set to new dictionary and set compare mode to text
Set dictNames = New Scripting.Dictionary
dictNames.CompareMode = TextCompare
'For each Named Range
For Each nm In ThisWorkbook.Names
'Check if it refers to an existing cell (bad references point to "#REF!" errors)
If Not (Strings.Right(nm.RefersTo, 5) = "#REF!") Then
'Only in that case, create a Dictionary entry
'The key will be the name of the range and the item will be the address, worksheet included
dictNames(nm.Name) = nm.RefersTo
End If
Next
'You now have a dictionary of valid named ranges that can be checked
End Sub
メインプロシージャ内では、範囲を使用する前に存在チェックを行うだけです。
Sub CopyRange_MyRange()
CheckRangeWithDictionary
If dictNames.exists("MyRange") then
Sheets(1).Range("MyRange").Copy
end if
End Sub
辞書の読み込みは少し長く見えるかもしれませんが、処理と検索は非常に高速です。また、この単純なアプリケーションでエラーハンドラーを使用せずに、有効なアドレスを参照する名前付き範囲が存在するかどうかを確認する方がはるかに簡単になります。
ワークブックレベルではなくシートレベルで名前を使用する場合、一意性を保証するために、より複雑なキーを使用する必要があることに注意してください。辞書が作成された方法から、キーが繰り返されると、アイテムの値が上書きされます。これは、キー作成ステートメントのチェックとして同じExistsメソッドを使用することで回避できます。辞書の使用方法についての適切なリファレンスが必要な場合は、次の one を使用してください。
幸運を!