初めての店舗開業を成功させよう>>

Excel2002
WindowsXP

CSVファイルにスペックリストがあり、そこへADOで接続しています。

また、エクセルのA列に製品名があり、RecordsetのFindもしくはFilterで該当するスペックを見つけられるようにしています。

ソースとしては次のような感じです。

For i = 1 to 100
  RS.MoveFirst
  RS.Find "製品名='" & Cells(i,1) & "'"
  If Not RS.EOF Then
    Cells(i,2)=RS("重量")
  End If
next i

このソースの実行中にいつも特定の製品名のところで次のエラーのどちらかで止まってしまいます。


[Microsoft][OEBC Text Driver] UPDATE ステートメントの構文エラーです。
[Microsoft][OEBC Text Driver] このISAMでは、リンクテーブル内のデータを更新することはできません。


この製品名を省くと最後まで問題なく進みます。製品名は単に半角アルファベットで8文字程度なんですが・・・。

このエラーの意味はどういうものでどういった回避方法があるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

http://www.happy2-island.com/vbs/cafe02/capter00 …
'CSV 「C:\TEST\TEST.csv」

Set myDB = CreateObject("ADODB.Connection")
myDB.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=C:\TEST;ReadOnly=1"
mySQL = "select * from TEST.csv where 製品名='冷蔵庫'"
Set myRS = myDB.Execute(mySQL)
Do Until myRS.Eof = True
Msgbox myRS("製品名").Value & "=>" & myRS("重量").Value
myRS.MoveNext
Loop
myRS.Close : Set myRS = Nothing
myDB.Close : Set myDB = Nothing
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBA ADOでのCSV取込みについて

下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。

Sub main()
  Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="
  Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""
  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim idx As Integer
  Dim strSQL As String

  cn.ConnectionString = PROVIDER & DRIVER & "C:\"""
  cn.Open

  '全件数取得
  strSQL = "SELECT * FROM Sample.csv"

  'CSVファイルの内容を取得
  Set rs = cn.Execute(strSQL)

  rs.MoveFirst

  Do Until rs.EOF
    For idx = 0 To rs.Fields.Count - 1
      Debug.Print rs.Fields(idx).Value '←ここ
    Next idx
    rs.MoveNext
  Loop

  Set rs = Nothing
  cn.Close
  Set cn = Nothing
End Sub


ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。

Sub main()
  Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="
  Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""
  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim idx As Integer
  Dim strSQL As String

  cn.ConnectionString = PROVIDER & DRIVER & "C:\"""
  cn.Open

  '全件数取得
 ...続きを読む

Aベストアンサー

schema.ini ファイル(データ型定義)を作ってやれば安心かと。
http://www.ken3.org/cgi-bin/test/test102-1.asp

http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips118.htm

PS.
CopyFromRecordset についても調べると、吉かも?

QExcelVBAにて外部データ(*.csv)をSQL文を使って抽出する方法

こんにちは

VBAインポート問題で日々悩んでいるものです。

CSV形式のデータをODBCのシステムDSNに登録し、それをDAOでSQL要求しデータを抽出する方法がよくわかりません。

(1)データベースの定義記述内容
(2)レコードセットにSQL命令をかける記述
(3)抽出された内容をワークシートに貼る記述

等がよくわかりません。

DAOの場合、レコードセットを定義するのに
set DB=DBEngine.OpenDatabase("******")があったり、なかったりする理由がわかりません。

突然、set rs = CurrentDb.OpenRecordset("*****")
しているのはなぜでしょうか。

Aベストアンサー

田吾作7@38.6度の風邪引きです。。。
返事が遅くなってすいません。昨日ほとんど寝てました。。。


作りなおしました。

質問の仕様が
1.ODBC
2.EXCELに貼り付け

とあったので、すでにODBCは無視してますが、EXCELに貼り付けは忠実に守ろうとしていました。
今回のは、完全に仕様を無視したつくりになってます。(スピード重視のため)

作りとしては
1.CSVのデータをAccessにテーブルとして取り込む
2.EXCEL形式でエクスポート&ワークブックを開く

もしこれでもいいのであれば、こちらの方が処理が早いと思います。


Sub Main2()
  'CSVファイルのフルパス
  Const csvFullPath  As String = "c:\Folder1\dmy\test.csv"
  'EXCELファイルのパス
  Const excelFullPath As String = "c:\test.xls"
  'CSVファイルを取り込むテーブル名
  Const DmyTbl    As String = "DmyTbl"
  
  
  'CSVファイルを取り込む
  Call inCsv(csvFullPath, DmyTbl)
  
  'EXCEL形式でエクスポート
  Call outExcel(DmyTbl, excelFullPath)
