私のファイルには 50 枚のシートが含まれており、各シートは標準フォームです。Form1、Form2、Form3 という名前を付けます。
印刷シートを作成して、表示したいフォームを選択できるようにし、必要なフォームを見つけるためにシート間を移動する必要がないようにしたいと考えています。また、この印刷シートにカウンターを配置して、プリンターに送信するたびにカウントされるようにしたいと考えています。
これまでに何をしましたか? この数式を作成しました。ここで、M1 はフォーム名のドロップダウン リストです。したがって、Form2 を表示する場合は、ドロップダウン リストで Form2 を選択すると、数式によって Form2 のすべてのシートが表示されます。
=IF($M$1="Form1";IF('Form1'!A1="";"";'Form1'!A1);"")&IF($M$1="Form2";IF('Form2'!A1="";"";'Form2'!A1);"")&IF($M$1="Form3";IF('Form3'!A1="";"";'Form3'!A1);"")
すべてのフォームが標準化されているため、正常に動作しています。
選択したフォームを選択したら、会社の ID 番号を入力して印刷する必要があります。
このシートに、印刷した回数をカウントするカウンターを作成できるかどうか、または何かを保存または変更したときに時系列順にカウントするカウンターを作成できるかどうかを知りたいです...
答え1
ご要望はすべて対応可能です。ただし、VBA のみを使用する予定です。
ドロップダウンはそのままにして、マクロをトリガーするボタンも追加します。
マクロでは、ドロップダウンのあるセルを読み取り、適切なシートを送信して印刷します。次に、ドロップダウンとボタンと同じページにある一連のセルにある適切なカウンターを更新します。
保存回数をカウントするには、before_save 関数のマクロが必要です。検索する必要があります。私のブログにそれに関する記事があるかもしれませんが、覚えていません。数年前に実行したからです。原則は前のマクロと同じで、適切なセルに 1 を追加するだけです。
答え2
他の50シートのうちの1つの内容を表示する「印刷シート」を作成するためのよりクリーンな方法は、セルを次A1
のように設定することです。
=INDIRECT($M$1 & "!A1")
これは、表示するセルの修飾名に似たテキスト文字列を作成し、関数を使用してINDIRECT()
その文字列を逆参照します (つまり、セル アドレスとして扱い、識別されたセルの内容を取得します)。これにより、 を追加する際に数式を変更する必要がなくなりますForm51
。警告:
- これにより、Excelはこれらの間接セルを「再計算」するために多くの作業(つまり、多くの時間)を行う可能性があります。何でも変更( だけではありません
M1
)。現在の状態よりも悪くなるかどうかはわかりません。 - 更新したいときに、「プリントシート」にデータを変更したり、新しいデータを入力したりする誘惑に負けないようにしてください
Form42
。(もちろん、今はこの問題を抱えています。)プリントシートを保護することで、このような事故から身を守ることができるかもしれません。
印刷シートを作成する方法は他にもあります。例えば、VBAを使用して
- 呼び出しを置き換えてよりスムーズに動作するユーザー定義関数を作成する
INDIRECT()
か、 - 実際には、変更するたびに、 からのすべてのデータを印刷シートにコピーします。
Formnn
M1
VBA ルーチンを記述することで変更をカウントできますWorksheet_Change
。
シートのロジックで印刷をカウント/検出する方法はわかりません。ただし、VBA で印刷ルーチンを記述することで、目的の効果を実現できる可能性があります。
PrintOut , , , True
ステートメントはシートを印刷します。他の必要なアクション(例えば、カウンターを増やすなど)を追加してください。(印刷することを忘れないようにしてください。このマクロを使う4番目のパラメータPrintOut
はプレビューに設定すると、True
シートを印刷する前に Microsoft Excel で印刷プレビューが呼び出され (キャンセルするオプションが提供されます)、False
(または省略すると)、無条件でシートが直ちに印刷されます。
見るMS Office に VBA を追加するにはどうすればよいですか? 情報については、まあ、ご存知のとおりです。