お世話になっております。
前回の質問に関連した不明点が出てきてしまい、今一度皆様のお力をお借りしたいです。
(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
番号 | データ名 |
---|---|
1 | 1_○○○○_●●●● |
2 | 2_○○○○_●●●● |
3 | 3_○○○○_●●●● |
4 | 4_○○○○_●●●● |
5 | 5_○○○○_●●●● |
上記表の通りA列とB列の行数が一致している際はエラーは上がらないのですが、下記表のようにA列の行数が多いとエラーとなってしまいます。
番号 | データ名 |
---|---|
1 | 1_○○○○_●●●● |
2 | 2_○○○○_●●●● |
3 | 3_○○○○_●●●● |
4 | |
5 |
A列の番号はあらかじめ用意されているものの為、行数の変更はできません。
また、B列も途中空白のセルが不特定箇所に複数存在する可能性があります。
初心者であることを盾にしてしまっているようで大変申し訳ございませんが、今一度お力添えをお願いしたく思います。
何卒、宜しくお願い申し上げます。
<追記1>
下記表のように上段で空白セルがある際もインデックスの有効範囲エラーが出ることが判明しております。
番号 | データ名 |
---|---|
1 | |
2 | |
3 | 3_○○○○_●●●● |
4 | 4_○○○○_●●●● |
5 | 5_○○○○_●●●● |
6 | |
7 |
番号 | データ名 |
---|---|
1 | |
2 | |
3 | 3_○○○○_●●●● |
4 | |
5 | 5_○○○○_●●●● |
6 | |
7 | 7_○○○○_●●●● |
8 | |
9 |
B列に空白行があるとインデックスの有効範囲エラーとなってしまうのでしょうか…
ちなみにデバック箇所は
Cells(i, 2).Value = a(UBound(a))
の部分です。
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行何をしているか、説明してみてもらえますか。
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 …継続
以上のように認識しておりましたが、いかがでしょうか…?
解決されたようなので良かったですし、回答としては書きませんが、ベストアンサーで指摘されているように
a = Split(Cells(i, 2).Value, "_") …文字列を"_"で分解
の理解にありそうです。
「配列」と「Split関数」について少し調べてみるといいかと思います。
文字列を「分解」自体は間違いではないのですが、より正しくは文字列を指定の文字で分解して「配列化する」ことです。
「インデックスの有効範囲」というエラーが出てくる場合、大抵の場合はこの配列に収められているデータと呼び出そうとしているデータのインデックスがマッチしていない場合です。
お返事が遅くなってしまい申し訳ございません。
ご指摘いただきまして誠にありがとうございます。
今後の為にも理解を深めてまいります!
まだ回答がついていません
会員登録して回答してみよう