こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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の部分が表示できません。
どなたかよいほうほうをお願いします。

投稿日時 - 2008-11-02 15:01:26

QNo.4448243

暇なときに回答ください

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.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関数は、一つの選択肢にすぎません。

投稿日時 - 2008-11-04 12:00:09

ANo.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-44
10-11-11-1212
1-2-3-10 10
1-2-10-33
1-2-33
1-22
1-1313
11-1414
11-33
ーーー
>Dim moji As Variant
田中先生の解説に注目。
http://officetanaka.net/excel/vba/tips/tips62.htm
>あらかじめ要素の数が明らかなときは、それを受け取る配列変数を用意しておけばいいのですが、一般的にはいくつの要素が返るかわかりません。そんなときは、Split関数の返り値(配列)をバリアント型変数で受け取ります。バリアント型変数に配列を格納すると、変数を配列として操作できるようになります。

投稿日時 - 2008-11-02 20:52:30

お礼

皆様いろいろな
回答をありがとうございます。



文字列を分割して、分割した文字の一番右側を表示するには

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



で解決できました。
皆様ありがとうございました。

投稿日時 - 2008-11-03 16:28:21

ANo.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

投稿日時 - 2008-11-02 20:31:04

お礼

皆様いろいろな
回答をありがとうございます。



文字列を分割して、分割した文字の一番右側を表示するには

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



で解決できました。
皆様ありがとうございました。

投稿日時 - 2008-11-03 16:29:14

ANo.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つだけしかできなかった場合にこれをするとエラーになるので、配列数のチェックを入れました。

投稿日時 - 2008-11-02 17:45:59

お礼

皆様いろいろな
回答をありがとうございます。



文字列を分割して、分割した文字の一番右側を表示するには

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



で解決できました。
皆様ありがとうございました。

投稿日時 - 2008-11-03 16:30:02

ANo.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)

ループ内では、なるべく、こういう書き方は避けたほうがよいです。オーバーヘッドが掛かってしまいます。

投稿日時 - 2008-11-02 16:13:37

ANo.3

UBound関数とLBound関数をヘルプで調べてみればどうでしょうか。

UBound関数は配列のインデックス番号の最大値を返します。
LBound関数は配列のインデックス番号の最小値を返します。

投稿日時 - 2008-11-02 16:13:17

お礼

皆様いろいろな
回答をありがとうございます。



文字列を分割して、分割した文字の一番右側を表示するには

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



で解決できました。
皆様ありがとうございました。

投稿日時 - 2008-11-03 16:30:42

ANo.2

VBAなら下の関数が使えます

InStrRev 関数
機能
ある文字列 (string1) の中から指定された文字列 (string2) を最後の文字位置から検索を開始し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す文字列処理関数です。

構文
InstrRev(stringcheck, stringmatch[, start[, compare]])

投稿日時 - 2008-11-02 16:04:33

お礼

皆様いろいろな
回答をありがとうございます。



文字列を分割して、分割した文字の一番右側を表示するには

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



で解決できました。
皆様ありがとうございました。

投稿日時 - 2008-11-03 16:31:44

ANo.1

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

投稿日時 - 2008-11-02 15:07:39

お礼

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

投稿日時 - 2008-11-02 16:01:37