Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10428 / 13644 ツリー ←次へ | 前へ→

【21889】Seek関数を使いこなすには umebaind 05/2/2(水) 20:17 発言[未読]
【21892】Re:Seek関数を使いこなすには ちゃっぴ 05/2/2(水) 20:51 回答[未読]
【21897】Re:Seek関数を使いこなすには ichinose 05/2/3(木) 7:47 発言[未読]

【21889】Seek関数を使いこなすには
発言  umebaind E-MAIL  - 05/2/2(水) 20:17 -

引用なし
パスワード
   始めまして、UMEBAINDといいます。
VBAは初心者なもので教えていただきたいのですが、
以下のようなプログラムを作りSEEK関数を利用して
ファイルから検索している文字が見つかれば
新たに検索する文字を入れ替え
見つかった行のその次の行から検索し処理を
短時間で終了させるような事をやりたいのですが
<<<このPGの本体とも言うべきプログラムは約25万件の処理を
行う為>>>
どうかご教授ください。
よろしくお願いします。


Sub FSEEK()
'MsgBox "引数=" & Mails
  Dim s As String
  Dim MyArray
  Dim d
  s = CurDir          'カレントフォルダを取得する
  MyArray = Split(s, "\", -1) 'カレントフォルダを"¥"で分割する
  'カレントフォルダを再構成する
  s = MyArray(0) & "\" & MyArray(1) & "\" & MyArray(2) & "\" & "デスクトップ\ファイルシーク"
  
  ChDir s           'カレントフォルダを変更する
  Dim strFILENAME2 As String
  strFILENAME2 = s & "\FILESEEK2.txt"

  Dim strREC 'オーバーフローの為
  
  Dim setlist As Variant     'SPLITの戻り値はバリアント型の為
  Dim n, comt, counter
 
  'strFILENAME2 = s & "\FILESEEK2.txt"
  Dim intFileno As Integer
  Dim i
  Dim jjj As Variant
  Dim uuu As Long
  Dim dse, A1, A2 As String
  Open strFILENAME2 For Input As #1
  Dim strtest
  Dim ddd As String
  Dim FPos As Long
  
  counter = 0
  i = 1
  Do Until EOF(1)
    
    Line Input #1, strREC
    
    jjj = Split(strREC, ",")
    dse = jjj(1)

A1 = "6columsyori"
A2 = "12columsyori"

    If StrComp(dse, A1) = 0 Then
      
      MsgBox i & "行目" & "で見つかりました!" & A1 & "行目の処理:" & Loc(1)
    
      FPos = Seek(1)
      
      MsgBox FPos & "⇔本当の現在位置"
      
      A1 = ""
      A1 = A2 '処理の入れ替え
      Seek #1, FPos + 1 '見つかった位置から検索する
    
    End If
    i = i + 1
   
  Loop
  
'
  Close #intFileno


End Sub

データは以下のファイルです。・**************************************

\FILESEEK2.txt

1FILESEEKTESTNOW,1columsyori
2FILESEEKTESTNOW,2columsyori
3FILESEEKTESTNOW,3columsyori
4FILESEEKTESTNOW,4columsyori
5FILESEEKTESTNOW,5columsyori
6FILESEEKTESTNOW,6columsyori
5FILESEEKTESTNOW,7columsyori
5FILESEEKTESTNOW,8columsyori
9FILESEEKTESTNOW,9columsyori
10FILESEEKTESTNOW   ,10columsyori
11FILESEEKTESTNOWSEEEK ,11columsyori
12FILESEEKTESTNOW   ,12columsyori
13FILESEEKTESTNOWSEEEK,13columsyori
14FILESEEKTESTNOW   ,14columsyori
15FILESEEKTESTNOW   ,15columsyori
16******************** ,16columsyori
17    uu         ,17columsyori
18 uuuu           ,18columsyori
19FILESEEKTESTNOW,19columsyori
20FILESEEKTESTNOW,20columsyori
21FILESEEKTESTNOW,21columsyori
22FILESEEKTESTNOW,22columsyori
23    g           ,23columsyori
24    g            ,24columsyori
25    g            ,25columsyori
26    g            ,26columsyori
27    g            ,27columsyori
28    g            ,28columsyori
29    g            ,29columsyori
30    g            ,30columsyori

【21892】Re:Seek関数を使いこなすには
回答  ちゃっぴ  - 05/2/2(水) 20:51 -

引用なし
パスワード
   変更するFileはCSVのようですが、処理速度を求めるなら
CSVは非常に不利です。

固定長で保存する形式であれば、Addressで直接置き換えることが
出来ますが、可変長の記憶形式の場合、File全体を再度書き込まなければ
なりません。

また、どうしてもCSVでというのであれば、Binaryで読み込む方法も
考慮してもいいかも知れません。

あと、文字列の結合処理は非常に処理の重たい動作となります。
(& でつなぐことです。)
Join関数、Mid Statementを使用するなどして高速化しましょう。

【21897】Re:Seek関数を使いこなすには
発言  ichinose  - 05/2/3(木) 7:47 -

引用なし
パスワード
   umebaind さん、ちゃっぴさん、おはようございます。

>以下のようなプログラムを作りSEEK関数を利用して
>ファイルから検索している文字が見つかれば
>新たに検索する文字を入れ替え
>見つかった行のその次の行から検索し処理を
>短時間で終了させるような事をやりたいのですが
><<<このPGの本体とも言うべきプログラムは約25万件の処理を
>行う為>>>
処理時間を短くする方法は、ちゃっぴさんの投稿にもありましたが、
一回の読込で複数行読み込んでしまう方法があるとは思います。
(アルゴリズムに工夫が必要ですが)。
でも、その前にumebaind さんが投稿されたコードで
1行づつ読み込んだ手法で正常に動作するコードを作ってみてはいかがですか?

見せていただいた限りでは、
SEEK関数及び、SEEKステートメントを使用する意味が私には
わかりませんでした。
入力データもご提示されているので
再現しやすいご質問なのですが、
ご希望の結果も記述されるともっとよかったと思いますよ!!

>Sub FSEEK()
>'MsgBox "引数=" & Mails
>  Dim s As String
>  Dim MyArray
>  Dim d
>  s = CurDir          'カレントフォルダを取得する
>  MyArray = Split(s, "\", -1) 'カレントフォルダを"¥"で分割する
>  'カレントフォルダを再構成する
>  s = MyArray(0) & "\" & MyArray(1) & "\" & MyArray(2) & "\" & "デスクトップ\ファイルシーク"
>  
>  ChDir s           'カレントフォルダを変更する
>  Dim strFILENAME2 As String
>  strFILENAME2 = s & "\FILESEEK2.txt"
>
>  Dim strREC 'オーバーフローの為
>  
>  Dim setlist As Variant     'SPLITの戻り値はバリアント型の為
>  Dim n, comt, counter
> 
>  'strFILENAME2 = s & "\FILESEEK2.txt"
>  Dim intFileno As Integer
>  Dim i
>  Dim jjj As Variant
>  Dim uuu As Long
>  Dim dse, A1, A2 As String
>  Open strFILENAME2 For Input As #1
>  Dim strtest
>  Dim ddd As String
>  Dim FPos As Long
>  
>  counter = 0
>  i = 1
>  Do Until EOF(1)
>    
>    Line Input #1, strREC
    debug.print strrec
'   として、Seekステートメントが実行された
'   直後の「strREC」の中身を確認して下さい
'   たぶん、umebaind さんが意図している内容とは違うと思います
>    
>    jjj = Split(strREC, ",")
>    dse = jjj(1)
>
>A1 = "6columsyori"
>A2 = "12columsyori"
'↑これは、ここにあると
'常に"6columsyori"を調査してしまいますよね
'これは、たぶん、わかってらしてやっているとは思いますが・・・。

>
'     カンマ区切りの2列目のデータのみ検索する仕様でよいのですか?
>    If StrComp(dse, A1) = 0 Then
>      
>      MsgBox i & "行目" & "で見つかりました!" & A1 & "行目の処理:" & Loc(1)
>    
>      FPos = Seek(1)
>      MsgBox FPos & "⇔本当の現在位置"
>      
>      A1 = ""
>      A1 = A2 '処理の入れ替え
>      Seek #1, FPos + 1 '見つかった位置から検索する
>    
>    End If
>    i = i + 1
>   
>  Loop
>  
>'
>  Close #intFileno
>
>
>End Sub

仕様が

>ファイルから検索している文字が見つかれば
>新たに検索する文字を入れ替え
>見つかった行のその次の行から検索し処理

であれば、SEEKステートメントの処理は不要だと思いますが・・・。
一行読み込んだ時点でカレントポインタは、次の行の先頭に
なっていますから・・・。

10428 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free