• ベストアンサー

Excel で日付入力したらマクロが動く方法

Excel 2003 です。(OSはXP) データ用のエクセルファイルからマクロでコピー貼り付けをする日報ファイルを作っています。構成シートが7枚、マクロは12モジュール、ファイルサイズが140MBという巨大なものです。 セルB2に日付を入力したとき、Macro1が動くようにしたいのですが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$B$2" Then Exit Sub Else... 以外に何かうまい方法はないでしょうか? セルに値を入力、じゃなくて、何かのコントロールでもかまいません。 マクロで日付を読み込めることが必須条件です。 上述のマクロの活用方法はいろいろ読みましたが、処理に時間がかかって困っております。「全てのセルに変更が加えられたのを検知」するしか方法はありませんか? 一応、この Macro1 を呼び出す部分以外には Application.EnableEvents = False を入れて、Worksheet_Changeが反応しないように止めていますが、遅いような気がします。(計ったわけではないのですが。) この日報ファイル自体が、計算の塊で、1つのセルに数値を入力しただけで、再計算に1秒前後かかることがあります。 そこで、貼り付けのマクロ(Macro2)を動かすときには Application.Calculation = xlManual を入れたりもしているのですが(それでも貼り付けに1分30秒)、常に再計算をOFFにするわけにもいかず・・・。 だから「全てのセルに変更が加えられたのを検知」という命令は、時間短縮のため避けたいのです。 また、マクロの全てにEnableEventsを入れておくのも、見苦しくて。(新たにマクロを追加したらまた忘れずにEnableEventsを書かないといけない構造にしたくありません。) 「全てのセルに変更が加えられたのを検知」ではなく、特定のオブジェクトに日付が入力された・選択されたのをマクロの開始合図とすることはできませんでしょうか? 質問がわかりにくかったらすみません。よろしくお願いします。

  • QoooL
  • お礼率100% (171/171)

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

今一つやりたいことが分かりませんが 処理速度を早くしたいということでしょうか? で、あれば大きく考え方を変えたほうが良いと思います 速度を遅くしているのは、マクロではなく関数ですし ファイル容量を肥大化してるのも関数が原因です 即ち、関数の使いすぎだと思います 関数の中身はマクロです 試しに '----------------------------------------------------- Function 足し算(数値1 As Long, 数値2 As Long) As Long 足し算 = 数値1 + 数値2 End Function '------------------------------------------------------ を標準モジュールにコピーし、適当なセルを選択し、関数の選択窓を見ると、足し算があると思います そこで、計算してみましょう ある関数をあるシートの100セルに設定するとします ある関数は1000文字程度のマクロで構成されているとします 100セル×ある関数(1000文字)で10万文字に成ります これをマクロで処理すると ある関数と同等のマクロ処理1000文字 マクロ起動処理(イベント等)500文字 100セルを同じ処理をするためのループ処理500文字 合計で2000文字 最低限ですが、同じ結果が得られると思います 単純な比較ですが、処理速度、容量共に5分の1程度になると予想できます 質問にありますが >「全てのセルに変更が加えられたのを検知」 は、関数も同じ(自動計算の場合)プラス対象シート全部を再計算してしまうのに対して、マクロは対象以外は処理を中止できる と、ALLマクロ化にすれば処理速度、容量の面でも有利だと思いますが そうもいかないと思いますので、少しずつマクロ化しては如何と思います 関数は便利なのですが、使いすぎると処理が重く、容量が増える傾向あるようです 長々と失礼しました

QoooL
質問者

お礼

