Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
データ型について
投稿日時: 21/06/26 11:01:28
投稿者: A太郎

的外れな質問でしたらすみません。
1.234をtypenameで調べるとdoubleとなりましたが
数値データをtypenameにかけて、なぜ一意にデータ型が決まるのでしょうか?
小数の場合、singleとdoubleがある認識です。

回答
投稿日時: 21/06/26 17:20:44
投稿者: WinArrow
投稿者のウェブサイトに移動

>なぜ一意にデータ型が決まるのでしょうか?
  
きまるのではなく、決めている(つまり仕様)ということではないでしょうか?
  
  
例えば、
Const で 定数定義しますが、
データ型を省略した場合、どのように解釈されているか調査してみるとよいでしょう。
  
例えば、
セルに「1-2」と入力した場合、日付に解釈されてしまうのとおなじではないか?
 

回答
投稿日時: 21/06/27 07:10:03
投稿者: simple

既に回答いただいているところですが、グダグダ書いてみます。
(1)
変数の型をVariant型の変数に入れたとき、
型が実質的にどうなるか実験するとこうなります。
 

Sub test()
    Dim v1, v2, v3, v4
    v1 = 100
    v2 = 10.2
    v3 = [A1].Value             'A1セルの値は 100
    v4 = [A2].Value             'A2セルの値は 10.2
    Debug.Print TypeName(v1)    'Integer が表示される
    Debug.Print TypeName(v2)    'Double
    Debug.Print TypeName(v3)    'Double
    Debug.Print TypeName(v4)    'Double
End Sub

10.2は、自分で型定義するならSingle型の変数に入れることも、
Double型の変数に入れることもできるわけですが、
v2がDouble型となるのは、これはこのように決めたのです。
(既に指摘いただいていることに同意します)
 
二つを方式を混在させるのは負荷になりますし、
Single型でメモリを少々節約するよりも、ロジックを簡明にするメリットや、
システムの環境との関係からもそれが適切と判断したものでしょう。
 
これは整数でも同様で、数値が書かれたコードから読み取る際に、
100なら、Byte型でも間に合うと判断してByte型で管理することも理論的に可能ではが、
そうした判断をMS社はしなかったのです。
それは判断事項であり、言語設計者が論理で変更できる話だからです。
一定の数までの整数はすべてInteger、それを超えたらLong型(さらに超えたら別の型)と、
決めたのです。
 
(2)
なお、ワークシートの数値はすべてDoubleと見なして扱います(上記のv3を参照)。
これは既に実行されている、ワークシートの中での数値の管理方法に依存しているものと
想像できます。このことも頭に入れておくとよいかと思います。
 
(3)
少し飛躍しますが、若干の周辺事情についてコメントします。
 
数値にはいろいろな型があります。整数では、Byte,Integer,Long 等々。
 
メモリの消費量からするとByteが最小で適切なようにも思いますが、
OS(32ビットもしくは64ビット)との相性などを考えると、
Longが速度上も適切と言われていますし、
今どきはメモリー消費量は気にする必要性も殆どないはずです。
メモリー消費量で物事が決まっている訳ではないのです。
 
これはユーザーが変数の型を決める場合の考え方にも影響していて、
整数はすべてLong型で宣言して使う」と言う方針の人も多いです。
私もたいていはLongにしています。

回答
投稿日時: 21/06/28 10:35:11
投稿者: sk

引用:
1.234をtypenameで調べるとdoubleとなりましたが
数値データをtypenameにかけて、なぜ一意にデータ型が決まるのでしょうか?

それが VBA における仕様なので。
 
Microsoft Docs より:
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/data-types/type-characters#literal-type-characters
 
引用:
小数の場合、singleとdoubleがある認識です。

型文字が記述されておらず、かつ小数部分を含んでいる
数値リテラルは常に Double 型のデータとして扱われます。

投稿日時: 21/07/11 16:24:03
投稿者: A太郎

皆様
 
回答ありがとうございました。
また返信が遅れて申し訳ありません。
 
データ型は宣言しない場合はデフォルトが定められているということで理解しました。
ありがとうございました。