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する
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など差し替えてみればよろしいでしょうか?
色々やってみたいと思います。
ありがとうございます。
当方素人ですが、情報ありがとうございます。
2-1など差し替えてみればよろしいでしょうか?
色々やってみたいと思います。
[返信 3] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : てらてら 投稿日時 : 2026/01/12(Mon) 17:47:03
こんにちは。
ごんぼほりさんの解説を受けてですが、
> daysDest(i) は Variant/Integer型
との事なので、 CInt(daysDest(i)) として Integer型にしてしまえば通ると思います。
こんにちは。
ごんぼほりさんの解説を受けてですが、
> 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
>
ありがとうございます。検証してみたいと思います!
■[返信 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)とほぼ同じです
「やってみます」ではなくて、「やってみた結果」の報告をお願いしたいところです
てらてらさんの回答は、私の(1-2)とほぼ同じです
「やってみます」ではなくて、「やってみた結果」の報告をお願いしたいところです
[返信 6] Re : ByRef引数の型が一致しません。とコンパイルエラーになってしまいます。どう修正したら良いでしょうか。
投稿者 : こうど 投稿日時 : 2026/01/15(Thu) 16:03:12
■[返信 5] ごんぼほりさん(2026-01-14 09:04:24)の記事
> てらてらさんの回答は、私の(1-2)とほぼ同じです
> 「やってみます」ではなくて、「やってみた結果」の報告をお願いしたいところです
申し訳ございません。ご指摘ありがとうございます。
実施致しました。
元データとの設定齟齬があったためか?
実行エラー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列の時間
' 時間帯によって書き込み行の範囲を決定
元データをお示しできないのでここでは限界でしょうか?ご協力いただいていますのに申し訳ございません
■[返信 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(もしくは両方)という名前のワークシートが存在しなのが原因です
当初の質問は、コンパイルエラーについてでした。
まず、コンパイルエラーが解消したかどうか報告があってしかるべきだと思います
コンパイルエラーは解消したのですね?
次に、「インデックスが有効範囲内にありません」という実行時エラーですが、
>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枠を転記先に整理していきたいと言われて困惑している所です。調べながら少し弄っていますがやはり素人には難しく困っております
■[返信 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 )