3

私は VBA の初心者ですが、ここ数日ずっと VBA を使ってきました。50 以上のシートを持つ同様の構造のワークブックが多数あります。Excel マクロがワークブック全体に拡張されていないことに行き詰まっています。

文字列値を持つ 2 つの列の左右から文字を削除する必要があります。コードは次のとおりです。

Sub Trim()

Dim c As Range

 For Each c In Range("B5", Range("B" & 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 Range("C5", Range("C" & Rows.Count).End(xlUp))
 c.Value = Left(c.Value, Len(c.Value) - 16)

 Next c

End Sub

これは私がやりたいことですが、私のアクティブなワークブックに対してのみです。すべてのシートにループさせるためにいくつかのことを試みましたが、成功していません。

助けてくれてありがとう!

4

2 に答える 2

0

未テストですが、問題ないはずです

 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番目のコメントに基づく)

上記のコード (元の投稿も) は、Leftandの 2 番目の引数がRight負でない場合にのみ機能します。負の引数がある場合、説明したようなエラーが発生します。あなたが何を抽出したいのか正確にはわかりませんが、ほとんどの場合LeftRightあなたが望んでいることをしていません..

例:

もしそう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))

コードはエラーを通過しません。ただし、以前はエラーがスローされていた場合、単語全体が削除されます (つまり、空の文字列が返されます)。これが望ましい動作かどうかはわかりませんが、教えてください! :)

于 2013-09-26T22:36:59.530 に答える
0

Excel は、数式を使用するブック ツールとして非常に優れています。

質問に正確に答えられないリスクがありますが、元のワークブックから必要な情報を抽出する数式を使用して新しいワークブックを作成するのはどうでしょうか。次に、次のような式を使用して、

=LEFT(INDIRECT("[Workbook]Sheet1!B1"), LEN(INDIRECT("[Workbook]Sheet1!B1"))-7)

数式参照全体を文字列引数で計算できる場合は、任意のセルを抽出し、必要に応じて処理します。

完全に記述的なソリューションとして、パフォーマンスは VBA ソリューションに似ているかもしれませんが、別の言語の知識は必要なく、デバッグがはるかに簡単です。

于 2013-12-22T17:07:39.250 に答える