マンガでよめる痔のこと・薬のこと

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

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

A 回答 (4件)

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



提案します。

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

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

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

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

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

などで削除することもできますよ。
    • good
    • 0
この回答へのお礼

提案していただいたとおり、TEMPフォルダーにCSVをコピーしたところ私の知識の範囲で解決できました。
ありがとうございました。

お礼日時:2008/10/02 11:12

詳しい方のようですね。

ご参考までに。

> SQLを使った集計の方が早いかなと思い
うーん。。ソース次第でしょう。
> また、テーブルのレコード数が65535を超えるものもあります
それなら確かに SQL を使った方が楽ですね。

> D:\DATA\ORDER\SOURCE.CSVに売上のデータがあり、
> D:\DATA\STOCK\SOURCE.CSVに在庫のデータがあります。

1. 2つの CSV は同一フォルダに置いて下さい
  複数のフォルダに分散させると面倒ですよ。多分。以下説明用に
    
    D:\DATA フォルダ
    売上データを o.csv、
    在庫データを s.csv
  
  とします。

2. ADO 接続について
  ADO 定数をイチイチ再定義するのは面倒なのでアーリーバインドで。
  なるべく広い環境の PC で動作するように
  
    Microsoft ActiveX Data Objects 2.6 Library
  
  あたりの多少古いライブラリを参照しておくと良いと思います。
  で、具体的なコード例ですが....

  ' // 変数の宣言等は省略
' // CSV フォルダパス
  sCsvDir = "D:\DATA"
  
  ' // CSV 接続文字列(HDR= ラベル有無)
  sConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
           "Data Source=" & sCsvDir & ";" & _
           "Extended Properties=""Text;HDR=YES;FMT=Delimited"""

  ' // SQL 生成
  sql = "次項目で説明"
  
  ' // CSV に接続してレコードセットを取得
  Set cn = CreateObject("ADODB.Connection")
  cn.Open sConnectionStr
  Set rs = CreateObject("ADODB.Recordset")
  rs.Open sql, cn, adOpenForwardOnly, adLockReadOnly

  ' // ワークシートに展開
  ' // もちろん Rows.Count(Excel2003 までなら 65536)を越える
  ' // 場合は別途処理が必要
  Range("A2").CopyFromRecordset rs

  ' // 後処理(略)


