Excel VBA 質問スレッド №2164 (未解決)

ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。

投稿者 : こうど     投稿日時 : 2026/01/09(Fri) 16:31:08     OS : 未指定     EXCEL : 未指定
Sub test_2()
    Dim srcSheets As Variant
    Dim destSheets As Variant
    Dim wsSrc As Worksheet, wsDest As Worksheet, wsTotal As Worksheet
    Dim r As Long, c As Long, i As Integer
    Dim cellVal As String, floorNum As String
    Dim srcTime As Double
    Dim destCol As Integer, startRow As Long, endRow As Long
    Dim targetRow As Long, found As Boolean
    
    ' --- 設定エリア ---
    ' 読み取り対象のシート名をここに追加してください
    srcSheets = Array("A1006", "B1007")
    ' 書き込み先のシート名
    Set wsTotal = Sheets("全フロア表")
    ' 曜日ごとのソース列(C=月, E=火, G=水, I=木, K=金)
    Dim daysSrc: daysSrc = Array(3, 5, 7, 9, 11)
    ' 曜日ごとの書き込み列(C=月, F=火, I=水, L=木, O=金) ※3列おきと想定
    Dim daysDest: daysDest = Array(3, 6, 9, 12, 15)
    ' ------------------

    ' 転記先シートのデータ部分をクリア(任意)
    On Error Resume Next
    For i = 2 To 4
        Sheets(i & "階フロア表").Range("C2:Q50").ClearContents
    Next i
    wsTotal.Range("C2:Q50").ClearContents
    On Error GoTo 0

    ' 各ソースシートをループ
    For Each sName In srcSheets
        Set wsSrc = Sheets(sName)
        
        ' 各行をループ (2行目から21行目)
        For r = 2 To 21
            srcTime = wsSrc.Cells(r, 1).Value ' A列の時間
            
            ' 時間帯によって書き込み行の範囲を決定
            Select Case srcTime
                Case Is < TimeValue("09:50"): startRow = 2:  endRow = 6   ' 9:10-9:50枠
                Case Is < TimeValue("12:59"): startRow = 9:  endRow = 11  ' 9:51-12:00枠
                Case Is < TimeValue("15:01"): startRow = 12: endRow = 18  ' 13:00-15:00枠
                Case Else:                   startRow = 19: endRow = 25  ' 15:01-17:00枠
            End Select

            ' 各曜日(月~金)をループ
            For i = 0 To 4
                cellVal = wsSrc.Cells(r, daysSrc(i)).Value
                
                If cellVal <> "" Then
                    ' ( )内の階層数字を抽出
                    floorNum = ""
                    If InStr(cellVal, "(2)") > 0 Then floorNum = "2"
                    If InStr(cellVal, "(3)") > 0 Then floorNum = "3"
                    If InStr(cellVal, "(4)") > 0 Then floorNum = "4"
                    
                    If floorNum <> "" Then
                        ' 1. 各階のシートへ転記
                        Set wsDest = Sheets(floorNum & "階フロア表")
                        Call WriteToEmptyCell(wsDest, cellVal, daysDest(i), startRow, endRow)
                        
                        ' 2. 全フロア表へ転記
                        Call WriteToEmptyCell(wsTotal, cellVal, daysDest(i), startRow, endRow)
                    End If
                End If
            Next i
        Next r
    Next sName
    
    MsgBox "転記が完了しました。"
End Sub


Sub WriteToEmptyCell(ws As Worksheet, cellValue As String, targetCol As Integer, startRow As Long, endRow As Long)
    Dim targetRow As Long
    targetRow = startRow
    
    ' 指定列の範囲内で空いている最初のセルを探す
    Do While ws.Cells(targetRow, targetCol).Value <> "" And targetRow <= endRow
        targetRow = targetRow + 1
    Loop
    
    ' 空いているセルが見つかれば書き込み
    If targetRow <= endRow Then
        ws.Cells(targetRow, targetCol).Value = cellValue
    End If
