
VBAで、通常は文字列はInputを使って読み込むのですが
Binary形式で読み込んだらどうなるかについて調べてみました。
例えば、D:\text.txtのファイルに
123456789ABあ
という内容が書き込まれているとします。
このテキストデータを以下のようにして文字列数を指定した上で読み込むと
Sub Sample2()
Dim buf() As String
ReDim buf(0)
buf(0) = Space(10)
Open "D:\text.txt" For Binary As #1
Get #1, , buf(0)
Close #1
End Sub
最初の10文字である
123456789Aを読み込むことができます。
一方で、文字列数を指定せずに配列に直接読み込もうとすると
Sub Sample1()
Dim buf() As String
ReDim buf(0)
Open "D:\text.txt" For Binary As #1
'Seek #1, 9
Get #1, , buf
Close #1
'MsgBox buf 'ABCを返します
End Sub
なぜか最初の2文字をスキップして
最後の10文字である
3456789ABあ
が読み込まれます。
なぜ最初の二文字が読み込めなかったのでしょうか?
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
> ということなのですがなぜ-1する必要があるのでしょうか?
二進数の1111111111111111が十進でいくつかを計算するのに、2^15+2^14+・・・+2^2+2^1+2^0と計算するのが面倒なので、1を足せば10000000000000000になるので、2^16と簡単に計算できます。ここからさっきの1を引きます。十進数2桁の最大数値が99なのと比較して考えてみてください。

No.6
- 回答日時:
文字列型変数の先頭に文字列の長さが書かれているのは、言語の実装の慣習的なものもあります。
これがCだと文字列型というかchar型の配列で扱われますが、長さを書かない代わりに終端マークとして0x00を付加します。なのでCでは文字列の中に0x00自身を入れることはできません。その一方でVBのように長さを先頭に書く実装になっている言語では、入れられるデータ値に制限がない代わりに常に長さを示す値を入れておくメモリを余分に消費する…とも考えられます。
もう今となってはGB単位でメモリを積んでいるのが当たり前なので、ここで1バイト2バイトけちった程度では全く大勢に影響しませんけど、これら言語が生まれた当時はメモリ空間が全体でも64KBしかなかった頃だったりするので、とにかくどうやって省メモリ化するかは至上命題であったという背景があります。
No.5
- 回答日時:
> 散々検索して調べたのですが見つかりませんでした。
VBA付属のヘルプは見ない主義なのでしょうか?Getステートメントの説明に書いてあるのですが。
> 二桁だけだとファイルサイズに上限ができてしまうことになります
レコードサイズだと、先の回答に書いたのですが。ファイルサイズではないです。
レコードサイズには、2^16-1=65535という上限が出来ます。
No.4
- 回答日時:
> 2だけ小さいですがなぜでしょうか?
うっかりしてました。「レコード=長さを表す2バイト+データ本体」で、レコード長=12849なので、データ長は12847になります。
> 12から&H3231が計算される理由もよく分からないのですが
"1" の文字コード &H31、"2" の文字コード &H32 です。 参考: https://ja.wikipedia.org/wiki/ASCII
順番は、先頭か下位桁で後ろが上位桁なので(参考:リトルエンディアン)、&H3132じゃなくて &H3231 になります。
No.3
- 回答日時:
> 長さとは何の長さのことでしょうか?
> ファイルサイズではないし、文字列サイズでもないし、一体なんでしょうか?
レコードサイズですね。Getの処理単位です。文字列変数に読み込んだ場合は、文字列サイズがそうなります。
buf(0)に読み込んだ後では、buf(0)の文字列長が、"12" つまり &H3231 つまり 12849 になるはずです。msgbox len(buf(0)) して確認してみてください。
ご回答ありがとうございます。
Lenで調べてみると12847になりました。
2だけ小さいですがなぜでしょうか?
12から&H3231が計算される理由もよく分からないのですが
どういう計算をしているのでしょうか?
検索してもかかりませんでしたが
どこのページに書かれてありますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
VBAでの Replace関数で、ワイル...
-
EXCELで=より左の文字を一括で...
-
【Excel VBA】複数ある特定の文...
-
16表記の文字列を数字に直した...
-
VBA2005 16進を2桁で表示したい。
-
変数に入れた文字列(定数)で書...
-
OnTime 使用時のプロシージャへ...
-
文字列からタブコードを取り除...
-
エクセルで文字列の最大値を抽...
-
LEFT関数で文字数を指定しない...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルVBAで特定の文字列が見...
-
ヒアドキュメントのEOLとEOMの違い
-
C++のdefine文の使い方の質問で...
-
漢数字に変換するプログラム
-
C# 巨大な文字列の計算をさせたい
-
Excelで指数表現しないようにす...
-
アクセスで特定の数字以外(複...
-
bashスクリプトでの文字列から...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報
ありがとうございます。
長さとは何の長さのことでしょうか?
ファイルサイズではないし、文字列サイズでもないし、一体なんでしょうか?
ありがとうございます。
ファイルサイズの計算の仕方は理解できました。
テキストファイルをバイナリデータと読み込もうとしているから
最初に二桁をファイルサイズとして認識してしまっているのだと思いますが
このことってどこかのページか書籍に書かれていますか?
散々検索して調べたのですが見つかりませんでした。
二桁だけだとファイルサイズに上限ができてしまうことになります、
これよりももっと大きなサイズのファイルにはどのようにして扱うのでしょうか?
というかどういう時にファイルの頭二桁をサイズにして使用されるのでしょうか?
ありがとうございます。
2^16-1=65535という上限
ということなのですがなぜ-1する必要があるのでしょうか?
-1はどこから来た数値なのでしょうか?