5

この質問については、次の投稿を参照して自分自身を明確にし
ます。 VBA によって追加されたときに条件付き書式がオフセットされるのはなぜですか?

最近目にする非常に多くの投稿で、OP は暗黙のうちに .Activate、.Select、.Offset などの使用を許可されていますが、潜在的なバグ (ほとんどの場合、エンド ユーザーが原因) への扉が開かれています。
コードがサポートされることもあります。

私の質問: これらのステートメントに起因する典型的なバグをキャッチする直接的な代替手段がない場合、これらのステートメントのいずれかを使用する有効な状況はありますか?

私の意見では、Excel 用に開発する際に必須の動的ソリューションについて言及しています。個人的には、6 年以上の間、私がそれを必要としたケースを 1 つも思い出すことができません。利用可能な最悪のオプションの 1 つであるように常に思われます。以前の会社では、VBA を使用しないことが暗黙のルールであり、VBA ライフ (およびエンド ユーザーのライフ) が向上するだけでした。

私がこの質問を作成した理由は、VBA の初心者に、これらのステートメントを使用するときに取るリスクを認識させることは価値があると考えているためです (エンド ユーザーが予期しないことをした場合のリスクが経験的に証明されています。 VBA への愛情) と直接的な代替案を提案すること (以前は常にそうしていたとは言いませんが、すでにバグ モンスターに迅速な解決策を提供するだけでは何か問題があると感じています)。

黙って許可すると (この場合は自動的に強化されます)、VBA 開発者を始めると、間違った方法でツールを作成することが増えると思います (したがって、新規参入者もその動作を継承します。これは、Google が戻ってきてからスタック オーバーフローからも学ぶことになります)。彼らが探している結果 (!))。
開発者が「選択」を使用できる理由と、それが潜在的なバグである状況を認識していない場合は、絶対に使用しないでください。個人的には、イミディエイト ウィンドウで select stmt を使用して、ダイナミック レンジの定義 (バグ モード) を簡単にチェックできますが、記述されたコードでは使用できません。

その結果、最終的に VBA は以前よりもさらに人気がなくなります。問題が発生した場合、その言語は被害者になります (それでも、Excel および Access アプリケーションで利用可能な「最高の」プログラミング サポートであることには変わりありません)。VBA が常に「たわごと」である大企業で、これが何度も発生するのを見てきました。

これは私自身の正直な経験にすぎません。
それは正しいか間違っているかの問題ではありません。質問に対するあなたの見解を聞きたいです。

4

5 に答える 5

3

Select と Activate については同意しますが、ActiveWorkbook、ActiveSheet、および ActiveCell については同意しません (これらが悪用されていることには同意しますが、それ自体を避けるべきではないということには同意しません)。それらには間違いなく正当な用途があります。ActiveCell から行う「一連の塗りつぶし」を自動化するプログラムがあります。私のプログラムは、どのセルが使用されるかを予測できません。それを選択するのはユーザー次第です。これはユーザー インターフェイスの一部です。

ただし、Select を使用しなければならない状況が 3 つあります (現在、ズームについて読んだ 4 つの状況ですが、使用したことはありません)。

  1. 条件付き書式。Application.ConvertFormula を使用する回避策がありますが、選択を保存し、正しいセルを選択し、行為を行い、前の選択を再選択するよりも悪いです。
  2. データ検証。同じ理由。
  3. 形。詳細を思い出せたらいいのですが、Shapes を扱うのは久しぶりです。形を選ばないとできないことがありました。

Select と Activate のコードを取り除くことは、気高い戦いです。

于 2012-09-14T16:40:59.007 に答える
2

Excel には、Activate または ActiveSheet/ActiveWorkbook などを必要とするメソッドがいくつかあります。現時点で覚えているのは zoom プロパティだけです。ズームは、ウィンドウで現在アクティブなシートのみに影響するため、すべてのシートをズームするには、次のようなものが必要です

Sub SetZoom()
Dim ws As Worksheet
    Application.screenupdating = false

    For Each ws In Worksheets
        ws.Select
        ActiveWindow.Zoom = 80
    Next ws

    Application.screenupdating = true
End Sub
于 2012-09-14T16:12:43.637 に答える
1

を使用.Selectして、コードを実行した後にユーザーのビューがどうなるかを判断できます。たとえば、コードで新しいワークブックを作成する場合、使用せずに使用ActivateするとSelect、ユーザーはこれが発生することを知らない可能性があります。

新しいワークブックを作成したり、その他の大規模なデータ操作を行ったりする長い操作を頻繁に終了します。

FinalViewWorkbook.FinalViewSheet.Range("A1").Select

エンド ユーザーに何かを知らせるためだけに - 「ああ、これでレポートの新しいワークブックが作成されました!」等

于 2012-09-14T19:23:03.637 に答える
0

この問題では、いくつかを区別することが重要だと思います。

  • Active-something: ユーザーが現在何を処理しているかを知る必要がある場合にのみ、これを使用してください。私の経験では、これは通常、データ検証またはアクティブ シート検出です (たとえば、「ユーザーがボタンを押したシートを更新する」など)。
  • Selection: と多少同じですがActive、読み取り用にのみ使用してください。データ検証、または「セル値をパスとして解釈し、新しいエクスプローラー ウィンドウで開く」などのギミックに役立ちます。
  • SelectActivate: とは異なりSelectionます。選択したセル、シートなどを実際に変更するためです。ユーザーがクリックするだけでプログラムを台無しにする可能性があるため、これを使用してデータを読み書きしないでください。ユーザーはクリックするのが大好きです。これはズーム (@user3357963 の回答を参照) にのみ使用するか、コードの動作が完了した後にビューをクリーンアップします (@enderland の回答を参照)。(よくわかりませんが、PageView の処理には ActiveSheet も必要だと思います)。
  • SelectActivate2 番目: VBA を初めて使用し、マクロ レコーダーを使用して学習している場合は、最初Range("A5").Selectに 、次にSelection.Value="NewValue". これを に結合しRange("A5").Value="NewValue"ます。
  • Offset: 個人的には、使用に問題はありません.Offset()。このコマンドで問題が発生したことはありません。代わりに、「このセルの行と列のこのセルのシート+1」を毎回実行する必要なく、「このセルの隣のセル」と言うのは便利な方法だと思います。

最近目にする非常に多くの投稿で、OPは暗黙のうちに.Activate、.Select、.Offsetなどの使用を許可されています...

私はこれに賛同する。コードの一部を機能させるために必要な答えを与える方が簡単ですが、 などの使用はActiveCell.Valueお勧めしません。リンク先のスレッドが十分に説明されている場合、これははるかに簡単になります。これはうまくいけば :-)

于 2015-10-13T13:23:19.033 に答える