3. SQL の書き方(一例)

  テーブルの指定に該当する部分は [s#csv] のように書きます。

  SELECT
   [s#csv].[在庫No],
   DATEDIFF('d',[s#csv].[仕入日],[o#csv].[売上日]) AS [滞留日数],
   [o#csv].[売上額]-[s#csv].[仕入額]) AS [粗利益],
   [o#csv].[注文No]
  FROM [s#csv] LEFT JOIN [o#csv] ON [s#csv].[在庫No] = [o#csv].[在庫No];

  当然、売れないモノもあるでしょうから、[売上日] が Null の場合
  なんかも考慮して SQL を書いて下さい。

では。

この回答への補足

返信がおそくなりました。自分で書き込んだつもりで書き込んでいなかった。どうりで返答がこないはずだ(笑)
>詳しい方のようですね
詳しくないです。
回答3で教えていただいた内容ならば、ネット上に参考になるサイトが多々ありましたので、なんとかかけます。
しかし、
>2つの CSV は同一フォルダに置いて下さい
>複数のフォルダに分散させると面倒ですよ。
既存のものとのからみで、別々の場所にしなければならないのです。
その「面倒」なことのフローチャートというか箇条書きにでも処理を教えていただければ・・・

補足日時:2008/09/29 12:25
    • good
    • 1

こんにちは。



> 2つのCSVを結合した結果をADOでレコードセットに格納したい場合
> どのようなソースになるのでしょうか?

2 つの CSV を 1 ブック上にシートを分けて展開すれば、あとは関数
VLOOKUP 等と作業列の使用で何とかなることだと思います。

ゆえに疑問に思うのですが、レコードセットを作成した後に何がしたい
のでしょうか? 目的が書かれてません。

単にレコードセット作成の実験的コードを知りたいのか、実用に耐える
ものが知りたいのか、目的によって回答が変ってくると思います。

この回答への補足

返信が遅くなりました。
さて、なぜこのようなコードを知りたいのかといいますと、今までMSSQLでDTSを使用し取り込み、ODBCでエクセルにストアドプロシージャの値を返すような形でいたのですが、今度DBサーバーを撤去しするので、MSSQLを使用せずにCSVからMSSQLを介さず直接エクセルにということになりました。そこで、どうしたらよいか思案中というところでして。
VLOOKUP等を使用する場合も考えましたが、SQLを使った集計の方が早いかなと思いこういった質問をしました。また、テーブルのレコード数が65535を超えるものもありますので

補足日時:2008/09/05 09:13
    • good
    • 0

  Dim isOK      As Boolean


  Dim I       AS Integer
  Dim N       AS Integer
  Dim strUriages()  As String
  Dim strZaikos()  As String
  Dim strStockNumber As String
  Dim strSQL     AS String

  strUriages() = FileReadArray("D:\DATA\ORDER\SOURCE.CSV")
  N = UBound(strUriages())
  For I = 0 To N
    strStockNumber = CutStr(strUriages(I), ",", 4)
    strZaikos() = FileFindArray("D:\DATA\STOCK\SOURCE.CSV", "*" & strStockNumber & "*")
    strSQL = "INSERT INTO ・・・・・" & _
     "・・・・・・"
    isOK = CnnExecute(strSQL)
    If Not isOK Then
   MsgBox "深刻なエラーが発生しましたので処理を中断します"
       Exit For
    End If
  Next I

FileReadArray()・・・CSV データを AAA,BBB,CCC を1レコードとする配列に呼び込む。
CutStr()・・・・・・・・・・CSV データからN番目を取り出す。
FileFindArray()・・・CSV データの第二引数にマッチする行を配列で返す。
CnnExecute・・・・・・・・SQL文を実行する。

こういう関数を用意すれば、こういう処理の流れで可能。
で、で、関数も含めての全容となるとかなりヘビーな回答になると思います。

***********************************
 ただし、その必要はないのでは?
***********************************

で、その必要はないと思いますよ。

10 INPUT A, B
20 C = A * B
30 PRINT C

コンピュータ処理は、単純化すればこの3行。

10 INPUT A * B TO C
20 PRINT C

で、質問者の構想はこのようです。
つまり、データの入力と処理とが渾然一体に。
これは、不必要で無駄な処理。

10 INPUT A, B
20 PRINT A * B

と、入力データの参照段階で色々と処理するのが基本だと思います。
    • good
    • 0
この回答へのお礼

解答ありがとうございます
私はてっきり、
Con.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & Path & ";ReadOnly=0"
strSQL = "select * from aaa.csv"
rs.Open strSQL, Con, adOpenForwardOnly
の流れで・・・例えばCon2とrs2を用意して、rsとrs2を選択できるかな~位の感覚で質問しました。なぜこのような質問かというのは別の方に頂いた解答に補足事項に記載してあります

お礼日時:2008/09/05 09:33

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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

QADOを使用してExcelファイルをオープンし、内部結合したい。

エクセルに2つのシートがあります。
シート名"男性用","女性用"
それぞれのシートに"名前"の列があります。
この2つのシートを内部結合して検索したいのですが
可能でしょうか

----------------------シート1個の場合
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Properties("Extended Properties") = "Excel 8.0"
cn.Properties("Data Source") = App.Path & "\test.xls"
cn.Open

Dim cmd As ADODB.Command
Set rst = New ADODB.Recordset
rst.Source = "Select * From [男性用$]"
rst.ActiveConnection = cn
rst.CursorType = adOpenDynamic
rst.Open , , , , adCmdText

'------------------------------
これで取り出せますがシート2つを内部結合させたいばあい

rst.Source = "Select * From [男性用$]"

はどう変えたらいいでしょうか

excelでなければ

select * from 男性用 inner join 女性用 on 男性用.名前=女性用.名前

となると思いますが。

エクセルに2つのシートがあります。
シート名"男性用","女性用"
それぞれのシートに"名前"の列があります。
この2つのシートを内部結合して検索したいのですが
可能でしょうか

----------------------シート1個の場合
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Properties("Extended Properties") = "Excel 8.0"
cn.Properties("Data Source") = App.Path & "\test.xls"
cn.Open

Dim cmd As ADODB.Command
Set rst = New ADODB....続きを読む

Aベストアンサー

>シート2つを内部結合させたいばあい
(1)結合条件がある場合
select A.*,B.* from [男性用$] As A inner join [女性用$] As B
on A.名前=B.名前
(2)単に両方を一度に見たい場合
select * from [男性用$] union all select * from [女性用$]

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

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 についても調べると、吉かも?

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

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

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

Aベストアンサー

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

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

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

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qマクロを使用してCSVファイルの結合を行いたい

過去の質問の中から、素晴らしい結合のマクロを見つけましたが、パソコンをwindows7にエクセルを
エクセル2010に変更した後、マクロが使えなくなりました。
どなたか修正して頂けないでしょうか?

列の項目は定形で、10~200行のデータが書かれたCSVファイルが1つのフォルダに多数あります。
新しいファイルに、NO.1のファイルのデータの続きにNO.2、NO.3・・・と続けてデータが下の行に連続
して並ぶようにマクロで結合させたいと思っていますので、宜しくお願いします。


Sub Test1()
Dim files As FileSearch, FilesCnt As Integer, i As Integer
Dim cBook As Workbook, pBook As Workbook

 FilesCnt = mySearch(files, ThisWorkbook.Path)
 If FilesCnt = 0 Then Exit Sub
 Set pBook = Workbooks.Add(xlWBATWorksheet)
  For i = 1 To FilesCnt
   Workbooks.Open files.FoundFiles(i)
   Set cBook = ActiveWorkbook
   cBook.ActiveSheet.UsedRange.Copy
   With pBook.ActiveSheet
    If i > 1 Then
     .Cells(.Range("A65536").End(xlUp).Row + 1, 1). _
      PasteSpecial (xlPasteAll)
    Else
     .Cells(.Range("A65536").End(xlUp).Row, 1). _
      PasteSpecial (xlPasteAll)
    End If
   End With
   Application.CutCopyMode = False
   cBook.Close
  Next i
 Set cBook = Nothing: Set pBook = Nothing
End Sub

'********************************************************************
Function mySearch(files As FileSearch, myDir As String) As Integer
 mySearch = 0
 Set files = Application.FileSearch
 With files
   .NewSearch
   .LookIn = myDir
   .SearchSubFolders = True
   .Filename = "*.csv"
   If .Execute() > 0 Then mySearch = .FoundFiles.Count
 End With
End Function

過去の質問の中から、素晴らしい結合のマクロを見つけましたが、パソコンをwindows7にエクセルを
エクセル2010に変更した後、マクロが使えなくなりました。
どなたか修正して頂けないでしょうか?

列の項目は定形で、10~200行のデータが書かれたCSVファイルが1つのフォルダに多数あります。
新しいファイルに、NO.1のファイルのデータの続きにNO.2、NO.3・・・と続けてデータが下の行に連続
して並ぶようにマクロで結合させたいと思っていますので、宜しくお願いします。


Sub Test1()
Dim files As FileSearch...続きを読む

Aベストアンサー

こちらのような質問相談掲示板でも非常に良く寄せられるご質問の一種ですが、あなたが発見したマクロでやってるようにCSVファイルをエクセルで開いて操作すると、しばしばデータが変わってしまいます。今まで全く問題が無かったのでそこは絶対心配無いという事なら、勿論構いませんが。

既出回答にあるようにエクセルとか使わずにバッチで処理してしまう方が私も簡単とは思いますが、そこはまぁご質問なので、とりあえずベタなマクロでやらせてみると…



sub macro1()
 dim myPath as string
 dim myFile as string
 dim s as string

 mypath = thisworkbook.path & "\"
 on error resume next
 kill mypath & "out.csv"
 on error goto 0

 myfile = dir(mypath & "*.csv")
 if myfile = "" then exit sub
 open mypath & "out.csv" for output as #1

 do until myfile = ""
  open mypath & myfile for input as #2
  do until eof(2)
   line input #2, s
   print #1, s
  loop
  close #2
  myfile = dir()
 loop
 close #1
end sub

結果はout.csvというファイルに書き出しています。
ブックをCSVファイルが保存してあるフォルダに放り込んでマクロを実行します。
やはり既出回答でも指摘されているように、勿論マクロ有効で開いてマクロをキチンと実行する必要があります。

こちらのような質問相談掲示板でも非常に良く寄せられるご質問の一種ですが、あなたが発見したマクロでやってるようにCSVファイルをエクセルで開いて操作すると、しばしばデータが変わってしまいます。今まで全く問題が無かったのでそこは絶対心配無いという事なら、勿論構いませんが。

既出回答にあるようにエクセルとか使わずにバッチで処理してしまう方が私も簡単とは思いますが、そこはまぁご質問なので、とりあえずベタなマクロでやらせてみると…



sub macro1()
 dim myPath as string
 dim myFile a...続きを読む

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング