• ベストアンサー

TYPE分の使い方で

Visual Basic 6.0です。 バイナリーファイルを読むのに使用するため 下記のようなType宣言をしています。 今 KOUMOKU は String * 10で宣言しているのですが 読み込むファイルでいろいろあるので (*8,*6,*4など) たくさんのType分を作っているのですが 一つのType分で宣言できる方法はないでしょうか。 Type TYPEA KOUMOKU As String * 10 <-この10が任意で可変できないでしょうか NAMAE As String * 20 BUKA As String * 5 End Type

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

  • ベストアンサー
noname#221368
noname#221368
回答No.1

 可変にはできません。だから発想の転換をしましょう。以下は、読み込むバイナリ・ファイルの出力も、自分でやる事を前提にします。  バイナリ・ファイルの読み込みはもともと、バイト並びの区切りを、全て知っている事が前提になります。だったら、その文字数もIntegerなんかで文字列の直前に、バイナリ・ファイルに書いとけばいいと思いませんか?。  VB6にも、指定文字数分だけ、バイナリ・ファイルから文字列を読み出す関数があります。こういうファイルを、自己格納型と言います。  Stringは可変長文字列ですし、今ではアスキー形式なのか、ユニコード形式での書き込みなのかの違いすらあります。にも関わらず、文字数を指定しただけで、バイナリ・ファイルから文字列を正確に読み出せる関数が存在するという事は、アスキー形式であるか、ユニコード形式であるかも、Stringを Put した場合、自動で文字列の直前に書いてあるんですよ。この発想を利用しましょう。  ちなみに、Put のヘルプの後半が読んでみて下さい。自己格納型の感覚が、なんとなくでもわかります。

obone
質問者

お礼

