2016-12-02 5 views
1

ここでは、列BとCのセルをチェックし、特定のテストごとにProper関数を適用する関数です。Excel特定の範囲のProperを使用した関数のVBAパフォーマンス

Sub proper_function() 

    Dim rng, cell As Range 

    Set rng = Range("B:B", "C:C") 

    For Each cell In rng 
     If Not cell.HasFormula Then 
      cell.Value = WorksheetFunction.Proper(cell.Value) 
     End If 
    Next cell 

End Sub 

これは処理に時間がかかり、場合によってはExcelがクラッシュしました。

私はむしろ、全体の列ではなくテキストでセルを調べたいと思いますが、forループを少し修正する必要があると思っていますが、動作させることはできません。シートを減速させない?

おかげ

+0

あなたはどのように多くの行データのを持っているのですか? – Brian

+0

あなたのシートがどのように見えるかを知る必要があります。ループの終わりに達するとループが壊れてしまいますが、その場所を特定する方法はありません。 – Fritz

答えて

1

は(テストしていない)、この変更をお試しください:

Sub proper_function() 

Dim rng as Range 
Dim cell As Variant 

Set rng = Range("B:B", "C:C") 
For Each cell In ActiveSheet.Range(rng.Address).SpecialCells(xlCellTypeConstants)  
    cell.Value = WorksheetFunction.Proper(cell.Value) 
Next cell 

End Sub 

をしかし、私はまた、別の答えで提案されているように、最後の行を見つけ、そしてのみ使用される範囲にrngを設定します。また、Thomasが指摘したように、定数セルを前例として持つ揮発性の関数や関数がある場合は、Application.ScreenUpdating.Calculationを追加することが重要です。それもあなたのスピードを上げる鍵となるかもしれません。

+0

ありがとうございます。私が下位関数にこの同じコードを使用することができるかどうかを知りたいのは、ProperをLowerに変更するだけですが、うまくいきませんでしたか? – Pete

+0

@Pete 'WorksheetFunction.Proper(cell.Value) 'を 'LCase(cell.Value)'(大文字の場合は 'UCase')に変更します。また、私のコードがあなたの問題を解決した場合は、緑色のチェックマークを付けてください。 :-) – Brian

0

は、あなたはおそらく、あなたがの.xlsxまたは.xlsmファイル内のすべてのセルをループしてみた場合、彼らは1,048,576行を持っているので、問題に実行するつもりだ、とあなたはその倍をやっています!それはあなたが何をしていても減速を引き起こすでしょう。

ブランケット範囲B:BとC:Cを使用するのではなく、データを含む可能性のある範囲に制限することができます。その後、C列で、これは、列Bで最後に使用された行を見つけます

Sub Properiser() 
    Dim rngAll As Range 
    Dim rngCell As Range 
    Dim lngLast As Long 

    lngLast = Range("B" & Rows.Count).End(xlUp).Row 

    If Range("C" & Rows.Count).End(xlUp).Row > lngLast Then 
     lngLast = Range("C" & Rows.Count).End(xlUp).Row 
    End If 

    Set rngAll = Range("B1", "C" & lngLast) 

    For Each rngCell In rngAll 
     If Not rngCell.HasFormula Then 
      rngCell.Value = WorksheetFunction.Proper(rngCell.Value) 
     End If 
    Next rngCell 
End Sub 

:あなたのシートを見ることなく、私はこのような何かをしようと、それを行うための最善の方法を確認してくださいのためではなく、一般的に言うことはできません範囲の終点として大きい方を使用してください。

UsedRangeプロパティを使用して実際にファイル内で使用された行数と列数を調べるなど、データを見ることなく、それらのいずれかがあなたにとってうまくいくかどうかを判断するのは難しいか否か。

EXPANDように編集:

を今、あなたはあなたではなくテキストのみを含むセルを見て、プロセスを持っているだろうと述べました。私たちができることはいくつかあります。

オプション1:空のセルのためのチェック

あなたは空のセルの多くてバウンスしている疑いがある場合、あなたは、単にあなたのIf条件でセルの内容を確認することができます。

if len(rngCell.value) <> 0 then 
    'Function 
end if 

オプション2:非テキストのチェックは残念ながら我々が英数字のテキストを確認することができ、簡単な、単一の機能を持っていない

値。私たちは排除のプロセスを踏む必要があります。したがって:

if len(rngCell.value) <> 0 then 
    if isnumeric(rngcell.value) = False AND _ 
     iserror(rngcell.value) = false then 
     'Assume it's text and perform our function 
    End if 
End if 

...など。 IFループで必要なだけ多くのチェックを積み重ねることができます。

1

私はWorksheetFunction Properのファンではありません。なぜなら収縮を適切に大文字にしないからです(例えば、can't, doesn't, I'llCan'T, Doesn'T, I'Llになる)。 Proper Case with extra rules in Excelへの私の答えは、正確に収縮を大文字にする私自身の機能TitleCaseを持っています。

Target範囲のみパフォーマンスが向上大幅ScreenUpdatingCalculationをオフ定数値(なし式)

Set Target = Intersect(.Range("B:C"), .UsedRange).SpecialCells(xlCellTypeConstants) 

を持たない空白のセルを含んでいます。 Application.ScreenUpdating = Falseの Application.Calculation = xlCalculationManual


Sub proper_function() 
    Dim Target As Range, cell As Range 
    With Worksheets("Sheet1") 
     On Error Resume Next 
     Set Target = Intersect(.Range("B:C"), .UsedRange).SpecialCells(xlCellTypeConstants) 
     On Error GoTo 0 
    End With 


    If Not Target Is Nothing Then 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 
     For Each cell In Target 
      If Not cell.HasFormula Then 
       cell.Value = WorksheetFunction.Proper(cell.Value) 
      End If 
     Next cell 
     Application.Calculation = xlCalculationAutomatic 
     Application.ScreenUpdating = False 
    End If 
End Sub 
+1

おそらく私は完全に理解していないのですが、もし 'Cellでないなら、なぜ' 'Target'だけが' xlCellTypeConstants'ですか? – Brian

関連する問題