3

G'Day、

データを適切に実行するために、ExcelVBAが1つの場所で宣言された定義済みの範囲を効果的に管理する方法について理解を深めるのに役立つ質問があります。このプロジェクトにさらに取り組む前に、どちらの2つのオプション(これまでのところ知っている)が優れているか、または推奨されないベストプラクティスであるかを理解したいだけです。

私が解決している問題は、架空のサプライヤのセット全体で多数の障害を含む小さなテーブルを作成することです。したがって、テーブルは次のようになります(生の形式で申し訳ありません)

「会社名」「故障数」
「クールマシーン」7
「クーラントクォーター」5
「リトルウォータークーラント3
」エアムーバーシステム7
「ジェネラルクーラント」5
「アドミアクーラント」4

私の最初のオプション(Const String)は、次のようなこのモジュール/式です。

Option Explicit
Public Const CountofFailures As String = "J7:J12"
Sub btnRandom()
    ' Declaration of variables
    Dim c As Range

    ' Provide a random number for failures across Suppliers
    For Each c In ActiveSheet.Range(CountofFailures)
        c.Value = Random1to10
    Next c
End Sub

Function Random1to10() As Integer
    'Ensure we have a different value each time we run this macro
    Randomize
    ' Provide a random number from 1 to 10 (Maximum number of Failures)
    Random1to10 = Int(Rnd() * 10 + 1)
End Function

2番目のオプション(定義済みの名前)は、次のようなこのモジュール/式です。

Option Explicit
Sub btnRandom()
    ' Declaration of variables
    Dim c As Range
    Dim iLoop As Long

    ' Provide a random number for Suppliers with Defined Range
    For Each c In ActiveWorkbook.Names("CountofFailures").RefersToRange
        c.Value = Random1to10
    Next c
End Sub

Function Random1to10() As Integer
    'Ensure we have a different value each time we run this macro
    Randomize
    ' Provide a random number from 1 to 10 (Maximum number of Failures)
    Random1to10 = Int(Rnd() * 10 + 1)
End Function

何か提案があります-これが役立つ場合は、後でマクロタイマーテストを行いますか?

セルにリストされている範囲を値としてフェッチする場合、3番目のオプションはありますか?これを実際に行うコードを見たことがありませんか?

4

3 に答える 3

5

パフォーマンスの違いはわかりません-constの方が速いと思います。私の一般的なアドバイスは、「パフォーマンスの問題が発生するまでパフォーマンスについて心配しないでください」です。そうしないと、最適化に何を費やすかを推測してしまい、正しくない可能性があります。

名前付き範囲に関しては、行と列を挿入すると移動するという利点があります。列Iに新しい列を挿入する場合は、最初の例を編集する必要があり、2番目の例は引き続き機能します。

于 2012-12-23T03:52:26.897 に答える
3

両方のコードが、ボトルネックとなる範囲をループします。私はあなたに提案します

  1. 範囲名を使用して、データを自動的に「検索」します。つまり、行と列を挿入/削除しても、参照はそのまま残ります。私の経験では、ファイル内の多くの範囲名は、ブックが実行していることをわかりにくくする可能性があります
  2. この範囲に1回の書き込みを行います

コード

Sub QuickFill()
Randomize
Range("CountofFailures").Formula = "=Randbetween(1,10)"
Range("CountofFailures").Value = Range("CountofFailures").Value
End Sub
于 2012-12-23T03:58:20.327 に答える
1

名前付き範囲の方が遅いことがわかりました(おそらく、Excelが名前を参照するために名前の内部ルックアップを実行する必要があるため)が、非常に極端な場合(数十の場合を除いて)大きな違いを見つけることができる可能性はほとんどありません。数万回または数十万回参照されている数千の名前)。
そしてディックが言うように:利点はわずかな速度の損失をはるかに上回ります。

于 2012-12-23T12:34:47.990 に答える