Excel VBA質問箱 IV

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

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


8352 / 13646 ツリー ←次へ | 前へ→

【33658】「文字列''が終了していません。」というエラー mon 06/1/17(火) 19:12 質問[未読]
【33661】Re:「文字列''が終了していません。」とい... ichinose 06/1/17(火) 19:59 発言[未読]
【33665】Re:「文字列''が終了していません。」とい... mon 06/1/17(火) 20:11 お礼[未読]
【33668】Re:「文字列''が終了していません。」とい... ichinose 06/1/17(火) 20:46 発言[未読]
【33669】Re:「文字列''が終了していません。」とい... mon 06/1/17(火) 20:58 発言[未読]
【33674】Re:「文字列''が終了していません。」とい... ichinose 06/1/17(火) 21:48 発言[未読]
【33746】Re:「文字列''が終了していません。」とい... mon 06/1/19(木) 20:28 発言[未読]
【33751】Re:「文字列''が終了していません。」とい... ichinose 06/1/19(木) 21:26 発言[未読]
【33756】Re:「文字列''が終了していません。」とい... ichinose 06/1/19(木) 21:55 発言[未読]
【33844】Re:「文字列''が終了していません。」とい... mon 06/1/22(日) 14:02 お礼[未読]

【33658】「文字列''が終了していません。」という...
質問  mon  - 06/1/17(火) 19:12 -

引用なし
パスワード
   以下のようなプログラムをつくり、テキストファイルのデータを1行づつSQLServer上のテーブルにINSERTしようとしています。
仮に、テキストファイルのデータが40行だとすると、40件のデータをINSERTした後 41件目に空データをINSERT使用としてエラーになります。
エラーメッセージは
「文字列''が終了していません。」
となっています。
エラーになった際に発行したSQL文をクエリアナライザで実行するとテーブルにINSERTすることができます。

一体どこがエラーになっているのか自分では分からなくてて・・・


ロジック等 どこがおかしいかお分かりでしたら教えてください。
お願いします。m(_ . _)m


------------------------------------------------------------------

'SQLServerとの接続は既に確立された状態
con.BeginTrans    
   
Dim strDataFile as string
strDataFile = "D:\LOG.txt"
Dim pFileNo As Integer
pFileNo = FreeFile
'ファイルのオープン
Open strDataFile For Random As #pFileNo Len = 40

Do While Not EOF(pFileNo)      

 Get #pFileNo, , mKuni_kani
     
 'SQL文生成
 Dim sql as string
 sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
 
  On Error Resume Next
  con.Execute sql
  If (Err) Then
   con.RollbackTrans
      
   MsgBox Err.Description & vbCrLf & sql
   Err.Clear
   Exit Do
  End If

Loop
Close #pFileNo

If (Err.Number = 0) then
  con.CommitTrans
End If
On Error GoTo 0

【33661】Re:「文字列''が終了していません。」と...
発言  ichinose  - 06/1/17(火) 19:59 -

引用なし
パスワード
   ▼mon さん:
こんばんは。


>以下のようなプログラムをつくり、テキストファイルのデータを1行づつSQLServer上のテーブルにINSERTしようとしています。
>仮に、テキストファイルのデータが40行だとすると、40件のデータをINSERTした後 41件目に空データをINSERT使用としてエラーになります。
>エラーメッセージは
>「文字列''が終了していません。」
>となっています。
>エラーになった際に発行したSQL文をクエリアナライザで実行するとテーブルにINSERTすることができます。
>
>一体どこがエラーになっているのか自分では分からなくてて・・・
>
>
>ロジック等 どこがおかしいかお分かりでしたら教えてください。
>お願いします。m(_ . _)m
>
>


>------------------------------------------------------------------
>
>'SQLServerとの接続は既に確立された状態
>con.BeginTrans    
>   
>Dim strDataFile as string
>strDataFile = "D:\LOG.txt"
>Dim pFileNo As Integer
>pFileNo = FreeFile
>'ファイルのオープン
>Open strDataFile For Random As #pFileNo Len = 40
'何故、テキストファイル(テキストファイルですよね?)を
'ランダムモードでオープンしているのですか?
'通常、テキストファイルには Cr+lfと言うコードが一行の最後に
'入っています。これをも読み込むという計算の上でのことですか?
'あるいは、Cr+lfが元々入っていないファイルなのですか?

