こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[Excel VBA]デフォルトプロパティ

問: Range Object のデフォルトプロパティがValueであることを証明・反証するMicrosoftの公式の文書を示せ。余力があればTextBoxやLabelのデフォルトプロパティがそれぞれText,Captionであることも示せ。

#タイトルの字数が足らんorz
#Q6372450の回答を作っててこの根拠を自分で見つけることが出来なかった。ここさえ突破できれば、Variant型(Integerの値がVariantに格納されているときの状態)とString型を比較するときにどういう比較をするかの話をヘルプから引っ張ってくれば完成できるかなと思うんだけど…

投稿日時 - 2010-12-09 05:09:36

QNo.6372495

困ってます

質問者が選んだベストアンサー

もしかして勘違いしてたらすみません。
Excel.Rangeクラスの既定メンバ…_Defaultプロパティ(非表示)
MSForms.TextBoxクラスの既定メンバ…Valueプロパティ
MSForms.Labelクラスの既定メンバ…Captionプロパティ
公式の文書、というかオブジェクトブラウザではだめでしょうか。

『Range Object のデフォルトプロパティ』については以前から迷走してるような感じがありますね。

Excelヘルプ(Excel 開発者用リファレンス)には
>Worksheet.Cells プロパティ
>Item プロパティは、Range オブジェクトに対する既定のプロパティであるため、...
と書いてあります。

http://msdn.microsoft.com/ja-jp/library/aa537180%28office.11%29.aspx
ここには
>デフォルト プロパティ
>Range オブジェクトのデフォルト プロパティは、Value プロパティなので...
とあります。

でも実際のところは
>Excel.Rangeクラスの既定メンバ_Defaultプロパティは、
>引数を指定すればItemプロパティの処理を、
>引数を指定しなければValueプロパティの処理を実行します。
http://www2.aqua-r.tepm.jp/~kmado/kcolumn.htm から引用)
という巷の識者の方の記事のほうが参考になるような気がします。

丁度進行中のスレッドがあるようです。
http://www.excel.studio-kazu.jp/kw/20101209011132.html

投稿日時 - 2010-12-09 17:24:59

お礼

>公式の文書、というかオブジェクトブラウザではだめでしょうか。
OKです。素晴らしい。

#オブジェクトブラウザ自体は知っており、かつ、いくつかのサイトでDefaultなるものを見たと思ったので、漁ってみようとして載ってないものとして諦めてた。「非表示のメンバを表示する」というオプションを見逃したばっかりにorz(アンダースコアがあることにも気づいてなかったな、俺)
#その後、TextBoxにデフォルトプロパティがないと焦った。ええ、Excel側に含まれるTextBoxとMSFormsのTextBoxは違う、という単純なオチでしたが。

>丁度進行中のスレッドがあるようです。
長いんで後でじっくり読む予定。

#「ポイント付ける前に読んで実験しろ」とか質問者に対して思っていた手前、読む前にポイントをつけるのもなんなので少し遅れるかも。

ちなみに、Q6372450用に拵えていたコードは、

Option Explicit

Sub Main()
Dim v As Variant
Dim i As Integer
Dim s As String
v = 9
i = 9
s = "10"
MsgBox (v > s) '文字列比較でTrue
MsgBox (i > s) '数値比較でFalse

End Sub

って奴です。

http://msdn.microsoft.com/en-us/library/ee200271%28v=PROT.10%29.aspx

>There is an exception to the rules in the preceding table when both operands have a declared type of Variant, with one operand originally having a value type of String, and the other operand originally having a numeric value type. In this case, the numeric operand is considered to be less than (and not equal to) the String operand, regardless of their values.

「数値より文字列が常に大きいとされるのは両方がVariant型の時」ですから、Variantが戻るValueプロパティと違いTextプロパティはStringなので、Q6372450には適用されないでしょう。

また、Excel 2003のヘルプから
>一方の式が数値データ型、他方がバリアント型 (内部処理形式は数値データ型または数値に変換できる文字列型)

の時は数値比較で、

>一方の式が文字列型、他方がバリアント型 (Null 値を除く)

の時は文字列比較となります。

まぁ向こうで回答するかはわかりません(気分次第)

投稿日時 - 2010-12-09 18:48:44

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

