• ベストアンサー

lenは文字数を取得する関数ですよね?

vbaで Sub test() Dim i As Long Debug.Print Len(i) End Sub とすると、4が返るのですが、なぜなのかまったくわかりません。 iには0が入っているので、一文字だから1が返ると思うのですが・・・

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

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>4が返るのですが、なぜなのかまったくわかりません。 あなたは Dim i As Long と宣言し、変数 i は文字列ではなく数値を格納するものとしています。 変数 i は Long と言うサイズの数値ですから4Byte変数になります。 従って、値が代入されていなくても Len(i) の帰りは4で良いことになります。 >iには0が入っているので、一文字だから1が返ると思うのですが・・・ 数値の0は1文字ではなく4Byteの値の0です。 変数 i の定義からやり直さないと期待の1は返りません。 Sub test() Dim i As String i="0" Debug.Print Len(i) End Sub 私はvbaの実践経験がありません。 10年以上前にC言語を少々齧りましたが殆ど忘れていますので正しい判断か否か?

参考URL:
http://www.officetanaka.net/excel/vba/function/Len.htm
swihourfhjv
質問者

お礼

ありがとうございました。

その他の回答 (1)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Lenは、HELPを見ると 指定した文字列の文字数または指定した変数に必要なバイト数を表す長整数型 (Long) の値を返します ですので、Longは4バイトの符号付整数ですので4が返ります。

swihourfhjv
質問者

お礼

ありがとうございました。

関連するQ&A

  • 変数を続けて宣言した場合はEmpty型になる?

    Sub test1() Dim Int1, Int2 As Long Debug.Print "---------- test1の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub Sub test2() Dim Int1 As Long Dim Int2 As Long Debug.Print "---------- test2の実行結果 ----------" Debug.Print TypeName(Int1) Debug.Print TypeName(Int2) End Sub を実行すると、 ---------- test1の実行結果 ---------- Empty Long ---------- test2の実行結果 ---------- Long Long の結果が得られます。 test1のInt1がEmpty型になりますが、変数の型にEmptyはないですよね? どういうことなのでしょう???

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • 「Debug.Print i = i + 1」がFalseになる。

    Sub test() Dim i As Long i = 0 Debug.Print i = i + 1 End Sub を実行すると False がイミディエイトウインドウに表示されます。 理由が知りたいです。 よろしくお願いします。

  • イミディエイトウインドウの最高表示数は199行?

    当方XP&Office2003です。 Sub test() Dim i As Long For i = 1 To 200 Debug.Print i Next i End Sub を実行すると、 2 3 ・ ・ ・ 200 と、表示され、最初の1が消えてしまいます。 イミディエイトウインドウでは、199行までしか表示できないのでしょうか? 私がoffice2003だからですか?

  • Replace関数 大文字小文字を区別したい

    エクセルVBAについて質問いたします。 Sub test23() Dim 文字列 As String 文字列 = "Aa" Debug.Print Replace(文字列, "A", "b") End Sub を実行すると戻り値は、bbなのですが、大文字小文字を認識して置換する方法はありますか? 上記の例で例えるのなら、「A」なら「B」に置換したいので 「a」は、「A」ではないので、置換させたくないのです。

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

  • Excel2007VBA時間の書式とLen関数

    ●質問の主旨 文字列の長さを返すLen関数の引数に 時間を設定すると戻り値が一定しないのはなぜでしょうか? また下記に示すように20や17などの数字がかえってくるの でしょうか? ●質問の補足 A1セルに入力されている時間が以下の通りだとします。 例1)1:11→20 例2)13:59→17 ●コード Sub test() Dim i as String i=Range("A1") Msgbox Len(i) End Sub 以上よろしくお願いします。

  • コントロールのタイプを取得したい場合

    Sub test() Dim i As Integer Dim StrFormName As String StrFormName = "UserForm1" With UserForms.Add(StrFormName).Controls For i = 0 To .Count - 1 Debug.Print .Item(i).Name  Next End With End Sub これでエクセルのユーザーフォーム上のすべてのコントロール名が取得できるのですが、 コントロールのタイプを取得したい場合、 Debug.Print .Item(i).Name  の部分をどう変えればいいのでしょうか? 例えばコマンドボタンなら、「CommandButton」と返ってきてほしいです。 Debug.Print .Item(i).Controlstype でも Debug.Print .Item(i).Controltype でもエラーになりました。

  • 文字列の最後が空白なら削除する

    Sub test() Dim mystr As String mystr = "abc " If Right(mystr, 1) = " " Then Debug.Print Left(mystr, Len(mystr) - 1) End If End Sub これで、最後の1文字が空白なら削除できるのですが、 "abc "のように、最後に空白が2つある場合が対応できないのですが そういう場合でも対応できるコードはありますか?

  • VBAで期間が何か月間なのかを取得する方法

    VBAで期間が何か月間なのかを取得する方法を教えてください。 Sub test1() Dim dateStart As Date Dim dateEnd As Date dateStart = "2013/1/1" dateEnd = "2013/12/31" Debug.Print 12 & "カ月です" End Sub この場合、12か月ですが、 例えば dateStart = "2013/7/1" の場合、6カ月を返したいのですが それを取得するコードを教えていただけますか? よろしくお願いします。

専門家に質問してみよう