>
>Do While Not EOF(pFileNo)      
>
> Get #pFileNo, , mKuni_kani
'           ↑この変数と
'下のSQL文字列の相関はどうなっていますか?

>     
> 'SQL文生成
> Dim sql as string
> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
実際のSQLは↑ではないですよね?
これで40行目までは正しくデータが入っているのですか?


> 
>  On Error Resume Next
>  con.Execute sql
>  If (Err) Then
>   con.RollbackTrans
>      
>   MsgBox Err.Description & vbCrLf & sql
>   Err.Clear
>   Exit Do
>  End If
>
>Loop
>Close #pFileNo
>
>If (Err.Number = 0) then
>  con.CommitTrans
>End If
>On Error GoTo 0

【33665】Re:「文字列''が終了していません。」と...
お礼  mon  - 06/1/17(火) 20:11 -

引用なし
パスワード
   ▼ichinose さん:

こんばんは。
早速のお返事ありがとうございます。
質問が不適切であった様ですみません。


>▼mon さん:
>こんばんは。
>
>
>>以下のようなプログラムをつくり、テキストファイルのデータを1行づつSQLServer上のテーブルにINSERTしようとしています。
>>仮に、テキストファイルのデータが40行だとすると、40件のデータをINSERTした後 41件目に空データをINSERT使用としてエラーになります。
>>エラーメッセージは
>>「文字列''が終了していません。」
>>となっています。
>>エラーになった際に発行したSQL文をクエリアナライザで実行するとテーブルにINSERTすることができます。
>>
>>一体どこがエラーになっているのか自分では分からなくてて・・・
>>
>>
>>ロジック等 どこがおかしいかお分かりでしたら教えてください。
>>お願いします。m(_ . _)m
>>
>>
>
>
>>------------------------------------------------------------------
>>
>>'SQLServerとの接続は既に確立された状態
>>con.BeginTrans    
>>   
>>Dim strDataFile as string
>>strDataFile = "D:\LOG.txt"
>>Dim pFileNo As Integer
>>pFileNo = FreeFile
>>'ファイルのオープン
>>Open strDataFile For Random As #pFileNo Len = 40
>'何故、テキストファイル(テキストファイルですよね?)を
>'ランダムモードでオープンしているのですか?
>'通常、テキストファイルには Cr+lfと言うコードが一行の最後に
>'入っています。これをも読み込むという計算の上でのことですか?
>'あるいは、Cr+lfが元々入っていないファイルなのですか?
CrLfは入っています。
読み込むテキストファイルは固定長で、一行が2000字以上になることもあります。
何故ランダムモードにしたのかはちょっと・・ 忘れました。(--;;)
(テキストファイルは読み込みだけで、書き込み処理はありません。)


>>Do While Not EOF(pFileNo)      
>>
>> Get #pFileNo, , mKuni_kani
>'           ↑この変数と
>'下のSQL文字列の相関はどうなっていますか?

ちょっと 省略してしまったのですが、読み込むテキストファイルが固定長なので
ユーザ定義関数を定義しました。
定義の中を表示させてみて、各値は正確にテキストファイルから読み込むことが出来ています。
ユーザ定義関数を使って読み込むデータを定義しています。 

    
>> 'SQL文生成
>> Dim sql as string
>> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
>実際のSQLは↑ではないですよね?
>これで40行目までは正しくデータが入っているのですか?
入れることができます。
トランザクションを一件づづコミットさせると、40件のデータが正しく、テーブルに格納されます。


>>  On Error Resume Next
>>  con.Execute sql
>>  If (Err) Then
>>   con.RollbackTrans
>>      
>>   MsgBox Err.Description & vbCrLf & sql
>>   Err.Clear
>>   Exit Do
>>  End If
>>
>>Loop
>>Close #pFileNo
>>
>>If (Err.Number = 0) then
>>  con.CommitTrans
>>End If
>>On Error GoTo 0


