未テストですが、問題ないはずです
Sub MyTrim()
' avoid Trim because it is a built-in function!
Dim c As Range, wb As Worksheet
For Each wb In ActiveWorkbook.WorkSheets
For Each c In wb.Range("B5", wb.Range("B" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 10)
c.Value = Right(c.Value, Len(c.Value) - 7)
Next c
For Each c In wb.Range("C5", wb.Range("C" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 16)
Next c
Next wb
End Sub
編集(以下の2番目のコメントに基づく)
上記のコード (元の投稿も) は、Left
andの 2 番目の引数がRight
負でない場合にのみ機能します。負の引数がある場合、説明したようなエラーが発生します。あなたが何を抽出したいのか正確にはわかりませんが、ほとんどの場合Left
、Right
あなたが望んでいることをしていません..
例:
もしそうc.Value = "a string somewhat long"
なら
Left(c.Value), Len(c.value)-10)="a string som"
その後
Right(c.Value, Len(c.Value)-7) = "g som"
パーツはRight
に作用し"a string som"
ます。
次のように、失敗する直前にコードを実際に停止し、希望どおりに動作するかどうかを確認できます。
行の上に行
c.Value = Left(c.Value, Len(c.Value) - 10)
を追加
debug.Assert Len(c.Value) >= 10
行の上に行c.Value = Right(c.Value, Len(c.Value) - 7)
を追加します
debug.Assert Len(c.Value) >= 7
これは、「文字列の長さが少なくとも 10 であることを確認し、これが true でない場合は停止する」という表現と考えることができます。これは、true でない場合にコードの実行を停止します。その後、イミディエイト ウィンドウに移動できます。 (Ctrl+G または View-> Immediate Window のいずれか) と入力? c.Value
し、 This will display the value of c
. 最後に、コードが停止すると、停止した行が黄色でマークされます. 次のコード行を実行したい場合は、F8
. を押すたびF8
に、1 行のコードが実行されます。
最終的な観察として、変更c.Value = Left(c.Value, Len(c.Value) - 10)
する場合
c.Value = Left(c.Value, IIf(Len(c.Value) - 10 >= 0, Len(c.Value) - 10, 0))
コードはエラーを通過しません。ただし、以前はエラーがスローされていた場合、単語全体が削除されます (つまり、空の文字列が返されます)。これが望ましい動作かどうかはわかりませんが、教えてください! :)