2017-03-16 9 views
0

私は列を下り、そのセルがリストされているセキュリティタイプのいずれかと等しいかどうかを確認するループを持っています。そうでなければ、データオフセット1の列を切り取って左に貼り付けます。ときには、データがオフセットされて1〜3列になっているので、i = i-1を追加してifをsat化するまで同じ行をチェックするのです。このコードでは、2つの問題が発生します。エンドレスループを作成する複数のステートメントまたは複数のステートメントの場合

1.)複数のorのif文のコードがよりシンプルになっていますか?

2.)このコードはセクションで動作しますが、シート全体(〜29K行)で実行されるときは無限ループに入ります。これがどうして起こるのか?

LastCashrow = Sheets("Cash Data").Range("A" & Sheets("Cash Data").Rows.Count).End(xlUp).Row 

For i = 8 To LastCashrow 

SecType = Left(Cells(i, 5), 2) 

    If SecType = "aw" Or SecType = "ca" Or SecType = "cb" Or SecType = "cd" Or SecType = "cl" Or SecType = "cp" Or SecType = "cs" Or SecType = "cv" Or SecType = "ep" _ 
       Or SecType = "ex" Or SecType = "fi" Or SecType = "fm" Or SecType = "gb" Or SecType = "gm" Or SecType = "hf" Or SecType = "lp" Or SecType = "mb" _ 
       Or SecType = "mf" Or SecType = "oa" Or SecType = "pf" Or SecType = "pr" Or SecType = "ps" Or SecType = "pt" Or SecType = "re" Or SecType = "rl" _ 
       Or SecType = "tb" Or SecType = "tp" Or SecType = "ut" Or SecType = "wt" Or SecType = "zb" Or SecType = "zt" Then 

    ElseIf IsEmpty(SecType) = "True" Then 
     Exit For 

    Else 
     Set Shift = Range(Cells(i, 5), Cells(i, 17)) 
     Shift.Cut 
     Cells(i, 4).Select 
     ActiveSheet.Paste 
     Application.CutCopyMode = False 
     i = i - 1 

    End If 

Next i 
+0

チェックそれがtrueの場合、それは全く何の価値を持っている場合は、チェックし、その後、 – mast3rd3mon

+1

他に、最終的には削除しない 'I = I - を1 'と下からループします。 'For i = LastCashrow to 8 Step - 1' –

+0

@ScottCranerなぜですか? –

答えて

1

1)を、複数のかの持つIfステートメントのコードのよりシンプルなラインはありますか?

はい。私はあなたのコードを改善することにより、このように起動したい:

' Declare all of your variables explicitly 
Dim LastCashRow As Long 
Dim i As Long 
Dim SecType As String 
Dim cell As Range 

Dim validSecTypes() As String 
validSecTypes = Split("aw,ca,cb,cd", ",") ' write all of your values here... 
' returns an array of strings: ["aw", "ca", "cb", "cd"] 

LastCashRow = 12 

For i = 8 To LastCashRow 
    Set cell = Cells(i, 5) 
    If IsEmpty(cell) Then Exit For ' This is really the first thing to check for. 

    SecType = Left(cell.Value, 2) 

    If ArrayContains(validSecTypes, SecType) Then 
     MsgBox SecType & " is IN!" 
    Else 
     MsgBox "This is OUT: " & SecType 
     'your lines of code go here 
    End If 

Next i 

これは、ヘルパー関数使用しています:

Function ArrayContainsValue(arr As Variant, val As Variant) As Boolean 
    ArrayContainsValue = (UBound(Filter(arr, val)) > -1) 
End Function 

2.)このコードは、セクションで動作しますが、それは全体のシート上で動作するとき(〜 29K行)、無限ループに入ります。これがどうして起こるのか?

いいえ、あなたのシートを参照する必要があります。

あなたは本当にそれが無限であると確信していますか?現在書かれているように、コードを使用して多くの行を処理するには時間がかかることがあるためです。

私が推測したように、あなたのコードは実行に時間がかかります。

犯人は、おそらくこのコードのビットです:

Shift.Cut 
    Cells(i, 4).Select 
    ActiveSheet.Paste 
+0

これはうまくいった。あなたは無限ループを作っていないという点で正しいです。私は、複数のまたはステートメントは、コードが遅く実行する原因と考えています。 – theurlin

0

あなたは、複数または条件簡素化するためにこれを行うことができます:

If InStr(1, "/aw/ca/cb/cd/cl/cp/cs/cv/ep/ex/fi/fm/gb/gm/hf/lp/mb/mf/oa" + _ 
      "/pf/pr/ps/pt/re/rl/tb/tp/ut/wt/zb/zt", SecType) > 1 Then 
+0

もし私が+1したいのであれば、thisrは質問の半分に答えません^^ – Noldor130884

+0

'SecType ="/c "'ならば失敗します。 –

+0

次に、区切り文字として「/」を使用しています。つまり、「/」を持つ秒型がないため、今のところ私の問題ではないようです。 – PKatona

関連する問題