[[20170313203348]] 『MsgBoxで表示できる文字数が1023文字までなのは、』(マリオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『MsgBoxで表示できる文字数が1023文字までなのは、なぜ?』(マリオ)

http://officetanaka.net/excel/vba/function/MsgBox.htm

 ↑コチラを見てみると、
 引数promptに指定できる文字数は、1バイト文字で約1024文字です。
 とある。

 下記のtestプロシージャを実行すると、
 MsgBoxで表示できる文字数は、
 1024文字でなく、1023文字までになるのだが…。
 MsgBox表示は、1023字までの、文字数制限があるということですね。

 1バイト文字 ← 1K(ケー)byte ← 1024byte の意だろうと推測される
 半角、全角にかかわらず、1文字につき、1byte消費されるのですかね?
 ★msgbox命令自体で、1byte使用されているのだろうか?

 >ただし使用する文字の幅によって使用できる文字数は異なります。
 とありますが、そうかな…??1023文字でないのは、
 どんなときでしょうか??

 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 sub test()
 '改行がない場合 - 全角、半角ともに、1023文字まで表示可能
 msgbox String(1022, "あ") & "い"
 'msgbox String(1022, "1") & "2"

 '----------------------------------------------
 'vbCRLFは、2文字扱い
 'msgbox vbCRLF & String(1020, "あ") & "い"

 'vbNewLineは、2文字扱い
 'msgbox vbNewLine & String(1020, "あ") & "い"

 'vbCRは、1文字扱い
 'msgbox vbCR & String(1021, "あ") & "い"

 'vbLfは、1文字扱い
 'msgbox vbLf & String(1021, "あ") & "い"

 'Chr(13)は、1文字扱い
 'msgbox Chr(13) & String(1021, "あ") & "い"

 'Chr(10)は、1文字扱い
 'msgbox Chr(10) & String(1021, "あ") & "い"

 'End Sub
 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 ん?「1バイト文字で約1024文字」とありますが…?
 1byte=8bit=2^8=256
 という理解なのですが、256じゃなくて、1024なのはなぜか?

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413226859?__ysp=MWJ5dGUgYml0ICAxMDI0

 ↑コチラを見ると、

 「1バイト文字」→「1Kbyte」→「1024byte」
 で、この場合の「K」は、「キロ」ではなく「ケー」と読むらしい。
 Kだと紛らわしいので、1998年に、「Ki(キビ)=1024」という
 新しい単位が設定されたとある。

 ★1KB(キロバイト)は、間違いではなく1000bitで、いいのですね。
   間違いではないけど、コンピュータが2進法で処理している
   ことを考えると、1KB(ケーバイト)または1Ki(キビバイト)
   を使用した方が好ましいといった程度のことなのかな?

      1K(ケー)byte=1Ki(キビ)byte=1,024byte
                    1K(キロ)byte=1,000byte
        1Mi(メビ)byte=1024^2=1,048,576byte
         1M(メガ)byte=1000^2=1,000,000byte
    1Gi(ギビ)byte=1024^3=1,073,741,824byte
     1G(ギガ)byte=1000^3=1,000,000,000byte
    1Ti(テビ)byte=1024^4
     1T(テラ)byte=1000^4

https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%93%E3%83%90%E3%82%A4%E3%83%88

(マリオ) 2017/03/13(月) 20:35


 研究熱心なマリオさんの真骨頂 というところですね。

 恥ずかしながら キビ だの メビ だの初めて知りました。

 もちろん キロは千 だろう メガは100万だろう ということですけど、
 私が、よちよち歩きのアセンブラープログラマー時代から、(私個人は)コンピュータの世界では
 キロは 1024だ、だから 4Kは 4096 だと、そう思って、何も不思議に思わず、使ってきましたね。
 ややこしいので、キロとはいわず、ケー でした。

 閑話休題

  当時も、メガ という言葉はもちろんあって 1048576 ですけど、
  そんな単位のメモリー領域は、【概念】であって、実際に作るとすれば
  とんでもない高額なものになるので、たんに、あこがれ として メガ という言葉を
  使っていました。仮想記憶の考え方がでる前の話です。
  隔世の感がありますねぇ。

 皆さんそうだと思っていたんですが 1キロバイトは 1000バイトだと、そう(素直に)理解しておられる
 人々もいらっしゃるということですね。

 ●ところで、

 >1K(ケー)byte=1Ki(キビ)byte=1,024bit

 えっ?

 1,024【Byte】でしょ?

(β) 2017/03/13(月) 20:53


 >βさん
 >>1K(ケー)byte=1Ki(キビ)byte=1,024bit

 >えっ?
 >1,024【Byte】でしょ?

 ですね(^^♪ どうもです。2017/03/13(月) 20:35 の記事のbitと書いてしまったところ、
 byteに書き換えました。

(マリオ) 2017/03/13(月) 21:10


 余談
 =============================================
 ただ、1023字を越えてもエラーには、なりませんね…?ん??
 Long型でもないし、どうなっているんだか??
 1文字につき、1byte消費なので…ん〜。

 VBS(拡張子:vbs)だと、
 msgbox String(1000000000 , "あ") & "い"'★10の9乗 
 で、エラーにならず、
 msgbox String(1100000000 , "あ") & "い"'★10の9乗×1.1
 だとエラーですね。

 でも、エクセルVBAでは、test2で、
 実行時エラー(14)
 文字列領域が不足しています
 と表示されますね。test3ならエラーになりませんが…。まっいっか…。

 Sub Test2()
   MsgBox String(1000000000, "あ") & "い"'★10の9乗   
 End Sub

 Sub Test3()
   MsgBox String(100000000, "あ") & "い"'★10の8乗
 End Sub

(マリオ) 2017/03/13(月) 21:51


 >>でも、エクセルVBAでは、test2で、
 >>実行時エラー(14)

試してみましたが、これエラー吐いてるのStringのほうでは?
String型で変数立ててString(1000000000, "あ")を格納しようとすると同じエラー14でしたが。
(X) 2017/03/15(水) 11:58


excel2010 win7 32bit 環境ですが

「あ」では511文字しか表示できません。
「a」では1023文字表示できます。
適当にググると文字幅依存とのことなので

半角1023
全角511*2=1022

1では全角表示不可なので
半角1023=全角1022

1024 = 0〜1023 ということかなとも思いましたが、はてさて・・・
(X) 2017/03/15(水) 12:16


ヘルプには「名前付き引数 prompt に指定できる最大文字数は、1 バイト文字で約 1,024 文字です。ただし、使う文字の文字幅に依存します。」とあるわけで、「1 バイト文字で約 1,024 文字」というのがミソですね。これが全角2バイト半角1バイトとした場合に、1024-1バイトまで、というのが正確な値なのでしょう。「約」と付けているのは、1023バイト目が全角の前半だった場合は1022バイトで切れるから、とかですかねぇ?

おそらく、関数の実装が、C言語等で1024バイト分のメモリを確保していて、1バイトは文字列終端のNULL文字になるので、1023バイトなのかと思います。UnixならばOSのソースも公開されていたので、こういう場合に内部処理を追えたのですが、windowsは閉鎖的なので難しいですね。 将来、もっと長い文字の需要が多ければ、仕様が変わる可能性もあるので、あまり気にしなくとも良いかと思います。
(???) 2017/03/15(水) 13:51


 >X さん

 >「あ」では511文字しか表示できません。 

 今、試したら、そうでした。
 あれ?
 たまに、エクセルを保存しないで、
 コードを実行し続けていると、
 おかしな動作をすることがあります。
 おそらく、それなのかな〜??

 MsgBox String(511, "あ") & "abc"

 で表示されるのは「あ…あa」でした。
 半角換算で、1023字ですよね。

 >???

 >おそらく、関数の実装が、C言語等で1024バイト分の
 >メモリを確保していて、1バイトは文字列終端のNULL文字
 >になるので、1023バイトなのかと思います。

 うむうむ。1バイトは、NULL文字かもしれませんね。
 basicなのに、C言語に依存している部分も
 あるのですかね??

 NULL文字とは、文字数0の文字列で、
 制御文字らしいですが、深く理解しておりません…。

 「C言語 NULL文字」で、ググると
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 文字列型を持たないC言語において、文字列は文字型の配列で表現されます。この配列には、文字列の最後を示すNULL文字が含まれている必要があります。

 文字列用に確保された文字型配列内にNULL文字が含まれていなければ、文字列として不完全であり、文字列を取り扱う関数や処理に引き渡した場合、脆弱性の要因となります。

 C標準の文字列処理関数を用いて文字列操作を安全に行うためには、引数として渡す文字列が確実にNULL終端されている必要があります。
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 なんて、書き込みもありました。

 ありがとうございます。

(マリオ) 2017/03/17(金) 18:19


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.