過去ログ

                                Page     421
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼INPUT関数について  COBOL 03/10/28(火) 18:26
   ┗Re:INPUT関数について  よろずや 03/10/29(水) 12:50
      ┗Re:INPUT関数について  COBOL 03/10/30(木) 3:18
         ┗Re:Split 関数  イケガミ 03/10/30(木) 8:29
            ┗Re:Split 関数  COBOL 03/10/30(木) 15:40
               ┗Re:やはり INPUT文で対処になります。  COBOL 03/10/31(金) 16:07
                  ┗Re:やはり INPUT文で対処になります。  イケガミ 03/10/31(金) 16:39
                     ┗Re:やはり INPUT文で対処になります。  COBOL 03/11/5(水) 14:24

 ───────────────────────────────────────
 ■題名 : INPUT関数について
 ■名前 : COBOL
 ■日付 : 03/10/28(火) 18:26
 -------------------------------------------------------------------------
   始めましてCOBOLといいます。
最近ACCESS2002SP−1ではまってしまいました。
以下のVBAを作って動かしたところ

Input #1, str005

の命令でstr005に入るのが、カンマ編集は正常に動作するのですが、chr(9)のタブ編集はまったく切り分け出来ないという症状です。
INPUT関数はカンマ編集しか出来ないものなのでしょうか?
宜しくお願いします。


以下は現状の作成しているVBAです。

Public Function データSET()
  
  Dim cnn     As New ADODB.Connection
  Dim rs     As New ADODB.Recordset
  Dim rs1     As New ADODB.Recordset
  
  Dim str001(255) As String      'フィールド名
  Dim str002   As String      'PASS
  Dim str003   As String      'ファイル名
  Dim str004(255) As String      'フィールド位置
  Dim str005   As String
  Dim str006   As String      '表題の扱い

  Dim num001   As Long       '位置ワーク
  Dim num002   As Long       '位置ワーク(data)
  Dim num003   As Long       '位置ワーク(出力)
  Dim num004   As Long       '入力アイテム
  
  Set cnn = CurrentProject.Connection
  
  str002 = GetOption("Option_2")   'PASS & ファイル名
  str006 = GetOption("Option_5")   '表題の扱いについて
  
  On Error GoTo err_a10
  Open CStr(str002) For Input As #1
