dポイントプレゼントキャンペーン実施中!

Excel2002を使用しています。
標準モジュール内で下記のように変数を宣言すると

Dim i,k as long

(例)kには、あるセルの値を取得します。10000
Keta=len(k)

この結果、ketaには、「4」という結果になります。
10000なので、「5」が返らないといけないのですが、うまくいきません。

ところが、

Dim i ,k ,m as long
このように変数kの後ろに他の変数(今回はm)を記載すると、
「5」という結果が返ってきます。
変数の宣言の仕方が間違っているのでしょうか?
よろしくお願いいたします。

ちなみに、
Dim k as long
としても、「4」の結果が返ってきました。
同じ行に他の記載をしないとうまくいかないようです。。。

A 回答 (3件)

Len関数は“文字列”の長さを返す関数です。


従って long 型の変数はその変数自体のサイズ(4バイト)が返されているものと思われます。
では long 型の変数の長さを返すにはどうしたらいいかというと、一旦文字列に変換しLen関数を使うことになります。

Keta=len(cstr(k))

また Dim i,k,m as long という書き方、これは実は i と k と m を long 型にするという意味ではありません。
i と k はバリアント型、m は long 型になります。
つまり、

Dim i
Dim k
Dim m as long

という宣言と同じ意味になります。
バリアント型というのは(マニュアルを読んでもらうのが一番ですが)簡単に言えば、都合良く処理してくれる型です。
これがVBA(VB)の長所でもあり短所でもあります。
型を意識しないでプログラムが書けるため便利だけど、理解して使わないと余計なバグの原因となります。

この回答への補足

早速のご回答、ありがとうございます。
大変参考になりました!!
それでは、複数で同じ型の宣言をする場合は

Dim i as long, k as long ,m as long

でよろしいのでしょうか?

補足日時:2006/04/27 15:01
    • good
    • 0

#1です。



>それでは、複数で同じ型の宣言をする場合は
>Dim i as long, k as long ,m as long
>でよろしいのでしょうか?

はい、そういうことです。
ただプログラムの見易さから言うと(プロの立場から言うと)、1行1行分けた方がいいと思います。
後ろにコメントも書けますし。
例えばこんな感じで。

Dim i as long ' 金額
Dim k as long ' 個数
Dim m as long ' 人数
    • good
    • 0
この回答へのお礼

丁寧にお答えいただきありがとうございました。
助かりました。

お礼日時:2006/04/27 15:17

Dim i,k, m as long


などのように宣言した場合、
Dim i as long
Dim k as long
Dim m as long
の意味ではなく
Dim i as Variant
Dim k as Variant
Dim m as long
の意味になります。
なので、全部をlong だとしたい場合は、全ての変数にas long が必要です。
Len 関数のヘルプを見て貰うとわかると思いますが、
Len 関数は、変数を保持するのに必要なメモリをバイト数で返します。
Long の場合エクセルでは4バイトなので4が返ります。(数値の長さではありません、長さが必要な場合は、文字列にしてやる必要があります)
バリアントの場合、文字列として評価をしてその長さが返ります。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
勉強になりました。

お礼日時:2006/04/27 15:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!