- ベストアンサー
エクセルの関数とマクロについて
(1)のお願い! 例えば関数で =COUNTIF(A1:A10,"*") と記述すれば「A1:A10のセル範囲に文字列のセルは何個あるか」ということですが、これをマクロではどのように記述しますか?教えて下さい。 (2)のお願い! マクロを本格的に勉強したいのですが、関数については理解できてますので、関数とマクロの記述の比較が出来れば私にとって非常に便利なのですが、そのような事を記載した書籍やWebサイトはないものでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 最初に、私は主にVBAの回答をしていますが、ワークシートの関数は難しいですね。 時々、私は、練習で、ワークシート関数をVBAに置き換えてみてはいるのですが、かなり上達しないと、入門レベルでは難しいなって思います。一応、入門編では、SUM関数をマクロで表現してみなさいっていうホームワークが出るかもしれませんが。 以下のコードでも、(1) は、入門レベルのVBAでは出て来ない内容です。うまく出来ているか、自信がありません。(2)が、最も易しい方法です。(3)は、また、難しいです。(3)は、見かけは簡単なのですが、入門を終えた時点、また、変数の型が把握してからのほうがよいです。 VBAで、当面は、関数と比較したりするのは、後にしたほうがよいです。ややこしくなります。本来、SUM関数でも、まともに考えると難しいです。 それから、個人的な意見ですが、#1 さんが出している、大村あつしさんの、『かんたんプログラミング』シリーズの中で、「コントロール・関数編」が、3部のシリーズの中で一番難しいです。かなり補足も多いので、その分ややこしいように感じます。やはり、このシリーズの基礎編-応用編と進めて、最後に、コントロール・関数編に進むのが、私自身は良いような気がしますし、私自身そうしました。 なお、私自身は、お勧めの学習サイトはあまりありません。Q&A掲示板は大手のものがいくつかあるようですが、学習サイトではありません。いくつかの掲示板を見てきて、ここは別として、VBA系の掲示板は、なかなか敷居が高いと思います。 しかし、また、VBAで開発チームを作るわけでもありませんので、VBAのコーディングは、ルール無用でも、「動きさえすれば、内容は何でも構わないのだ」という方が、8割以上だと思います。また、難しい書き方をしなくても使えれば、それで十分かもしれません。 ほとんどのサイトは、入門レベルで覚えるべき内容が載っていません。MSDN のOffice アーカイブライブラリや Office ソリューション開発などが良いとは思うのですが、内容的には、入門者用ではありません。 なお、 『日本VBA協会』は、とても参考になります。 http://www.vbaa.jp/index.htm //サンプルコード// '----------------------------- '(1) CountIf を、そのまま再現しようとしたマクロ Option Compare Text Sub CountIfMacro() Dim myRange As Range Dim c As Range Dim i As Long Dim SearchWord As String SearchWord = "*" '実際は、セルを参照することも可 Set myRange = Range("A1:A10") For Each c In myRange If Not IsNumeric(SearchWord) Then If c.Value Like SearchWord And Not (IsNumeric(c.Value)) Then i = i + 1 End If Else If c.Value Like SearchWord Then i = i + 1 End If End If Next c Set myRange = Nothing MsgBox i End Sub '-------------------------- '(2) Excelの関数をVBAコードで使う方法 Sub FunctionUsedMacro() Dim myRange As Range Set myRange = Range("A1:A10") MsgBox WorksheetFunction.CountIf(myRange, "*") Set myRange = Nothing End Sub '-------------------------- '(3) Excelのワークシート関数を直接使う方法 Sub EvaluateUsedMacro() Dim myRange As Range Dim SearchWord As String Dim ref As Integer SearchWord = """*""" Set myRange = Range("A1:A10") ref = Application.ReferenceStyle MsgBox Evaluate("CountIf(" & myRange.Address(, , ref) & ", " & SearchWord & ")") Set myRange = Nothing End Sub '--------------------------
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 もう一度、見直してみました。 最初に、一般的にはプロシージャのことをマクロといいますが、 マクロで、数式をワークシートに貼り付けるという場面は、ひじょうに少ないですね。つまり、ワークシートで、何らかのユーザー側が、数式を削除したりしてしまったときにしか、数式の貼り付けという作業は起こらないかと思います。その都度、数式を貼り付けるマクロというのは、あり得ないと言っても過言ではないと思います。 例えば、数式の範囲が変るから、という理由でマクロを考えるとしたら、それは、関数で処理できますね。 =COUNTIF(A:A,"*") で良いわけです。 ただ、=COUNTIF(A1:A10,"*") そのものの意味というのは、 言い換えると =COUNTA(A1:A10)-COUNT(A1:A10) こういう意味ですよね。 つまり、 =COUNTIF(A1:A10,"*") の式って、書式の文字列に影響されるわけですね。 そうすると、マクロでは、以下に他ならないわけです。 Sub CountText() Dim c As Range Dim i As Long For Each c In Range("A1:A10") If VarType(c.Value) = vbString Then i = i + 1 End If Next MsgBox i End Sub こうやってみると、関数は難しいなって思います。 関数とマクロの記述の比較 という着眼点はよいのですが、かなりハイレベルですね。やはりVBAは別物です。
お礼
再度ご回答をご指導をありがとうございます。 今後、勉強をするにあたって大変参考になりました。
- imogasi
- ベストアンサー率27% (4737/17070)
この質問は内容があいまいだと思います。場合分けができてないということは、理解が徹底してないということだと思います。 (1)エクセル関数をVBAコードの中で(ほぼ似た機能として)使いたいのか。 この場合Application.WorksheetFunction.XXX()のところへ関数名をはさんで使う場合です。 これは全ての場合にそうできるわけではなく、実際やってみるか、解説書に当たるわけです。 もうひとつ、Rangeの表現が、VBAではシートに打ち込む関数と違うことです。 (2)yyy.Formura="=XXX"と式をセルに埋め込む場合です (3)関数の実際の機能をVBAのコードで組む場合です。 繰り返しなどを使って、判断をすれば、条件に該当する件数が出たり、 数値計算して、Sinの値を計算したり、標準偏差の定義に還って計算するなどです。 >関数については理解できてますので、関数とマクロの記述の比較が出来れば の意味がどれをさしますか。 (3)は難しい勉強ですし、(2)はあっけないし、どれでしょう。
お礼
ご回答とご指摘をありがとうございます。 (1)のお願い!については、単に関数をマクロで使用する事が可能かを知るのに例を示せば簡単だと思ったからです。 (2)のお願い!については、関数の処理をマクロで記述すれば、どのような記述になるかを知りたかっただけで他意はありません。もしWebサイトなどがあれば私的に参考にしたかったわけです。 けれど、これからマクロの勉強を本格的に始めるのに大変参考になりました。ありがとうございました。
- e10go
- ベストアンサー率38% (47/122)
No.1のe10goです。 先程の回答では、うまくいきません。申し訳ありません。 うまい方法が分からないので、下のコードで試してください。 ----マクロコード始め---- Sub test() Dim ir1 As Integer, ir2 As Integer, ir3 As Integer, ic1 As Integer, ic2 As Integer ir1 = Selection.Cells.Row ic1 = Selection.Cells.Column ir2 = 1 - ir1 ir3 = 10 - ir1 ic2 = 1 - ic1 Selection.FormulaR1C1 = "=COUNTIF(R[" & ir2 & "]C[" & ic2 & "]:R[" & ir3 & "]C[" & ic2 & "],""*"")" End Sub ----マクロコード終り----
お礼
ご回答ありがとうございます。 参考にさしていただきます。
- e10go
- ベストアンサー率38% (47/122)
こんにちわ。 =COUNTIF(A1:A10,"*") 上の式を、マクロで入れるコードは、 Selection.FormulaR1C1 = "COUNTIF(" & """A1:A10""" & ",""" & "*""" & ")" になります。 関数とマクロの記述の比較が出来る書籍は、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1825133 でも、紹介しましたが、 かんたんプログラミング Excel2003 VBA コントロール・関数編,大村 あつし(著) が、お薦めです。 http://www.amazon.co.jp/exec/obidos/ASIN/4774119660/ish-22/503-9250461-7915948 それと、URLは、 「Excelでお仕事」 http://www.asahi-net.or.jp/~ef2o-inue/top01.html 「Smile!Excel」 http://www.happy2-island.com/excelsmile/index.html 「Excel VBA モーグ即効テクニック集」 http://www.moug.net/tech/exvba/index.htm 「K窓 Excel技Excel Tips」 http://homepage2.nifty.com/kmado/kvba.htm を、参照してください。
お礼
ご回答ありがとうございます。 とても親切丁寧で解りやすく助かります。 サンプルコード(2)は簡単で解り安いです。 (1)(3)も頑張って勉強します。 本当にありがとうございました。