0

いくつかの配列のチュートリアルに従いましたが、VBA のコードは難しすぎて、基本的な知識では配列に変更できません。

誰でも助けることができますか?

これは私のコードです:

Sub InternExtern()

Dim source, addrescell, destination As Range
Dim Sourcevalue As String


For Each source In Range("E6", Range("E" & Rows.Count).End(xlUp))
 If source.Value <> "" Then
    For Each addrescell In Range("address_table_names").Rows
             If addrescell.Cells(1).Value <> "" And InStr(source.Offset(0, 23).Value, "Extern") = 0 Then
               SourceName = addrescell.Cells(1).Value
               Sourcevalue = addrescell.Cells(1, 4).Value
                    If InStr(UCase(source), UCase(SourceName)) <> 0 Then
                      If InStr(Sourcevalue, "10.") <> 0 Or InStr(Sourcevalue, "192.168.") <> 0 Or IsInternal(addrescell.Offset(0, 3).Value) Then
                       source.Offset(0, 23) = "Intern"
                       Else: source.Offset(0, 23) = "Extern"
                      End If
                    End If
                      If InStr(source, "-ext-") <> 0 Or InStr(source, "any") <> 0 Or InStr(source, "-EXT-") <> 0 Then
                      source.Offset(0, 23) = "Extern"
                      End If
                      If InStr(source, "any") <> 0 And InStr(source.Offset(0, -1).Value, "FW-Peering") = 0 Then
                      source.Offset(0, 23) = "Intern"
                      End If

            End If
            Next addrescell
End If
Next source

列の値を配列に追加する私の目標は、それを高速化することです。

前もって感謝します!

4

2 に答える 2

1

何かを配列に入れることがどのように役立つかはよくわかりません。いつかまた取り出さなければならないでしょう。

ループが実行されている間、無効にして、最後にオンに戻してみApplication.ScreenUpdatingApplication.Calculationください。

Application.ScreenUpdating = False
Application.Calculation = xlManual
' your loop
Application.ScreenUpdating = True
Application.Calculation = xlAutomatic

コードが何をしているのか、何をしたいのかを説明できれば、もっとお手伝いできるかもしれません。@seheが提案したようなワークシート関数を使用する方が、はるかに優れた解決策になる可能性があります。

アップデート

コードレビューへのリンクを見ると、答えの1つは、ワークシートの配列コピーを作成し、変更した配列をワークシートに再適用するのが非常に簡単で迅速であることを示しています。以前は見たことがない、かなりクールなもの。

配列の方が速いかもしれませんが、あなたの場合、配列に変換するときに存在しないオブジェクトのメソッドを使用すると、複雑さが増すだけだと思います。

セルのアドレスを配列に追加すると仮定します(そうでない場合、シートにコンテキストがありません)

Array(1).Offset(0,1) = <not going to happen>

Range(Array(1)).Offset(0,1) = <going to work>

したがって、多くの配列がない限り、オブジェクトに戻って作業を行うことになりますが、それは冗長である場合と冗長である場合があります。

私はあなたの関数の目的が何であるかを100%確信していないので、これはまったく役に立たないかもしれません!内部forループの余分な(不要な)反復があるかもしれないと思います。基本的にマークされたセクションで'HEREその反復が完了したことを意味する場合は、ループを終了して次の親ループに進むことができます。

For Each source In Range("E6", Range("E" & Rows.Count).End(xlUp))
    If source.Value <> "" Then
        For Each addrescell In Range("address_table_names").Rows
            If addrescell.Cells(1).Value <> "" Then ' vba doesn't shortcircuit
                If InStr(source.Offset(0, 23).Value, "Extern") = 0 Then
                    SourceName = addrescell.Cells(1).Value
                    Sourcevalue = addrescell.Cells(1, 4).Value
                    If InStr(UCase(source), UCase(SourceName)) <> 0 Then
                        If InStr(Sourcevalue, "10.") <> 0 Or InStr(Sourcevalue, "192.168.") <> 0 Or IsInternal(addrescell.Offset(0, 3).Value) Then
                            source.Offset(0, 23) = "Intern"
                            ' HERE
                            Exit For
                        Else
                            source.Offset(0, 23) = "Extern"
                            ' HERE
                            Exit For
                        End If
                    End If
                    If InStr(source, "-ext-") <> 0 Or InStr(source, "any") <> 0 Or InStr(source, "-EXT-") <> 0 Then
                        source.Offset(0, 23) = "Extern"
                        ' HERE
                        Exit For
                    End If
                    If InStr(source, "any") <> 0 Then ' again, no shortcircuit
                        If InStr(source.Offset(0, -1).Value, "FW-Peering") = 0 Then
                            source.Offset(0, 23) = "Intern"
                            ' HERE
                            Exit For
                        End If
                    End If
                End If
            End If
        Next addrescell
    End If
Next source

に関する情報shortcircuit-ing、ネストされたifを使用するよりも高速でありand、lightspeedではありませんが、1つの比較を節約できます。あなたがたくさんの反復をしているなら、それは(とにかく少し)合計することができます

于 2013-03-15T12:57:03.257 に答える
0

それからワークシート関数を作成することをお勧めします:

そうすれば、計算列に数式を入力するだけで済みます

 =InternExtern(E6)

また、完全な再計算を行うか、VBA プロジェクトを再コンパイルするか、ソース値が変更された場合にのみ、セルが再計算されます。

于 2013-03-15T12:43:23.257 に答える