そうです、うまく言えなかったのですが、 「小さいファイルならWorksheet_Changeなど入れても気にしないが、大きいファイルなので、もっとピンポイントで特定セルの変更 (または何らかの方法での日付の入力)だけを検出して、処理速度を早くしたい」ということでした。 長いご回答は大歓迎です! とても深い考察でした。早速試してみました。まだ、うまいこと検証できるような反復計算・計時プログラムはできていませんが、65000行の計算だけでも    足し算(A1,A2)    A1+A2 のうち後者が遅い気がしました。 ご指摘の通り、今改良を重ねているプログラムは関数だらけでして、 例えばEA列の20行目に =IF(or(AM20>0,AX20<AY20,DE20=""),"",IF(DX20*0.005>DY20,0, IF(DZ20="","",DZ20)))  (この例だと79文字) というような式が入っていて、これが各列の20行目から43219行目まで同様の式で埋め尽くされています。式をオートフィルしたときは、「ここからここまで同じ式」という圧縮技術が使われているだろう、と勝手に思いこんでいたのですが、リアルに全てのセルに79文字ずつ書き込んでいるのと変わらないのですね(この例だとEA列の式だけで 3412800バイト)。  関数ウィンドウで「ユーザー定義」の関数というのは見たことあるはずなのにちっとも「使おう」という考えに至っていませんでした。こんなに手軽なものだとは! あえて難点をあげるとすれば、定義されている関数を知らない同僚には、セルの中身の意味が1クッション置かないとわからない、ということぐらいでしょうか。でも、教えていただいた方法で、相当時間が短縮できそうなので、メリットの方が圧勝です!(現在、オープンや保存だけで40秒以上かかっているので。) ご回答の中の「5分の1程度」の根拠は   10万 対 2000 ですか? 50分の1のことですか? まあ全てが概算でけっこうですから気にしていません。 期待以上のお答えが返ってきて満足です! ありがとうございました。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#5の補足・訂正 「ここの質問者は、Versionを書いていないようですが、ここの回答者と意見は同じです。(訳はいれません)」 「ここの」は、「以下の」と読み替えてください。引用先の掲示板のことでした。 なお、OLE とキメツケしていますが、DDEかもしれません。それについては説明がありませんので、こちらの想像です。

QoooL
質問者

お礼