例えば
『RangeのデフォルトプロパティはValueプロパティです』
とか回答したりして、ん?ホントにそうなのか?と自分で疑問に思ったりした時に
根拠となる公式文書を探したりするのって真摯な態度だと思うんですよね。
やってみたらそうだから仕様です、とかじゃなくて
このドキュメントから仕様である事が解かります、という回答って信頼できる回答だと思います。
仕様の詳細に関するドキュメントがなくても経験上こう書けば動くんだからいいじゃない、
という人もいれば
Objectの既定メンバを省略した時の挙動の違いはどんな仕様によるものなのか探求したい、
という人もいるでしょうし。
プログラミングに対する向き合い方ってやっぱり人それぞれという事でいいんじゃないでしょうか。
もちろん、Wendy02様がhimajin100000様の考え方を否定されているわけではないとは思ってますけども。



じつは『バイト比較』って私もよくわからなかったんです。
>v2 は、上記では、2,4,8 バイトのいずれか..
というのはひょっとして
Dim i As Integer
Dim l As Long
Dim d As Double
MsgBox LenB(i) & "," & LenB(l) & "," & LenB(d)
これの事かなという気もするのですが
Dim v2 As Variant
v2 = 10000
MsgBox LenB(v2)
だし、違うよなー...と悩んでました。
Variant型ですしね。
>VBAなら、10+4 =14 Byte です。
で、なんとなく
ヘルプの[データ型の概要]の
>データ型            記憶領域のサイズ       範囲
>:
>文字列型 (String) (可変長)   10 バイト + 文字列の長さ   0 ~ 2GB
の事なんだなーと。(やっぱドキュメントあると便利 :D)
...という事は「数値より文字列が常に大きいとされるのは両方がVariant型の時」の理由として
型サイズ比較により『文字列が常に大きい』から、とおっしゃりたいのですね?
#ん?バリアント型 (Variant) (文字列)・・・だと 22 バイト + 文字列の長さ ?

でもQ6372450のケースでは

Sheets.Add.OLEObjects.Add "Forms.TextBox.1", Left:=100, Top:=20, Width:=20, Height:=20

Sub test()
  Dim tb As MSForms.TextBox
  With ActiveSheet
    Set tb = .OLEObjects("TextBox1").Object
    tb.Value = 1
    DoEvents: DoEvents
    .Range("A1").Value = 1
    MsgBox .Range("A1") <> tb.Text 'False つまり1="1"
  End With
  Set tb = Nothing
End Sub

なのでVariant型とString型の比較なので『文字列比較』なのですよきっと。



それはさておき、本題のところでは
http://msdn.microsoft.com/en-us/library/ee200324%28PROT.10%29.aspx
ここに
>If the declared type of the target is not Variant, and the target has a public default Property Get or function, the data value’s value is the result of invoking this default member for that target with this argument list. This consumes the argument list.
『default member』っていうのが出てくるんですけど
>If the value type of the expression’s target variable is a class:
?あんまし関係なし?
#英文(は|も)からっきし...orz

投稿日時 - 2010-12-13 23:35:19

ANo.7

失礼ですが、ご質問者さんは、VBAはどうも話があやういような気がします。

無理やり自分の領域で話をしようとしているけれども、話が食い違っていると思います。
プロパティは省略しない、値の比較は、比較する前に文字列か数値かチェックする、それで足りるはずだと思います。プロパティは.Value, .Value2, .Text は、その状況に合わせて使い分けるように用意されています。難しい話をする必要もなく、基本的なことを守れば解決するはずです。省略してどうとか、それは自分の実験の中だけの話です。Office 開発チームのブログに問い合わせる以外は、そのあたりの仕組は分かりませんし、VBA/VB6の元の開発者は会社を辞めてしまいましたから、そのあたりの意図は闇の中だと思います。

VB.Net がどうとかいう話をされても、違う言語だし、根本的な比較の仕方が違うものを持ってこられても、根拠が弱いですね。

>文字列よりも数値の方が「常に」デカイにはならないし、
>2バイト、4バイト、8バイトのいずれか…になるか?

私は、なぜVBAの話で、VB.Net を持ち出すのか分かりません。いくら、こちらが、VB.Net を詳しくないだろうといっても、VB.Net を持ち出して、持論展開しても、VBAとVB.Net で同じようには出来ないはずです。

》System.BitConverter.GetBytes(20S).Length '
VB.NETでいうShortで2バイト。

》System.Integer.Parse("11")は、
文字列を数値に変えているだけでしょう。
Integer型の11が出てくるはずです。これは、4バイト

》System.Text.Encoding.GetEncoding("UTF-16").GetBytes("11")[0]
Bynaryの"11"の文字列を配列に入れてもしょうがないでしょう。[0]だったら、"1"の文字コード49
VB.Net では、"11"は、Unicodeだから、4 Byte になります。
VBAなら、10+4 =14 Byte です。VBA上で、14 Byte になる数値はありません。