お手数おかけします。
よろしくお願いします。

【33668】Re:「文字列''が終了していません。」と...
発言  ichinose  - 06/1/17(火) 20:46 -

引用なし
パスワード
   ▼mon さん:
>>
>>>------------------------------------------------------------------
>>>
>>>'SQLServerとの接続は既に確立された状態
>>>con.BeginTrans    
>>>   
>>>Dim strDataFile as string
>>>strDataFile = "D:\LOG.txt"
>>>Dim pFileNo As Integer
>>>pFileNo = FreeFile
>>>'ファイルのオープン
>>>Open strDataFile For Random As #pFileNo Len = 40
>>'何故、テキストファイル(テキストファイルですよね?)を
>>'ランダムモードでオープンしているのですか?
>>'通常、テキストファイルには Cr+lfと言うコードが一行の最後に
>>'入っています。これをも読み込むという計算の上でのことですか?
>>'あるいは、Cr+lfが元々入っていないファイルなのですか?
>CrLfは入っています。
>読み込むテキストファイルは固定長で、一行が2000字以上になることもあります。
>何故ランダムモードにしたのかはちょっと・・ 忘れました。(--;;)
>(テキストファイルは読み込みだけで、書き込み処理はありません。)
>
>
>>>Do While Not EOF(pFileNo)      
>>>
>>> Get #pFileNo, , mKuni_kani
>>'           ↑この変数と
>>'下のSQL文字列の相関はどうなっていますか?
>
>ちょっと 省略してしまったのですが、読み込むテキストファイルが固定長なので
>ユーザ定義関数を定義しました。
>定義の中を表示させてみて、各値は正確にテキストファイルから読み込むことが出来ています。
>ユーザ定義関数を使って読み込むデータを定義しています。 
>
>    
>>> 'SQL文生成
>>> Dim sql as string
>>> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
>>実際のSQLは↑ではないですよね?
>>これで40行目までは正しくデータが入っているのですか?
>入れることができます。
>トランザクションを一件づづコミットさせると、40件のデータが正しく、テーブルに格納されます。
'となると、41行目のデータが本当に正しくユーザー定義型に
'取り込まれているかというこですが・・・。
'特にCrlfは、見えませんから・・・
'ここを再度確認してみて下さい。
'環境がないのでこちらでは確認ができません
'気になったのはそんなところですが・・・。


>
>
>>>  On Error Resume Next
>>>  con.Execute sql
>>>  If (Err) Then
>>>   con.RollbackTrans
>>>      
>>>   MsgBox Err.Description & vbCrLf & sql
>>>   Err.Clear
>>>   Exit Do
>>>  End If
>>>
>>>Loop
>>>Close #pFileNo
>>>
>>>If (Err.Number = 0) then
>>>  con.CommitTrans
>>>End If
>>>On Error GoTo 0
>

【33669】Re:「文字列''が終了していません。」と...
発言  mon  - 06/1/17(火) 20:58 -

引用なし
パスワード
   ▼ichinose さん:

曖昧な箇所も多いのに 質問に答えてくださってありがとうございます。


