- ベストアンサー
ワークシート関数(マクロ)を利用した場合のExcelの負担
はじめまして。 ここ最近大量のデータで悪戦苦闘している者です。 そこで効率を上げるためにマクロを勉強中ですが、ここで質問です。 マクロの本(初心者)を読んでいて、ワークシート関数のマクロが記載されていました。 Application.WorksheetFunction.関数 これは、通常の関数をマクロで使用するといったものらしいのですが、 例えば重複のデータを抽出する時に、頻繁に countif(A$1$:A1,A1) の関数を利用するのですが、それをこのままマクロでワークシート関数として利用した場合、Excselにかかる負担は普通の関数より軽減されるものなのでしょうか。 正直、大量データの集計を行う際、上記の関数を利用すると相当重くなる為、たいていが固まってしまいます。 それを避けたいのですが。 結局ワークシート関数を利用しても負担は変わらないのでしょうか? その他にもvlookupもよく使いますが、やはり大量データだと固まってしまいます。 早急に対応したいのですが、何せ本を読んで内容を咀嚼するのが精一杯で・・・ 大雑把な説明かもしれませんが、どなたか分かるかた是非教えていただければと思います。
- jo-dan_2006
- お礼率100% (5/5)
- オフィス系ソフト
- 回答数3
- ありがとう数3
- みんなの回答 (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 メソッドにあたります。
その他の回答 (2)
- NCU
- ベストアンサー率10% (32/318)
ワークシート関数をそのままユーザー定義関数に置き換えても確実に重くなるだけです。 (可能であれば)数式を値に置き換える方がはるかに有効でしょうね。 軽いシートを作るのは腕の見せ所なので、いろいろ工夫して下さい。 それでダメなら高性能なPCを使うんでしょうね。 ちなみに高性能なPC+Office2007ならデータ量の限界が相当違うかもしれません。
お礼
ご回答ありがとうございます。 ホント、こういう積み重ねが大事なんでしょうけど、正直泣き入ってます(^^; 本を読んでワークシート関数を知って、我が意を得たりっ!!って喜んでいました。でも、よくよく考えたら、作業工程(関数を入力する手間)を省略できるだけでExceleの負担は変わらないのでは?と空喜びな予感・・・。色々やってみますが。
- kakkysan
- ベストアンサー率37% (190/511)
それほど大量ならマクロだろうがワークシート関数だろうが大きな違いはないと思います。 EXELでPCが固まってしまうほどのデータを扱うなら、accessなどのデータベースを利用する事をお勧めします。 access なら10万行程度あるデータからの抽出や照合は朝飯前といった感じです。 解答になって無くて申し訳ありません。
お礼
早速のお返事ありがとうございます。 それとお礼の方遅れて申し訳ないです。 ACCESSももちろん使っています。 しかし、集計毎(例えば日付とか月別とか項目ごとにuniqueデータを出したい場合等)だとやはりexcel関数のような気がするのですが。 ちなみにAccessで一発で重複データを抽出するやり方がイマイチ浮かびません(^^;。 (重複クエリと不一致クエリを駆使して何とかやり遂げる感じです。)
関連するQ&A
- VBA ワークシート関数のエラー
シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。
- 締切済み
- Excel(エクセル)
- 「ワークシート関数」
良くわからないのですが エクセルのワークシートで使う関数を「ワークシート関数」と言い、 VBAで使うワークシート関数を「WorksheetFunction関数」と言うのですか?
- ベストアンサー
- オフィス系ソフト
- ワークシート関数とはどのことなのですか?
【1】エクセルのワークシート上で使う=TODAY()などの関数 【2】VBAのCountなどのWorksheetFunction 【3】VBAのLENなどの関数 どれのことを俗に言う「ワークシート関数」と言うのでしょうか? VBAで使う【2】【3】のことですか?
- ベストアンサー
- オフィス系ソフト
- VBA変数とワークシート関数を一緒に使う
お世話になります。マクロ初心者です。 【VBA変数とワークシート関数を一緒に使う】事はできないのでしょうか? 下記以上の多数のパターンで試しましたが使えません(本にも例がありません)。 「使える」「使えない」だけで構いませんのでご教示ください。 (WorksheetFunctionに関しては別途質問させて頂きます) 一応使用例を書いておきます。 コメント「@数をカント3」で試していますが、下3つのような ワークシート関数のような使い方(貼付)ができればと思っています。 A1に \#%&/*@ C1:H5に 108@78 8@725@ 666@98 @@32@9 7@751@ (各セル1文字ずつ)を入れます。 Sub count() Dim o As String, p As String o = "=CountIF(R[-7]C[2]:R[-3]C[7],Right(R[-7]C[0],1))" p = "=CountIF((C1:H5),Right(A1,1))" With Sheets("Sheet1").Cells(6, 1) '@数をカント1 .Activate .Value = "=""@カウント = "" & CountIF(R[-5]C[2]:R[-1]C[7],Right(R[-5]C[0],1))" With Sheets("Sheet1").Cells(7, 1) '@数をカント2 .Activate .Value = "=CountIF((C1:H5),Right(A1,1))" With Sheets("Sheet1").Cells(8, 1) '@数をカント3 .Activate ' .Value = o ' ' .Value = p ' ' .Value = """@カウント = "" & o" '使えない ' .Value = "=""@カウント = "" & ""p""" '使えなさいよ ' .Value = "=""@カウント = """ & p '使えておくれ End With End With End With End Sub
- ベストアンサー
- その他MS Office製品
- EXCELのワークシート関数をVBAに書き直す。
お世話になります。 Excel2013において、以下のワークシート関数の処理をVBAに書き直すにはどうしたら良いでしょう? =IF(ISBLANK($C4),"",IF(COUNTIF($C$4:$C4,$C4)>1,"重複しています。",INDEX(顧客!$A:$M,1,SUMPRODUCT(((顧客!$A:$M=$C4)*COLUMN((顧客!$A:$M)))))))
- 締切済み
- オフィス系ソフト
- エクセル:ワークシート関数、等比級数
エクセルでの質問です。 セルA1に0から100未満の正の数が入っていて、 等比級数で、 =(1+A1/100)^0+(1+A1/100)^1+(1+A1/100)^2+(1+A1/100)^3 のような数式で、上の式では(1+A1/100)^N(例えばNがセルB1に入っていて、そこまで足す)ようなワークシート関数はないでしょうか?(もち、組み合わせで) 財務関数を転用して、できそうなきがしているのですが、うまくいきません。 他のページ:http://oshiete1.goo.ne.jp/qa1655468.htmlを、参考にすると、マクロを使うと出来るみたいなのですが、ワークシート関数の組み合わせだけでは無理なのでしょうか?
- ベストアンサー
- 数学・算数
- エクセルVBA ワークシート関数の使用について
エクセル2003VBA ワークシート関数の使用についての質問です よろしくお願いします。 4桁の数字を、千の位・百の位・十の位・一の位に分解する関数ですが 例えば A1に4桁の数字があり、B1に千の位を表示する場合ですが ワークシート関数の場合 B1=MOD(INT($A$1/1000),10) となりますが VBAにてそのまま使用し Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10)とするとエラーになります。 エラーになる原因は、いろいろ調べたら分かったのですが この様に、一発でB1に計算結果を入れたいのですが、どうしたらよろしいでしょうか 現在は、 Range("C1").Formula = "=MOD(INT(A1/1000),10)" Range("B1").value=Range("C1").value 一旦、C1に置き換えてから行っています。 よろしくお願いします
- ベストアンサー
- オフィス系ソフト
- エクセルのワークシート間のデータ共有について
教えてください。エクセルなんですが、ワークシート1のセルA1にデータを入力し、ワークシート2のセルB2にそのデータが出るように、関数を埋め込んでいます。そこまでは良いのですが、そこからワークシート2のセルB2に新しくデータを入力して、ワークシート1のセルA1に反映させることは出来るのでしょうか?分かりづらく申し訳ありませんが、イメージとして現在データ入力をA→Bとなっているところを、A<=>Bにしたいのです。
- ベストアンサー
- オフィス系ソフト
- Excelで複数のワークシートのデータを1つのワークシート
Excelで、複数のワークシート(22ワークシート)のデータを1つのワークシートにまとめたいのですが、関数か何かで出来る方法はないでしょうか?.1ワークシートの行数は、まちまちですが、平均6000行ほどあります。
- 締切済み
- その他(業務ソフトウェア)
- Excel ワークシート関数をVBAで使用したい
お世話になります。 Excelでワークシート関数をVBAで使用したいのですが、うまくいきませんでした。 関数ですと「ISERROR(FIND(V$10,R$11))=FALSE」のような式をVBA上で使用したいと思い、以下のようにコードを書いてみましたが If Application.WorksheetFunction.IsError(Application.WorksheetFunction.Find(Cells(i, j), Cells(i, 18))) = False Then Cells(i, j).Select End If 「実行時エラー'1004' WorksheetFunction クラスのFindプロパティを取得できません」となります。 入れ子が問題なのでしょうか。 よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
お礼
丁寧かつ高度なご回答ありがとうございます。 ワークシート関数は初心者では難しいのですね(^^; なんだか悲しくなりました。 マクロの記載もありがとうございます。 今、別件のデータで悪戦苦闘していますのでそれが落ち着き次第、このマクロで色々勉強したいと思います。 今後、実現したいマクロは集計日毎に変わるだろう集計結果のセルに関数(countoif等)を入力するという内容ですが・・・難しそうですね。 多分、行や列の指定は固定で、その都度直すってやり方をする方向になりそうです。本当にありがとうございました。