• ベストアンサー

ワークシート関数(マクロ)を利用した場合のExcelの負担

はじめまして。 ここ最近大量のデータで悪戦苦闘している者です。 そこで効率を上げるためにマクロを勉強中ですが、ここで質問です。 マクロの本(初心者)を読んでいて、ワークシート関数のマクロが記載されていました。 Application.WorksheetFunction.関数 これは、通常の関数をマクロで使用するといったものらしいのですが、 例えば重複のデータを抽出する時に、頻繁に countif(A$1$:A1,A1) の関数を利用するのですが、それをこのままマクロでワークシート関数として利用した場合、Excselにかかる負担は普通の関数より軽減されるものなのでしょうか。 正直、大量データの集計を行う際、上記の関数を利用すると相当重くなる為、たいていが固まってしまいます。 それを避けたいのですが。 結局ワークシート関数を利用しても負担は変わらないのでしょうか? その他にもvlookupもよく使いますが、やはり大量データだと固まってしまいます。 早急に対応したいのですが、何せ本を読んで内容を咀嚼するのが精一杯で・・・ 大雑把な説明かもしれませんが、どなたか分かるかた是非教えていただければと思います。

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

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

こんばんは。 同じような内容で、一度、相談に乗ったことがありますが、あまり、ワークシート関数を入門時期に追いかけないほうがよいです。それは、思ったよりも難しい側面を持っているからで、単純なものに限ります。 しかし、結論から言うと、ワークシート関数で、値を置いていく限りにおいては、ワークシートの負担は軽くなる、ということです。 >何せ本を読んで内容を咀嚼するのが精一杯で・・・ それについては、入門書では詳しくは書いていません。VBのテクニックとも違う、Excel独特のワザというほうがよいかもしれません。自分で、ワークシート関数と同じ働きのユーザー定義関数を作れるレベルになれば、使えるようになります。 Countif(A$1$:A1,A1) この後、どうなるかは分かりませんが、例えば、以下のようにすれば、CountIf の関数を置くよりも遥かに軽くなります。ただ、コードとしては、入門レベルとはいえなくなると思います。それと、あまり、そういう方法に頼ると、応用が利かなくなります。 重複データから、ユニークなデータを出すプログラム Sub PickupUnique()  Dim c As Range  Dim j As Long  j = 1 '初期値  Application.ScreenUpdating = False  For Each c In Range("A1", Range("A65536").End(xlUp))   If c.Value <> "" Then    If WorksheetFunction.CountIf(Range("A1", c), c.Value) = 1 Then     Cells(j, 2).Value = c.Value '見つかったデータを置く     j = j + 1    End If   End If  Next  Application.ScreenUpdating = True End Sub この場合は、入門レベルでは、迷わず、AdvancedFilter を使うのがよいです。 Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True (ただし、このマクロは、項目行がないと、トップがダブります。) また、VlookUp の場合も、それを使うなとは言いませんが、それ以外の方法はないか、探してみてからにしたほうがよいです。エラー処理の問題などが出てきてしまいます。 だから、 Application.Vlookup という古い書き方のスタイルを薦める人もいますが、現在、私は、そのような方法は、採用しておりません。実行時エラーの処理の仕方は難しいのですが、やはり、きちんとエラー処理できないままに、そういう方法を採用していくと、結局のところ、意味が分からないままに使うことになってしまうからです。 なお、VLookup の代わりになるものは、Find メソッドにあたります。

jo-dan_2006
質問者

お礼

丁寧かつ高度なご回答ありがとうございます。 ワークシート関数は初心者では難しいのですね(^^; なんだか悲しくなりました。 マクロの記載もありがとうございます。 今、別件のデータで悪戦苦闘していますのでそれが落ち着き次第、このマクロで色々勉強したいと思います。 今後、実現したいマクロは集計日毎に変わるだろう集計結果のセルに関数(countoif等)を入力するという内容ですが・・・難しそうですね。 多分、行や列の指定は固定で、その都度直すってやり方をする方向になりそうです。本当にありがとうございました。

その他の回答 (2)

  • NCU
  • ベストアンサー率10% (32/318)
回答No.2

ワークシート関数をそのままユーザー定義関数に置き換えても確実に重くなるだけです。 (可能であれば)数式を値に置き換える方がはるかに有効でしょうね。 軽いシートを作るのは腕の見せ所なので、いろいろ工夫して下さい。 それでダメなら高性能なPCを使うんでしょうね。 ちなみに高性能なPC+Office2007ならデータ量の限界が相当違うかもしれません。

jo-dan_2006
質問者

お礼

ご回答ありがとうございます。 ホント、こういう積み重ねが大事なんでしょうけど、正直泣き入ってます(^^; 本を読んでワークシート関数を知って、我が意を得たりっ!!って喜んでいました。でも、よくよく考えたら、作業工程(関数を入力する手間)を省略できるだけでExceleの負担は変わらないのでは?と空喜びな予感・・・。色々やってみますが。

  • kakkysan
  • ベストアンサー率37% (190/511)
回答No.1

それほど大量ならマクロだろうがワークシート関数だろうが大きな違いはないと思います。 EXELでPCが固まってしまうほどのデータを扱うなら、accessなどのデータベースを利用する事をお勧めします。 access なら10万行程度あるデータからの抽出や照合は朝飯前といった感じです。 解答になって無くて申し訳ありません。

jo-dan_2006
質問者

お礼

早速のお返事ありがとうございます。 それとお礼の方遅れて申し訳ないです。 ACCESSももちろん使っています。 しかし、集計毎(例えば日付とか月別とか項目ごとにuniqueデータを出したい場合等)だとやはりexcel関数のような気がするのですが。 ちなみにAccessで一発で重複データを抽出するやり方がイマイチ浮かびません(^^;。 (重複クエリと不一致クエリを駆使して何とかやり遂げる感じです。)

関連するQ&A

専門家に質問してみよう