>▼mon さん:
>>>
>>>>------------------------------------------------------------------
>>>>
>>>>'SQLServerとの接続は既に確立された状態
>>>>con.BeginTrans    
>>>>   
>>>>Dim strDataFile as string
>>>>strDataFile = "D:\LOG.txt"
>>>>Dim pFileNo As Integer
>>>>pFileNo = FreeFile
>>>>'ファイルのオープン
>>>>Open strDataFile For Random As #pFileNo Len = 40
>>>'何故、テキストファイル(テキストファイルですよね?)を
>>>'ランダムモードでオープンしているのですか?
>>>'通常、テキストファイルには Cr+lfと言うコードが一行の最後に
>>>'入っています。これをも読み込むという計算の上でのことですか?
>>>'あるいは、Cr+lfが元々入っていないファイルなのですか?
>>CrLfは入っています。
>>読み込むテキストファイルは固定長で、一行が2000字以上になることもあります。
>>何故ランダムモードにしたのかはちょっと・・ 忘れました。(--;;)
>>(テキストファイルは読み込みだけで、書き込み処理はありません。)
>>
>>
>>>>Do While Not EOF(pFileNo)      
>>>>
>>>> Get #pFileNo, , mKuni_kani
>>>'           ↑この変数と
>>>'下のSQL文字列の相関はどうなっていますか?
>>
>>ちょっと 省略してしまったのですが、読み込むテキストファイルが固定長なので
>>ユーザ定義関数を定義しました。
>>定義の中を表示させてみて、各値は正確にテキストファイルから読み込むことが出来ています。
>>ユーザ定義関数を使って読み込むデータを定義しています。 
>>
>>    
>>>> 'SQL文生成
>>>> Dim sql as string
>>>> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
>>>実際のSQLは↑ではないですよね?
>>>これで40行目までは正しくデータが入っているのですか?
>>入れることができます。
>>トランザクションを一件づづコミットさせると、40件のデータが正しく、テーブルに格納されます。
>'となると、41行目のデータが本当に正しくユーザー定義型に
>'取り込まれているかというこですが・・・。
>'特にCrlfは、見えませんから・・・
>'ここを再度確認してみて下さい。
>'環境がないのでこちらでは確認ができません
>'気になったのはそんなところですが・・・。

データが40件しか入れていないのに41件目のデータを読もうとしているので、
ユーザ定義型の中は 空文字ばかりになっています。
SQL文はこんな感じ

INSERT INTO (テーブル名) VALUES ('','','')

テーブルそのものがNULL可になっているので クエリアナライザを使用するとこの空ばかりのINSERT文でもINSERTできます。
クエリアナライザだとINSERT出来るのに何故落ちてしまうのか、何故41行目のデータを読んでいるのかが(実際には空ですが) 不思議です。

【33674】Re:「文字列''が終了していません。」と...
発言  ichinose  - 06/1/17(火) 21:48 -

引用なし
パスワード
   >データが40件しか入れていないのに41件目のデータを読もうとしているので、
>ユーザ定義型の中は 空文字ばかりになっています。
これがヒントかも・・・。


>>>>
>>>>>------------------------------------------------------------------
>>>>>
>>>>>'SQLServerとの接続は既に確立された状態
>>>>>con.BeginTrans    
>>>>>   
>>>>>Dim strDataFile as string
>>>>>strDataFile = "D:\LOG.txt"
>>>>>Dim pFileNo As Integer
>>>>>pFileNo = FreeFile
>>>>>'ファイルのオープン
>>>>>Open strDataFile For Random As #pFileNo Len = 40
>>>>'何故、テキストファイル(テキストファイルですよね?)を
>>>>'ランダムモードでオープンしているのですか?
>>>>'通常、テキストファイルには Cr+lfと言うコードが一行の最後に
>>>>'入っています。これをも読み込むという計算の上でのことですか?
>>>>'あるいは、Cr+lfが元々入っていないファイルなのですか?
>>>CrLfは入っています。
>>>読み込むテキストファイルは固定長で、一行が2000字以上になることもあります。
>>>何故ランダムモードにしたのかはちょっと・・ 忘れました。(--;;)
>>>(テキストファイルは読み込みだけで、書き込み処理はありません。)
>>>
>>>
  Do While Loc(pFileNo) * 40 < lof(pFileNo)