End Sub

スポンサーリンク
[返信 1] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : ごんぼほり     投稿日時 : 2026/01/09(Fri) 17:21:36
Dim daysDest: daysDest = Array(3, 6, 9, 12, 15)
と定義しているので、daysDestはVariant型

Call WriteToEmptyCell(wsDest, cellVal, daysDest(i), startRow, endRow)
とするとき daysDest(i) は Variant/Integer型

Sub WriteToEmptyCell(ws As Worksheet, cellValue As String, targetCol As Integer, startRow As Long, endRow As Long)
で、targetCol はInteger型なので、型が異なります。

修正の方針はいくつかあって、

(1) ByRefである必要がない場合

 (1-1) 引数をByVal にする 引数がコピーされるときに自動で型変換されます
   Sub WriteToEmptyCell(ws As Worksheet, cellValue As String, ByVal targetCol As Integer, startRow As Long, endRow As Long)

 (1-2) Call するときに明示的に型変換する
   Call WriteToEmptyCell(wsDest, cellVal, Int(daysDest(i)), startRow, endRow)

(2) ByRefである必要がある場合

 (2-1) Subプロシジャ側でVariant型でうける
   Sub WriteToEmptyCell(ws As Worksheet, cellValue As String, targetCol As Variant, startRow As Long, endRow As Long)

 (2-2) Callする側の変数の型宣言をInteger型にする
   Dim daysDest(0 to 4) as Intger : daysDest(0)=3:daysDest(1)=6:daysDest(2)=9:daysDest(3)=12:daysDest(4)=15

 (2-3) daysDest(i)を別のInteger型変数に代入して、その変数を使ってCALLする

[返信 2] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : こうど     投稿日時 : 2026/01/11(Sun) 23:11:16
ありがとうございます。

当方素人ですが、情報ありがとうございます。
2-1など差し替えてみればよろしいでしょうか?
色々やってみたいと思います。

[返信 3] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : てらてら     投稿日時 : 2026/01/12(Mon) 17:47:03
こんにちは。

ごんぼほりさんの解説を受けてですが、
> daysDest(i) は Variant/Integer型
との事なので、 CInt(daysDest(i)) として Integer型にしてしまえば通ると思います。

Sub test_2()

 '--- 省略 ---
                    If floorNum <> "" Then
                        ' 1. 各階のシートへ転記
                        Set wsDest = Sheets(floorNum & "階フロア表")
                        Call WriteToEmptyCell(wsDest, cellVal, CInt(daysDest(i)), startRow, endRow)
                        
                        ' 2. 全フロア表へ転記
                        Call WriteToEmptyCell(wsTotal, cellVal, CInt(daysDest(i)), startRow, endRow)
                    End If

 '--- 省略 ---

End Sub

[返信 4] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : こうど     投稿日時 : 2026/01/13(Tue) 22:46:22
ありがとうございます。検証してみたいと思います!

■[返信 3] てらてらさん(2026-01-12 17:47:03)の記事
> こんにちは。

> ごんぼほりさんの解説を受けてですが、
> > daysDest(i) は Variant/Integer型
> との事なので、 CInt(daysDest(i)) として Integer型にしてしまえば通ると思います。

> Sub test_2()

>  '--- 省略 ---
> If floorNum <> "" Then
> ' 1. 各階のシートへ転記
> Set wsDest = Sheets(floorNum & "階フロア表")
> Call WriteToEmptyCell(wsDest, cellVal, CInt(daysDest(i)), startRow, endRow)

> ' 2. 全フロア表へ転記
> Call WriteToEmptyCell(wsTotal, cellVal, CInt(daysDest(i)), startRow, endRow)
> End If

>  '--- 省略 ---

> End Sub


[返信 5] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : ごんぼほり     投稿日時 : 2026/01/14(Wed) 09:04:24
てらてらさんの回答は、私の(1-2)とほぼ同じです
「やってみます」ではなくて、「やってみた結果」の報告をお願いしたいところです

