Excel VBA ユーザー定義関数をイベントマクロで使用する
Excel2003を使用しています。
あるセルと同色に塗りつぶされたセルの値を合計したく、下記1のユーザー定義関数を作成しました。
このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか?
可能であれば、どのようにコードを書いたらいいでしょうか?
Call を使用するのかな?と思い、コードを追加してみましたが、引数の型が一致しないといった内容のエラーメッセージが表示されてしまいました。
よろしくお願いします。
-------------------------------------------------------------
1.ユーザー定義関数(同色セルの合計)
Function SumColor(hanni As Range, iro As Range) As Double
Dim myrng As Range
SumColor = 0
For Each myrng In hanni
If myrng.Interior.ColorIndex = iro.Interior.ColorIndex Then
SumColor = SumColor + myrng.Value
End If
Next myrng
End Function
2.イベントマクロ(C列3行目以下ダブルクリックで塗りつぶし)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 3 And Target.Row >= 34 Then
Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36
End If
End Sub
No.3ベストアンサー
- 回答日時:
#2の回答者です。
>色の設定に重要な意味を持たせる(判定の条件にする等)のは好ましくないといった内容を目にしました。
そういうことを言う人がいますが、それは取り扱いが出来ないなら、という条件であって、「好ましくない」ということではないと思います。
>ユーザー定義関数を作成したものの、塗りつぶしの有無を変更しても計算結果を反映できないので、
私は、何度か発表していますが、以外に難しいということで、イベントを利用することには違いありません。
以下に私の発表したものがあります。
「自作マクロをセルの色が変わる度に再計算させるには」
http://oshiete.goo.ne.jp/qa/4680287.html
1. は、今試すと、修正が必要のようです。(名案とは言えませんが。)
'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Activesheet.Calculate
End Sub
Wendy02 さま、再度の回答ありがとうございます。
塗りつぶしの変更を判定の条件にしようとすると、イベントを利用して再計算させないといけないのですね。
今回の質問を投稿する前に、似たような内容の質問を検索してみたところ、再計算が必要との回答がありましたので、イベントで再計算させれば条件にできないこともないのかなとは思いましたが…。
Wendy02 さまが以前発表されたもののURLも拝見しました。
参考にさせていただきます。
ありがとうございました。
No.2
- 回答日時:
>このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか?
>可能であれば、どのようにコードを書いたらいいでしょうか?
Doubleクリックで色塗りしているわけですね。
> Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36
一体、何をどうするのか、言葉で説明してほしいです。このままなら、ただのSUM関数で済むのでは?
それで、色抜きでもするなら、また別問題です。その場合、ユーザー定義関数を貼り付けてください。
'//
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = False
If Target.Column = 3 And Target.Row >= 34 Then
With Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38))
.Interior.ColorIndex = 36
Target.Offset(2).Formula = "=SUM(" & .Address(0, 0) & ")"
'Target.Offset(2).Value = SumColor(.Cells, .Cells(1)) 'ユーザー定義関数の場合
End With
End If
End Sub
'//標準モジュール(このような書き方をしたほうがよいですね。)
Public Function SumColor(Hanni As Range, Iro As Range) As Double
Dim myRng As Range
Dim dblSum As Double
dblSum = 0
For Each myRng In Hanni
If myRng.Interior.ColorIndex = Iro.Interior.ColorIndex Then
If VarType(myRng) = vbDouble Then
dblSum = dblSum + myRng.Value
End If
End If
Next myRng
SumColor = dblSum
End Function
Wendy02 さま、回答ありがとうございます。
先の回答者様のお礼にも書かせていただきましたが、意図した質問内容とは違う内容となってしまっていました。
お時間をとらせてしまい、申し訳ありません…。
ユーザー定義関数を作成したものの、塗りつぶしの有無を変更しても計算結果を反映できないので、イベントマクロを使用して計算結果が反映されるようにできないかという内容で質問するはずでした。
ただ、
> それで、色抜きでもするなら、また別問題です。
という部分で、ちょっとアイデアをいただいたというか、塗りつぶしを元に戻す(塗りつぶしなし状態)コードを書き加えさせていただきましたので、意味不明な質問でも収穫がありました(^^ゞ
参考書やネットで調べたところ、色の設定に重要な意味を持たせる(判定の条件にする等)のは好ましくないといった内容を目にしました。今回は勉強も兼ねて、このようなユーザー定義関数を作ってみたのですが、確かにそのとおりですね。
No.1
- 回答日時:
何て言うか,普通に関数として使うだけです。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 3 And Target.Row >= 34 Then
Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36
’使用例
msgbox sumcolor(target.resize(2, 36), target)
End If
End Sub
keithin さま、回答ありがとうございます。
あれこれ試してうまくいかず、今回質問させていただいたのですが、意図する内容とは違う質問内容となってしまっていました…。
この質問文では、おっしゃるとおり、
> 何て言うか,普通に関数として使うだけです。
ですよね(^^;
お時間をとらせてしまい、申し訳ありません。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
皆さん定義を教えてください 「...
-
べき乗
-
Excelファイルの「数式」タブ→...
-
p⇒q=(¬p)∨qについて
-
「互いに素」の定義…「1と2は互...
-
1未満と1以下の違い
-
無限から無限を引いたら何にな...
-
変数の宣言の名称を教えてくだ...
-
e<3の証明を教えてください。
-
数字の1とは何なのか?
-
交換法則が成り立って、結合法...
-
ACCESS IIF関数 複数条件の設...
-
ACCESS VBAでインポート定義の場所
-
フーリエ級数展開の初項はなぜa...
-
線形代数の部分空間の証明について
-
なぜ、直角三角形ではないのにs...
-
マイナス7は素数ですか?
-
方程式の記号で左右の辺を繋ぐ...
-
ノルム空間
-
1wordとは、何文字ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
皆さん定義を教えてください 「...
-
べき乗
-
1未満と1以下の違い
-
無限から無限を引いたら何にな...
-
理論物理学でよく用いられる地...
-
(-1) ^2πってなんで1じゃないん...
-
ACCESS VBAでインポート定義の場所
-
変数の宣言の名称を教えてくだ...
-
「互いに素」の定義…「1と2は互...
-
日本語 ことば ひとまわり ふた...
-
ACCESS IIF関数 複数条件の設...
-
質問の定義が分からないので確...
-
なぜ、直角三角形ではないのにs...
-
min関数 一橋大学過去問
-
質問の定義が分からないので確...
-
ヘシアンが0の場合どうやって極...
-
excel vba 名前付きセルが存在...
-
数字の1とは何なのか?
-
マイナス7は素数ですか?
-
「logx^2=2logx」が間違って...
おすすめ情報