それに、GetBytesの引数に、数値型なら、それぞれのデータ型の上限を超えるまでは、2バイト、4バイト、8バイトです。別に、これ以上、得意でもないVB.Net の話で、思わぬ墓穴を掘りたくもありませんから言及はしませんが、VBAのデータ型も、それぞれの数値でバイト数も変わるはずですね。

バイトの比較と、文字列比較の話が、なぜ、こんな話に発展するのでしょう。数字とバイト数を比較しても、比較には出来ません。VBAで計るのは、VarTypeあたりしかないとは思いますが。VBAはVBAで話をしてください。

後、[argument list queue] を「引数列」としていますが、英文については、今読みなおしてみましたが、新規のMS-VBAL Ver.1.0 は今までにはない用語が含まれているようです。その用語は、Internet検索してみましたが、MS側の文書だけです。いずれ日本語でも翻訳文は発表されるかもしれませんが、新語のようです。しかし、前回書いたように、原則論であって、index や argument list の後に出てきていますから、拙訳[引数リスト列]については、例えば、配列引数やRange型の引数のことだと思いましたが、今回の話とは関係ないと思います。

最後に、私の書いたものを、こちらの文章を改編し補わなくては、読めないほど悪文なのでしょうか。人の文章には人格も含まれています。分からないなら分からない、という反応で構わないけれども、改編するような行為は悪気がなくても、そういう書き方はマナーを失しています。最低限のマナーは守ってください。そのような行為は、いずれトラブルの元です。

投稿日時 - 2010-12-13 09:32:08

ANo.6

ありゃ?
>対して、『Cells(k, 14)』これは引数を指定していないのでValueプロパティの処理が実行され、
>演算できる型が取り出せる事になります。
何か変な事書いてますねorz
Dim testResult As Boolean
testResult = Cells(1) <> ""
このCells(1)はRangeですね。
プロパティが省略されて既定メンバが呼ばれている、と見なさないといけないんでしょうね。
Dim v: v = Cells(1)

#...いかん混乱してる...プロパティ省略記述反対 XD

投稿日時 - 2010-12-13 03:21:07

ANo.5

>「Rangeと文字列の比較ではありえないからデフォルトプロパティを使おうとする」ってことを仕様上納得できれば、..
『関係演算子はObject型に対して定義されていない』というセンで攻めてみられてはどうでしょう。
ドキュメントがうまく見つけられませんでしたが
http://msdn.microsoft.com/ja-jp/library/aa711633%28VS.71%29.aspx
http://msdn.microsoft.com/ja-jp/library/cey92b0t%28v=vs.80%29.aspx
この辺りのVBに対する記述があれば良いのでしょうか。

事象だけなら
Dim ws As Worksheet
Set ws = ActiveSheet
If ws = ActiveSheet Then
とか
Dim tb1 As TextBox
Dim tb2 As TextBox
Set tb1 = Sheet1.TextBoxes(1)
Set tb2 = Sheet1.TextBoxes(2)
If tb1 <> tb2 Then
とか。
WorksheetやTextBoxは既定メンバを持ってませんから
「438::オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
関係演算子に定義されている型が取り出せない、という事なのでしょう。

対して、『Cells(k, 14)』これは引数を指定していないのでValueプロパティの処理が実行され、
演算できる型が取り出せる事になります。
#言わずもがなですが
#引数を指定していない..Cells(k, 14)(1)(1)(1)..
#(k, 14)以降です。

DictionaryやCollectionのキーなどはObject型に対しても定義されているから
素直にObject型が通るのでしょう。
#ぃや、ドキュメント調べてません。

>どういう時にValueが必要で、どういう時に必要じゃないのか
となると、相手がObject型も受け取れるようになっているかどうかが焦点かと思いますが、
ドキュメント...難しそうですね。

投稿日時 - 2010-12-12 16:24:31

ANo.4

>「数値より文字列が常に大きいとされるのは両方がVariant型の時」

文字列が大きいと、私が言っているのは、バイトによる比較になるということです。

Sub Test1()
 Dim v1 As Variant 'v1をString型と換えてみると……
 Dim v2 As Variant
 v1 = "11" '文字列
 v2 = 20 '数値
 If v1 > v2 Then
  MsgBox CStr(v1) & ">" & CStr(v2) & vbCrLf _
  & CStr(v1 > v2)
 Else
  MsgBox CStr(v1) & "<=" & CStr(v2) & vbCrLf _
  & CStr(v1 <= v2)
 End If
