前提・実現したいこと
Excelのvbaで、「ユーザフォームのリストボックスで選択された日付と時刻をsheet2で検索(行または列番号の取得)する」ということをしたいです。
多くの時刻は検索できるのですが、特定の時刻だけ検索できず、理由と解決方法が知りたいです。
vba始めて1週間の初心者なので、詳しく教えていただけると助かります。
よろしくお願いします。
以下、コードと詳しい説明です。
具体的には、
リストボックスの値【日付,時刻,ID,セルのaddress,選択されたlistboxのindex】を配列に格納し、それを引数(num2)とした関数を作っています。
そして、num2(0)の日付(令和3年7月5日のような表記)とnum(1)の時刻(12:00のような表記)はString型だと思うので、CDateで変換し、match関数で検索するということをしています。
日付は、7月5日からエンドレスに作成してあり、時刻は、12:10~16:00まで10分刻みで作成しています。
検索したい箇所は、それぞれ日付(7月5日のような表記)はsheet2の9行目、時刻(12:00のような表記)はsheet2のC列(9~80行)です。
sheet2の時刻9行~80行は、「12:10, 12:10, 12:10, 12:20, 12:20, 12:20, ・・・, 16:00, 16:00, 16:00」というように同じ時刻を3回ずつ表記してあり、初めにmatchした値(行番号)を取得できれば良いです。
作ったプログラムでは何故か、「12:20, 13:10, 13:50, 14,40, 15,20」の時刻だけ検索できません。他の時刻は検索できます。
日付も検索出来ています。(日付はエンドレスの為、全て検索できるのか不安です。)
以下がコードになります。
発生している問題・エラーメッセージ
エラーメッセージは表示されていません。
該当のソースコード
vba
1Private Function del_func2(num2)'num2は配列で、「日付, 時刻, ID, セルのaddress(sheet1), 選択されたlistboxのindex」 2 Dim sht_2, sht_1 As Worksheet 3 Dim msg2 4 Set sht_1 = Sheets(1) 5 Set sht_2 = Sheets(2) 6 sht_2.Activate'ここでsheet2を作業できるようにしています。 7 '################################### 8 '# 日付の行検索 9 '################################### 10 Dim row_num As Variant 11 On Error Resume Next 12 row_num = WorksheetFunction.Match(CLng(CDate(num2(0))), Rows(Cells(1, 1).End(xlDown).Row + 1), 0) '日付の列を格納sheet2 13 On Error GoTo 0 14 If row_num = 0 Then 15 MsgBox "sheet2に日付がなく、" & vbCrLf & "削除出来ませんでした。" & vbCrLf & "プログラムを強制終了します。" 16 sht_1.Activate 17 End 18 End If 19 '################################### 20 '# 時間の行検索 21 '################################### 22 Dim col_time 23 On Error Resume Next 24 col_time = Application.WorksheetFunction.Match(CDbl(CDate(num2(1))), Range("C9:C80"), 0) '時刻の行を格納sheet2 25 On Error GoTo 0 26 If col_time = 0 Then 27 MsgBox "sheet2に時間がなく、" & vbCrLf & "削除出来ませんでした。" & vbCrLf & "プログラムを強制終了します。" 28 sht_1.Activate 29 End 30 End If 31 'MsgBox col_time 32End Function
試したこと
CDbl(CDate(num2(1))とRange("C9:C80")の型と表記の判定を行いました。
型は両方Double型(vartypeで確認出力5)で、表記は「12:00」のような表記(msgboxで目視で確認)でした。
一応、「CDbl(CDate(num2(1)) is Range(対応するセル)」と「CDbl(CDate(num2(1)) is Range(対応するセル)」を行いましたがどちらもFALSEでした。
補足情報(FW/ツールのバージョンなど)
ユーザーフォームのリストボックスはこんな感じです。
num2(0)に日付
num2(1)に時刻
num2(2)にID
num2(3)に選択されたIDが位置するsheet1のaddress(画像では非表示)
num2(4)に選択されたリストボックスのindex(画像では非表示)
説明下手で申し訳ございませんが、何卒よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー