アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルマクロで条件に合致する値を抜き出して別シートに記載していきたいのです。
条件としては、入力シートの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

A 回答 (5件)

これでどうでしょうか。


もし、同じエラーが発生するようでしたら、実際に使用している
入力シートの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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
対象セルをTimeValueとして拾ってくるのがおかしかったのですね。銀鱗様にご回答いただいていたのはここのご指摘だったということでしょうかね。
自分の勉強不足を痛感しました。
ご丁寧にありがとうございました。

お礼日時:2023/10/02 07:53

>対象セルをTimeValueとして拾ってくるのがおかしかったのですね。

銀鱗様にご回答いただいていたのはここのご指摘だったということでしょうかね。

はい、その通りです。
No2のfujillin様も、同様の指摘をされています。
    • good
    • 0

TimeValue が何をしているものなのかを考えてみましょう。



時間を示す【文字列】を【シリアル値】に変換してるんです。

ユーザー定義で「時間」にしているという事はすでにシリアル値であると考えられます。

ユーザー定義は
 正の値;負の値;ゼロ価;文字列
のように設定されます。
セミコロンで区切らないと基本は正の値のケースになります。
(G/標準 …が特殊ってだけ)
ですので【シリアル値】ですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
つまりどういうことなのでしょうか?
素人質問で申し訳ですが、TimeValue(ws1.cell(i,9).Value)の記述がおかしいのですか?

お礼日時:2023/10/01 18:08

こんにちは



No1様に1票。

単純に
 ws1.Cells(i, 9).Value >= TimeValue("17:15:00")
でいけるのでは?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはり「型が一致しません」のエラーが出ました。

お礼日時:2023/10/01 18:03

(´・ω・`) この場合、可能性が一番高いのが……



Cells(i,9) が、

 時間表記の【文字列】でない

なんてことを疑ってみます。
始めからシリアル値なんて話の落ちはありませんか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
該当するセルの書式はユーザー定義になっていたため、時刻にしましたが同様のエラーでした。

時間表記の文字列だという定義が必要なのでしょうか?

お礼日時:2023/10/01 14:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A