No.3ベストアンサー
- 回答日時:
こんにちは。
最初に、私は主に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
'--------------------------
ご回答ありがとうございます。
とても親切丁寧で解りやすく助かります。
サンプルコード(2)は簡単で解り安いです。
(1)(3)も頑張って勉強します。
本当にありがとうございました。
No.5
- 回答日時:
こんばんは。
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は別物です。
No.4
- 回答日時:
この質問は内容があいまいだと思います。
場合分けができてないということは、理解が徹底してないということだと思います。(1)エクセル関数をVBAコードの中で(ほぼ似た機能として)使いたいのか。
この場合Application.WorksheetFunction.XXX()のところへ関数名をはさんで使う場合です。
これは全ての場合にそうできるわけではなく、実際やってみるか、解説書に当たるわけです。
もうひとつ、Rangeの表現が、VBAではシートに打ち込む関数と違うことです。
(2)yyy.Formura="=XXX"と式をセルに埋め込む場合です
(3)関数の実際の機能をVBAのコードで組む場合です。
繰り返しなどを使って、判断をすれば、条件に該当する件数が出たり、
数値計算して、Sinの値を計算したり、標準偏差の定義に還って計算するなどです。
>関数については理解できてますので、関数とマクロの記述の比較が出来れば
の意味がどれをさしますか。
(3)は難しい勉強ですし、(2)はあっけないし、どれでしょう。
ご回答とご指摘をありがとうございます。
(1)のお願い!については、単に関数をマクロで使用する事が可能かを知るのに例を示せば簡単だと思ったからです。
(2)のお願い!については、関数の処理をマクロで記述すれば、どのような記述になるかを知りたかっただけで他意はありません。もしWebサイトなどがあれば私的に参考にしたかったわけです。
けれど、これからマクロの勉強を本格的に始めるのに大変参考になりました。ありがとうございました。
No.2
- 回答日時:
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
----マクロコード終り----
No.1
- 回答日時:
こんにちわ。
=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/4774119 …
それと、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
を、参照してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- Excel(エクセル) EXCEL 複数の条件に合致する個数を求めるには? 3 2022/04/19 16:39
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/25 16:07
- Excel(エクセル) エクセル関数についてお教えください 3 2023/07/24 12:33
- Excel(エクセル) 現在のセルの文字列を右隣のセルの名前にするマクロをつくりたい 4 2023/01/12 09:01
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 09:24
- Excel(エクセル) エクセルの数式について教えてください。 2 2023/02/18 11:30
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
EXCELのVBAでRange("A1:C4")を...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
Excel VBAからAccessマクロを実...
-
非表示の列をすべて削除するマクロ
-
ExcelVBAでPDFを閉じるソース
-
エクセルのマクロをセルの値に...
-
ピボットテーブルでの毎回可変...
-
ExcelのVBA。public変数の値が...
-
wordを起動した際に特定のペー...
-
TERA TERMを隠す方法
-
エクセルマクロ自動更新
-
エクセルに張り付けた写真のフ...
-
有効数字N桁のマクロについて
-
特定文字のある行の前に空白行...
-
マクロ実行時、ユーザーフォー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
エクセルで別のセルにあるふり...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
ExcelVBAでPDFを閉じるソース
-
EXCELのVBAでRange("A1:C4")を...
-
Excel VBAからAccessマクロを実...
-
TERA TERMを隠す方法
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
マクロ実行時、ユーザーフォー...
-
Excelのマクロについて教えてく...
-
ソース内の行末に\\
おすすめ情報