(#5 のお礼からの続きです) >実際に、Change イベントで大きなファイルを扱うのは、どう考えてもうまくありません。 長いご回答を何度もいただいたのに要約するのは失礼ですが、ご回答の中のポイントはここですね。勉強になりました。「どう考えても」という部分は私にはどう考えたら良いかわかりませんので、もっと勉強することにします。全般的には「幅広く答えてあげよう、多くのヒントをあげよう」としてくださったのはよく伝わりましたし、役に立ちました。ありがとうございます。 質問としてはこれで締め切らせていただきます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3です。 >>EnableEvents の意味は分かりますか? > >わかっていますよ。まあ不勉強な部分はあるにしても、使っています。 Event が、ちゃんと知っている人なら、Class も当然知っているはずです。ローカルモジュールに設置するということは、Class モジュールで設置すると同じことです。そういうことが分かっている方なら、また、私の書いた内容は、失礼な書き方になっただろうと思いますが。 >「B2しか監視する必要がないのに、B2も含めて全てのセルの変更が監視されているのは、効率が悪い」という意味で書きました。 だから、そういうのは、Worksheetというオブジェクトにイベントの設置をするからでしょう。 それに、Application.EnableEvent =False を一回させれば、イベントを死んでいるはずです。全部のコードに書く必要なんてないはずですね。ひとつ、プロシージャを書けば済みます。True にするまでは、イベントは死んでいます。そんなことは常識ですよね。 たぶん、Calculate Event をどうにかしたいということなんだろうと思いますが、どんな数式かは分かりませんが、VBAの配列メモリ上で計算させて数値をワークシートに戻せばよいのでは。2秒以内に可能なはずです。 実際に、Change イベントで大きなファイルを扱うのは、どう考えてもうまくありません。データ部分をADOやDAOなどで扱っていくとか、VBAなどをある程度使える人なら、そういう逃げ方をすると思いますが、OLE では、逃げることが出来ません。140Mというのは無理があると思います。 ここの質問者は、Versionを書いていないようですが、ここの回答者と意見は同じです。(訳はいれません) http://en.allexperts.com/q/Excel-1059/Excel-File-Size-Limitations-1.htm ただ、同様の質問の方はいつも同じなのですが、もう少し詳しい説明をしてくださらないと、こちらも思い込みだけで書いて、それで、反論されたり、後だしで、ひっくり返すような情報を書かれると、返事を付けるのにかなり苦しんでしまいます。 >データは2秒置きなので43200行あります。従って元のデータファイルがそれぞれ15~25MBあります。 最初に、こういう話は書いていただきたいです。スタティックなデータの話とは違いますし、それは、たぶん、OLEでしょうから、そこでオブジェクトを使用していますから、その分でも重くなっています。それを、毎回同じファイル、同じシートを使うなら、ゴミは溜まります。 確かに、ExcelのBiffファイルは、隙間だらけですから、その部分を少なくするということで「ワークシートの最適化」が可能な場合もありますが、それは、そういう条件を持っている場合に限ります。ブックを長く使うと、ある種のゴミを拾っていくので、それを吐き出すには、一旦、CSV やSYLKファイルに変換してから、もう一度、インポートをするという方法で取り出します。 そういう場合は、ワークシートの最適化は役立ちますが、そうでなければ意味がありません。そのデータがインポートする(された)ときに、処理できるような方法を取らないと、どんどん遅くなるはずです。 この問題は、本質的に、Excelのオブジェクト自体の問題だと思いますし、Excel 2007 でない以上、回避する能力は持っていないので、後は、別の方法を考えるしかありません。 それと、マクロの最適化(optimization)って、単に、モジュールは、数を減らすことではなくて、まず、そのマクロのモジュールの行き来を少なくするために、内容を整えることから始まります。その次に、各オブジェクトへのアクセスとそのオーバーヘッドのロス問題を見て行きます。その問題のコードが読めないと無理です。ほとんど、一般の素人の方には難しいと思います。(素人でないというなら、失礼しました。ある程度の力を持っていれば、#3とあわせて、これだけのアドバイスで十分だろうと思います。)VBAの最適化については、以下に書かれています。開発者にとっては常識的な内容です。 http://msdn.microsoft.com/ja-jp/library/aa189065(en-us).aspx

QoooL
質問者

お礼

(#5 の補足からの続きです) >開発者にとっては常識的な内容です。 そうなんですか。私は開発者ではないので(少なくとも、VBAを扱うだけでは開発者という自覚はない)、「最適化という話題は開発者にとって常識だ」という情報を上から目線で言われても、どうでもいいことです。 まあ全然マクロをやったことのない人(Wendy02様から分類すれば「ド素人」!?)に比べれば、少しは「力を持っている」つもりでしたが、私の力はきっと「ある程度の力」には達していないでしょうね。どの程度か、を決めるのは私ではなくてどうやらWendy02様のモノサシのようです。だから私は「一般の素人」ということで良いです。ご指摘の通り、私にはWendy02様のご説明は難しい内容でした。素人である可能性も考慮して書いていただいている、とはとうてい思えない専門的知識の列記でした。私は、私のレベルまで降りてきてくださる回答者様を待つことにします。(幸いこの質問は解決しましたが。) Wendy02様も、ここにはいろんなフィールド、いろんなレベルの質問者が、ふらっと立ち寄って何気ない質問をしていく、ということを許していただけませんか。EnableEvents の意味を、わかっている、と答えただけでムキになって「本当にわかっているなら~」とわざとこちらを試すような、難しい言葉を並べても(噛み砕いて説明する配慮をわざと省いても)大人げなくて困ります。最初の私の「質問のしかた」を見ただけで、Wendy02様が「ある程度の力を持っている方」なら、私が「限りなくド素人に近い」ということは見抜くことができていたはずですよね? 開発者なら、質問のしかたも変わっていたと思いますが? 「常識」というのが口グセのようなので、不快感は表明させていただきました。ここは「わからないから教えてください」と聞く場なので、そもそも「常識」なんて単語を使う機会はないと思います。それこそ良識ですよね。教える方は上の立場、教わる方は下の立場ですから、下から「教え方にケチつける」のは恐縮ですが、上からモノ言ってちょいちょいイヤミをはさむことでフラストレーションを発散させようとする人に対しては、不快感を表明する権利が私にもあるはずです。顔が見えない一期一会だからなおさらです。 (#6 のお礼へと続きます)

QoooL
質問者

補足

>True にするまでは、イベントは死んでいます。そんなことは常識ですよね。 そうですね。常識ですね。常識を強調して何が言いたいのですか。常識がわかっていないと教えてくださっているのですか。 あいにく、イベントのON/OFFはタイミング的に限定できないので困っていたのです。限定できるならしたのですが。 >同様の質問の方はいつも同じなのですが、もう少し詳しい説明をしてくださらないと、こちらも思い込みだけで書いて、それで、反論されたり そうですね、こういった空間では、自分の聞きたいことだけを手短かに聞く、仕事(プライベート)の内容にかかわるような具体例までは出さずに一般論で聞く、という質問者が多いと思います。私がやっていることも全部説明するには1000字では足りませんし。 「自分の知っている海の中でなんとか答えてあげよう」としてくださっているのはわかるので、善意ある方だとは伝わっているのですが、「決め付け」が多くて「反論してこられた」と感じられることがあるのでは?「決め付けが多いか少ないか」は全部見ていないので仮定の話ですが。そうですね、ここはチャットルームではないので、お互いに3度も4度も追加情報をやりとりするのは現実的でないので、回答者様が返事を付けるのにかなり苦しむ、ということのないよう、(できるなら)一発で回答を得られるよう、シンプルかつポイントは押さえた質問をするよう今後はさらに気をつけよう、と思います。今回の質問は特に、私もわかりにくいと自認していましたので、お叱りはごもっともです。どこまで質問に書いたら良いか、どういった側面から質問を書いたら良いか、迷った末でしたが、次回改善に生かします。貴重なご意見ありがとうございました。 そういった意味では、他の回答者様はわかりにくいなりに的確に質問を汲み取って、知りたい情報をくださって、幸いでした。私はある程度、与えられた情報(質問)の中で思い込みを加えて回答をくだされば、それでご回答になると思いますよ。「こういう場合はこうなります」というご回答は、自分の期待していた「場合」とは違ったとしても、勉強になります。 あとは、一人一人が知っているフィールドは違うのだから、知っていることなら「助言」する、知らないことには口を出さない、ということでいいんじゃないですか。 >>ファイルサイズが140MBという巨大なものです。 >常識的に、Excel 2003 で、そのファイルサイズが無理 ~ せいぜい、10Mに留めるべきで というのは、上述した決め付けの一種でしょう。私がWendy02様とは別次元のフィールドで作業をしている、と言えるのかも知れません。私が使っているデータロガーではエクセルで15M、30M、ざらですよ。製品仕様の範囲内です。だから私は、「10M超(100Mクラス)でどう快適に仕事をするか」ということを考えるべきフィールドに立っています。 「500円のお箸を買いに来た客」に、「10000円の箸の方がずっと長く使えるし美しい」「こんな箸も、こんな箸もある」「箸よりフォークの方がずっと優れている」「このぐらい知っているのは常識ですよね」と言われても、客としては困惑するだけです。「こんな箸がある」という辺りまでは、なるほど勉強になった、と興味をもってありがたく聞けても、「知らないあんたは反論しないでくれ」とまで言われたら余計な御世話です。 参考URLは、ためになりました。きっと、日本語サイトでは同様の疑問をまとめているサイトがないから、Wendy02様は海外サイトを普段よくご活用なさって、私にも教えてくださったのですね。どうやら、明確なエクセルの最適サイズはないものの、私の使っている「10M超」の系では、いろいろな不具合を我慢しなければならない、ということだと理解しました。 (#5 のお礼へと続きます)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

えーと ちゃんとした回答は他の方から 得られているようなのですが、 最適化についてもう少し補足させてください。 以前、知人から相談を受けた時、 100MB超のExcelファイルが800KB程度に なったことがあります。 これは極端な例ですが、Excel の特性上、 一定のサイズを超えると、何も手を加えなくても、 上書き保存するだけでサイズが膨らみます。 最適化の前後でサイズの違いが大きければ大きいほど、 数式、マクロ、等の扱い方に問題があった、 ということも言えます。 XL2000でしか確認したことがないものとしては グループ(アウトライン)を含む非表示セル を非表示のまま保存することが問題になってた こともあります。 手作業で小さくする方法として、大雑把ですが、、、 ・ブックの共有がされていれば解除、 ・Excelをデザインモードにして ・新規ブック(以下wbN)を開いて、 ・そこに対象ブック(wbT)と同じ数だけのシートを用意しておく。 ・[ツール]メニュー [オプション]ダイアログ [編集]タブ 「オブジェクトをセルとともに切取り、、、」 をオンにする。 (以下各シート毎に) ・wbTのシートで全てのセルを選択してコピー  (Ctrl + AC) ・該当する位置のwbNのシートを選択して貼付け  (Ctrl + AV) (以上繰り返し) ・シート名や数式の参照等、必要に応じて置換 (VBAプロジェクトも似たようなことをします。) ・VBEを開いて、標準モジュール、クラスモジュールの 数を合わせるように wbNにモジュール挿入し、 ・各モジュールペイン単位で記述部分をそれぞれコピペ (モジュール数を少なくできるなら尚良し)・ワークブック、ワークシートモジュールも同様、 記述内容のみコピペ ユーザーフォームモジュールがある場合は、 (ちょっと手を抜いて) ・プロジェクト エクスプローラ上で プロジェクト名をドラッグ&ドロップでコピペ ・参照設定の反映も忘れずに ・最後に、この作業の為に変更した設定を元に戻す。 名前を付けて保存で完了。(細かい漏れがないかチェック) ・テンプフォルダの掃除 以上です。 大変だけど効果は必ずあります。 ここまでやってから、、今度は ファイルの中身(数式やVBA)を最適化(?)します。 放って置けば膨らむ一方ですから。 私も痛い目にあったクチなので(^.^)

QoooL
質問者

お礼

追記ありがとうございます! 最適化を意識したわけではないのですが(最適化という言葉は今日初めて知った)、ちょうど、エクセルファイルに破損の疑いを抱いて、作り直していたところなのです。とあるセルのValueをマクロで拾ったところ、今は存在していない値(過去に書き込んでいた値)が返ってきたので、他の方から「そのブックは壊れつつある可能性があります」とご指摘を受けたところでした。 そこで、シートからシートへ、ちょうどおっしゃったような方法でセルとオブジェクトを移し、明日からはモジュールを移すところでした。危ない! 標準モジュールは、ドラッグでコピーしてこない方が良いのですね。危うくやってしまうところでした。早速、記述内容のみのコピーに切り替えます。 コマンドボタンやテキストボックなどのオブジェクトがある時に、行や列の挿入、も良くなさそうですね。オブジェクトに関しては戻るボタン(UNDO)が利かない時もありますもんね。 100MB超のExcelファイルが800KB程度に、 というのは100分の1のオーダーですからびっくりです! たいへん参考になりました。ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >ファイルサイズが140MBという巨大なものです。 常識的に、Excel 2003 で、そのファイルサイズが無理なのです。遅いとか速いとかいう話ではなくて、ファイルの使い方の問題です。 せいぜい、10Mに留めるべきで、それを140MBにしてしまって、どうこういう問題ではないと思います。データと計算部分をファイルとして分離するとか、データベースのコンセプトを導入するとか、Cube を使うとか、ファイル形態自体を工夫しなければ無理ですね。 >マクロの全てにEnableEventsを入れておくのも、見苦しくて EnableEvents の意味は分かりますか?Excel 2007 で試してみればすぐに意味が分かります。Excel 2003 では保護作用が働きますが、Excel 2007 では、無限ループ状になってハングします。そういうプログラム構造の保護のためであって、遅い速いの問題とは関係ありません。 >特定のオブジェクトに日付が入力された・選択されたのをマクロの開始合図とすることはできませんでしょうか もし、Event を厳密にオン・オフするなら、インスタンス・オブジェクトを作ればよいです。

QoooL
質問者

お礼

ご回答ありがとうございます。 >せいぜい、10Mに留めるべきで、 分析評価のための日報ファイルで、3つのデータファイルから、合計100チャンネル近くのデータをコピーしてきているのです。チャンネルを列にあてがっているのでEH列近くまで使っています。 データは2秒置きなので43200行あります。従って元のデータファイルがそれぞれ15~25MBあります。せいぜい、10M、とおっしゃる意味はわかりますが、それでは仕事としての目的に合致しません。 日報としてまとめる時には60秒置きなどに間引く案を検討したこともありましたが、わずかな変化を見逃すわけに行かないので、数十~百数十MBのファイルとせざるを得ませんでした。 最適化については他にもご回答をいただいていたので、いつまでも140Mではなく、小さくしてみようと思います。 >データと計算部分をファイルとして分離するとか、データベースのコンセプトを導入するとか、Cube を使うとか、ファイル形態自体を工夫 参考になりました。 >EnableEvents の意味は分かりますか? わかっていますよ。まあ不勉強な部分はあるにしても、使っています。無限ループの回避のために、「Worksheet_Change」イベントを一時的に止める、というのはどこかの「教えて」で見たことがありますが、私が言った用法は、無限ループとは別の話です。 B2以外のセルに値を書き込む度に、ワークシートに変更があった、と判定されては、遅い速いの問題に直結するので、 「B2しか監視する必要がないのに、B2も含めて全てのセルの変更が監視されているのは、効率が悪い」という意味で書きました。 >Event を厳密にオン・オフするなら、インスタンス・オブジェクトを作ればよい インスタンス・オブジェクトというのは初めて聞きましたが、そういう便利なものなのですね。インスタンスの前に、オブジェクトやクラスも、漠然としたイメージでしかつかんでいなくて、Microsoftのヘルプが理解できない時もあるので、今調べた限りでは、インスタンス・オブジェクトがEvent をオン・オフする手順にどう登場するのか、理解できませんでした。もっと調べてみます。 ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは 素通りしようかとも思ったのですが、私の文責にも 関わるような気がするので、概論だけ。 部分的な話なら(時間と気力が許せば)幾らでも 出来る気もするのですが、それでは、本質的な解決 にはならないでしょうし、そもそも優先順が違う と思うのです。 質問にないことを並べても仕方ないので、 私が考える優先順だけ、 アドバイスとして書くことにします。 1)「"Excel" "最適化"」でWeb検索 2)「貼付け」と「値貼付け」と 「VBAによる値設定」が 正しく使い分け出来ているか、自己検証 3)問題のブックの数式について  ・外部ブックの参照があれば、値貼付けを検討  ・揮発関数を用いている場合は、他の式に変更  (例、INDIRECTをINDEXで代用できるものとか) 4)コントロール (とりあえずシート上で コマンドボタンとコンボボックス) を実際に使って試してみる。 (出来れば入門書などを参考に) 勿論、調べたり、実践する中で 分からないことがあれば、 個別に質問すればよいと思います。 問題を総合的に捉えるのは大切なことだと思います。 が、あれもこれも、と言われているように思えて、 直接の回答は難しいです。 VBAも色々書いて、テストもしてみたり、、、 全体的なことも随分と考えてはみたけれど、 これが、私なりに誠意ある回答のつもりです。 相当、時間かかると思いますけれど、たぶんこれが、 最短距離の「いそがばまわれ」、のつもりです。 ひとつひとつ、身に付けて行く中で、 失敗もするだろうし、自分で解決できない問題も あるでしょう。 ショートカットして教わっちゃうのは損だし、 ご自身がつまらないんじゃないかな、と。 (それても強いて書くなら、 シートイベントではなく、 コマンドボタンと、そのイベントにするのが普通、 かな? 入力規則の代わりにコンボボックスを使う人も いるかな?) 色々試してみて、また質問に来てくださいね。 毎日此処を覗いてるわけじゃないし、先の約束は 出来ないけど、「これで解決できそう」っていう 回答が出せるような質問だったら、積極的に 考えるようにしますから。 では、また