[返信 6] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : こうど     投稿日時 : 2026/01/15(Thu) 16:03:12
■[返信 5] ごんぼほりさん(2026-01-14 09:04:24)の記事
> てらてらさんの回答は、私の(1-2)とほぼ同じです
> 「やってみます」ではなくて、「やってみた結果」の報告をお願いしたいところです


申し訳ございません。ご指摘ありがとうございます。

Sub test_2()
    Dim srcSheets As Variant
    Dim destSheets As Variant
    Dim wsSrc As Worksheet, wsDest As Worksheet, wsTotal As Worksheet
    Dim r As Long, c As Long, i As Integer
    Dim cellVal As String, floorNum As String
    Dim srcTime As Double
    Dim destCol As Integer, startRow As Long, endRow As Long
    Dim targetRow As Long, found As Boolean
    
    ' --- 設定エリア ---
    ' 読み取り対象のシート名をここに追加してください
    srcSheets = Array("A1006", "B1007")
    ' 書き込み先のシート名
    Set wsTotal = Sheets("全フロア表")
    ' 曜日ごとのソース列(C=月, E=火, G=水, I=木, K=金)
    Dim daysSrc: daysSrc = Array(3, 5, 7, 9, 11)
    ' 曜日ごとの書き込み列(C=月, F=火, I=水, L=木, O=金) ※3列おきと想定
    Dim daysDest: daysDest = Array(3, 6, 9, 12, 15)
    ' ------------------

    ' 転記先シートのデータ部分をクリア(任意)
    On Error Resume Next
    For i = 2 To 4
        Sheets(i & "階フロア表").Range("C2:Q50").ClearContents
    Next i
    wsTotal.Range("C2:Q50").ClearContents
    On Error GoTo 0

    ' 各ソースシートをループ
    For Each sName In srcSheets
        Set wsSrc = Sheets(sName)
        
        ' 各行をループ (2行目から21行目)
        For r = 2 To 21
            srcTime = wsSrc.Cells(r, 1).Value ' A列の時間
            
            ' 時間帯によって書き込み行の範囲を決定
            Select Case srcTime
                Case Is < TimeValue("09:50"): startRow = 2:  endRow = 6   ' 9:10-9:50枠
                Case Is < TimeValue("12:59"): startRow = 9:  endRow = 11  ' 9:51-12:00枠
                Case Is < TimeValue("15:01"): startRow = 12: endRow = 18  ' 13:00-15:00枠
                Case Else:                   startRow = 19: endRow = 25  ' 15:01-17:00枠
            End Select

            ' 各曜日(月~金)をループ
            For i = 0 To 4
                cellVal = wsSrc.Cells(r, daysSrc(i)).Value
                
                If cellVal <> "" Then
                    ' ( )内の階層数字を抽出
                    floorNum = ""
                    If InStr(cellVal, "(2)") > 0 Then floorNum = "2"
                    If InStr(cellVal, "(3)") > 0 Then floorNum = "3"
                    If InStr(cellVal, "(4)") > 0 Then floorNum = "4"
                    
                    If floorNum <> "" Then
                        ' 1. 各階のシートへ転記
                        Set wsDest = Sheets(floorNum & "階フロア表")
                        Call WriteToEmptyCell(wsDest, cellVal, CInt(daysDest(i)), startRow, endRow)
                        
                        ' 2. 全フロア表へ転記
                        Call WriteToEmptyCell(wsTotal, cellVal, CInt(daysDest(i)), startRow, endRow)
                    End If
                End If
            Next i
        Next r
    Next sName
    
    MsgBox "転記が完了しました。"
End Sub


