こんにちは。
まず、 '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
推測ではコードの誤りというよりは、データが(このルーチン処理をするには)不適当なデータであると思う。
ーー
多分このケースでは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!が返されます。
ーーーー
>行指定をせず、セルを単体で指定するとちゃんと・・
の意味は良くわからんが。