QoooL
質問者

お礼

ありがとうございます。とてもご誠意が伝わってきました。 そういう、ヒント、入口を与えるご回答でけっこうです。 私自身やってしまいがちなのですが、   充分に調べる前に、よくできる人に答えだけ求める という質問は結局自分のためにならない、と自分を戒めるように心がけています。「調べた」という事実や、失敗の積み重ね・「どう工夫しようか」という試行錯誤が大切ですよね。 また、質問の焦点を明確にしなかった私が悪いのです。私自身が、あれもこれも、と聞いているようであまり良い質問文ではないなあ、と感じながら投稿しているから、恐縮です。回答者の皆さんからしたら、「せっかく一生懸命答えても、これを聞いているのではなかったらどうしよう」と思われてしまいますよね。失礼しました。 なるほど、こういう重たいファイルの問題を、「最適化」としてたくさん取り上げられているのですね。 上のヒントの中で、(4)番について、もう少し教えていただけませんか? コマンドボタンコントロールと コモンダイアログコントロールは しょっちゅう使いますが、他のコントロールについては、てんで疎くて。ActiveX コントロールのコンボボックスでなく、ユーザーフォームコントロールのコンボボックスなら、日付を入力したときに○○させることができる、という意味でしょうか。 私はシートイベントとActiveX コントロールが多過ぎて、考えが凝り固まっているのかも知れません。 カレンダーコントロールなどもついさきほど知りました。日付を入力してマクロを起動させる方法は、別に、セルに値を入力じゃなくても、いろいろありそうですね。 概論でも長く丁寧にヒントをくださって、ありがとうございました。調べる糸口がみつかりました。

