- 締切済み
文字列を分割して、分割した文字の一番右側を表示するにはどうしたら良いのでしょうか?
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の部分が表示できません。 どなたかよいほうほうをお願いします。
- dachiya
- お礼率53% (21/39)
- オフィス系ソフト
- 回答数8
- ありがとう数9
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 うーん、回答者に、コードを載せる必要はありませんね。(^_^;) ただ、どちらかというと、いくつかのポイントはクリアされておりません。 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)
修正を最小限にして 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関数の返り値(配列)をバリアント型変数で受け取ります。バリアント型変数に配列を格納すると、変数を配列として操作できるようになります。
- Wendy02
- ベストアンサー率57% (3570/6232)
#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
お礼
皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには 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 で解決できました。 皆様ありがとうございました。
- death_note
- ベストアンサー率32% (61/189)
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つだけしかできなかった場合にこれをするとエラーになるので、配列数のチェックを入れました。
お礼
皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには 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)
こんにちは。 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)
UBound関数とLBound関数をヘルプで調べてみればどうでしょうか。 UBound関数は配列のインデックス番号の最大値を返します。 LBound関数は配列のインデックス番号の最小値を返します。
お礼
皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには 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)
VBAなら下の関数が使えます InStrRev 関数 機能 ある文字列 (string1) の中から指定された文字列 (string2) を最後の文字位置から検索を開始し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す文字列処理関数です。 構文 InstrRev(stringcheck, stringmatch[, start[, compare]])
お礼
皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには 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 で解決できました。 皆様ありがとうございました。
- death_note
- ベストアンサー率32% (61/189)
Cells(行, 2) = moji(3) の部分を Cells(行, 2) = moji(Ubound(moji)) としてみてはどうですか?
お礼
さっそくやってみました。 見事に表示できました。 ありがとうございます。 図々しくももう一つ教えてもらっても良いでしょうか 右から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 宜しくお願いします。
- ベストアンサー
- その他MS Office製品
- 最終列に入力されている文字を表示する
エクセル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です。
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- シートの全てを半角にする
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 でやるしかないですか? もっと効率のいい方法があったら教えてください!
- ベストアンサー
- オフィス系ソフト
お礼
皆様いろいろな 回答をありがとうございます。 文字列を分割して、分割した文字の一番右側を表示するには 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 で解決できました。 皆様ありがとうございました。