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

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

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

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

Q&A

解決済

5回答

523閲覧

VBA エラーの直し方がわからない

mi07

総合スコア20

VBA

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

0グッド

0クリップ

投稿2019/07/09 00:25

ほかで使用しているマクロをそのまま転用しようとしましたが、エラーになってしまします。
初心者ですのでエラーの直し方がわかりません。
ほぼ同じ内容のシートでは作動するのに、新たに作成したシートでは作動しません。。。
教えていただけると幸いです。

エラーは以下の部分で、
Set ws2 = Sheets(ws1.Cells(wrow, "J").Value)

エラー9
入荷入力シートJ2-J7には数式が入っており、J2、J3は問題なく、
J4以降が空白のためエラー表記となっています
エラー時の WROWは4となります。

Public Sub 転記()
Dim wrow As Long
Dim ws1 As Worksheet '入荷入力A2の値と同じ名前のシートの最終行にA2:D2とF2:G2の値代入
Set ws1 = Sheets("入荷入力")

Dim ws2 As Worksheet ’2行目から7行目を繰り返す For wrow = 2 To 7 'エラーのセルはスキップする If IsError(ws1.Cells(wrow, "J").Value) = False Then Set ws2 = Sheets(ws1.Cells(wrow, "J").Value) Dim TargetRng As Range Set TargetRng = ws2.Cells(Rows.Count, "A").End(xlUp).Offset(1) TargetRng.Resize(, 4).Value = ws1.Range("A2:D2").Value TargetRng.Resize(, 2).Offset(, 5).Value = ws1.Range("F2:G2").Value End If Next

End Sub

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

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

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

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

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

hatena19

2019/07/09 01:29 編集

Set ws2 = Sheets(ws1.Cells(wrow, "J").Value) の行でエラーになるということですか。そのときるエラーメッセージは何でしょうか。 あと、そのときの ws1.Cells(wrow, "J").Value は存在するシート名になってますか。
mi07

2019/07/09 04:45

エラー9 インデックスが有効範囲にありません が表示されます。
guest

回答5

0

前回の回答者です。

4行目エラーなので、2.3行目は問題ないと考えられます。
J列は全て同じ数式を組んでいるので、値自体に問題はないかと…
考えられるのは空白であることが、問題になっているのかなと思うのですが

「J4はエラーにはなっておらず、空白が表示されている。」と理解しました。
おそらく、IFERROR(何かの関数,"")のようになっており、空白が表示されていると思います。
ここで、念の為、確認ですが、空白は、長さ0の文字列("")であるということです。
もし、IFERROR(何かの関数," ")のようになっていると、半角のスペース1桁になります。
もし、IFERROR(何かの関数," ")のようになっていると、全角のスペース1桁になります。
空白が長さ0の文字列("")であるという前提での、解決する為のコードは以下のようになります。

VBA

1Public Sub 転記() 2 Dim wrow As Long 3 Dim ws1 As Worksheet '入荷入力A2の値と同じ名前のシートの最終行にA2:D2とF2:G2の値代入 4 Set ws1 = Sheets("入荷入力") 5 6 Dim ws2 As Worksheet '2行目から7行目を繰り返す 7 For wrow = 2 To 7 8 'エラーのセルはスキップする 9 If IsError(ws1.Cells(wrow, "J").Value) = False Then 10 '空白のセルはスキップする 11 If ws1.Cells(wrow, "J").Value <> "" Then 12 13 Set ws2 = Sheets(ws1.Cells(wrow, "J").Value) 14 15 Dim TargetRng As Range 16 Set TargetRng = ws2.Cells(Rows.Count, "A").End(xlUp).Offset(1) 17 18 TargetRng.Resize(, 4).Value = ws1.Range("A2:D2").Value 19 TargetRng.Resize(, 2).Offset(, 5).Value = ws1.Range("F2:G2").Value 20 End If 21 End If 22 Next 23 24End Sub 25

もし、空白が半角1けたなら
If ws1.Cells(wrow, "J").Value <> "" Then

If ws1.Cells(wrow, "J").Value <> " " Then
にしてください。(全角の場合は同様に" "にします)

投稿2019/07/09 10:46

tatsu99

総合スコア5438

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

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

mi07

2019/07/10 04:51

空白スペースはありませんでしたが、 Set ws2 = Sheets(ws1.Cells(wrow, "J").Value)がエラーとなってしましました。 下記の通り解決しました。 教えていただきありがとうございました!
guest

0

>エラー9
>入荷入力シートJ2-J7には数式が入っており、J2、J3は問題なく、
>J4以降が空白のためエラー表記となっています

数式で空白に見えるように「””」を返しているのなら、
その値は「空白」ではなくて長さ0の「文字列」です。
また、シート名はいつでも自由に変えられます。(意図しててでも、無意識でも)
誤って削除する場合もあるかも知れません。
なので、存在確認をした方がよりよいかと思います。
(どんな数式をいれていて、どんな値が返ってくるのか解りませんが^^;)

ExcelVBA