関連するQ&A

  • マクロに詳しい方!エクセルの日付入力について

    エクセルの日付入力について、例えばB列に何か入力したら自動的にA列に入力した日がB列に表示されるようにする方法(TODAY関数のように常に現在の日付ではなく、入力した日のまま固定にする方法)について検索したところ、下記の通り、マクロをつかった回答がありました。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413916824 B列に入力し、A列に日付を書き込む場合 B1→A1 B2→A2 B3→A3 … -------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 2 Then Exit Sub Application.EnableEvents = False Target.Offset(, -1).Value = Now Application.EnableEvents = True End Sub -------------------- 小生はマクロが分かりませんが、上記のコードをコピペ入力すると、その通りになりました。 そこで、みなさんにご相談ですが、これをA列に入力→B列に日付、C列に入力→D列に日付、E列に入力→F列に日付・・・・・というようにしたいのですが、そのコードを教えて頂けないでしょうか。 何卒お知恵をお借りしたくお願い致します。

  • VBA/エクセルの日付入力でYYYYMMDD

    エクセル2013です。 特定のセルに日付を入力してもらうのですが、人によりさまざまな入力をされてしまいます。 どんな入力でも日付であれば、シリアル値なのであとからなんとかなるのですが、困るのはYYYYMMDDの連続数字、例えば今日なら20140712と入力されてしまうことです。 入力規則で排除したいのですが、それは許されず、20140712も日付として扱わなければならなくなりそうです。 そこでマクロで対処しようと以下のコードを書きました。 Private Sub Worksheet_Change(ByVal Target As Range)   Select Case Target.Address(0, 0)     Case "D2", "F2", "C4"       If Target.Value = "" Then Exit Sub       If IsDate(Target.Value) Then         Target.NumberFormatLocal = "yyyy/m/d"       Else         Application.EnableEvents = False         Target.Value = CDate(Format(Target.Value, "@@@@/@@/@@"))         Application.EnableEvents = True       End If     Case Else       Exit Sub   End Select End Sub これで最初はうまくいき、20140712と入力されても、ちゃんと2014/7/12になります。 ところが、同じセルに再度YYYYMMDD数字形式で入力すると、実行時エラー「オーバーフローしました」になってしまいます。多分セルが、YYYYMMDDの数字をシリアル値として見てありえない日付と判断したのだと思います。 どのようにコードを修正したらよろしいでしょうか? もう1点、日付をYYYYMMDDの連続数字で入力することは普通、エクセルではあまり見たことないですが、これって一般的な方法なのでしょうか?

  • エクセルでデータ入力された日付と時間を自動入力する

    前回ご質問にて 1行目に何か入力したら2行目に日付と時間を自動入力する というVBAを教えて頂きました。 ------------------------ Private Sub Worksheet_Change(ByVal Target As Excel.Range) Application.EnableEvents = False If Target.Row = 1 Then Target.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If Application.EnableEvents = True End Sub ------------------------ これを1行目に何か入力したら2行目に日付と時間ではなく セル指定を行いたいのです。 例)F13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という作りです。 よろしくお願いします。

  • エクセルのマクロコードに付いて教えて下さい。

    下記のマクロコードがありますが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With End Sub セル位置の指定を変更する場合は、どの様に 書けば良いのですか? このコードですと、セルA1の入力指定でなっていますが A1~A5までとか。A1、B1,C1とかにする場合はどの様に 書けば良いか教えて下さい。 マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • エクセルでデータを変更・入力した時だけ日付が更新される方法

    QNO.2915892を参考にさせていただき、マクロを設定しました。 正常に作動したのですが、その後シートの一部が変更できないように、ロックをかけることになりました。 するとロックのかかっている状態だと、このコードでは日付が更新されませんでした。 そこで、ロックのかかっていないセルのデータを更新した時だけ、 任意のセルに今日の日付(更新日)が自動で入るようにしたいです。 つまりエクセルを開いただけで、データを修正しなかったら日付は変わらないようにしたいです。 この場合はこのコードに何を足したり、どこを変更したらよいのでしょうか? もしくは全く別のものになるのでしょうか? 別のものであれば、それを教えていただけると助かります。 コードの意味はほとんどわかっていません。。。 *****以下今使っているコードです******** Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("B1") = Format(Date, "yyyy/m/d") Application.EnableEvents = True End Sub *********************以上**** どなたかよろしくお願いします。

  • エクセルのマクロについて

    以前、こちらのマクロで Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("a1")) Is Nothing Then Exit Sub Application.EnableEvents = False Range("a3:ba28").Replace What:="=*!", Replacement:=Target.Value, LookAt:=xlPart Application.EnableEvents = True End Sub 指定した範囲を(A1)セルに入力した値に置換するマクロを教えていただいたんですが、現在,、これを使ってsheet1の指定範囲内にある(=あ!$AR$75)などが入力してある部分のシート名を置換してデータ内容の変更を行っています。 しかし、この方法だと、シート名の文字数を指定しなくてはならなくて、自分以外の人が操作すると、エラーを出してしまうことがあり困っています。そこでchangeイベントをやめて、シート名の確認をしてからマクロの実行を行うには、どういったマクロにすればいいですか?? 説明が分かりづらくすみません・・・・・・。 もし他にシートの文字数などにこだわらなくてもよい方法があれば教えてください。 よろしくお願いします。

  • EXCEL 消費税の計算で有名なマクロに問題

    EXCEL2003 WINDOWS XP SP3 特定のセル(この例ではK5:K55)に入力した値を自動的に計算するモジュールを使っています。消費税の計算で有名な以下のマクロです。これを応用して、10で割る、という計算をしたところ、小数点以下が切り捨てられてしまいます。 例  66と入力→ 6.0       6.6でないとおかしい・・・ 表示形式は小数点が1桁まででるようにしています。小数点以下を切り捨てられないようにするにはどうしたらいいでしょうか。教えてくださいm--m 問題のマクロ Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("K5:K55")) Is Nothing Then Exit Sub Application.EnableEvents = False Target.Value = Int(Target.Value / 10) Application.EnableEvents = True End Sub

  • エクセル:シート内に入力があった場合のマクロの書き方

    シート内に入力があった時の処理を作作りたいです。 現状の作り方は、シートのコードにWorksheet_Changeを用意し、 その中に「Target.Addressを取得し、そのアドレスに応じて処理をする」と書き込んでいます。 例えば以下は、入力があったら3列離れた同じ行に同じ内容入力をする、というコードです。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim T_row As Integer, T_col As Integer   T_row = Target.Row   T_col = Target.Column + 3   Application.EnableEvents = False   Cells(T_row, T_col).Value = Target   Application.EnableEvents = True End Sub このコードの作り方だと、1つのセルへの入力にしか対応しないというか、 ドラッグやコピー&ペースト等、複数のセルにまたがった操作をすると動きません。 そういった通常可能な操作にも対応できるように作っていきたいのですが、 その場合どのように書き始めていけばよいでしょうか。 面倒な質問となってしまいましたが、 お時間あればよろしくお願いします。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • エクセルでの自動日付入力

    エクセルでこんなことできますか? B列以降のどれかのセルに変更を加えて(セル内に文字入力、セル内の文字削除)、保存した後閉じます。 次回そのファイルを開いたとき変更したセルのある行の A列に保存した日付を表示させたいです。 「この行がいつ変更されたか」を知りたいのです。 わかりにくくてすみません。 マクロは初心者です。(たぶんマクロでないと無理?) よろしくお願いします。

専門家に質問してみよう