位置情報で子どもの居場所をお知らせ

下記は、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」のまま取得することって出来ないのでしょうか?

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

A 回答 (4件)

schema.ini ファイル(データ型定義)を作ってやれば安心かと。


http://www.ken3.org/cgi-bin/test/test102-1.asp

http://www.geocities.co.jp/SiliconValley/4805/vb …

PS.
CopyFromRecordset についても調べると、吉かも?
    • good
    • 0
この回答へのお礼

CopyFromRecordset は知りませんでした。これ良いですね。schema.ini ファイルについても、勉強してみます。

お礼日時:2013/06/12 23:10

#2です。


Schema.ini と Copyfromrecordset で回答した訳。
レコードの値を直接、Cells(1,1)= rs.fields(idx) で代入しようとした場合に
Cells(1,1)="001" や Cells(1,1)="1-1-1" と同様に、1、2001/1/1 などになってしまうのを
避けるためです。
Schema.ini で定義し、 Copyfromrecordset でコピペッタンすればデータ型は継承されます。
(Office2010では。ただし文字長が255以上だと途中で切り捨てられるハズ)
余計なおせっかいかもしれませんが一応。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2013/06/12 23:12

このような場合は、ADODB.Streamを使うのが


いいのでは、と思いますが。

たとえば、Textファイルでも、CSVファイルでも
いいのですが、データが「""」でかこまれていない
ファイルに、

1020,012,12,001
12,56,003,030

このようなデータが入っているとすると、
出力は、

1020
012
12
001
12
56
003
030

このようになればいいわけですね。以下のコードを
標準モジュールに貼り付け実行してみてください。

Sub test1()
  Dim ad As Object
  Dim strList As String
  Dim strSplit As Variant
  Dim i As Long

  Set ad = CreateObject("ADODB.Stream")
  'このあたりの設定はWEBで検索してください。
  ad.Type = 2
  ad.Charset = "Shift-JIS"
  ad.Open

  ad.LoadFromFile = ("C:\test.csv")
  Do While Not ad.EOS
    '1行づつ読み込みます。
    strList = ad.ReadText(-2)
    'カンマのところで分割し、読み込みます。
    strSplit = Split(strList, ",")
    '配列に読み込んだデータを吐き出します。
    For i = LBound(strSplit) To UBound(strSplit)
      Debug.Print strSplit(i)
    Next i
  '次の行に行きます。
  Loop
  'オブジェクトを閉じ、破棄します。
  ad.Close: Set ad = Nothing
End Sub


なお、
ad.LoadFromFile = ("C:\test.csv")
のところのパスは適当ですので、実際に合わせて変更してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。こういう普通のCSVの読み込み方は、一応知ってたのですが、新たにADOでの読み込み方も勉強してたところです。色々と試してみます。

お礼日時:2013/06/12 23:12

桁数が決まっているなら、


    Debug.Print Format(rs.Fields(idx).Value, "000") '←ここ
が一番早いですよ。

コードを見る限り、行も列も関係なく読んでるようですし。
    • good
    • 0
この回答へのお礼

すみませんが、桁数は特定できません。なので、CSV中の値をそのまま忠実に取ってくる方法が知りたいのです。

お礼日時:2013/06/11 05:51

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

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

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

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

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形式でエクスポート&ワークブックを開く

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

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...続きを読む

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の記述をチョ...続きを読む

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

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

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QaccessでSQL文を使ってcsvファイルをインポートする方法

txtファイルをDoCmd.TransferTextでインポートする事は出来ているのですが、データが15~30万件ほどありかなり時間が掛かります。SQL文でのレコード全件DELETEがかなり高速だった為、インポートもSQLの方が処理が早いのでは?と思い色々サンプルをさがし、下記のようにしてみたのですが、SQL文をうまく書けず、作動しません。
間違い部分を指摘していただけませんでしょうか?

DoCmd.RunSQL "INSERT INTO Add_house_TEMP ( ハウス,カスト,SG1ステータス )"& _
       "SELECT [add_house#txt].F1,[add_house#txt].F2,add_house#txt].F3"& _
       "FROM add_house#txt IN "\\sv999999\_営業部\個人\作業場\20071115" "Text;HDR=NO;"

Aベストアンサー

全件デリートが早いからといって、読み込みが早いと判断できないと思います。
質問の趣旨から外れていると思いますが、ちょっと実験してみました。
参考になれば幸いです。
Private Sub コマンド0_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acImportDelim, , "T_Temp", strFileName, False
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド1_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
Dim strSQL As String
strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1"
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド2_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
Dim strSQL As String
Dim CON As New ADODB.Connection
Set CON = CurrentProject.Connection
strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1"
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False
CON.Execute strSQL
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

フィールド数188、18万件(355MB)のテキストファイルを読み込んでみました。
(毎回作ったテーブルを削除し、最適化をしてから行いました。)
5回ずつテストしてみましたが、体感できる差はなさそうです。
tranfertext と runsql は私のコンピュータでは65秒くらい、
ADOを使った場合は67秒くらいでした。
どちらかというと、物理的に読むHDと書くHDを分けるのに効果が
ありそうな気がしますが、残念ながら実験できる環境がありません。

全件デリートが早いからといって、読み込みが早いと判断できないと思います。
質問の趣旨から外れていると思いますが、ちょっと実験してみました。
参考になれば幸いです。
Private Sub コマンド0_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acImportDelim, , "T_Temp", strFileName, False
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド1_Click()
Dim sT...続きを読む

QADOによるCSVファイルからのデータ取得

EXCELVBAを用いて、ADODB.CONNECTIONによりデータを取得しようと思い、ネットで調べた
プログラムを使ってみたのですが、途中のレコードまでしか取得できませんでした。

ちなみに、データを取得しようと思っているもとのCSVファイルのサイズは10GB超、レコード数は
800万行程度あります。
これが、数十MB程度のファイルだと問題なかったのですが、レコード数などに制限はあるのでしょうか。

ご教示いただけますと幸いです。


用いたマクロの構文は以下のとおりです。

Dim con As New ADODB.Connection
Dim connectionString As String
Dim csvFilePath As String

Dim rs As ADODB.Recordset
Dim colNo As Long
Dim fileNumber As Long
Dim Buffer As String



'CSVファイルが置かれているフォルダ
csvFilePath = E:\


connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & csvFilePath & ";" _
& "Extended Properties=""Text;HDR=NO;FMT=Delimited"""



'コネクションオープン
con.Open connectionString

'ここでSQL文によりレコードを取得します。
Set rs = con.Execute("SELECT COUNT(*) FROM XXX.CSV")

fileNumber = FreeFile

Open OutputFolder & Application.PathSeparator & OutputFile For Output As #fileNumber


Buffer = ""

’ヘッダーの出力
For colNo = 0 To rs.Fields.Count - 1
If Buffer <> "" Then
Buffer = Buffer & ","
End If
Buffer = Buffer & rs.Fields(colNo).Name
Next
Print #fileNumber, Buffer

’データの出力
Do While rs.EOF = False

Buffer = ""
For colNo = 0 To rs.Fields.Count - 1
If Buffer <> "" Then
Buffer = Buffer & ","
End If
Buffer = Buffer & rs.Fields(colNo).Value
Next
Print #fileNumber, Buffer

'次のレコード
rs.MoveNext
Loop

Close #fileNumber

'クローズ
con.Close
Set rs = Nothing
Set con = Nothing

End Sub

EXCELVBAを用いて、ADODB.CONNECTIONによりデータを取得しようと思い、ネットで調べた
プログラムを使ってみたのですが、途中のレコードまでしか取得できませんでした。

ちなみに、データを取得しようと思っているもとのCSVファイルのサイズは10GB超、レコード数は
800万行程度あります。
これが、数十MB程度のファイルだと問題なかったのですが、レコード数などに制限はあるのでしょうか。

ご教示いただけますと幸いです。


用いたマクロの構文は以下のとおりです。

Dim con As New ADODB.Connection
Dim con...続きを読む

Aベストアンサー

> CSVファイルのサイズは10GB超

これをメモリ上に展開するのは32bit Windowsの制限で無理だし、64bitだとMicrosoft.Jet.OLEDBが動かない。
いずれにしろADOでは無理。

SQLでCSVを検索したいのなら、LogParserとか。
http://www.atmarkit.co.jp/fwin2k/operation/logparser1/logparser1_01.html

QCSVファイルの「”」について