sta_a10:
'-------------------------------------------------項目の数をチェック num005
  num005 = 0
  Do Until EOF(1)
    str005 = Input(1, #1)
    If str005 = Chr(13) Then
      num005 = num005 + 1
      Exit Do
    Else
      If str005 = "," Or str005 = Chr(9) Then
        num005 = num005 + 1
      End If
    End If
  Loop
  Close #1
  Open CStr(str002) For Input As #1
  
  rs.Open "A023_項目ファイル", cnn, adOpenStatic, adLockOptimistic, adCmdTableDirect
  rs.Index = "KEY01"
  
  rs1.Open "sheet1", cnn, adOpenStatic, adLockOptimistic, adCmdTableDirect
   
'-------------------------------------------------取り込み項目、位置取得
  num001 = 0
  Do Until rs.EOF
    If rs![check] = True Then
      num001 = num001 + 1
      str001(num001) = rs![項目]
      str004(num001) = rs![位置]
    End If
    rs.MoveNext
  Loop
  
  If num001 = 0 Then
    MsgBox ("項目が選択されていません1項目以上は選択してください。 ")
    Exit Function
  End If
    
  If str006 = "表題を一行目とする" Then
  Else
    GoTo sub_a10
  End If
'-------------------------------------------------1行目のデータ(表題部分)読み飛ばす
  num005 = 0
  Do Until EOF(1)
    str005 = Input(1, #1)           '一文字GET
    If str005 = Chr(13) Then
      num005 = num005 + 1
      Exit Do
    Else
      If str005 = "," Or str005 = Chr(9) Then
        num005 = num005 + 1
      End If
    End If
  Loop
   
'-------------------------------------------------データ取り込み
sub_a10:
  rs1.AddNew
  num002 = 0
  Do Until EOF(1)
    Input #1, str005              '一項目GET
    num002 = num002 + 1
    If num002 > num005 Then
      num002 = 1
      rs1.Update
      rs1.MoveNext
      rs1.AddNew
      GoSub sub_b10
    Else
      GoSub sub_b10
    End If
  Loop
  rs1.Update
  Close #1
  cnn.Close
  Exit Function
  
sub_b10:
  num003 = 0
  Do Until num001 = num003
    num003 = num003 + 1
    If str004(num003) = num002 Then
      If str005 = "" Then
        rs1(str001(num003)) = ""
      Else
        rs1(str001(num003)) = str005
      End If
    End If
  Loop
  Return
  
err_a10:
  MsgBox Err.Description
  Resume sta_a10
end_a10:

End Function

 ───────────────────────────────────────  ■題名 : Re:INPUT関数について  ■名前 : よろずや  ■日付 : 03/10/29(水) 12:50  -------------------------------------------------------------------------
   >INPUT関数はカンマ編集しか出来ないものなのでしょうか?
はい、そうです。

ヘルプの活用を是非覚えてください。

ヘルプより
メモ  Input # ステートメントを使用してファイルから変数へデータを正しく
読み込むことができるように、データをファイルに書き込む場合は、
Print # ステートメントではなく、必ず Write # ステートメントを使用してください。
Write # ステートメントを使用すると、ファイルにデータを書き込むときに
各データ項目の間に正しくカンマ (,) が挿入されます。

 ───────────────────────────────────────  ■題名 : Re:INPUT関数について  ■名前 : COBOL  ■日付 : 03/10/30(木) 3:18  -------------------------------------------------------------------------
   よろずやさん早速のご返事有難うございます。
少し私の説明が悪かったかも知れません。
読み込みのデータがタブ形式で入って来るのですが、以下のような一括変換のTransfertextを使わずにデータを一項目毎に読み込んで対応する手段は無いものなのでしょうか?

DoCmd.TransferText acExportDelim, "標準出力","受注", "C:\Txtfiles\April.doc"

 ───────────────────────────────────────  ■題名 : Re:Split 関数  ■名前 : イケガミ  ■日付 : 03/10/30(木) 8:29  -------------------------------------------------------------------------
   >データを一項目毎に読み込んで対応する手段は無いものなのでしょうか?

一行ずつ読み込めば、Split 関数で vbTab を使って切り分けることが
できますよ。

 ───────────────────────────────────────  ■題名 : Re:Split 関数  ■名前 : COBOL  ■日付 : 03/10/30(木) 15:40  -------------------------------------------------------------------------
   ▼イケガミ さん:
>>データを一項目毎に読み込んで対応する手段は無いものなのでしょうか?
>
>一行ずつ読み込めば、Split 関数で vbTab を使って切り分けることが
>できますよ。

イケガミさんありがとう御座います。
Split関数を教えていただいた結果HELPにて
Line Input #filenumber, varname
を見つけることが出来ました。
これで行けばdelimiterが何であっても対応が出来る予想が付きました。

Split関数とLine Input #関数の組み合わせでプログラムすれば、EXECLのTEXT変換を越えることが出来そうです。

ありがとう御座いました。
結果を又報告させていただきます。

 ───────────────────────────────────────  ■題名 : Re:やはり INPUT文で対処になります。  ■名前 : COBOL  ■日付 : 03/10/31(金) 16:07  -------------------------------------------------------------------------
   昨日のご回答によってPCで検索しても意味がわからず、一日本屋をあさっておりました。
その結果なのですが、どうしてもイケガミさんの言われるSplitでは難しい状況です。

理由はSplit関数は文字どおりDelimiterがあるところまでを切り離してくれるのかと考えておりましたが、Delimiterの文字を置き換えることしか出来ないようです。

つきましては一番やりたくないと考えていた INPUT文にて一文字ごとに改行かラインフィードかDelimiterかを判断して項目を見極めるしかないようで、ゴリゴリプログラムするしかないのでしょうか?

説明がうまく伝わっていないかも知れないと思いますが、EXECLを起動してTEXTファイルを開くときに自由に設定できるDelimiterをACCESSで実現させたいと考えていたのですが。 いかがでしょうか?

 ───────────────────────────────────────  ■題名 : Re:やはり INPUT文で対処になります。  ■名前 : イケガミ  ■日付 : 03/10/31(金) 16:39  -------------------------------------------------------------------------
   >理由はSplit関数は文字どおりDelimiterがあるところまでを切り離してくれるのかと考えておりましたが、Delimiterの文字を置き換えることしか出来ないようです。

私が質問の意味を理解してないのかな?

Sub Splitテスト()

  Dim string1 As String
  Dim varItem As Variant
  Dim lngIdx As Long
  
  string1 = "1" & Chr(9) & "2" & Chr(9) & "3"
  varItem = Split(string1, Chr(9), , vbTextCompare)
  
  For lngIdx = 0 To UBound(varItem)
    Debug.Print varItem(lngIdx)
  Next lngIdx
  
End Sub

これで、きちんと分割されますよね?

 ───────────────────────────────────────  ■題名 : Re:やはり INPUT文で対処になります。  ■名前 : COBOL  ■日付 : 03/11/5(水) 14:24  -------------------------------------------------------------------------
   イケガミさんご丁寧にご指導いただきありがとう御座いました。
完璧に出来そうです。

実は一文字づつ読み込んで判定して出来上がったのですが、あまりにもコーディングが汚く結果文をカキコするつもりでお邪魔いたしました。

私の理解不足でお手を煩わせてしまい誠に申し訳ありませんでした。
お陰で、思い通りの結果を得ることが出来そうです。
どうもありがとう御座いました。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 421