• ベストアンサー

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

問: Range Object のデフォルトプロパティがValueであることを証明・反証するMicrosoftの公式の文書を示せ。余力があればTextBoxやLabelのデフォルトプロパティがそれぞれText,Captionであることも示せ。 #タイトルの字数が足らんorz #Q6372450の回答を作っててこの根拠を自分で見つけることが出来なかった。ここさえ突破できれば、Variant型(Integerの値がVariantに格納されているときの状態)とString型を比較するときにどういう比較をするかの話をヘルプから引っ張ってくれば完成できるかなと思うんだけど…

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

もしかして勘違いしてたらすみません。 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

himajin100000
質問者

お礼

>公式の文書、というかオブジェクトブラウザではだめでしょうか。 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 値を除く) の時は文字列比較となります。 まぁ向こうで回答するかはわかりません(気分次第)

その他の回答 (7)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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型の引数のことだと思いましたが、今回の話とは関係ないと思います。 最後に、私の書いたものを、こちらの文章を改編し補わなくては、読めないほど悪文なのでしょうか。人の文章には人格も含まれています。分からないなら分からない、という反応で構わないけれども、改編するような行為は悪気がなくても、そういう書き方はマナーを失しています。最低限のマナーは守ってください。そのような行為は、いずれトラブルの元です。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

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

  • end-u
  • ベストアンサー率79% (496/625)
回答No.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型も受け取れるようになっているかどうかが焦点かと思いますが、 ドキュメント...難しそうですね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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から、生で値を比較をするのは乱暴だと思います。最近は、そういうことを言うと、相手が不愉快になるだけのようですが。

himajin100000
質問者

お礼

意味をよく把握できない部分が結構あった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 回答締切り:明日

himajin100000
質問者

補足

