![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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」の結果が返ってきました。
同じ行に他の記載をしないとうまくいかないようです。。。
No.1ベストアンサー
- 回答日時:
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
でよろしいのでしょうか?
No.3
- 回答日時:
#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 ' 人数
No.2
- 回答日時:
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が返ります。(数値の長さではありません、長さが必要な場合は、文字列にしてやる必要があります)
バリアントの場合、文字列として評価をしてその長さが返ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のサフィックスについて
-
「ずっと憧れていました」は英...
-
ドラゴン曲線を再帰で書く
-
他のフォームから別のフォーム...
-
レコードセットにnullの場合
-
VBA public変数はどのようなこ...
-
ボールが壁に当たって跳ね返る...
-
エクセルVBAでテキストボッ...
-
VBAでcallで呼び出したsubを終...
-
チェックボックスを操作できな...
-
マウスポインタの変更
-
画像処理について。(移動)
-
[VB6] SQLの作成について
-
プロシージャまたは関数の引数...
-
【VB6.0】 あるフォームから他...
-
ClickとChangeイベントの違いは...
-
C#のループでtextboxに値を入れ...
-
アクセスできない保護レベルエ...
-
Matlabでsin波を使って矩形波を...
-
画像処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のサフィックスについて
-
C++のActiveX DLLでポインタを...
-
初期化関数でmallocしたい
-
アドレスp (char *p) からの連...
-
C言語で32Bit*32Bitの演算は出...
-
「ずっと憧れていました」は英...
-
変数の型でlong longとunsigned...
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
エクセルVBAでテキストボッ...
-
VBAでcallで呼び出したsubを終...
-
sublimit textっていうエディタ...
-
他のフォームから別のフォーム...
-
VB.NETでのイベントの途中終了
-
三項でたとえば交換って
-
【VB6.0】 あるフォームから他...
-
アクセスできない保護レベルエ...
-
タイムアウトする仕組みを作りたい
-
VBAで入力数値について
-
チェックボックスを操作できな...
おすすめ情報