列「A」から「I」にデータが入力されているワークシートがあります。列 a には、2011 年 11 月 30 日から 2011 年 6 月 12 日までの日付が含まれています。オプションボタンが2つあるユーザーフォームがあります。最初の日付を選択すると、すべての日付が使用されます。2 番目が選択されている場合、開始日と終了日を入力するために使用できる 6 つのテキストボックス。これらの日付は、すべてのデータ/選択した間隔で範囲を作成するために使用されます。以前.find
は、選択した開始日と終了日の範囲を作成していました。
別のモジュールで動作するこのコードを書きましたが、range.Find
「何も返さない」ため、ユーザーフォーム内で動作させることができません。日付と組み合わせて使用するのが難しいため、モジュールでも機能するようになるまでに時間がかかりましたが、機能するようになったのでrange.find
、ユーザーフォームで機能しない理由がわかりません。
フォーラムを広範囲に検索しましたが、役立つものは見つかりませんでした。単なる入力エラーであることを願っていますが、なぜ機能しないのか本当にわかりません。
モジュール内のコードは次のとおりです。
sub Find()
Dim Dates As Range
Dim Data As Range
Dim LastRow As Long
Dim LastCol As Long
Dim RngStart As Range
Dim RngEnd As Range
Dim RngDates As Range
Dim DateStart As String
Dim DateEnd As String
Dim TextboxDate1 As Long 'these variables represent the textboxvalues of the userform
Dim TextboxDate2 As Long
Dim TextboxMonth1 As Long
Dim TextboxMonth2 As Long
Dim TextboxYear1 As Long
Dim TextboxYear2 As Long
TextboxDate1 = 2
TextboxDate2 = 4
TextboxMonth1 = 12
TextboxMonth2 = 12
TextboxYear1 = 2011
TextboxYear2 = 2011
ThisWorkbook.Worksheets("blad1").Activate
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Set Data = Range(Cells(1, 2), Cells(LastRow, LastCol))
Set Dates = Range(Cells(1, 1), Cells(LastRow, 1))
DateStart = TextboxMonth1 & "/" & TextboxDate1 & "/" & TextboxYear1 '"12/2/2011"
DateEnd = TextboxMonth2 & "/" & TextboxDate2 & "/" & TextboxYear2 '"12/4/2011"
Set RngStart = ThisWorkbook.Worksheets("blad1").Columns("A").find(DateStart)
Set RngEnd = Columns("a").find(what:=DateEnd, after:=Cells(1, 1), searchdirection:=xlPrevious)
Set RngDates = Range(RngStart, RngEnd)
MsgBox RngDates.Address 'should return A160:A447
End Sub
ただし、ユーザーフォームでこのコードを実行しようとすると、.find は「何も」を返しません。
Dim Dates As Range
Dim Data As Range
Dim LastRow As Long
Dim LastCol As Long
Dim RngStart As Range
Dim RngEnd As Range
Dim RngDates As Range
Dim DateStart As String
Dim DateEnd As String
ThisWorkbook.Worksheets("blad1").Activate
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Set Data = Range(Cells(1, 2), Cells(LastRow, LastCol))
Set Dates = Range(Cells(1, 1), Cells(LastRow, 1))
If OptionButton1.Value = False And OptionButton2.Value = False Then
MsgBox "specify time domain"
End If
If OptionButton1.Value = True Then
Set RngDates = ThisWorkbook.Worksheets("blad1").Range(Cells(2, 1), Cells(LastRow, 1))
End If
If OptionButton2.Value = True Then
DateStart = TextboxMonth1 & "/" & TextboxDate1 & "/" & TextboxYear1 '"12/2/2011"
DateEnd = TextboxMonth2 & "/" & TextboxDate2 & "/" & TextboxYear2 '"12/4/2011"
Set RngStart = ThisWorkbook.Worksheets("blad1").Columns("A").find(DateStart)
Set RngEnd = Columns("a").find(what:=DateEnd, after:=Cells(1, 1), searchdirection:=xlPrevious)
Set RngDates = Range(RngStart, RngEnd)
MsgBox RngDates.Address 'should return A160:A447
End If
DateStart と DateEnd が適切に定義されていることがわかりますが、コードは日付が見つかったセルを返すことができず、実行時エラー 1004: メソッド 'オブジェクトの範囲 '_global' が失敗しました。無から無までの範囲としてrngdates。
編集:最初のオプションボタンを選択してコード全体を実行すると、後で別のモジュールを使用して範囲を作成できることを知っておくと役立つかもしれませんがRngDates
、2番目の選択を使用してコードを実行し、クラッシュ後に停止すると、別のモジュールでも目的のセルが見つかりません。
編集: 明確にするために、日付は 2011 年 12 月 2 日から 2011 年 12 月 4 日であり、2 月ではありません。
前もって感謝します