VB6でCSVファイルを読み込みたいのですが、
以下のような項目だと、1項目として読み込むことができません。

例) AAA,"BBB,CCC,"" """,DDD

"BBB,CCC,"" """ を1項目として読み込みたいのですが
ダブルコーテーションの括りの中に、更にダブルコーテーションがあると
うまくいかないみたいです。
何か方法がありますでしょうか?


Open DownLoadFile For Input As #1 Len = 32000
Input #1, rec
Do Until EOF(1)
処理1

Loop
close #1

Aベストアンサー

>出力フォーマットを変更する事はできないので、
やはり処理を組み込むしかないようですね。

参考になればよいのですが、サンプルを作成しました。
ExcelのVBAで動いたので多分大丈夫だとは思うのですが、、、

ダメっぽかったらそちらで修正して^^;

Option Explicit

Public Const DEF_CHR34   As String = """"  'ダブルコーテーション
Public Const DEF_SPLIT_CHAR As String = ","   '区切り文字

Sub Main()
  Dim l_strバッファ    As String
  Dim l_str一行      As String
  Dim l_strAryバッファ() As String
  Dim i          As Integer
  Dim l_strAry一行()   As String
  
  'ファイルを一気に読み込む
  l_strバッファ = ファイル読込み("C:\test.csv")
  
  '改行コードで配列化を行う
  l_strAryバッファ = Split(l_strバッファ, vbCrLf)
  
  '改行数のループ処理を行う
  For i = LBound(l_strAryバッファ) To UBound(l_strAryバッファ)
    l_str一行 = l_strAryバッファ(i)
    Debug.Print l_str一行
    
    '文字が存在していなければ、ループを抜ける
    If RTrim$(l_str一行) = "" Then
      MsgBox i + 1 & "行目が空データなので、ループをぬける"
      Stop
      Exit For
    End If
    
    Stop
    '一行を区切り文字で配列化する
    If Not 変換_ライン_配列(l_str一行, l_strAry一行, DEF_SPLIT_CHAR) Then
      MsgBox "えらー終了"
      Stop
      Exit For
    End If
    Stop
  Next i
  
End Sub


Public Function ファイル読込み(ByVal p_strファイル名 As String) As String
  Dim intFile   As Integer
  Dim lngLen   As Long
  Dim bytBuff()  As Byte
  
  intFile = FreeFile
  lngLen = FileLen(p_strファイル名)
  
  If lngLen = 0 Then
    Exit Function
  End If
  
  ReDim bytBuff(0 To lngLen - 1)
  Open p_strファイル名 For Binary Access Read As intFile
  Get intFile, , bytBuff
  Close intFile
  
  ファイル読込み = StrConv(bytBuff, vbUnicode)
End Function


'文字列を、指定の区切りキャラで、配列化を行う
Public Function 変換_ライン_配列( _
  ByVal p_str一行 As String, _
  ByRef p_strAry一行() As String, _
  Optional ByVal p_str区切 As String = "," _
) As Boolean
  Dim l_bln実行結果    As Boolean
  Dim l_strAry区切()   As String
  Dim l_str文字列     As String
  Dim i          As Integer
  Dim l_intカウント取得数 As Integer
  Dim l_strAry返却()   As String
  
  l_bln実行結果 = True
  
  '区切り文字で配列化する
  l_strAry区切 = Split(p_str一行, p_str区切)
  
  '配列要素数でループを行う
  For i = LBound(l_strAry区切) To UBound(l_strAry区切)
    '取得する
    If Not 補正取得(l_strAry区切, i, l_str文字列, p_str区切) Then
      'エラー処理
      l_bln実行結果 = False
      Exit For
    End If
    
    '取得した文字列を、配列として記憶する
    ReDim Preserve l_strAry返却(l_intカウント取得数)
    l_strAry返却(l_intカウント取得数) = l_str文字列
    
    l_intカウント取得数 = l_intカウント取得数 + 1
  Next i
  
  '記憶した配列を返却する
  p_strAry一行 = l_strAry返却

  '取得結果のステータスを返却する
  変換_ライン_配列 = l_bln実行結果
End Function

Private Function 補正取得( _
    ByRef p_strAry区切() As String, _
    ByRef p_int開始位置 As Integer, _
    ByRef p_str取得文字 As String, _
    ByVal p_str区切 As String _
) As Boolean
  Dim l_bln実行結果    As Boolean
  Dim i          As Integer
  Dim l_str文字      As String
  Dim l_strAryChr34()   As String
  Dim l_intカウントChr34 As Integer
  Dim l_str文字連結    As String
  
  
  l_str文字 = p_strAry区切(p_int開始位置)
  
  If Left$(l_str文字, 1) = DEF_CHR34 Then
    'ダブルコーテーションで文字列が始まる場合
    For i = p_int開始位置 To UBound(p_strAry区切)
      l_str文字 = p_strAry区切(i)
      
      '初回のループでなければ、区切りキャラを追加する
      If i <> p_int開始位置 Then
        l_str文字連結 = l_str文字連結 & p_str区切
      End If
      '文字列の連結を行う
      l_str文字連結 = l_str文字連結 & l_str文字
      
      '内部に存在するダブルコーテーションの数を取得する
      l_strAryChr34 = Split(l_str文字, DEF_CHR34)
      l_intカウントChr34 = l_intカウントChr34 + UBound(l_strAryChr34)
      
      '一番右の文字がダブルコーテーションである 且つ ダブルコーテーションのカウントが偶数である
      If (Right$(l_str文字, 1) = DEF_CHR34) And ((l_intカウントChr34 Mod 2) = 0) Then
        '先頭と最後のダブルコーテーションを抹消
        p_str取得文字 = Mid$(l_str文字連結, 2, Len(l_str文字連結) - 2)
        
        '呼び出し元のループカウンタのポジションを進める
        p_int開始位置 = i
        
        '正常処理であることを通知
        l_bln実行結果 = True
        Exit For
      End If
    Next i
    
  Else
    'ダブルコーテーションで文字列が始まらない場合
    '取得した値をそのままセット
    p_str取得文字 = l_str文字
    
    '正常処理であることを通知
    l_bln実行結果 = True
  End If
  
  '取得結果のステータスを返却する
  補正取得 = l_bln実行結果
End Function

>出力フォーマットを変更する事はできないので、
やはり処理を組み込むしかないようですね。

参考になればよいのですが、サンプルを作成しました。
ExcelのVBAで動いたので多分大丈夫だとは思うのですが、、、

ダメっぽかったらそちらで修正して^^;

Option Explicit

Public Const DEF_CHR34   As String = """"  'ダブルコーテーション
Public Const DEF_SPLIT_CHAR As String = ","   '区切り文字

