- ベストアンサー
VBAで文字列の一部を抽出する方法
- VBAを使用して、excelに記入された文字列から特定の部分を残す方法を教えてください。
- LEFT関数を使用するとエラーが発生し、VBAでの操作が必要です。
- SEARCHプロパティがセルを単体で指定する場合には機能し、行指定の場合にはエラーが発生します。なぜでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 まず、 'J' がないときの、エラー処理がなされていません。 それに、代わりの関数がある場合は、VBAでは、ワークシート関数は使うべきではありませんね。 >位置 = Application.WorksheetFunction.Search("J", Range("B" & 行), 1) これではうまく行きません。エラーが返ったら、とまってしまいます。 それに、基本的には、VBAでは、InStr や InStrrev のVBA関数を使います。 それから、変数に2バイト文字はやめたほうがよいです。 例: '------------------------------------------------ 'Option Explicit Option Compare Text Sub IDをひとつだけにする() Dim rw As Long Dim i As Long Dim j As Integer rw = Range("B2000").End(xlUp).Row Application.ScreenUpdating = False For i = 7 To rw If Cells(i, 2).Value Like "J*/J*" Then j = InStr(1, Cells(i, 2).Value, "/", 1) If j > 1 Then '本来は、j >5 ですが、念のため Cells(i, 2).Value = Mid$(Cells(i, 2).Value, 1, j - 1) End If End If Next i Application.ScreenUpdating = True End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
推測ではコードの誤りというよりは、データが(このルーチン処理をするには)不適当なデータであると思う。 ーー 多分このケースではB列IDを見ただけでは判らないかと思う? どの行で起こっているか(行数が多いようだが) Sub test01() For i = 1 To 1000 If (i Mod 20) = 0 Then MsgBox i Next i End Sub (質問の場合は上記iが「行数」か。20行おきにメッセージをだす。止まる前の i から20以内のデータを良く見ること) ようなのを入れて、うまくいかない行を割り出してみては。 どこか空き列に、目印の値を入れてみるのも手。どの行で止まったか判ると思う。 終わりまで処理して、結果がおかしいより、不幸中の幸いだよ。 そしてそのセルのデータに注目すれば誤りの原因がわかるでしょう。 それらしきことをやってないようだが不思議。 ーー プログラムがうまくいかないのは (1)コードの作り方がまずい (2)データが予想通りで無い(広く言えば上記(1)になるが) 2つあって、(2)も多い。大規模システムのダウンもこれが多い。 タイミング・組み合わせが絡むと原因究明が非常に難しい場合が多い。 (2)は質問されても、読者では典型的なエラーケースしか指摘できない。 参照 http://excel.onushi.com/function/search.htm 対象に検索文字列が含まれていない場合はエラー値#VALUE!が返されます。 開始位置に1以下の数値を指定するとエラー値#VALUE!が返されます。 ーーーー >行指定をせず、セルを単体で指定するとちゃんと・・ の意味は良くわからんが。
- marbin
- ベストアンサー率27% (636/2290)
エクセルのバージョンが分かりませんが、 Split関数 を使う、ではダメですか?
- okormazd
- ベストアンサー率50% (1224/2412)
空のセルをSearchが参照してないか。 検索対象の文字数より、開始位置が大きいと質問のようになる。