• 締切済み

文字列を分割して、分割した文字の一番右側を表示するにはどうしたら良いのでしょうか?

Sub test2() Dim moji() As String Dim a As Range Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row Set a = Cells(行, 1) moji() = Split(a, "-") On Error GoTo moji Cells(行, 2) = moji(3) Next 行 moji: Cells(行, 2) = moji(2) End Sub で A列 B列 1-2-3-4 4 10-11-11-12 12 1-2-3-10 10 1-2-10-3 3 1-2-3 3 1-2 1-13 11-14 11-3 の結果になりますが1-2,11-14,11-3の部分が表示できません。 どなたかよいほうほうをお願いします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 うーん、回答者に、コードを載せる必要はありませんね。(^_^;) ただ、どちらかというと、いくつかのポイントはクリアされておりません。 imogasiさんの提示するポイント Dim moji() As String これは、 Dim moji As Variant のほうがよいです。 また、 a = Cells(行, 1) 暗黙のプロパティを使っていますが、この場合は、Textプロパティにします。a =Cells(i, 1).Text 'インクリメンタルな変数は、i,j を使うのが慣例です。 当然、Dim a As String です。 それから、変数は2バイト文字を使ってはいけません。使ってよいのは入門時だけです。 理由は、Excel 2003以降でも、未だ検索時に文字化けが発生しています。 それから、 Cells(行, 2).Value = moji(UBound(moji) - 1) これは、エラーの発生する要素がありますから、 #5さんのコードを参考にして、添え字(Index)の数を取って、0の場合は分岐してください。 なお、私の書いているのは、「-」の区切り文字(Separator)は、半角絶対という条件がとれない場合は、私の書いたようなTextCompare モードにするか、一旦、文字を半角にする(StrConv)、ということが必要になります。それから、Split関数は、一つの選択肢にすぎません。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.7

修正を最小限にして Sub test2() Dim moji As Variant Dim a As Range Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row Set a = Cells(行, 1) moji = Split(a, "-") Cells(行, 2) = moji(UBound(moji)) Next 行 End Sub 結果 1-2-3-4 4 10-11-11-12 12 1-2-3-10 10 1-2-10-3 3 1-2-3 3 1-2 2 1-13 13 11-14 14 11-3 3 ーーー >Dim moji As Variant 田中先生の解説に注目。 http://officetanaka.net/excel/vba/tips/tips62.htm >あらかじめ要素の数が明らかなときは、それを受け取る配列変数を用意しておけばいいのですが、一般的にはいくつの要素が返るかわかりません。そんなときは、Split関数の返り値(配列)をバリアント型変数で受け取ります。バリアント型変数に配列を格納すると、変数を配列として操作できるようになります。

dachiya
質問者

お礼

皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには Sub test() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji)) Next 行 End Sub 文字列を分割して、分割した文字の右から2番目を表示するには Sub test6() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji) - 1) Next 行 End Sub で解決できました。 皆様ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#4です。 別にアドバイスしても、興味を示さないでしょうから、それぞれの部分の解説はしません。Split 関数が楽なのは分かるけれども、あえて、使わないで、Text Compare Mode で行っています。 Sub test4()   Dim m As Integer   Dim n As String   Dim i As Long   Dim j As Integer   For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row     m = Len(Cells(i, 1).Text) - Len(Replace(Cells(i, 1).Text, "-", "", , , 1))     n = Replace(Cells(i, 1).Text, "-", "^", , m - 1, 1)     j = InStrRev(n, "-", , 1)     If j = 0 Then       Cells(i, 2).Value = n     Else       n = Mid(n, 1, j - 1)       j = InStrRev(n, "^", , 1)       Cells(i, 2).Value = Mid(n, j + 1)     End If   Next i End Sub

dachiya
質問者

お礼

皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには Sub test() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji)) Next 行 End Sub 文字列を分割して、分割した文字の右から2番目を表示するには Sub test6() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji) - 1) Next 行 End Sub で解決できました。 皆様ありがとうございました。

回答No.5

No1です。 右から2番目を取得するには Cells(行, 2) = moji(3) この部分を If Ubound(moji) > 0 Then Cells(行, 2) = moji(Ubound(moji)-1) Endif としてはどうでしょうか? 一応解説しておくと、Splitで"-"を区切り文字として配列に分割されます。 Ubound(moji)でこの配列がいくつの要素を持ってるのか分かります。(実際はインデックスが0からなので要素数-1です) 右から2番目を表示するには最大インデックスの1個前のデータを出せばいいのでUbound(moji)-1となります。ただしSplitで配列が1つだけしかできなかった場合にこれをするとエラーになるので、配列数のチェックを入れました。

dachiya
質問者

お礼

皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには Sub test() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji)) Next 行 End Sub 文字列を分割して、分割した文字の右から2番目を表示するには Sub test6() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji) - 1) Next 行 End Sub で解決できました。 皆様ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 Split 関数を使う使わないというのは、人の好き好きですから、それは置いといて、元のデータを良く確認してみてください。Excelの場合は、そのまま置くと、11-3 などは、日付データ(シリアル値)になりますから、.Value プロパティでは取れません。他にも、別のポイントがあります。 Sub test3()   Dim moji() As String   Dim i As Long   Dim j As Integer   For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row     j = InStrRev(Cells(i, 1).Text, "-", , 1)     If j > 0 Then       Cells(i, 2).Value = Mid(Cells(i, 1).Text, j + 1)     Else       Cells(i, 2).Value = Cells(i, 1).Text     End If   Next i End Sub それと、 Set a = Cells(行, 1) ループ内では、なるべく、こういう書き方は避けたほうがよいです。オーバーヘッドが掛かってしまいます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

UBound関数とLBound関数をヘルプで調べてみればどうでしょうか。 UBound関数は配列のインデックス番号の最大値を返します。 LBound関数は配列のインデックス番号の最小値を返します。

dachiya
質問者

お礼

皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには Sub test() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji)) Next 行 End Sub 文字列を分割して、分割した文字の右から2番目を表示するには Sub test6() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji) - 1) Next 行 End Sub で解決できました。 皆様ありがとうございました。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

VBAなら下の関数が使えます InStrRev 関数 機能 ある文字列 (string1) の中から指定された文字列 (string2) を最後の文字位置から検索を開始し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す文字列処理関数です。 構文 InstrRev(stringcheck, stringmatch[, start[, compare]])

dachiya
質問者

お礼

皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには Sub test() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji)) Next 行 End Sub 文字列を分割して、分割した文字の右から2番目を表示するには Sub test6() Dim moji() As String Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row a = Cells(行, 1) moji() = Split(a, "-") Cells(行, 2).Value = moji(UBound(moji) - 1) Next 行 End Sub で解決できました。 皆様ありがとうございました。

回答No.1

Cells(行, 2) = moji(3) の部分を Cells(行, 2) = moji(Ubound(moji)) としてみてはどうですか?

dachiya
質問者

お礼

さっそくやってみました。 見事に表示できました。 ありがとうございます。 図々しくももう一つ教えてもらっても良いでしょうか 右から2番目を表示するにはどうしたら良いのでしょうか。