End Sub

Private Sub outExcel(inTblName As String, inXlsFile As String)
  Dim xlsApp   As Excel.Application
  Dim xlsBook   As Excel.Workbook
  
  'エクセル形式でエクスポート
  DoCmd.TransferSpreadsheet acExport, 8, inTblName, inXlsFile, True
  
  
  'エクセル起動をしてエクスポートされたかを確認
  Set xlsApp = New Excel.Application
  Set xlsBook = xlsApp.Workbooks.Open(inXlsFile)
  
  xlsBook.Worksheets(inTblName).Select
  
  xlsApp.Visible = True

  Set xlsBook = Nothing
  Set xlsApp = Nothing
End Sub
Private Sub inCsv(inFileName As String, inTblName As String)
  Dim Db   As DAO.Database
  Dim strSQL As String
  
  Dim strFile As String
  Dim strPath As String
  
  Dim wkVal  As Variant
  
  Set Db = CurrentDb
  
  'とりあえずダミーを削除
  On Error Resume Next
  Db.TableDefs.Delete inTblName
  On Error GoTo 0
  
  'パスとファイル名に分解
  wkVal = Split(inFileName, "\")
  strFile = wkVal(UBound(wkVal))
  strPath = Left(inFileName, Len(inFileName) - Len(strFile))
  
  'SQL文(テーブル作成用)を作成
  strSQL = "select * into " & inTblName & _
      " from " & "[Text;DATABASE=" & strPath & "].[" & strFile & "]"
  Db.Execute strSQL
  
  Set Db = Nothing
End Sub

田吾作7@38.6度の風邪引きです。。。
返事が遅くなってすいません。昨日ほとんど寝てました。。。


作りなおしました。

質問の仕様が
1.ODBC
2.EXCELに貼り付け

とあったので、すでにODBCは無視してますが、EXCELに貼り付けは忠実に守ろうとしていました。
今回のは、完全に仕様を無視したつくりになってます。(スピード重視のため)

作りとしては
1.CSVのデータをAccessにテーブルとして取り込む
2.EXCEL形式でエクスポート&ワークブックを開く

もしこれでもいいのであれ...続きを読む

QVBAで複数のCSVからレコードセットを作りたい

D:\DATA\ORDER\SOURCE.CSVに売上のデータがあり、
D:\DATA\STOCK\SOURCE.CSVに在庫のデータがあります。
売上には
注文NO,売上日,売上額,在庫NO
在庫には
在庫NO,仕入日,仕入額
とあるとして
在庫.在庫NO,利益,滞留日数,売上.注文NOというような、2つのCSVを結合した結果をADOでレコードセットに格納したい場合どのようなソースになるのでしょうか?
一つのCSVからレコードセットに結果を格納するやりかたならネットに多々掲載されてますが、複数のCSVについてのやり方の掲載が探せなかったので質問します。

Aベストアンサー

> 既存のものとのからみで、別々の場所にしなければならないのです。

提案します。

現在の CSV の位置を動かせないなら、別途 Tmp フォルダに CSV をコピー
して、そこをワークフォルダとしてみれば?

ファイルのコピー方法は、

 ・FileCopy を使った方法(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/FileCopy.htm
 ・CopyFile を使った方法(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#CopyFile

などがあります。作業が終わったら、

 ・Kill ステートメント(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/Kill.htm
 ・DeleteFile メソッド(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#DeleteFile

などで削除することもできますよ。

> 既存のものとのからみで、別々の場所にしなければならないのです。

提案します。

現在の CSV の位置を動かせないなら、別途 Tmp フォルダに CSV をコピー
して、そこをワークフォルダとしてみれば?

ファイルのコピー方法は、

 ・FileCopy を使った方法(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/FileCopy.htm
 ・CopyFile を使った方法(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#CopyFile

などがあ...続きを読む

Q作成したレコードセットのCSV出力の方法

test.csv とtest2.csvから作成したレコードセットをtest3.csvに出力したいのですが、
”指定した式は、いずれかの引数とデータ型が対応していません。”
とエラーが帰ってきます。

色々試したのですがうまくいきません、

作成したレコードセットをCSVファイルにエクスポートする方法を教えてください。

Private Sub コマンド6_Click()


Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset

Set CN = New ADODB.Connection

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\;" & _
"Extended Properties='Text;HDR=YES'"

Set RS = CN.Execute("SELECT * FROM test.csv a LEFT JOIN test2.csv b ON a.tel = b.tel")

DoCmd.TransferText acExportDelim, , RS, "C:\test3.csv", True, ""



Set RS = Nothing
Set CN = Nothing


End Sub

test.csv とtest2.csvから作成したレコードセットをtest3.csvに出力したいのですが、
”指定した式は、いずれかの引数とデータ型が対応していません。”
とエラーが帰ってきます。

色々試したのですがうまくいきません、

作成したレコードセットをCSVファイルにエクスポートする方法を教えてください。

Private Sub コマンド6_Click()


Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset

Set CN = New ADODB.Connection

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
...続きを読む

Aベストアンサー

#2です

解決されたという解釈で良かったのでしょうか。
(記述を見直しました)(前のものでも一応動くとは思います)

ただ、気がかりなのがCドライブ直下と言う事で・・・・
(私はそこには作らないというだけの話ですが)


「test1.csv」「test2.csv」のありかを、「D:\HOGE」と仮定します。
作成する「test3.csv」の場所を「E:\hogehoge」と仮定します。
「E:\hogehoge\test3.csv」が存在したらエラーとなります。

「D:\HOGE」を★★に、「E:\hogehoge」を☆☆で置換えて記述したとすると
(#2の記述をチョッと変更しています。
変な改行表示されるので、一度メモ帳等にコピー&ペーストして確認ください)


Dim CN As ADODB.Connection
Dim sSql As String

Set CN = New ADODB.Connection

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=★★;" & _
"Extended Properties='Text;HDR=YES'"

sSql = "SELECT * INTO [test3.csv] IN '☆☆'[Text;FMT=Delimited;HDR=YES;IMEX=0;]" _
    & " FROM [test.csv] AS a LEFT JOIN [test2.csv] AS b ON a.tel = b.tel;"

CN.Execute sSql
Set CN = Nothing

※ この辺については、Web上のブログで見たような気が気ます。
(SQLで CSV出力指定記述とか・・・)

※  [test3.csv] の後の IN句の記述について、いろいろ確認を取られたらと思います。

#2です

解決されたという解釈で良かったのでしょうか。
(記述を見直しました)(前のものでも一応動くとは思います)

ただ、気がかりなのがCドライブ直下と言う事で・・・・
(私はそこには作らないというだけの話ですが)


「test1.csv」「test2.csv」のありかを、「D:\HOGE」と仮定します。
作成する「test3.csv」の場所を「E:\hogehoge」と仮定します。
「E:\hogehoge\test3.csv」が存在したらエラーとなります。

「D:\HOGE」を★★に、「E:\hogehoge」を☆☆で置換えて記述したとすると
(#2の記述をチョ...続きを読む

QACCESSのSQLで数値型に変換するには

こんにちわ。今SQLの書き方が分からなくて大変困っております。
ACCESS2000で、テーブルが一つあるとします。
テーブルの内容は、氏名・点数の2項目だとします。

点数が50点より大きい人を抽出したいのですが、
項目は全てSTRING型にしないといけないため、
単純に比較できません。抽出した項目を数値型に
変換して、比較したいのですが、どのように書いたらいいのでしょうか。

SELECT  Shimei , CAST(Tensuu AS NUMERIC)
FROM   Table1
WHERE   Tensuu > 50;

このようなクエリを書いてみましたがエラーが出てしまいます。
ORACLEではTO_NUMBERなどの関数があると思うのですが、
ACCESSではどのようにしたらいいのでしょうか??
よろしくお願いします。

Aベストアンサー

この程度か?

SELECT テーブル1.Shimei, CInt([Tensuu]) AS 得点
FROM テーブル1
WHERE (((CInt([Tensuu]))>50));

それではヘルプでCIntでも確認してね。

Q[Excel]ADODBでNull変換されてしまう

お世話になります。
今、Office2003で次のようなマクロを作成しています。
マクロが保存されているブックM、
参照するデータが保存されているブックD、
出力先のブックOがあり、
ブックMにてADODBをつかって、ブックDからSQLによる条件でブックOへ出力します。

このとき、ブックDのセルではちゃんとデータがセットさせているのに
出力したブックOでは空になってしまうという現象が発生して困っています。

デバッグ等して確認してみたところ、
書式が標準のセルで、文字列型の数値(文字列型のセルから値コピーした場所)が入っていると
RecordSetにとれた段階でNullに変換されてしまてしまっているように見えました。

この問題を解決するために何かよい方法はありますでしょうか?

ソースコードの詳細は確認できないのですが
こんな感じだったと思います。
※ rs.Requeryにて、rsの中身を確認した時点でNullだったので QueryTablesによる取り込みは関係ないと考えています。

Set conn = CreateObject("ADODB.Connection")
conn.Open ConnectString

Set sql = CreateObject("ADODB.Command")
sql.CommandType = 1
sql.ActiveConnection = conn
sql.CommandText = SQL文(? とUNION含む)
sql(0) = パラメータ設定
...

Set rs = CreateObject("ADODB.RecordSet")
Set rs = sql.Execute
With Sheet1.QueryTables.Add(rs, "A1")
.AdjustColumnWidth = False
.FieldNames = True
.BackgroundQuery = False
.Refresh False
.Delete
End With
...

お世話になります。
今、Office2003で次のようなマクロを作成しています。
マクロが保存されているブックM、
参照するデータが保存されているブックD、
出力先のブックOがあり、
ブックMにてADODBをつかって、ブックDからSQLによる条件でブックOへ出力します。

このとき、ブックDのセルではちゃんとデータがセットさせているのに
出力したブックOでは空になってしまうという現象が発生して困っています。

デバッグ等して確認してみたところ、
書式が標準のセルで、文字列型の数値(文字列型のセルから値コピーし...続きを読む

Aベストアンサー

度々失礼。
http://support.microsoft.com/kb/194124/ja
全てが強制的に文字列に変わるようですが

With conn
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties").Value = "Excel 8.0;IMEX=1" '■
  .Properties("Data Source") = "c:\temp\data.xls"
  .Open
End With
..『オプション IMEX=1;』を追加する方法でもいいかもしれません。

さっきのSub try()のQueryTableオブジェクトだけで使う場合はConnectionを以下に変更です。

wkCON = "OLEDB;" & _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=C:\temp\data.xls;" & _
    "Extended Properties=""Excel 8.0;IMEX=1;"""

度々失礼。
http://support.microsoft.com/kb/194124/ja
全てが強制的に文字列に変わるようですが

With conn
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties").Value = "Excel 8.0;IMEX=1" '■
  .Properties("Data Source") = "c:\temp\data.xls"
  .Open
End With
..『オプション IMEX=1;』を追加する方法でもいいかもしれません。

さっきのSub try()のQueryTableオブジェクトだけで使う場合はConnectionを以下に変更です。

wkCON = "OLEDB;" & _
    "Provider=Mi...続きを読む

QExcel VBAでCSVファイルを読込むと何故か文字列が日付に変換さ

Excel VBAでCSVファイルを読込むと何故か文字列が日付に変換されて困っています。
すごく困っております。どなたか教えて下さい。

状況を申し上げますと、以下のようなCSVデータがあります。
"住所1","住所2"
"東京都港区青山","1-24-11"

このとき、別なCSVにデータを移すという単純なものです。

通常は、
WsCount.Cells(1, 1).Value =Cells(2,1).value
WsCount.Cells(1, 2).Value =Cells(2,2).value
で、セルにある文字をそのまま、新しいシートのセルに移すだけのことですが、
何故か、"1-24-11"が日付に変換され、"2011/1/24"に変わってしまいます。
デバックなどで、途中経過を見ても既に日付にかわっており、
どうにも対応ができません。

以前は""で囲んである文字は、文字のまま認識していたと思いますが、
何故か今回はうまくいきません。

ちなみに、Excel2007です。

どなたか、教えて下さい。

宜しくお願いします。

Aベストアンサー

ヒントです

Office2007で「データ」→「外部データの取り込み」→「テキストデータ」を選択すると、フィールド毎の取り込みの型を指定できます(文字列型にすれば日付型には変換されません)

この操作を「マクロ記録」してみてください。こんなマクロが生成されます。

Sub Macro1()
'
' Macro1 Macro
'
With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\Temp\sample.csv", _
Destination:=Range("$A$1"))
.Name = "sample"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 932
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 2)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub

あとはいらない行を削除してできあがり。削除しなくても一応は動くはずですけど。

ヒントです

Office2007で「データ」→「外部データの取り込み」→「テキストデータ」を選択すると、フィールド毎の取り込みの型を指定できます(文字列型にすれば日付型には変換されません)

この操作を「マクロ記録」してみてください。こんなマクロが生成されます。

Sub Macro1()
'
' Macro1 Macro
'
With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\Temp\sample.csv", _
Destination:=Range("$A$1"))
.Name = "sample"
.FieldNames = True
.RowNumbers = False
...続きを読む


人気Q&Aランキング

おすすめ情報