End Sub

「数値より文字列が常に大きいとされる」のは、バイト比較になる時に成立します。v2 は、上記では、2,4,8 バイトのいずれかですから、必ず、v1が大きくなります。v1をString型と換えてみると、挙動は変わって、文字列比較になります。

次は、
Sub Main()
  Dim v As Variant
  Dim i As Integer
  Dim s As String
  v = 9
  i = 9
  s = "10"
  MsgBox (v > s) 'v側がキャスティングが起きている
  'これは、文字列比較で、9 >"10" -->9 > 1 の比較だから、True
  MsgBox (i > s) 's側がキャスティングが起きている
  'これは、数値比較で、9 >10 -->9 > 10 の比較だから、False
End Sub

以下は、あくまでも、原則的な話だと思いますが。

> http://msdn.microsoft.com/en-us/library/ee199297%28v=PROT.10%29.aspx

A property expression.
A property expression references a property,....

プロパティ表現。
プロパテイ表現は、プロパティに参照項目をつける。それと同時に、引数リスト列(?)の宣言したタイプを持つ。

> http://msdn.microsoft.com/en-us/library/ee200324%28v=PROT.10%29.aspx
例えば、
An expression classified as a value expression ...

「値の表現または変数式として分類される表現は、データ値として同じ表現として宣言されたタイプで評価することができる。」このValueは、Valueプロパティを意味してはいませんね。
この訳じゃ、良く分からないと思いますが、しかし、それだけの話だと思います。「Static semantics」というのは、「静的な意味論」で、変数や定数の値の宣言などのことだと思います。

少し、話を戻すと、私の書いたサンプルプログラムの要旨は、VBAの中で処理される暗黙のキャスティングの変更による比較なのです。しかし、私は、あまり、その点を細かく把握するよりも、原則的な方法論を使えばよいと思います。私の書いたものが、ドロ臭く映るようですが、偶然の産物をアテにするほど、私は頭が良くありませんので、そんなキャスティング仕様など覚えられません。むしろ、数値比較なら、Val関数、文字比較なら、StrCompやLikeを使えばって思うのですが、みんな、<,>, = の演算子で間に合わせるほうが良いと考えているわけではないでしょうか。

今回の場合、頭をつかうことなく、数値比較なら、数値で比較すればよいのであって、TextBox の入力規則を決めて、数値型の変数を当てているならともかく、コードからは分からないまま、TextBoxのValueから、生で値を比較をするのは乱暴だと思います。最近は、そういうことを言うと、相手が不愉快になるだけのようですが。

投稿日時 - 2010-12-10 21:49:14

補足

追記:
俺が
>静的セマンティクス
>(コンパイル時の話だろうから無視)
みたいな判断をしているのがそもそも間違いなのだろうか…