1Option Explicit 2 3Public Sub 転記() 4 Dim ws1 As Worksheet: Set ws1 = Sheets("入荷入力") 5 Dim ws2 As Worksheet 6 Dim rngSheetName As Range 7 Dim rngTarget As Range 8 Dim c As Range 9 10 On Error Resume Next 11 Set rngSheetName = ws1.Range("J2:J7").SpecialCells( _ 12 xlCellTypeFormulas, xlNumbers + xlTextValues) 13 On Error GoTo 0 14 '指定の範囲の数式の返り値が全部数値か文字列以外なら終了 15 If rngSheetName Is Nothing Then Exit Sub 16 17 For Each c In rngSheetName.Cells 18 '存在しないシート名があるときのエラー回避 19 On Error Resume Next 20 Set ws2 = Sheets(c.Value) 21 On Error GoTo 0 22 '存在したら転記 23 If Not ws2 Is Nothing Then 24 Set rngTarget = ws2.Cells(Rows.Count, "A").End(xlUp).Offset(1) 25 rngTarget.Range("A1:D1").Value = ws1.Range("A2:D2").Value 26 rngTarget.Range("F1:G1").Value = ws1.Range("F2:G2").Value 27 Else 28 MsgBox c & "シートが存在しません。スキップします。", vbOKOnly 29 End If 30 Next 31End Sub

上記のサンプルコードは、エラーを回避する一例を示したものであり、
数式の返す値が空白に見えるときの対応は、特に考慮されていません。
数式がどのような文字列で空白に見えるように返しているかで対応が変わると思います。
他の方が回答されてますので、それらも参考にしてみてください。
あと、参考にセルの指定方法を別の書き方で書いてみました。
ご自分で読みやすい方法で書いて下さい。

投稿2019/07/09 14:59

編集2019/07/09 15:02
mattuwan

総合スコア2136

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

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

mi07

2019/07/10 04:47

上記の方法だと1行目が4回繰り返し転記されてしまいました。 ただ、初心者にはこちらのほうがわかりやすいので、こちらで勉強させていただきます。 ありがとうございました。
guest

0

エラーがでるのが、

Set ws2 = Sheets(ws1.Cells(wrow, "J").Value)

で、エラーメッセージが「インデックスが有効範囲にありません」だとしたら、
ws1.Cells(wrow, "J").Valueの値が存在しないシート名になっている可能性が大です。
あるいは、数値なら、0以下かシート数より大きい数値になっているかです。

そのセルには正しいシート名が入力されてますか。
前後に空白か含まれているとか、全角半角が異なってるとかないか確認してみてください。
数値なら、1からシート数の間の数値か確認してください。

投稿2019/07/09 04:37

編集2019/07/09 04:44
hatena19

総合スコア33715

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

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

mi07

2019/07/09 04:53

4行目エラーなので、2.3行目は問題ないと考えられます。 J列は全て同じ数式を組んでいるので、値自体に問題はないかと… 考えられるのは空白であることが、問題になっているのかなと思うのですが、現在出先ですので明日もう一度確認してみます。
hatena19

2019/07/09 08:26

同じ数式でも結果は異なる場合もありますよね。 というか同じ結果になるものを複数設定する必要性もないですし。 具体的にどのような数式を設定しているのですか。
guest

0

ベストアンサー

If IsError(ws1.Cells(wrow, "J").Value) = False Then

If Len(ws1.Cells(wrow, "J").Value) > 0 Then

投稿2019/07/09 03:42

iruyas

総合スコア1067

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

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

0

set ws2 = Sheets(ws1.Cells(wrow, 10).Value)

この関数では"J"ではなく数値を入れるのだと思いますよ。

投稿2019/07/09 00:29

stdio

総合スコア3307

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

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

mi07

2019/07/09 00:37

Jセルの値とするにはどうすればよいでしょうか?
nanami12

2019/07/09 00:45

変数に格納してあげるだけでは?
stdio

2019/07/09 00:46

Jは英語で何番目にくる文字かを考えましょう。 又はChr(65 + 10)と入力すればJという文字が取得できますのでその逆をすればいいのです。
hatena19

2019/07/09 01:18

ws1.Cells(wrow, "J") という書き方は間違いでないです。Cellsの第2引数には列名(アルファベット)も指定できます。いちいち数字に変換しなくてもいいので結構便利に使ってます。
nanami12

2019/07/09 01:59

出力されているエラーメッセージはなんですか?
mi07

2019/07/09 04:30

エラーは エラー9 インデックスが有効範囲にありません が表示されます。
hatena19

2019/07/09 04:32

エラーがでるのはどの行ですか。 Set ws2 = Sheets(ws1.Cells(wrow, "J").Value) ですか。
nanami12

2019/07/09 04:37

見ている箇所がJ列の様なので このコードを先頭にきさいして動作させてみてください ws.Columns(10).NumberFormatLocal = "@
nanami12

2019/07/09 04:43

インデックスが有効範囲にありませんというエラーメッセージは 範囲内のデータにデータがない場合か範囲外のデータにアクセス している場合です。上記コードは標準書式を文字列に変換するコードです
nanami12

2019/07/09 04:46

WROWは4 の時に 空白な為エラーメッセージが表示されて いるのかと想像し、その空白の列Jに対して文字列扱いにしてみて どうなるかという意味で記載してます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問