'これで試してみて下さい      
>>>>>
>>>>> Get #pFileNo, , mKuni_kani
>>>>'           ↑この変数と
>>>>'下のSQL文字列の相関はどうなっていますか?
>>>
>>>ちょっと 省略してしまったのですが、読み込むテキストファイルが固定長なので
>>>ユーザ定義関数を定義しました。
>>>定義の中を表示させてみて、各値は正確にテキストファイルから読み込むことが出来ています。
>>>ユーザ定義関数を使って読み込むデータを定義しています。 
>>>
>>>    
>>>>> 'SQL文生成
>>>>> Dim sql as string
>>>>> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
>>>>実際のSQLは↑ではないですよね?
>>>>これで40行目までは正しくデータが入っているのですか?
>>>入れることができます。
>>>トランザクションを一件づづコミットさせると、40件のデータが正しく、テーブルに格納されます。
>>'となると、41行目のデータが本当に正しくユーザー定義型に
>>'取り込まれているかというこですが・・・。
>>'特にCrlfは、見えませんから・・・
>>'ここを再度確認してみて下さい。
>>'環境がないのでこちらでは確認ができません
>>'気になったのはそんなところですが・・・。
>
>データが40件しか入れていないのに41件目のデータを読もうとしているので、
>ユーザ定義型の中は 空文字ばかりになっています。
>SQL文はこんな感じ
>↓
>INSERT INTO (テーブル名) VALUES ('','','')
>
>テーブルそのものがNULL可になっているので クエリアナライザを使用するとこの空ばかりのINSERT文でもINSERTできます。
>クエリアナライザだとINSERT出来るのに何故落ちてしまうのか、何故41行目のデータを読んでいるのかが(実際には空ですが) 不思議です。

【33746】Re:「文字列''が終了していません。」と...
発言  mon  - 06/1/19(木) 20:28 -

引用なし
パスワード
   ▼ichinose さん:
こんばんは

お返事ありがとうございます。


>  Do While Loc(pFileNo) * 40 < lof(pFileNo)
>'これで試してみて下さい  

早速 試してみましたが、結果はかわりませんでした。
相変わらず 文字列''が終了していません。というエラーです。
データ40件はテーブルに追加され、41件目に空文字ばかりのデータをINSERTしようとしています。


>>>>>>
>>>>>> Get #pFileNo, , mKuni_kani
>>>>>'           ↑この変数と
>>>>>'下のSQL文字列の相関はどうなっていますか?
>>>>
>>>>ちょっと 省略してしまったのですが、読み込むテキストファイルが固定長なので
>>>>ユーザ定義関数を定義しました。
>>>>定義の中を表示させてみて、各値は正確にテキストファイルから読み込むことが出来ています。
>>>>ユーザ定義関数を使って読み込むデータを定義しています。 
>>>>
>>>>    
>>>>>> 'SQL文生成
>>>>>> Dim sql as string
>>>>>> sql = "INSERT INTO (テーブル名) VALUES ((テキストファイルからとったデータ),(テキストファイルからとったデータ),(テキストファイルからとったデータ))"
>>>>>実際のSQLは↑ではないですよね?
>>>>>これで40行目までは正しくデータが入っているのですか?
>>>>入れることができます。
>>>>トランザクションを一件づづコミットさせると、40件のデータが正しく、テーブルに格納されます。
>>>'となると、41行目のデータが本当に正しくユーザー定義型に
>>>'取り込まれているかというこですが・・・。
>>>'特にCrlfは、見えませんから・・・
>>>'ここを再度確認してみて下さい。
>>>'環境がないのでこちらでは確認ができません
>>>'気になったのはそんなところですが・・・。
>>
>>データが40件しか入れていないのに41件目のデータを読もうとしているので、
>>ユーザ定義型の中は 空文字ばかりになっています。
>>SQL文はこんな感じ
>>↓
>>INSERT INTO (テーブル名) VALUES ('','','')
>>
>>テーブルそのものがNULL可になっているので クエリアナライザを使用するとこの空ばかりのINSERT文でもINSERTできます。
>>クエリアナライザだとINSERT出来るのに何故落ちてしまうのか、何故41行目のデータを読んでいるのかが(実際には空ですが) 不思議です。

【33751】Re:「文字列''が終了していません。」と...
発言  ichinose  - 06/1/19(木) 21:26 -

引用なし
パスワード
   こんばんは。
>
>早速 試してみましたが、結果はかわりませんでした。
>相変わらず 文字列''が終了していません。というエラーです。
>データ40件はテーブルに追加され、41件目に空文字ばかりのデータをINSERTしようとしています。