追記: 俺が >静的セマンティクス >(コンパイル時の話だろうから無視) みたいな判断をしているのがそもそも間違いなのだろうか… dic.Exists(c)のcの後ろに空の引数リスト()がなくdic.Exists(c())となっていないから、Rangeなのである、という話だとしたら Cells(k, 14) = txtUriken.Text 左辺は引数二つを渡してRangeが返ったあとは、空の引数列がないはずで、Rangeにならないと変だと思う。(で「型が一致しません」だと思うからなあ… だから、どういう場合に「引数列がない」としたいのかがよくわからないんだよなー、ドキュメント読んでても。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.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

himajin100000
質問者

お礼

>比較演算子 の項ですね。 そうです。 #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にも割り振ってただろうな…)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

himajin100000
質問者

お礼

>私は、このスレ主さんは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

関連するQ&A

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • VBA 同様処理の簡素化?

    エクセル VBAで下記のようにテキストボックスの処理を 書き込みました。 Private Sub TextBox24_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub Private Sub TextBox25_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub テキストボックス24、25内の処理は同じなのですが テキストボックスが増えた場合、修正することも考えて 簡素化したいのですが、どのように行なえばいいでしょうか?

  • 複数コントロールテキストの同一セルへの入力

    はじめまして。 エクセルVBAについて質問させて頂きます。 ユーザーフォームにラベル・テキストボックスそれぞれ1~6があって ラベルのキャプションとテキストボックスのテキストをセル同一セルに 入力したくて With UserForm1 Range("A1") = .Label1.Caption & .TextBox1.Text & .Label2.Caption & .TextBox2.Text _ & .Label3.Caption & .TextBox3.Text & .Label4.Caption & .TextBox4.Text _ & .Label5.Caption & .TextBox5.Text & .Label6.Caption & .TextBox6.Text End With と、このように記述したのでが、これをもっと簡潔に書く方法はございませんでしょうか? ご教授よろしくお願いします。

  • マクロで関数の使い方

    下記のコードを試したのですが、オブジェクトはこのプロパティまたはメソッドをサポートしていませんとエラーが出ます。 どの部分の書き方が間違っているでしょうか? Label93.Caption = 2 * (Application.SQRT(Val(Label91.Caption) ^ 2 - (Val(Label91.Caption) - Val(TextBox35.Value)) ^ 2))

  • LabelとTextboxの自動計算を希望

    ComboBox2のリスト選択で連動でlabel2とlabel12の数字変更 TextBox2には数字入力 Label12(数字) x TextBox2(数字) = Lavel22(乗算合計)で Label12変えないで、TextBox2の数字変えた時はLabel22の合計変動 Label12の数字変えて、TextBox2の数字変ない時はLabel22の合計変わらない現状です。 Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case True 'TextBox2かLabel12が空白の時Label22空白 Case TextBox2.Value = "" Or Label12.Caption = "" Label22.Caption = "" Case Else 'TextBox2とLabel12が数字の時Label22はTextBox2の数字とLabel12数字を乗算する If IsNumeric(TextBox2.Value) And IsNumeric(Label12.Caption) Then _ Label22.Caption = TextBox2 * Label12 'Label22に数字がある時Label29に合計表示 Label29.Caption = Label22 End Select End Sub ComboBox2_change()作って、TextBox2_KeyUp書いてる内容を書けば動くでしょうが・・・ 同じ内容2つ書かないで動く方法があれば非常に助かります。 いい方法無さそうならComboBox2_change()作って書こうかな・・・と思ってます

  • VBAでコントロール配列を持つことは可能ですか?

    Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

  • VBAでVlookup機能を使うときにエラー

    このコミュニティでもたびたび質問されているVLOOKUPのVBAですが 解答例で多く書かれているのが Public Sub test()     Dim MyVariant As Variant     MyVariant = Application.VLookup("excel", Range("A:B"), 2, False)     If IsError(MyVariant) Then       Debug.Print "Not Found"     Else       Debug.Print MyVariant     End If   End Sub なのですがRangeの部分にシートの情報を乗せるとエラーが出ます 例)Application.VLookup(Label6.Caption, WorkSheets("Sheet5").Range("A:B"), 2, False) まだまだ初心者なので何がおかしいのかわかりません よろしくお願いします

  • textbox.textやlabel.captionの型変換について

    VB6.0を使用しています。 テキストボックスやラベルに値として数字を入れているのですが、これらの値に数字で加算減算する場合・・・ ●宣言部でintegerを宣言する又は、 ●string型で宣言してからプロシージャ内でCint(textbox.text)やCint(label.caption)のように変換するのとどう違うのでしょうか?

  • エクセルユーザーフォームのカーソル位置

    どうしても分からないのでお助け下さい(>_<) エクセルでユーザーフォームを作っています。 TextBox1に品番を入れたら、Label1に品名を表示させています。 このとき、TextBox1に存在しない品番を入力した場合は、 再度入れなおしをさせたいのです。 そこで、カーソルをもう一度TextBox1に持っていきたいのです。 しかし、どうやってもタブオーダーでTextBox1の次にあるTextBox2に カーソルが行ってしまいます。 どうしたらもう一度TextBox1にカーソルを持っていくことができますか? ちなみに品名を表示するモジュールを書いておきます。 このSetFocusが違うということは分かるのですが・・・。 Private Sub TextBox1_AfterUpdate() Dim tmp As Range, a a = Me.TextBox1.Value   Set tmp = Sheets(1).Columns(1).Find(a, , xlWhole)   If tmp Is Nothing Then     Me.Label1.Caption = "品番が誤っています。再度入力して下さい"     Me.TextBox1.SetFocus     Exit Sub   Else     Me.Label1 = tmp.Offset(0, 1)   End If End Sub

  • プロパティの値が不正ですってでます!

    下記プログラムがあります。 Private Sub Timer1_Timer() data(current) = PICOCX1.ADinp(PortA, 4) Label4.Caption = Date & "," & Time ondo = "現在の温度:" & Format(data(current) / 10.23 * 5, "#0.0℃") kiroku = Date & "," & Time & "," & Format(data(current) / 10.23 * 5, "#0.0") Label1.Caption = ondo Dim MyFil As String Dim intFileNo As Integer MyFil = Text3.Text intFileNo = FreeFile If Dir$(MyFil) = "" Then Open MyFil For Output As #intFileNo Print #intFileNo, kiroku Close #intFileNo Else Open MyFil For Append As #intFileNo Print #intFileNo, kiroku Close #intFileNo End If End Sub このプログラムを1時間に一回実行したいのですがインターバルを3600000にするとプロパティの値が不正ですとでてしまい実行することができません。 どうやったらちゃんと動くようになりますか??お願いします。