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

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

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

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

解決済

VBA インデックスの有効範囲エラーについて教えてください

shibakoppe
shibakoppe

総合スコア27

VBA

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

1回答

0評価

0クリップ

158閲覧

投稿2022/05/17 08:45

編集2022/05/18 09:13

お世話になっております。
前回の質問に関連した不明点が出てきてしまい、今一度皆様のお力をお借りしたいです。
(https://teratail.com/questions/upbkui8rwk2fqc)

hatena19様にお教えいただいた以下のコードを利用して、目的を達成することができたのですが、B列に入力されるデータ数よりもA列に入力されているデータ数が多いとインデックスの有効範囲エラーが出てきてしまいました。

Sub sample1() Dim s As String Dim a Dim i As Long For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row a = Split(Cells(i, 2).Value, "_") Cells(i, 2).Value = a(UBound(a)) Next End Sub
番号データ名
11_○○○○_●●●●
22_○○○○_●●●●
33_○○○○_●●●●
44_○○○○_●●●●
55_○○○○_●●●●

上記表の通りA列とB列の行数が一致している際はエラーは上がらないのですが、下記表のようにA列の行数が多いとエラーとなってしまいます。

番号データ名
11_○○○○_●●●●
22_○○○○_●●●●
33_○○○○_●●●●
4
5

A列の番号はあらかじめ用意されているものの為、行数の変更はできません。
また、B列も途中空白のセルが不特定箇所に複数存在する可能性があります。

初心者であることを盾にしてしまっているようで大変申し訳ございませんが、今一度お力添えをお願いしたく思います。
何卒、宜しくお願い申し上げます。

<追記1>
下記表のように上段で空白セルがある際もインデックスの有効範囲エラーが出ることが判明しております。

番号データ名
1
2
33_○○○○_●●●●
44_○○○○_●●●●
55_○○○○_●●●●
6
7
番号データ名
1
2
33_○○○○_●●●●
4
55_○○○○_●●●●
6
77_○○○○_●●●●
8
9

B列に空白行があるとインデックスの有効範囲エラーとなってしまうのでしょうか…

ちなみにデバック箇所は

Cells(i, 2).Value = a(UBound(a))

の部分です。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

kaz.Suenaga

2022/05/17 09:08

For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row a = Split(Cells(i, 2).Value, "_") Cells(i, 2).Value = a(UBound(a)) Next 理解がどこで躓いているのかを知るために、この4行について、1行1行何をしているか、説明してみてもらえますか。
shibakoppe

2022/05/17 09:16

For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row …最終行取得 a = Split(Cells(i, 2).Value, "_")          …文字列を"_"で分解 Cells(i, 2).Value = a(UBound(a))         …分解した文字列の後ろの要素を転記 Next                       …継続 以上のように認識しておりましたが、いかがでしょうか…?
kaz.Suenaga

2022/05/17 14:28

解決されたようなので良かったですし、回答としては書きませんが、ベストアンサーで指摘されているように a = Split(Cells(i, 2).Value, "_")          …文字列を"_"で分解 の理解にありそうです。 「配列」と「Split関数」について少し調べてみるといいかと思います。 文字列を「分解」自体は間違いではないのですが、より正しくは文字列を指定の文字で分解して「配列化する」ことです。 「インデックスの有効範囲」というエラーが出てくる場合、大抵の場合はこの配列に収められているデータと呼び出そうとしているデータのインデックスがマッチしていない場合です。
shibakoppe

2022/05/18 00:13

お返事が遅くなってしまい申し訳ございません。 ご指摘いただきまして誠にありがとうございます。 今後の為にも理解を深めてまいります!

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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