エクセルマクロで条件に合致する値を抜き出して別シートに記載していきたいのです。
条件としては、入力シートのF列に日勤が入力されていて、かつE列が空白で、かつI列の時刻データが17時15分以降の場合、出力シートに値を入力するというものです。
「If TimeValue(ws1.Cells(i, 9).Value) >= TimeValue("17:15:00") Then」の行がエラーを出しており、「型が一致しません」とのことです。
以前こちらでご回答いただいたコード(正確に動作する)に上記1文を足したらエラーが出たので該当文章の記述がおかしいと思うのですが原因がわかりません。
ご指導のほどよろしくお願いします。
Sub 勤務区分入力()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetRow As Long
' シート1とシート2を設定
Set ws1 = ThisWorkbook.Sheets("入力シート")
Set ws2 = ThisWorkbook.Sheets("出力シート")
' シート1の最終行を取得
lastRow = ws1.Cells(ws1.Rows.Count, "F").End(xlUp).Row
' Sheet2の7行から下に向かってデータを埋めるための行を設定
targetRow = 7
' データを検査してコピー
For i = 9 To lastRow
If ws1.Cells(i, 6).Value = "日勤" And IsEmpty(ws1.Cells(i, 5).Value) Then
If TimeValue(ws1.Cells(i, 9).Value) >= TimeValue("17:15:00") Then
ws2.Cells(targetRow, 3).Value = "17:00~18:00"
ws2.Cells(targetRow, 4).Value = "17:00~"
targetRow = targetRow + 1
End If
ElseIf ws1.Cells(i, 6).Value = "6:45早出" And IsEmpty(ws1.Cells(i, 5).Value) Then
If TimeValue(ws1.Cells(i, 9).Value) >= TimeValue("15:30:00") Then
ws2.Cells(targetRow, 3).Value = "15:15~16:15"
ws2.Cells(targetRow, 4).Value = "15:15~"
targetRow = targetRow + 1
End If
ElseIf ws1.Cells(i, 6).Value = "11時遅出" And IsEmpty(ws1.Cells(i, 5).Value) Then
If TimeValue(ws1.Cells(i, 9).Value) >= TimeValue("19:45:00") Then
ws2.Cells(targetRow, 3).Value = "19:30~20:30"
ws2.Cells(targetRow, 4).Value = "19:30~"
targetRow = targetRow + 1
End If
End If
Next i
' リリースオブジェクト
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
No.4ベストアンサー
- 回答日時:
これでどうでしょうか。
もし、同じエラーが発生するようでしたら、実際に使用している
入力シートのI列のセルの画像を提示していただけると、解決に結びつきやすくなります。
Sub 勤務区分入力()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetRow As Long
' シート1とシート2を設定
Set ws1 = ThisWorkbook.Sheets("入力シート")
Set ws2 = ThisWorkbook.Sheets("出力シート")
' シート1の最終行を取得
lastRow = ws1.Cells(ws1.Rows.Count, "F").End(xlUp).Row
' Sheet2の7行から下に向かってデータを埋めるための行を設定
targetRow = 7
' データを検査してコピー
For i = 9 To lastRow
If ws1.Cells(i, 6).Value = "日勤" And IsEmpty(ws1.Cells(i, 5).Value) Then
If ws1.Cells(i, 9).Value >= TimeValue("17:15:00") Then
ws2.Cells(targetRow, 3).Value = "17:00~18:00"
ws2.Cells(targetRow, 4).Value = "17:00~"
targetRow = targetRow + 1
End If
ElseIf ws1.Cells(i, 6).Value = "6:45早出" And IsEmpty(ws1.Cells(i, 5).Value) Then
If ws1.Cells(i, 9).Value >= TimeValue("15:30:00") Then
ws2.Cells(targetRow, 3).Value = "15:15~16:15"
ws2.Cells(targetRow, 4).Value = "15:15~"
targetRow = targetRow + 1
End If
ElseIf ws1.Cells(i, 6).Value = "11時遅出" And IsEmpty(ws1.Cells(i, 5).Value) Then
If ws1.Cells(i, 9).Value >= TimeValue("19:45:00") Then
ws2.Cells(targetRow, 3).Value = "19:30~20:30"
ws2.Cells(targetRow, 4).Value = "19:30~"
targetRow = targetRow + 1
End If
End If
Next i
' リリースオブジェクト
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
ご回答ありがとうございます。
対象セルをTimeValueとして拾ってくるのがおかしかったのですね。銀鱗様にご回答いただいていたのはここのご指摘だったということでしょうかね。
自分の勉強不足を痛感しました。
ご丁寧にありがとうございました。
No.5
- 回答日時:
>対象セルをTimeValueとして拾ってくるのがおかしかったのですね。
銀鱗様にご回答いただいていたのはここのご指摘だったということでしょうかね。はい、その通りです。
No2のfujillin様も、同様の指摘をされています。
No.3
- 回答日時:
TimeValue が何をしているものなのかを考えてみましょう。
時間を示す【文字列】を【シリアル値】に変換してるんです。
ユーザー定義で「時間」にしているという事はすでにシリアル値であると考えられます。
ユーザー定義は
正の値;負の値;ゼロ価;文字列
のように設定されます。
セミコロンで区切らないと基本は正の値のケースになります。
(G/標準 …が特殊ってだけ)
ですので【シリアル値】ですね。
ご回答ありがとうございます。
つまりどういうことなのでしょうか?
素人質問で申し訳ですが、TimeValue(ws1.cell(i,9).Value)の記述がおかしいのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルマクロでデータ出力の際の条件がうまく機能しません。 2 2023/09/30 13:01
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) エクセルマクロで出力行の増やし方がわかりません。 4 2023/09/28 23:40
- Visual Basic(VBA) 条件をつけてカウントする 4 2021/12/19 20:27
- Visual Basic(VBA) Excel VABについて 1.xlsm、VBA.xlsm2つのファイルがあり、1.xlsmにてVB 6 2021/12/13 17:46
- Visual Basic(VBA) VBA ある文字が含まれるセルの行をうまく削除出来ません 3 2021/10/30 22:07
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの保護で、列の表示や...
-
文字の色も参照 VLOOKUP
-
VBAで繰り返しコピーしながら下...
-
ExcelのVlookup関数の制限について
-
【条件付き書式】countifsで複...
-
Excel複数シートにあるデータを...
-
Excelでの並べ替えを全シートま...
-
エクセルで、チェックボックス...
-
エクセルの列の限界は255列以上...
-
VLOOKアップ関数の結果の...
-
Excel の複数シートの列幅を同...
-
【VBA】複数のシートの指定した...
-
エクセル マクロ 標準モジュー...
-
エクセル複数シートのデータを...
-
Excelに自動で行の増減をしたい...
-
Excelで全てのシートに一気に列...
-
VBAで検索して、行をコピー&追...
-
【マクロ】あいうえお順のシー...
-
accessでexcelを読み込む時のデ...
-
エクセル 日報売上を月報に展開...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の色も参照 VLOOKUP
-
ExcelのVlookup関数の制限について
-
エクセルの保護で、列の表示や...
-
VBAで繰り返しコピーしながら下...
-
Excel の複数シートの列幅を同...
-
エクセルで横並びの複数データ...
-
エクセルの列の限界は255列以上...
-
【条件付き書式】countifsで複...
-
Excelでの並べ替えを全シートま...
-
SUMPRODUCTにて別シートのデー...
-
エクセル マクロ 標準モジュー...
-
VLOOKアップ関数の結果の...
-
エクセルで、チェックボックス...
-
Excel VBA ピボットテーブルに...
-
オートフィルタ使用時にCOUNTIF...
-
スプレッドシートでindexとIMPO...
-
エクセルVBAで、ある文字を含ん...
-
エクセルのブック分割マクロを...
-
【VBA】複数のシートの指定した...
-
Excel複数シートにあるデータを...
おすすめ情報