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 |
>INPUT関数はカンマ編集しか出来ないものなのでしょうか? はい、そうです。 ヘルプの活用を是非覚えてください。 ヘルプより メモ Input # ステートメントを使用してファイルから変数へデータを正しく 読み込むことができるように、データをファイルに書き込む場合は、 Print # ステートメントではなく、必ず Write # ステートメントを使用してください。 Write # ステートメントを使用すると、ファイルにデータを書き込むときに 各データ項目の間に正しくカンマ (,) が挿入されます。 |
よろずやさん早速のご返事有難うございます。 少し私の説明が悪かったかも知れません。 読み込みのデータがタブ形式で入って来るのですが、以下のような一括変換のTransfertextを使わずにデータを一項目毎に読み込んで対応する手段は無いものなのでしょうか? DoCmd.TransferText acExportDelim, "標準出力","受注", "C:\Txtfiles\April.doc" |
>データを一項目毎に読み込んで対応する手段は無いものなのでしょうか? 一行ずつ読み込めば、Split 関数で vbTab を使って切り分けることが できますよ。 |
▼イケガミ さん: >>データを一項目毎に読み込んで対応する手段は無いものなのでしょうか? > >一行ずつ読み込めば、Split 関数で vbTab を使って切り分けることが >できますよ。 イケガミさんありがとう御座います。 Split関数を教えていただいた結果HELPにて Line Input #filenumber, varname を見つけることが出来ました。 これで行けばdelimiterが何であっても対応が出来る予想が付きました。 Split関数とLine Input #関数の組み合わせでプログラムすれば、EXECLのTEXT変換を越えることが出来そうです。 ありがとう御座いました。 結果を又報告させていただきます。 |
昨日のご回答によってPCで検索しても意味がわからず、一日本屋をあさっておりました。 その結果なのですが、どうしてもイケガミさんの言われるSplitでは難しい状況です。 理由はSplit関数は文字どおりDelimiterがあるところまでを切り離してくれるのかと考えておりましたが、Delimiterの文字を置き換えることしか出来ないようです。 つきましては一番やりたくないと考えていた INPUT文にて一文字ごとに改行かラインフィードかDelimiterかを判断して項目を見極めるしかないようで、ゴリゴリプログラムするしかないのでしょうか? 説明がうまく伝わっていないかも知れないと思いますが、EXECLを起動してTEXTファイルを開くときに自由に設定できるDelimiterをACCESSで実現させたいと考えていたのですが。 いかがでしょうか? |
>理由は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 これで、きちんと分割されますよね? |
イケガミさんご丁寧にご指導いただきありがとう御座いました。 完璧に出来そうです。 実は一文字づつ読み込んで判定して出来上がったのですが、あまりにもコーディングが汚く結果文をカキコするつもりでお邪魔いたしました。 私の理解不足でお手を煩わせてしまい誠に申し訳ありませんでした。 お陰で、思い通りの結果を得ることが出来そうです。 どうもありがとう御座いました。 |