質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

14831閲覧

Excel VBA で差込&連続印刷したいが、「実行時エラー '13': 型が一致しません。」が発生する。

BiigBlueSea

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/11/23 05:29

###前提・実現したいこと
会員情報入力シートのデータをコース変更届シートへ差込&連続印刷したいのですが、エラーが発生していて困っています。
コードをどのように修正したら良いのかご教示下さい。

###発生している問題・エラーメッセージ
コードを実行すると「実行時エラー '13': 型が一致しません。」というエラーが表示されます。
デバッグすると「myNo = .Range("A" & i).Value」の行に問題が発生していました。
この行にブレークポイントを設定して、.Range("A" & i).Value にマウスカーソルを当てると、「myNo = 0」「i = 2」と値が表示されます。

###該当のソースコード
Sub コース変更届印刷()
Dim LastRow As Long
Dim i As Long
Dim myNo As Long
If vbNo = MsgBox("印刷を開始しますか?", vbYesNo) Then Exit Sub
With Worksheets("会員情報入力")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 2 To LastRow
myNo = .Range("A" & i).Value
If myNo = 0 Then
Exit For
End If
With Worksheets("コース変更届")
.Range("G2").Value = myNo
.PrintOut Copies:=1, Collate:=True
End With
Next i
End With
MsgBox ("印刷が終了しました")
End Sub

※別のExcelファイルでは上記コードで問題なく差込&連続印刷できています。今回、1行目の宣言名?、6行目と13行目のシート名、14行目のセル位置(G2)を変更してコードを実行したところエラーが発生してしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)
Excelファイルのシート構成は下記のとおりです。
3つのシートで構成しています。

【1.会員情報入力シート】
イメージ説明
A2:I52はテーブル設定しています(テーブル名:会員情報)。
A列に会員番号を入力すると、B・C・G・H列の各データは関数を使用して会員情報一覧表シートから取得するように設定してあります。
※会員氏名(B列)の場合:=IF(A3="","",VLOOKUP(A3,会員情報一覧表!A:E,3,0))
D・E・F・I列はデータを直接入力するかリストからデータを選択する設定にしてあります。
M~P列には、会員の学年(M列)と取得級(N列)という2つの条件から選択可能な平日コース(O列)と土曜日コース(P列)の一覧表を表示しています。
E1の印刷ボタンにはマクロが登録してあり、クリックするとコードが実行されます。

【2.コース変更届シート】
イメージ説明
1行目~4行目の各データは、会員番号(G2)に基いて関数を使用して会員情報入力シートのテーブルから取得するように設定してあります。
※会員氏名(G3)の場合:=IF(G2="","",VLOOKUP($G$2,会員情報,2,0))
印刷範囲(A6~AH28)内で表示している各データは、1行目~4行目の各データ表示セルを参照しています。
※会員氏名(I14)の場合:=G3
ただし選択可能コース【平日】(A22)と選択可能コース【土曜日】(L22)のデータは、関数を使用して会員情報入力シートのM~P列の一覧表から取得するように設定してあります。
※選択可能コース【平日】(A22)の場合:=INDEX(会員情報入力!O:O,SUMPRODUCT((会員情報入力!M3:M7=G4)*(会員情報入力!N3:N7=V1)*ROW(会員情報入力!M3:M7)))

【会員情報一覧表シート】
A列:会員番号、B列:学年、C列:会員氏名、D列:現在のコース1、E列:現在のコース2 の一覧表です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問者さんのコードでは以下のようWith文の範囲をシート全体にしています。

With Worksheets("会員情報入力")

このようにすると.Range("A2").Valueはシート相対なので普通にA2へのアクセスになってしまいます。A2の値はLongではないのでエラーになりますね。

推測ですが、変更前のVBAでは以下のようになっていたのではないでしょうか。

With ThisWorkbook.Names("会員情報").RefersToRange または、
With ThisWorkbook.Sheets("XXX").Range("会員情報")

Withの範囲をテーブル名の範囲(=Range)とすると、そのWith文のスコープ内では名前を付けた範囲(テーブルの範囲)での相対参照になるのでシートのA3セルを.Range("A2").Valueで参照できます。

変更前のWith文がどうなっていたかを確認するとこれが原因かどうかわかると思います。


追記:2016/11/27 18:57
自分は上の回答を思いつくのにほとんど時間をかけてません。それは問題が起こったときの状況が明記されていた的確な情報から把握できたからです。よって最初の質問文の内容はよかったと思います。しかし、下記コメントからは本当に私の推定どおりだったのかどうかや新たに発生した状況に関する情報がないので私にもすぐにわかりません。私見ですが回答者さんの調べ方に足りないのは「直した位置は把握しているがその変更の影響を把握できていない」点だと思います。そこを意識して調査を進めてみることを提案します。
(なお、2件しか処理されないと聞いて思いつくのは会員情報という表が3行しか定義されていないだけでは?と思いますが自信はないです)

投稿2016/11/23 06:43

編集2016/11/27 09:57
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BiigBlueSea

2016/11/27 08:12

ご回答戴きまして有難うございました。 またお礼が遅れたことをお詫び致します。 昨日職場にて、ご回答を参考にして下記のように改変したコードを実行できるか試してみました。 Sub コース変更届印刷() Dim LastRow As Long Dim i As Long Dim myNo As Long If vbNo = MsgBox("印刷を開始しますか?", vbYesNo) Then Exit Sub With ThisWorkbook.Sheets("会員情報入力").Range("会員情報") LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row For i = 1 To LastRow myNo = .Range("A" & i).Value If myNo = 0 Then Exit For End If With Worksheets("コース変更届") .Range("G2").Value = myNo .PrintOut Copies:=1, Collate:=True End With Next i End With MsgBox ("印刷が終了しました") End Sub 質問内容のエラーは無事解消しましたが、なぜか2件分(3行目と4行目)の印刷しか実行されません。この不具合を解消するにはどうしたら良いでしょうか?
guest

0

torisanさんのご指摘もエラーの原因の可能性が。
私の場合は.rangeよりも、動作の機敏性も含めて、.cellsを用います。
と申しますのが、引数がlongで定義されていますが、excelの行、列の指定はintegerの範囲内。従ってエラーの原因がlongとintの違いは僅かながらでもあると考えます。
cellsも一見同じように見えますが.rangeで"A"とiの組み合わせによるセルの指定に関して、明確に列・行を分けると分かりやすくなるように経験上おもいました。
今一度Googleなどで.cellsについてもお調べになられて今後の活用をお考えください。

投稿2016/11/23 06:39

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Dim myNo As Long で宣言しているLongは数値が入る変数の宣言です。
見た目は数字ですが、
A列に入っている値が文字列型になっていませんか?
--追記--
A2でしたね……。
『会員番号』という文字を数値型に入れているから、に訂正します。

投稿2016/11/23 05:48

編集2016/11/23 06:50
torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問