1

私はそれが非常に単純なことを知っていますが、どこが間違っているのかわかりません - 助けてください

シーンの設定:
現在、ワークブックに 3 つのワークシートがあります

Sheet1 – レースのフィクスチャーの日付に応じて移動する生データで構成されています

Sheet2 - シート 1 からコピーされた生データで構成されます

ビュー– シート 2 のデータのビュー

プロセスは次のとおりです-ユーザーは手動でフィクスチャをシート1にドラッグアンドドロップし、フィクスチャのコピーを取り、シート2のデータで追加の列を追加するマクロ有効ボタンをクリップします

次に、最後のボタンをクリックして、「ビュー」シートにこのデータのビューを作成します。VnthLookupビュー シートが行っているのは、各セルに相対値を設定するために呼び出された定義済みモジュールを呼び出していることだけです。

問題
現在、各シートの VBA と数式は正常に動作します。ビューを作成するときに、セルをクリックしてキーボードの [戻る] ボタンをクリックして手動で計算を求めると、ビューが更新されて正常に動作します。ただし、ビューシート全体を再計算しようとすると、タイムアウトになり、計算を完了するのに永遠にかかります (最大 1 時間 + わずか 30 行、8 列ヘッダー)。

vnthlookup モジュールのコーディングは次のとおりです。

Public Function VlookupNth(MyVal As Variant, MyRange As Range, Optional ColRef As Long, Optional Nth As Long = 1)
    Dim Count, i As Long
    Dim MySheet As Worksheet

    Count = 0
    Set MySheet = Sheets(MyRange.Parent.Name)

    If ColRef = 0 Then ColRef = MyRange.Columns.Count

    For i = MyRange.Row To MyRange.Row + MyRange.Rows.Count - 1
        If MySheet.Cells(i, MyRange.Column).Value = MyVal Then
            Count = Count + 1
            If Count = Nth Then
                VlookupNth = MySheet.Cells(i, MyRange.Column + ColRef - 1).Value
                Exit Function
            End If
        End If
    Next i

    VlookupNth = ""
End Function

そして、私のビューシートには、列Bから列Jまでのすべてのセルに次の式があります-シート2から要求している値に応じて、「X」は異なります。

=VlookupNth(1,Sheet2!C:AAA,X,2)

これに時間がかかる理由を理解するための助けをいただければ幸いです。

ps 説明を明確にする必要がある場合は、喜んでワークブックをお送りします。転送先アドレスを残してください。

4

2 に答える 2

4

2 つの問題があります。

  1. より小さな問題は、シート名を使用して範囲を参照していることです。代わりに、MyRangeすでに持っている変数を使用してください。
  2. より大きな問題は、列全体を関数に渡すことです。関数は最後の百万行まで列全体をやみくもに調べます (必要な値が十分に早く見つからない場合)。関数をシートに存在する実際のデータに制限する必要があります。

次のように書き換えます。

Public Function VlookupNth(ByVal MyVal As Variant, ByVal MyRange As Range, Optional ByVal ColRef As Long = 0, Optional ByVal Nth As Long = 1) As Variant
    Dim Count As Long, i As Long

    Count = 0
    If ColRef = 0 Then ColRef = MyRange.Columns.Count

    'Do not consider uninitialized rows
    Set MyRange = Application.Intersect(MyRange, MyRange.Parent.UsedRange)

    If Not MyRange Is Nothing Then
        For i = 1 To MyRange.Rows.Count
            If MyRange.Cells(i, 1).Value = MyVal Then
                Count = Count + 1
                If Count = Nth Then
                    VlookupNth = MyRange.Cells(i, ColRef).Value
                    Exit Function
                End If
            End If
        Next i
    End If

    VlookupNth = ""
End Function
于 2013-01-02T13:17:58.813 に答える
1

おそらく応答ではありませんが、開始するためのヒントと提案がいくつかあります。

Dim Count, i As Long  'is defining Count as a variant
Dim Count as long, i As Long    'is the proper syntax

それでは
Set MySheet = Sheets(MyRange.Parent.Name)無意味に思えます。MySheetはワークシートであり、 を使用するため、Setである必要がありますSet MySheet = Sheets(MyRange.Parent)
私はあなたをお勧めします

  • それらの小さな修正を試して、
  • Option Explicitモジュールに設定されていることを確認してください。
  • コンパイルし、テストし、ニュースを返します...
于 2013-01-02T13:25:26.647 に答える