2

列「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 月ではありません。

前もって感謝します

4

2 に答える 2

0

.Findsetを使用する場合RngStartはワークブックとワークシートを指定しますが、.Findget を使用するRngEnd場合はワークシートを指定しません。

これにより、検索に失敗する可能性があります。

于 2015-07-31T11:45:15.650 に答える