• 締切済み

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

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/17068)
回答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番目を表示するにはどうしたら良いのでしょうか。

関連するQ&A

  • 列を変更して転記したいのですが。

    すみません、誰か教えていただけませんか。 A列に値が入力がされていて、その値をF列に転記していき 15行までいけば2列横にズレて転記していき更に、15行で 2列横と続けたいのですがうまく出来ません。 下記のように記述してみたのですが、値が置き換わるだけで 転記出来ません。 誰か教えて頂けませんでしょうか。 Sub TEST() Dim i As Long, ii As Long Dim myR As Long myR = Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row ii = 5 For i = 1 To myR Cells(1, ii).End(xlUp).Offset(0, 1).Value = Cells(i, 1).Value If Cells(1, ii).End(xlUp).Row = 15 Then ii = ii + 2 End If Next i End Sub 宜しくお願いします。

  • 最終列に入力されている文字を表示する

    エクセルVBAで最終列に入力されている値の表示方法について教えてください。 最終行については表示できるのですが、最終列に入力されているものの表示がうまくいきません。 A列の最終行の値をセル”D1”に表示するについては Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまくいきました。 最終行、例えば3列目の10行目に”111”と入力されているときにセル”D1”に”111”と表示するようにはどうしたらよいのでしょうか。 どなたがご指南ください宜しくお願いします。

  • 増やした列へ決められた文字を入力するには?

    いつもお世話になっております。 表があり、A列の前に1列追加し、その新しいA列の3行目のセルから表の最終行に「□」(四角)を表示するようにしたいのですが、思うように行かず困っております。 「□」は印刷後に手でチェックを入れる為に使うのが目的です。 Sub test() Columns("A").Select Selection.Insert shift:=xlToRight Dim myrow() As Variant Dim i As Integer For i = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1 myrow(i, 3) = "□" & i Next End Sub A列は増えるんですが、その先が動きません。 よろしくお願いいたします。 環境はWindowsXP Excel2003です。

  • VBA 最終列に入力された値の表示について

    VBAで最終列に入力された値の表示について教えてください。 例えば10行目の10列目(J列)に”123”と入力された値をセル”D1”に表示させたいのですがどのようにすればよいのでしょうか。 A列の最終行については Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまく表示できたのですが、最終列についてなかなかうまくいきません。 どなたかご指南ください宜しくお願いします。

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • A列の最終行までハイパーリンクを付けたい

    A列の最終行までハイパーリンクを付けたいのですがコードがわかりません。 Sub test() Dim i As Long For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row 'ハイパーリンクにするコード Next i End Sub まではわかりました。 表示文字列もURLもセルに入ってる値にしたいです。 ご教授よろしくお願いします。

  • 他のシートの任意の列に1行おきに表示する

    よろしくお願いします。 下の構文ですと Worksheets("入力")の3列目5行目以降のデーターが Sheet2の同じ列(3列目)5行目以降に1行おきに表示されます。 これを Worksheets("入力")の3列目5行目以降のデーターを Sheet2の7列目5行目以降に1行おきに表示したいのですが どのように書き直せばよいでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Long, j As Long j = 5 With Worksheets("入力") For i = 5 To .Cells(Rows.Count, 3).End(xlUp).Row .Rows(i).Copy Worksheets("Sheet2").Cells(j, 1) j = j + 2 Next i End With End Sub

  • 複数の列を繋げてA列に入れたい VBA

    aaa aaa  bbb aaa  bbb  ccc aaa (A列にaaa、B列にbbb、C列にcccが入ってます) と言うデータがあるのですが 全てA列に入れて aaa aaabbb aaabbbccc aaa としたいです。 ・最終列は必ずしもCではないのです。(Dの場合もEの場合もある) ・最終行も変化します。 Sub 分かれてる列を繋げる() Dim Col As Long Dim Row As Long For Row = 1 To Range("a65536").End(xlUp).Row   For Col = 1 To Cells(Row, 256).End(xlToLeft).Column    Cells(Row, 1) = Cells(Row, 1) & Cells(Row, 2) & Cells(Row, 3)    Next Col Next Row End Sub をやってみましたが、 aaa aaabbbbbb aaabbbcccbbbcccbbbccc aaa となってしまい、 欲しい結果とは違くなってしまいます。

  • ある文字を含む列と同じ行にある列と一致の文字の除外

    "名称"(D列)で*ABCD*と含まれるものと同じ行にある"番号"(B列)が一致するものを全て除外したい(D列の値は異なるが、 B列の値が一緒なものを除外したい)。 下記のコードに上記の内容のコードを加えたいのですがやり方を教えていただけないでしょうか? ちなみにVBA初心者なためお手柔らかにお願い致します。 Sub 分別() Dim j As Long j = Cells(Rows.Count, 1).End(xlUp).Row With Range(Cells(3, 1), Cells(j, 43)) .AutoFilter Field:=37, Criteria1:="EFGK" .AutoFilter Field:=4, Criteria1:="*FF0001*", Operator:=xlOr, Criteria2:="*DD0002*" End With End Sub

  • シートの全てを半角にする

    A列からT列、 行は10000行ほどあるのですが 全てを半角にしたいのですがマクロでないと無理でしょうか? Sub 全てを半角にする() Dim row行 As Long Dim col列 As Long For col列 = 1 To Range("IV1").End(xlToLeft).Column For row行 = 2 To Cells(65536, 2).End(xlUp).Row Cells(row行, col列) = StrConv(Cells(row行, col列), vbNarrow) Next row行 Next col列 End Sub でやるしかないですか? もっと効率のいい方法があったら教えてください!

専門家に質問してみよう