Sub Main()
  Dim l_strバッファ    As String
  Dim l_str一行      As ...続きを読む

Q【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim 行数 As Long, 列数 As Integer
Dim i As Integer, j As Long, k As Long

ファイル名 = "test.csv"
フォルダ名 = "csv"
パス名 = ActiveWorkbook.Path & "\" & _
フォルダ名

'csvフォルダが存在しなければ作成する
If Dir(パス名, vbDirectory) = "" Then
MkDir パス名
End If
ChDir パス名

Open ファイル名 For Output As #1

For i = 1 To Worksheets.Count
Worksheets(i).Activate
Worksheets(i).Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
行数 = Selection.Rows.Count
列数 = Selection.Columns.Count

For j = 1 To 行数
For k = 1 To 列数 - 1
データ = Selection.Cells(j, k) _
.Value
Write #1, データ;
Next k
Write #1, Selection.Cells(j, 列数) _
.Value
Next j
Next i
Close #1
End Sub

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim ...続きを読む

Aベストアンサー

Write # は文字列を""で囲んで出力する仕様になっています。
そのまま出力したければ、Print #を利用すればよろしいかと。
ただし、Printの場合は区切り文字(カンマ)を自動で出力してくれませんので、併せて出力する必要があります。

For j = 1 To 行数
  For k = 1 To 列数 - 1
    データ = Selection.Cells(j, k) .Value
    Print #1, データ; ",";
  Next k
  Print #1, Selection.Cells(j, 列数).Value
Next j

なお、いらぬおせっかいですが、ドライブが複数ある環境下だと、
 ChDir パス名
だけでは必ずしもcvsフォルダ内に、ファイルが作成されるとは限りません。
 Open パス名 & "\" & ファイル名 For Output As #1
のように、フルパスで指定しておいた方が確実かと…

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です


人気Q&Aランキング