テキストファイルは40件で41件目を読み込もうとしているならば、
このテキストファイルの読込み方の問題ですよね?


>>  Do While Loc(pFileNo) * 40 < lof(pFileNo)
>>'これで試してみて下さい  
上記コードの40はレコード長の意味ですが、よろしいですか?

私がmonさんが問題にしている
テキストファイルやユーザー定義型の構造を見ていないので
題材を提供しましょう!!

新規ブックの標準モジュールに

'=============================================
Public Type rec
  a1 As String * 6
  a2 As String * 4
  crlf(1 To 2) As Byte
  End Type
'=============================================
Sub mk_sample()
  Dim idx As Long
  Dim o_data As Variant
  Dim fno As Long
  fno = FreeFile()
  Open ThisWorkbook.Path & "\txtsamp.txt" For Output As #fno
  For idx = 1 To 5
    Print #fno, String(10, CStr(idx))
    Next idx
  Print #1, "12345"
  
  Close #fno
End Sub
'=============================================
Sub test()
  Dim dat1 As rec
  Open ThisWorkbook.Path & "\txtsamp.txt" For Random As #1 Len = 12
  Do While Loc(1) * 12 < LOF(1)
    dat1.a1 = "": dat1.a2 = ""
    Get #1, , dat1
    MsgBox dat1.a1 & "---" & dat1.a2
    Loop
  Close #1
End Sub


上記のコードをコピー後、一度、適当な名前で保存してください。

・最初にプロシジャーmk_sampleを実行してみて下さい。
 これでレコード長12バイトのデータが6件作成されます。
 (12バイトは、Crlfも入れて12バイトです)

・次にプロシジャーtestを実行してみて下さい。

データが6件正しく表示されますよね?

上記のコードとmonさんのテキストデータ及び、ユーザー定義型の構造
等を比べてみて下さい。

【33756】Re:「文字列''が終了していません。」と...
発言  ichinose  - 06/1/19(木) 21:55 -

引用なし
パスワード
   testは、

Sub test()
  Dim dat1 As rec
  Dim r_len As Long
  Dim fno As Long
  r_len = Len(dat1)
  fno = FreeFile
  Open ThisWorkbook.Path & "\txtsamp.txt" For Random As #fno Len = r_len
  Do While Loc(fno) * r_len < LOF(fno)
    dat1.a1 = "": dat1.a2 = ""
    Get #fno, , dat1
    MsgBox dat1.a1 & "---" & dat1.a2
    Loop
  Close #fno
End Sub

としたほうが良いでしょうか?

それから、
ランダムモードでOpenする理由がわかりました。
どうしても? ユーザー定義型を使いたかったからですね?

【33844】Re:「文字列''が終了していません。」と...
お礼  mon  - 06/1/22(日) 14:02 -

引用なし
パスワード
   ▼ichinose さん:

お返事遅くなってすみません。

教えて頂いた方法を試してみて、結果
ユーザー定義型を使用してデータを読み込む際に、改行コードの除去の方法が悪かったことが分かりました。
改行コードが除去しきれていなかったため、データは40件なのに41件めを読み込みに行っていたようです。


お世話になりました、
色々とご指導ありがとうございました。


>testは、
>
>Sub test()
>  Dim dat1 As rec
>  Dim r_len As Long
>  Dim fno As Long
>  r_len = Len(dat1)
>  fno = FreeFile
>  Open ThisWorkbook.Path & "\txtsamp.txt" For Random As #fno Len = r_len
>  Do While Loc(fno) * r_len < LOF(fno)
>    dat1.a1 = "": dat1.a2 = ""
>    Get #fno, , dat1
>    MsgBox dat1.a1 & "---" & dat1.a2
>    Loop
>  Close #fno
>End Sub
>
>としたほうが良いでしょうか?


>それから、
>ランダムモードでOpenする理由がわかりました。
>どうしても? ユーザー定義型を使いたかったからですね?

そうです(^^;)
テーブルの項目数が多いのと、今後レコード長が変わる可能性があったので
ユーザ定義型を使用していたんでした。
(^^;)

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