No.3ベストアンサー
- 回答日時:
>取りあえず原始的に、ある範囲のrowやrows.count、columnやcolumns.countを使って
>targetがその中にあるかどうかとゆう方法でやりました。
>もっと簡単にできないでしょうか?
当然、rowやcolumnを使って範囲を特定することも行いますが、範囲の形状で面倒になったりします。
普通行っているのは、
自分の決めた範囲を定義する。離れた範囲や複雑な範囲は『Union』で定義すると効果的。
↓
Targetを単一セル単位で処理
↓
単一セルが自分の決めた範囲にあれば処理を行う。『Intersect』を使い、判定を行う。
範囲の行数・列数の計算や判定回数が減り、分かりやすく書ける気がします。。
こんな感じで書いています。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rg As Range '変更したセル
Dim myArea As Range 'この範囲で何かを行う
Set myArea = Union(Range("B2:B5"), Range("C6:C9"), Range("D10:D13"))
For Each rg In Target
If Not Intersect(myArea, rg) Is Nothing Then
MsgBox "Hit!!"
End If
Next
End Sub
この回答への補足
補足ではないのですが、どうしてもわからないことがありましたので・・・
> If Not Intersect(myArea, rg) Is Nothing Then
この一文なのですが、Is Nothingがよくわかりませんでした、いろいろ調べてみましたが、参照しなくなるとか利用できなくなるとか書いていました。Intersectは共通部分と書いていましたので、Not Intersect(myArea, rg) だとmyAreaと rg
の共通部分ではないところとゆう感じでしょうか? のIs Nothing とはどのような意味になるのでしょか?
有難うございます。聞きなれないUnionやIntesectとゆうのがでてきたので、早速調べてこの方法でプロトタイプを作ってみようと思います。
No.4
- 回答日時:
Intersectメソッドの使用例(Help)には、
Worksheets("Sheet1").Activate
Set isect = Application.Intersect(Range("rg1"), Range("rg2"))
If isect Is Nothing Then
MsgBox "共通部分がありません。"
Else
isect.Select
End If
とあります。
この、『isect Is Nothing』は、Is演算子で2つのオブジェクト変数(isect と Nothing)を比較して、
2つが同じならTrueが返ってきます。『=』の代入の意味ではありません。
この場合、片方がNothingなので、式がTrueならisectもNothingになり、共有セル範囲が存在しないことになります。
ここで気になるのが、『Nothing』って何?ということですが、DimステートメントのHelpに、
『・・・宣言したオブジェクト変数にオブジェクトが代入されるまでは、その変数には Nothing という
特殊な値が設定されます。Nothing は、その変数がオブジェクトの特定のインスタンスを参照していない
ことを示します。』とあります。
個人的には、『Is Nothing』はIntersectやFindで『共有部分がない、見つからない』の意味で使っています。
上のような書き方を、個人的には下のように書いています。
If Not Intersect(myArea, rg) Is Nothing Then
日本語表現では『共有部分がないということでなければ』でしょうか。
この式の『Not Intersect(myArea, rg) Is Nothing』を考えます。
Not演算子は式の論理否定を求めます。
従って、Notに対応する式は Intersect(myArea, rg) Is Nothing になります。
この式の意味はHelpと同様、Intersect(myArea, rg) と Nothing を比較して
一致したらTrue(と言うことは、Intersectした結果がNothing=何もない)です。
Intersect(myArea, rg) で2つのセル範囲の共有部分を求める
↓
Intersect(myArea, rg) Is Nothing
で共有部分がなかったら式はTrueになる
で共有部分ががあれば式はFalseになる
↓
Not Intersect(myArea, rg) Is Nothing
で共有部分がなかったら式はFalseになる
で共有部分ががあれば式はTrueになる
分かりやすく書くと Not(Intersect(myArea, rg) Is Nothing) です。
↓
結局、共有部分があれば、Ifの判別式はTrueになります。
この回答への補足
あ~ほんとに何回も申し訳ありません。rgとゆうのはどの部分のことでしょか?
Targetが一つのセルではなく広い範囲だとして、その中のセルを一つずつみるとゆうことで、For文でセルの数だけまわしているのでしょうか?
私は範囲が一列と31行だったので、For文を使わずに
Public Function M_isArea(ByVal target As Range)
Dim my_area As Range
M_isArea = False
Set my_area = Range("入社退社")←31行1列です。
If Not Intersect(target, my_area) Is Nothing Then
M_isArea = True
End If
End Function
としてみましたが、大丈夫ですか?動かした感じは大丈夫そうなのですが・・・
rgとはなんだったのでしょうか?申しわけありません。よろしくお願いします。
有難うございました。大変わかりやすかったです!!
よくわかりました。いろんなところで使えそうですね。行と列をそれぞれみるより断然こっちの方が読解性がありますね。
ほんとにお世話になりました。有難うございました。
No.2
- 回答日時:
えーとですねー
Hook=引っ掛ける
ですよね?
VBやVBAにはそれぞれイベントがあります。
それはなぜ起こるかというと、OSとアプリケーションとの間でメッセージのやり取りがあるからです。
それをアプリケーションが現状を認識しチェンジイベントなどを起こします。
そのOSとアプリケーションとのやりとりのメッセージを盗み見たり、変更させてしまうのです。
それが俗にHookと呼ばれています。
ここの質問掲示板にもHookを使用した例をいくつか載せてますので、見てみると面白いかもしれませんね
^^
No.1
- 回答日時:
>自分の決めた範囲のみに対するイベントのみをとりたい
無理と思われます。
イベント発生はエクセル内部のシートオブジェクトで行われている物です。
イベントはオブジェクト単位で発生します。
一度エクセルシートをHookさせようとしたことがあるのですが、共有メモリ部分を参照しようとすると、EXCELが以上終了を連発しました。
もしこの方法が成功しても明らかに面倒な方法です。おすすめできません。
>ある範囲のrowやrows.count、columnやcolumns.countを使ってtargetがその中にあるかどうか
それが最適な方法です。
範囲にあるかどうかをチェックするロジックを作っておき、その関数がTRUE/FALSEを返す仕組みにしておくことが、一番簡潔な方法だと思います。
有難うございます。やはり無理なのですね。それがわかっただけでも良かったです。そうですね、TAGOSAKU7さんの教えてくださったようにやっていましたので、それを自分の関数としてあちらこちらで使いまわししたいと思います。
ところで、Hookとは何でしょうか?プログラム初心者(パソコン自体初心者です)なもので、よくわかりませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
カッコ付けのオブジェクト名を...
-
Excel2007 でのチェックボック...
-
Excel VBAでマウスの左クリック...
-
文字列で小数点以下の0を削除し...
-
構造体の静的な初期化
-
VBでExcelの表形式の様なデザイ...
-
ユーザーフォームのインポート...
-
コードでオブジェクトを最前面に
-
クリスタルレポートのプレビュ...
-
【エクセルのマクロ】クリップ...
-
エクセルVBAでセル番地を指定し...
-
日本語の文字化けを直す方法
-
VBAで選択範囲外の図形(オブジ...
-
Excel VBA でPictureBoxオブジ...
-
アクセスのテーブルを隠す?
-
エクセルVBA初心者です。オブジ...
-
【エクセル】複数のTextBoxに共...
-
起動済のIEから.NET Framework...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
Excel2007 でのチェックボック...
-
Access からオブジェクトとして...
-
エクセルVBAでセル番地を指定し...
-
Excel VBAでマウスの左クリック...
-
【エクセルのマクロ】クリップ...
-
日本語の文字化けを直す方法
-
現在アクティブになっているオ...
-
Accessのフォーム上にエクセル...
-
文字列で小数点以下の0を削除し...
-
【エクセル】複数のTextBoxに共...
-
ユーザーフォームのインポート...
-
Excelを閉じるときVBAプロジェ...
-
コードでオブジェクトを最前面に
-
PowerpointVBAで指定のShapeオ...
-
Imageコントロールにグラフを表...
-
VBAで選択範囲外の図形(オブジ...
-
C#で画像をクリップボードへの...
-
WSH or VBの質問
おすすめ情報