dic.Exists(c)のcの後ろに空の引数リスト()がなくdic.Exists(c())となっていないから、Rangeなのである、という話だとしたら
Cells(k, 14) = txtUriken.Text
左辺は引数二つを渡してRangeが返ったあとは、空の引数列がないはずで、Rangeにならないと変だと思う。(で「型が一致しません」だと思うからなあ…

だから、どういう場合に「引数列がない」としたいのかがよくわからないんだよなー、ドキュメント読んでても。

投稿日時 - 2010-12-12 13:21:30

お礼

意味をよく把握できない部分が結構あったorz
=======================
>「数値より文字列が常に大きいとされる」のは、バイト比較になる時に成立します。v2 は、上記では、2,4,8 バイトのいずれかですから、必ず、v1が大きくなります。

2バイト、4バイト、8バイトのいずれか…になるか?数値でそういうのが出てくるとなると、Integer とか Longのバイト長かなぁとも思うけど、
System.Integer.Parse("11") > System.BitConverter.GetBytes(20S).Length ' VBAのIntegerはSystem.Int16だからVB.NETでいうShortで2バイト。
っていう主張ってことはないと思った。その式なら、
System.Integer.Parse("1") < System.BitConverter.GetBytes(20S).Length ' VBAのIntegerはSystem.Int16だからVB.NETでいうShortで2バイト。
となって、文字列よりも数値の方が「常に」デカイにはならないし、

System.Text.Encoding.GetEncoding("UTF-16").GetBytes("11")[0] > System.BitConverter.GetBytes(20S)[0];
って話をしたいわけでもないはず。そもそも「2バイト、4バイト、8バイトのいずれか」だから、という理由にはならない。
System.Text.Encoding.GetEncoding("UTF-8").GetBytes("1")[0] > System.BitConverter.GetBytes(32767S)[0];
とかもない。前者は少なくともprintable ASCIIだから0x7F以下、後者も0x7Fだから後者のほうが大きくなるはず。
=====================
>しかし、私は、あまり、その辺の(暗黙の型変換の仕様)を細かく把握するよりも、原則的な方法論(VB.NET以降で導入されたOption Strict Onのように、出来るだけ記述を省略しない方法)を使えばよいと思います。私の書いたもの(Option Strict On)が、(プログラマ志向でなくあまり勉強したくない一般ユーザには)ドロ臭く映るようですが、(暗黙の型変換という)偶然の産物をアテにするほど、私は頭が良くありませんので、そんな(暗黙の)キャスティング仕様など覚えられません。むしろ、数値比較なら、(引数および戻り値の型が明示されている)Val関数、文字比較なら、StrCompやLikeを使えばって思うのですが、みんな(一般ユーザは)、<,>, = の演算子で間に合わせるほうが良いと考えているわけではないでしょうか。(= 結論: Option Strict On万歳!)

という趣旨で正しいのかな?この解釈で正しければ、himajin100000は、両手を上げての大賛成です。
#覚えようとすれば覚えられるだけの頭はあるかもしれんが、んなくだらんことに頭使いたくねーよ。

#しばらくの間、「何で俺に暗黙の型変換を使用したコードが泥臭く見えるんだ?確かに暗黙の型変換嫌いだけど。」「『明示的なキャスト等という小難しい仕様など、私(Wendy02)には覚えられません』だと?明示的なキャストの方が圧倒的に解りやすいではないか!」と憤慨していました(汗
=======================
>プロパティ表現。
以下の議論もよくわかっていなかった。
(もしかしてそっちでも訳の意味を今ひとつ取れていないのかな?)とか失礼なことを思いつつ、自分なりの訳をちょっとだけ書いて面倒くさくなって投げたorz 調べてはいないので俺の造語多数。
https://cid-b89cb784f5346675.office.live.com/browse.aspx/TestCase/Q6372495

回答締切り:明日

投稿日時 - 2010-12-12 12:55:59

ANo.3

>また、Excel 2003のヘルプから
ぁ、Visual Basic ランゲージ リファレンス>演算子>比較演算子 の項ですね。
あまり深く理解できていませんでした。
あらためて認識致しました。
なるほど
>Q6372450には適用されないでしょう。
なのですね。
確かに
>If Cells(k, 14) = txtUriken.Text Then とするとちゃんと同等の売上が表示...
とも書いてありました。

勉強になりました。ありがとうございます。



以下余談ですが
>#「ポイント付ける前に読んで実験...
私も同感なので問題なしです。
#じつわレス入れるのにかなり緊張したのは内緒 XD

また、2年以上も前の話なので用済みでしたらスルーしてください。
Q4053673はExcel.ApplicationのEvaluateメソッドの事です。
なのでExcelVBA特有のものですね。
ドキュメントとしてはヘルプになるかと思います。
http://msdn.microsoft.com/ja-jp/library/aa191489%28office.10%29.aspx
Dim v(), w()
v = [{1,2;3,4}]
w = Evaluate("{1,2;3,4}")
中かっこは配列定数で、ワークシートの関数に使われたりする配列定数の文字列を
Evaluateメソッドの引数に与える事によって配列に変換してます。
ドキュメントはExcel一般機能のヘルプになります。
http://office.microsoft.com/ja-jp/excel-help/HP005198319.aspx

投稿日時 - 2010-12-09 22:55:18

お礼

>比較演算子 の項ですね。
そうです。
#2のお礼(ってお礼じゃなくなっているような気もするけど)にも書いたけれど、
「Rangeと文字列の比較ではありえないからデフォルトプロパティを使おうとする」ってことを仕様上納得できれば、なんですけどね。

#俺、(自分自身によるものを含む)こういう揺さぶりに弱くて、英文読んでて決断できないんだ(笑)。

>また、2年以上も前の話なので用済みでしたらスルーしてください。

お気に入りにでも入れてもらえたのかな、だとしたら嬉しい。

>Q4053673はExcel.ApplicationのEvaluateメソッドの事です。

回答のメモがわりに使っている自分のブログによると
2010-06-04に気がついたみたい。
http://blog.goo.ne.jp/himajin100000/e/c16bfde730576b5b61ae137a37eaff5a
他にもこんなやつで悩んでたりします。
http://blog.goo.ne.jp/himajin100000/e/dc5f89097486bd652bf81c5be1f6e447

話ずれてきたorz

デフォルトプロパティが何か、ということが自分の中で一応解消できたため特に何か追加で投稿したいことが皆さんになければ、2日程待って、締め切ろうかと思っています。
(多分20ptが#1となるかと。10ptがあれば#2にも割り振ってただろうな…)

投稿日時 - 2010-12-10 19:48:51

ANo.2

私は、このスレ主さんはMSありきで始まっているようですから、私の回答は答にはならないと思いますし、ここでは、「Excelの学校」のようなスレにはなりませんが、end-uさんの回答は興味を引きましたので、少し回答させていただきます。(あまり長引く話には書き続ける元気がありませんが。)

どうもマイクロソフトの翻訳は信用しかねる部分があるので、一度、英語で確認しました。Default Property ... 規定のプロパティの訳にしていることは確認しました。

>デフォルト プロパティ
>Range オブジェクトのデフォルト プロパティは、Value プロパティなので
The default property of a Range object is the Value property so grandTotal is assigned the value of the Range object.
http://msdn.microsoft.com/en-us/library/aa537180(v=office.11).aspx

これはVBAの開発チームとは別のチームが書いた話だと思います。とは言っても、元の開発者は辞めてしまったので、これが正しいのか違っているのか言っても始まらないと思います。ただ、開発チームに直接聞く方法はあるかと思いますが、聞いたところで、プロパティ自体は変わるわけではないと思います。

「エクセルの学校」で、論議も続いているようですが、私の認識では、Range Object のDefault Property は、Value ではないと考えています。もちろん、_Default という非表示プロパティがあるということもあるのですが、省略されたプロパティには、二つあります。Value と Item です。だから、それを、デフォルトと呼ぶわけにはいかないと思います。

つまり、省略した時に、必ず、Value値に納まるというなら、それは、デフォルトと呼ぶにふさわしいけれども、そうでない場合は、そのようにすることは出来ません。

これは、昔書いたコードですが、以下の場合は、cでは、オブジェクトが確保されますので、以下の場合は、省略できません。これは特殊な例かもしれませんが、実際、オブジェクトを扱う時と、Valueを扱う時は、外部オブジェクトを使う時には明確にしなければならないはずです。もともと、VB6のCreateObejct("Excel.Application")で、オートメーション・オブジェクトを扱う時に、.Valueプロパティを忘れるとエラーが発生することで、気が付きました。

種類を数えるマクロです。A1~同列の任意の行のセルまで、数値でも、文字でも、ランダムにいれて、以下を実行します。Value プロパティを入れないと、オブジェクトとして確保してしまうので、それぞれのセルは別のものと数えてしまいます。

Sub DicTest()
Dim i As Long
Dim c As Range
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For Each c In Range("A1:A65536").SpecialCells(xlCellTypeConstants, 23)
  If dic.Exists(c) Then '要 .Value プロパティ
    Else
    dic.Add c, Empty '要 .Value プロパティ
    i = i + 1
  End If
Next
MsgBox i
End Sub

投稿日時 - 2010-12-09 21:12:54

お礼

>私は、このスレ主さんはMSありきで始まっているようですから、
はい。

>私の回答は答にはならないと思いますし、
大丈夫だ、問題ない

#元ネタのプレイ経験はない。

>私の認識では、Range Object のDefault Property は、Value ではないと考えています。もちろん、_Default という非表示プロパティがあるということもあるのですが、

>つまり、省略した時に、必ず、Value値に納まるというなら、それは、デフォルトと呼ぶにふさわしいけれども、そうでない場合は、そのようにすることは出来ません。

はい、反証されたため、現在の俺の認識ではValueでもItemでもなく_Defaultのみだ、ということになっております。

>数値でも、文字でも、ランダムにいれて、以下を実行します。Value プロパティを入れないと、オブジェクトとして確保してしまうので、それぞれのセルは別のものと数えてしまいます。

どういう時にValueが必要で、どういう時に必要じゃないのかを調べようと
http://msdn.microsoft.com/en-us/library/ee199297%28v=PROT.10%29.aspx
http://msdn.microsoft.com/en-us/library/ee200324%28v=PROT.10%29.aspx
あたりを読んでるけど、自信持ててませんorz

投稿日時 - 2010-12-10 19:34:31

あなたにオススメの質問