Sub WriteToEmptyCell(ws As Worksheet, cellValue As String, targetCol As Integer, startRow As Long, endRow As Long)
    Dim targetRow As Long
    targetRow = startRow
    
    ' 指定列の範囲内で空いている最初のセルを探す
    Do While ws.Cells(targetRow, targetCol).Value <> "" And targetRow <= endRow
        targetRow = targetRow + 1
    Loop
    
    ' 空いているセルが見つかれば書き込み
    If targetRow <= endRow Then
        ws.Cells(targetRow, targetCol).Value = cellValue
    End If
End Sub


実施致しました。

元データとの設定齟齬があったためか?
実行エラー9

インデックスが有効範囲内にありません

と出現してしまいました。

' 転記先シートのデータ部分をクリア(任意)
On Error Resume Next
For i = 2 To 4
Sheets(i & "階フロア表").Range("C2:Q50").ClearContents
Next i
wsTotal.Range("C2:Q50").ClearContents
On Error GoTo 0

' 各ソースシートをループ
For Each sName In srcSheets
Set wsSrc = Sheets(sName)    ←デバックボタンをクリックするとこの部分が黄色く表示されました。

' 各行をループ (2行目から21行目)
For r = 2 To 21
srcTime = wsSrc.Cells(r, 1).Value ' A列の時間

' 時間帯によって書き込み行の範囲を決定

元データをお示しできないのでここでは限界でしょうか?ご協力いただいていますのに申し訳ございません

[返信 7] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : ごんぼほり     投稿日時 : 2026/01/15(Thu) 17:23:25
当初の質問は、コンパイルエラーについてでした。
まず、コンパイルエラーが解消したかどうか報告があってしかるべきだと思います
コンパイルエラーは解消したのですね?

次に、「インデックスが有効範囲内にありません」という実行時エラーですが、
>For Each sName In srcSheets
> Set wsSrc = Sheets(sName)    ←デバックボタンをクリックするとこの部分が黄色く表示されました。
の部分で、sNameはsrcSheetの要素です。
srcSheetは、
srcSheets = Array("A1006", "B1007")
ですから、A1006またはB1007(もしくは両方)という名前のワークシートが存在しなのが原因です

[返信 8] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : こうど     投稿日時 : 2026/01/16(Fri) 23:30:38
■[返信 7] ごんぼほりさん(2026-01-15 17:23:25)の記事
> 当初の質問は、コンパイルエラーについてでした。
> まず、コンパイルエラーが解消したかどうか報告があってしかるべきだと思います
> コンパイルエラーは解消したのですね?

> 次に、「インデックスが有効範囲内にありません」という実行時エラーですが、
> >For Each sName In srcSheets
> > Set wsSrc = Sheets(sName)    ←デバックボタンをクリックするとこの部分が黄色く表示されました。
> の部分で、sNameはsrcSheetの要素です。
> srcSheetは、
> srcSheets = Array("A1006", "B1007")
> ですから、A1006またはB1007(もしくは両方)という名前のワークシートが存在しなのが原因です


ありがとうございました。修正して実施するとコンパイルエラーはなく挙動もできましたが指示を出した方から条件の変更と
さらなる問題が出現しました。

転記はできるのですが

A1006シート C2~C21を(2)の条件で2階フロア表に転記した場合転記先のセルのC2から縦に転記されてしまい整理できていない。本来転記先のB2から整理して詰めて転記をしたい手指でした

さらに指示者から条件の変更で
A1006シートの転記条件がA列時間の9:10.9:31のC2,C3を転記先9:10~9:50枠 B2B-6,C2-C6,D2-D6の範囲内に順に詰めて整理してほしいとのことでしたが
9:10,9:31,9:52,10:13,10:34までのC2.C3.C4.C5.C6を転記先を9:10~9:50枠 B2B-6,C2-C6,D2-D6の範囲内に順に詰めて整理し、転記先9:51~12:00枠にはA1006 10:55,11:16,11:37のC7~C9枠を転記先に整理していきたいと言われて困惑している所です。調べながら少し弄っていますがやはり素人には難しく困っております

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2026-03-10 04:01:43 )
タイトルとURLをコピーしました