[リストへもどる]
一括表示

投稿時間:2003/03/31(Mon) 12:20
投稿者名:
URL :http://moonless.infoseek.livedoor.com/
タイトル:
気になったコードについて
おはつにお目にかかります。
龍と申します。
よろしくお願いします。

さて、私はこのページに初めて訪れ、
なにやらVBプログラムについての説明があるようなので、
ちょっと色々と見ていたんですが、
少し気になったことがあったのでここに記述いたします。

■リンク
Excel & Word関係 ⇒ エクセルの表をクリップボード経由でVBに貼り付け活用

■プログラム
テキストファイルをオープンし、
配列変数にデータを割り当て、
(配列変数を使用せず)データをテキストボックスに貼り付けている箇所。

  '使用可能なファイル番号を取得
  lngFileNo = FreeFile
  'テキストファイルをオープン
  Open "C:\sample.txt" For Input As #lngFileNo
  ' ファイルの終端までループを繰り返します。
  Dim myText(6, 6) As String
  Dim k As Integer
  j = 0
  Do While Not EOF(lngFileNo)
    '1 行づつ変数に読み込みます。
    Line Input #lngFileNo, strMyTxt
    j = j + 1: k = 1
    For i = 1 To Len(strMyTxt)
      '貼り付けた表の項目はタブで区切られているので
      If Mid$(strMyTxt, i, 1) <> vbTab Then
        'タブが見つかるまで文字をつなぎ変数に格納
        myText(j, k) = myText(j, k) + Mid$(strMyTxt, i, 1)
      Else
        k = k + 1
      End If
    Next i

  ' 読み込んだファイルを1行づつテキストボックスに表示します。
    Text2.Text = Text2.Text & strMyTxt & vbCrLf
  Loop

  'ファイルを閉じる
  Close #lngFileNo

■気になった点
配列変数を使用していないということもですが、
まず、配列に格納する方法として、
なぜSplit関数を用いてないのか、という点です。

やるなら、

'配列取得用変数の宣言
Dim varArray as Variant

'myText(6, 6)と宣言すると、
'0 〜 6までの7個の配列がメモリバッファに割り振られてしまうため、
'1 〜 6までしか使用しないのであれば、(1 to 6, 1 to 6) とすべき。
Dim myText(1 to 6, 1 to 6) As String

  lngFileNo = FreeFile
  j = 0
  Open "C:\sample.txt" For Input As #lngFileNo
    Do Until EOF(lngFileNo)
      j = j + 1
      Line Input #lngFileNo, strMyTxt
      'タブを区切り文字として、配列文字列の取得
      varArray = Split(strMyTxt, vbTab)
      '配列を割当てる
      For i = 0 to UBound(varArray) Step 1
        myText(j, i + 1) = varArray(i)
      Next i
      '配列の削除
      Erase varArray
    Loop
  Close #lngFileNo

と、こうした方が、
一文字ずつ読む必要もなく、
コードも見やすく、
また、処理速度も速いと思われますが。

どうでしょう?

それとも、
一文字ずつ読み込む必要があっての記述であれば、
このカキコは削除されても結構です。

投稿時間:2003/03/31(Mon) 13:46
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: 気になったコードについて
Split関数はVB6.0からだったと思います。
Variant使用も互換の問題があります。

また、このサンプルの目的はExcel操作ですから、
Tab区切りの文字列を2次元配列に入れる操作に
関して、特に最適化する必要もないと思われます。

投稿時間:2003/03/31(Mon) 16:04
投稿者名:
URL :http://moonless.infoseek.livedoor.com/
タイトル:
Re^2: 気になったコードについて
> Split関数はVB6.0からだったと思います。
> Variant使用も互換の問題があります。

なるほど。
VBは6.0からしかやったことがないため、
それは存じませんでした。


> また、このサンプルの目的はExcel操作ですから、
> Tab区切りの文字列を2次元配列に入れる操作に
> 関して、特に最適化する必要もないと思われます。

それに関しては了解しています。
ただ気になっただけなので。

投稿時間:2003/03/31(Mon) 14:57
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 気になったコードについて
ご指摘ありがとうございます。
ここのコードはできるだけ機種依存しない方法で作成しております。
又、そのコードが必要な人が理解し易い方法をと思って記入しております。
まあ、貴方様のように高レベルの方が参考にはされないので実害はないかと
思っております。
後はLantern さんが書かれたようにVB5.0でも使用できるようにしております。

投稿時間:2003/03/31(Mon) 16:06
投稿者名:
URL :http://moonless.infoseek.livedoor.com/
タイトル:
Re^2: 気になったコードについて
> ここのコードはできるだけ機種依存しない方法で作成しております。
> 又、そのコードが必要な人が理解し易い方法をと思って記入しております。

機種依存やらなにやらの話はまったく考えておりませんでした。
ありがとうございます。


> まあ、貴方様のように高レベルの方が参考にはされないので実害はないかと
> 思っております。

高レベルではないですよ(笑
分からないことがあったので、
それを調べるために、
ネットサーフィンしていたんですから。

投稿時間:2003/03/31(Mon) 16:30
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 気になったコードについて
 一応計測して見ました。各3回の平均です。

表示部分は両方とも下記で統一しました。
        myTextLine = myTextLine & strMyTxt & vbCrLf
    Loop
    Close #lngFileNo
    Text2.Text = myTextLine

私のサンプルの結果 0.001 秒
貴方のサンプル   0.002 秒
 
 となりました。 多分 Split関数の影響と思われますが

投稿時間:2003/03/31(Mon) 19:34
投稿者名:
URL :http://moonless.infoseek.livedoor.com/
タイトル:
Re^4: 気になったコードについて
>  一応計測して見ました。各3回の平均です。
>
> 表示部分は両方とも下記で統一しました。
>         myTextLine = myTextLine & strMyTxt & vbCrLf
>     Loop
>     Close #lngFileNo
>     Text2.Text = myTextLine
>
> 私のサンプルの結果 0.001 秒
> 貴方のサンプル   0.002 秒
>  
>  となりました。 多分 Split関数の影響と思われますが

あらら(笑

私が書いた方が、
処理速度は下がるんですね。
長所としてはコードの見易さのみ、ですか(笑
#読み込むものによっても変化するでしょうけど。
#それをいうとキリがないので省きます。

いやはや、勉強になりました。

もっと精進しないと。

あ、それと。
これはこのスレとは関係ないのですが、
花ちゃんさん、言葉遣いには注意した方がいいですよ。

> まあ、貴方様のように

とか、
こちらにいる他の人たちみなさん、
「喧嘩売ってんのか、こいつ」
みたいな反応でした。

私のカキコにどこか反発したくなる箇所があったのなら、
それはお詫びいたします。(_ _(--;(_ _(--;

血の気の多い方にそういうレスを返してしまうと、
たちどころに荒らされてしまいますので、
言葉遣いには注意した方がいいと思います。

私に対しての場合に至っては、
そんなに酷いものでない限り、笑って許しますが(笑