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

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

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

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

Q&A

解決済

3回答

5078閲覧

VBA Split関数でのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2020/11/13 01:23

前提・実現したいこと

エクセルVBAにて別bookから取得した値(日付)をSplit関数を使用し、当該bookのsheetに
張り付けたいです。

発生している問題・エラーメッセージ

一度成功したのですが、2度目からは失敗するようになりました。

実行時エラー9 インデックスが有効範囲にありません。

該当のソースコード

VBA

1 Dim i As Variant 2 Dim tmp 3 4 For i = 6 To Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row + 1 5 tmp = Split(Cells(2, i), "/") 6 If Sheets("sheet2").Range("F" & i).Value <> "" Then 7 Sheets("sheet3").Range("C30").Value = tmp(0) & "年" 8 Sheets("sheet3").Range("D30").Value = tmp(1) & "月" 9 Sheets("sheet3").Range("E30").Value = tmp(2) & "日" 10 End If 11 Next

補足情報(FW/ツールのバージョンなど)

Excel 2010

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

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

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

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

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

guest

回答3

0

ベストアンサー

Cells(2, i) が空欄だったり、"/"が含まれていない値だったりしてませんか。

Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row + 1
で最終行の次の行を取得してますが、そこは空欄になりますよね。

あと、
Split(Cells(2, i), "/")
の部分、i は行番号のはずですが、列番号に指定してますが、それで大丈夫なんですか?

ステップ実行で1行ずつ実行させて期待通りの動作をしているか確認する作業を行いましょう。(デバッグ作業)

VBA デバッグの仕方

投稿2020/11/13 01:36

編集2020/11/13 01:37
hatena19

総合スコア34075

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

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

退会済みユーザー

退会済みユーザー

2020/11/13 02:04

ご回答ありがとうございます。 仰る通りケアレスミスが多大にありました。 Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row - 1 に直し、Split(Cells(i,2)),"/") に変更致しました。 上記修正を含めた上でステップ実行を試したところ、変数tmpに対してインデックスが有効範囲にありません。というエラーが出ているのが判明致しました。 この場合はやはりsplit関数が上手く機能していないのでしょうか。
hatena19

2020/11/13 02:56 編集

どの行でエラーが出てますか。 Cells(2, i) の値が空だったり、”/”が2つ含まれていないということはないですか。
退会済みユーザー

退会済みユーザー

2020/11/13 04:00

ご返答ありがとうございます。 エラー箇所は6行目の"Sheets("sheet3").Range("C30").Value = tmp(0) & "年" "で カーソルを合わせたところ、tmp(0)=<インデックスが有効範囲にありません。>という内容です。 上記split関数部分は(cells(i, 2),"/"に変更致しました。 "/"は"2020/11/13"のように2つ含まれております。 お力添え宜しくお願い致します。
hatena19

2020/11/13 06:52

「別bookから取得した値(日付)をSplit関数を使用し、当該bookのsheetに張り付けたい」とのことですので、ブックを省略せずに指定するように書き換えてみてください。 tmp = Split(Workbooks("別ブック").Sheets("シート名").Cells(2, i), "/") とか Workbooks("当該book").Sheets("sheet3").Range("C30").Value = tmp(0) & "年" というように。 他の部分も同様に書き換えてください。
退会済みユーザー

退会済みユーザー

2020/11/19 02:31

ご回答ありがとうございます。 返答が遅くなり申し訳ございませんでした。 無事完了できました。 ありがとうございました。
guest

0

こんにちは。
エラー原因についてはhatena19さんとradames1000さんの回答をご参考ください。

以下VBAコードを拝見した感想です。

ブックやシートオブジェクトを省略したコーディングが目立ちます。
初心者の方によく見られる傾向です。
面倒くさがらずにブックオブジェクトやシートオブジェクトを書きましょう。
Withで指定しても良いです。

複雑な処理や多数のブックやシートを扱うVBAコードを書く時に、どのブックのどのシートかがコードで判断しにくくなりますし不具合の元です。(不具合の解析にも労力を使います)

投稿2020/11/13 02:13

DreamTheater

総合スコア1095

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

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

退会済みユーザー

退会済みユーザー

2020/11/13 04:02

ご回答ありがとうございます。 コーディングの件、ご注意頂きましてありがとうございます。 以後、注意致します。
guest

0

こちらじゃないですか?

VBA

1'tmp = Split(Cells(2, i), "/") 2tmp = Split(Cells(i, 2), "/")

あと、C~Eの30を指定しているのでどんどん上書きされるのはいいのでしょうか。


文字列でなく日付データでしたら下記のように書けます。

VBA

1If Sheets("sheet2").Range("F" & i).Value <> "" Then 2 Sheets("sheet3").Range("C30").Value = Year(Cells(i, 2)) & "年" 3 Sheets("sheet3").Range("D30").Value = Month(Cells(i, 2)) & "月" 4 Sheets("sheet3").Range("E30").Value = Day(Cells(i, 2)) & "日" 5End If 6

投稿2020/11/13 01:37

編集2020/11/13 07:56
radames1000

総合スコア1925

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

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

退会済みユーザー

退会済みユーザー

2020/11/13 01:56

ご回答ありがとうございます。 for文の中にPDF化する構文も入れるつもりなので大丈夫です。 ご心配痛み入ります。
radames1000

2020/11/13 02:01

そうだったんですね。良かったです。 サンプルででもエクセルデータを提示していただけたらわかりやすくて助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問