ありがとうございました。 参考になりました。 ただ私の説明不足でした。 バイナリファイルの出力はすべてすでに出力されたもしか存在しないので次回に生かしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラムの記述方法について

    プログラム初心者です。 よろしくお願いいたします。 数個の変数を構造体で定義し、そのメンバ名を 順に実行させたいのですができますでしょうか? type koumoku a1 as string a2 as string a3 as string End type Sub main() koumoku.a1="egg" koumoku.a2="book" koumoku.a3="ohasi" Dim syori as string syori = koumoku.a1 ※ここでeggを用いた処理を実施   syori = koumoku.a2 ※ここでbookを用いた処理を実施 syori = koumoku.a3 ※ここでohasiを用いた処理を実施 End sub 上記で実施している構造体のメンバ(a1~a3)は 繰り返し処理するので、繰り返し文にしたいと 思っていますが、そのような考えは間違っているでしょうか? 実際には、a1~a10など増やしたいと思っています。 また、不完全なコーディングですが誤りがあればご指摘いただきたく 何卒よろしくお願いいたします。

  • VB6で、一次元配列と二次元配列の相互コピー

    VB6で、一次元配列と二次元配列の相互コピーをしたいです。 (1)元々下記のような宣言をもつ配列がありました。 Public Type TKey no As String id As String code As String atr() As String End Type Public Type tr Key As TKey atr() As String abc As Boolean End Type Public gtr() As tr (2)コピー用に、下記のような二次元配列用宣言をつくりました。 Public Type TKey2 2no As String 2id As String 2code As String a2tr() As String End Type Public Type 2tr Key22 As TKey2 atr22() As String abc22 As Boolean End Type Public g2tr() As 2tr (3)  (1)から(2)にデータを複製したり、 (4)  (2)から(1)にデータを複製したいです。 今は、下記のように面倒くさいことをしています。 dim gtr(maxcnt) ReDim Preserve g2tr(500, maxcnt) ループ g2tr(cnt, i).Key22.2code = gtr(i).Key.code ・・・(3) gtr(i).Key.code = g2tr(j, i).Key22.2code ・・・(4)       今は上記を全ての宣言の配列に実行しています。 なにかもっと効率のよい方法はないでしょうか。 (1)の配列は、1~500くらいはあり、不定です。

  • ExcelでのVisual Basicのプログラミング

    ExcelでのVisual Basicのプログラミングでモンスターが乱数で攻撃をしてHPを減らすものを作りたいのですがどうすればいいのでしょうか?ちなみにここまで出来ました。 Type Monster namae as String kougeki as Integer bougyo as Integer HP as Integer End Type Dim dragon as Monster, doragon2 as Monster dragon.namae = "red" dragon.kougeki = 50 dragon.bougyo = 50 dragon.HP = 100 dragon2.namae = "blue" dragon2.kougeki = 10 dragon2.bougyo = 10 dragon2.HP = 50 If dragon.kougeki > 50 Then MsgBox "fire"

  • ExcelVBAで初期値のセット

    ExcelVBAで初期値のセット Typeで定義したデータタイプの変数にConstで初期値をセットしたいのですがどのようにしたら良いのでしょうか。 例えば Public Const Sdata As String = "AAAAA" Public Const Idata As Long = 1 これはできますが、 Type typeA Sdata As String Idata As Long End Type Public Const Adata As typeA = "AAAAA",1 これはできません。 Typeで定義したデータ型にいるれ方法をお教えください。 ExcelVBA Type Const で検索してみましたが見つけきれませんでした。

  • 関数の引数に複数のユーザ定義型変数を使いたい

    一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか? Public Type TypeA strCodeA As String intNumA As Integer End Type Public Type TypeB strCodeB As String intNumB As Integer End Type Public Function funcTest(arg1 As Variant) As Integer (略) End Function と記述して関数を Dim datA As TypeA iResult = funcTest(datA) と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。 コンパイルエラー: パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • 表(縦横)形式データを配列にしたい

    Type GYO ' 文字列要素 gyono As String ' 項番 hinmei As String ' 品名 hinmeicode As String ' 品名コード hinmeicnt As String ' 数量 End Type 行数可変であれば以上の様に列の定義をし、行はgyo(i) i=1,2,3,4とすればよいのですが、列も可変なのです。 この場合、どのように定義すればよいのでしょうか?

  • エクセル2007でVBAが動きません、助けて下さい

    先日、使用していたエクセルを2003から2007に変更した所、 オブジェクトのテキストが読み込めなくなってしまいました。 マクロの記録なども試したのですが、問題が解決せず 困っています。 原因が分かる方が入らしたら、ぜひとも教えてください。 =================================== Sub namae() Dim namae1 As String Dim namae2 As String namae1 = Application.Caller namae2 = ActiveSheet.Shapes(namae1).TextFrame.Characters.Text MsgBox namae2 End Sub

  • 文字列をSplitを使って区切りたい。 ","

    "," で区切られた文字列をSplitを使って区切りたいのですが。 例. "abc","123d","fr44","1erg" Dim Arr_Koumoku as string() Dim delimiter as string delimiter = Chr(34) & Chr(44) & Chr(34) 'delimiter = """,""" "← これでも結果は同じだった Arr_Koumoku = Arr_Kaigyo(i).Split(delimiter) とやると。 Arr_Koumoku(0) =   Arr_Koumoku(1) = abc Arr_Koumoku(2) = , Arr_Koumoku(3) = 123d Arr_Koumoku(4) = , Arr_Koumoku(5) = fr44 Arr_Koumoku(6) = , ・・・・ と区切られてしまいます。 Arr_Koumoku(0) ="abc" Arr_Koumoku(1) ="123d" Arr_Koumoku(2) ="fr44" Arr_Koumoku(4) ="1erg" としたいのですが。アドバイスを頂けたら幸いです。 開発環境 WindowsXP SP2 Visual Studio 2005 Standard Edition SP1

  • ファイルサイズ固定の保存方法

    ファイルサイズを固定にしてバイナリ形式で保存を したいのですが、 Public Type typTest   iData as integer   lData as Long   stData as String   sData as Single end Type ↑の構造体をバイナリ形式で保存をしてそのファイルサイズを20バイトにしたいと思っています。 stDataに"Test"という文字を半角で保存した時は14バイトで、 全角にした時は18バイトになってしまいます。 stDataを10バイト固定にする方法はありますでしょうか? 宜しくお願いします。