2016-10-17 6 views
0

私はイニシャルと置き換えたいフルネームの列を持っています。私は現在、これをやっている効率的な配列のループ

Dim n As Long 
Dim varray As Variant 
Dim FullNameRange As Range 
Dim FullName As String 

varray = Range(NDLstaffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1) 

For n = FirstLineItemRow To UBound(varray, 1) 
    Set FullNameRange = ActiveSheet.Range(staffCol & n) 
    FullName = FullNameRange.Value 
    FullNameRange = Left(FullName, 1) & Mid$(FullName, InStr(FullName, " ") + 1, 1) 
Next 

LastRowは、グローバル変数として最後のレコードを指します。

同じモジュール内の他のサブルーチンと比較すると、処理に時間がかかります。

これを行うより良い方法はありますか?

ハードコードされた検索/置換が機能しないように、完全な名前はわかりません。 < 500レコードあります。

+0

私にはうまく見えますが、(少なくともこの宇宙では)改善できない実行時の複雑さは 'O(n)'です。あなたはデバッガの外で実行しようとしましたか?それはデバッグモードで通常どおりゆっくりと実行されますか? NET Office SDKを使用してC#/ .NETで書き直そうとしましたか? Excelを実行する際にExcelを最小限に抑えると、実行速度は向上しますか?どのExcelのバージョンを使用していますか? – Dai

+0

@Dai「ライブ」のときはゆっくりと正常に動作します。私はプログレスバー(userform)を使ってサブルーチンのどこにいるのかをユーザーに示します。このセクションに入ると、時間がかかります。 SDKの書き換えと使用について聞いたことがありません。最小化は時間に影響を与えません。 Excel 2016です。これが本当に最良の方法であれば、私は500レコードしかありません! – redditor

答えて

3
Dim n As Long, rng As Range 
Dim varray As Variant 
Dim FullNameRange As Range 
Dim FullName As String, v 

Set rng = Range(staffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1) 
varray = rng.Value 

For n = 1 To UBound(varray, 1) 
    v = varray(n, 1) 
    varray(n, 1) = Left(v, 1) & Mid$(v, InStr(v, " ") + 1, 1) 
Next 

rng.Value = varray 
+0

うわー。ちょうどこれをテストし、それは私の合計から約2分を削り取った...ありがとう!なぜこれがうまくいったのか、どこが間違っているのか説明できますか? – redditor

+2

データを配列にプルした後、ワークシート上でセルごとにループ処理を行いました。配列内のデータを変更して、一度にシートに書き戻す方がはるかに高速です。 –

+0

私はそれを配列に入れようとしていたのですが、どうもありがとう! – redditor