こんにちは

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

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

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

等がよくわかりません。

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

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

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

A 回答 (4件)

田吾作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
    • good
    • 0
この回答へのお礼

お体大丈夫ですか。
今まで、いろいろとアドバイスいただきほんとうにありがとうございます。
参考にさせていただきます。
また、わからないことがありましたらお助けください。
本件の質問はこれで終了させていただきます。

お礼日時:2001/10/31 21:50

>  Set xlsApp = New Excel.Application


?上記の記述ですと、VBAでなくて、VBからの実行ということになるのでしょうか。
?希望としましては、VBAからの実行をしたいのですが。

VBAで大丈夫ですよ。(^^;)
何らかのモジュールを開いて、ツールの参照設定で
[Microsoft Excel x.0 Object Library]
を指定したらアクセスからエクセルを操作できます。

ちなみにWord/PowerPointを参照設定してたら、それらのソフトを操作することもできますよ。これはVBもVBAも一緒です。


ステップ実行してみてください。
コメントがプログラムに書いてあると思いますが、処理としては
1.CSVファイルのフルパスから、DB名とTABLE名を取得
2.DB(ファイルパスのディレクトリ)/TABLE(CSVファイル)に接続
3.エクセルの起動
4.テーブルのフィールド名を、エクセルに出力
5.各フィールドの持つ値を、エクセルに出力
っていう感じです。


もしかして、hoomaさんの考えている処理は、クエリを作成して、DoCmd(アクセスの持ってる命令)でエクセル形式でエクスポートしたいのですか?

この回答への補足

お世話になってます。
実行したら下記のエラーがでました。

実行時エラー'3061':
ラメータが少なすぎます。1を指定してください。

変更した点は
Const FileFullPath As String = "c:\db4\0110itmz.csv"
です。

なにか、足りないのでしょうか。

>もしかして、hoomaさんの考えている処理は、クエリを作成して、
>DoCmd(アクセスの持ってる命令)でエクセル形式でエクスポートしたいのですか?

今のところ、SQLでできればクエリは必要ないです。

補足日時:2001/10/30 14:18
    • good
    • 0
この回答へのお礼

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

VBAの参照設定でDAO のバージョンが違ったためエラーになりましたが、正しいものに変えてCSVデータのインポートができるようになりました。
しかし、途中で値がオーバーフローになってしまい完全にインポートできません。99レコード目でいつも止まります。
さらに、速度が遅いんですが、速くはならないのでしょうか。
いろいろお願いしてすみません。

お礼日時:2001/10/30 19:30

ODBCじゃなきゃダメですか?


DAOで普通にCSVファイルに接続できるので、その方法のサンプルを載せておきます。


※注意点1.普通はRs.Recordcountとするとレコード件数がわかりますが、テキストに接続した場合はRs.Recordcountは常に[1]を返します。

※注意点2.DB名/テーブル名はテキストの場合は扱いが特別です。
たとえば
[c:\test.mdb] ← DB名
[TBL_商品] ← TABLE名
こういった扱いが普通ですが、テキストファイルの場合は
c:\Folder1\dmy\test.csvを分解して
[c:\Folder1\dmy\] ← DB名
[test#csv] ← TABLE名
となります。
注意すべきはテーブル名は、ピリオドが含む場合シャープ記号に変換して使用することです。

注意点3.GetRowsメソッドを使うとレコードセットのポインタが破棄されるため、使用不可能です。



当然ですが、ツールの参照設定で
[Microsoft Excel x.0 Object Library]
[Microsoft DAO x.x Object Library]
を指定してくださいね

Sub Main()
  'CSVファイルのフルパス(任意です)
  Const FileFullPath As String = "c:\Folder1\dmy\test.csv"
  
  'エクセルに貼り付ける時の開始行(任意です)
  Const lngPasteRow  As Long = 2
  
  Dim Ws As    DAO.Workspace
  Dim Db As    DAO.Database
  Dim Rs As    DAO.Recordset
  Dim strSQL As  String
  
  Dim strDbName  As String
  Dim strTblName As String
  
  Dim xlsApp   As Excel.Application
  Dim xlsBook   As Excel.Workbook
  Dim xlsSheet  As Excel.Worksheet
  
  Dim i  As Long
  Dim j  As Long
  
  Dim cntFld As Long
  
  'DB名とTABLE名を取得する
  Call getDbTbl_for_File(FileFullPath, strDbName, strTblName)
  
  'テーブルオープン
  Set Ws = DBEngine.Workspaces(0)
  Set Db = Ws.OpenDatabase(strDbName, True, False, "Text;")
  strSQL = "select * from [" & strTblName & "] where Field1='hoge'"
  Set Rs = Db.OpenRecordset(strSQL)
  
  
  'エクセル起動
  Set xlsApp = New Excel.Application
  Set xlsBook = xlsApp.Workbooks.Add
  Set xlsSheet = xlsBook.Worksheets(1)
  xlsApp.Visible = True
  
  '書き込み
  With xlsSheet
    'フィールド数取得
    cntFld = Rs.Fields.Count
  
    'フィールド名の書き込み
    For i = 0 To cntFld - 1
      .Cells(lngPasteRow, i + 1).Value = Rs.Fields(i).Name
    Next i
    
    '各値の書き込み
    i = 0
    Do Until Rs.EOF
      For j = 0 To cntFld - 1
        .Cells(lngPasteRow + 1 + i, j + 1).Value = Rs(j).Value
      Next j
      i = i + 1
      Rs.MoveNext
    Loop
  End With

  xlsBook.Saved = True  '更新情報を破棄する(閉じるときの「保存しますか?」のダイアログを表示させない)
  Set xlsSheet = Nothing
  Set xlsBook = Nothing
  Set xlsApp = Nothing
  
  Rs.Close
  Db.Close
  Ws.Close
  Set Rs = Nothing
  Set Db = Nothing
  Set Ws = Nothing

End Sub

'テキストのファイルパスを分解して、データベース名(パス)とテーブル名(ファイル名)に分ける。
Private Sub getDbTbl_for_File(inFilepath As String, outDbName As String, outTblName As String)
  Dim wkVal  As Variant
  wkVal = Split(inFilepath, "\")
  outTblName = wkVal(UBound(wkVal))
  
  outDbName = Left(inFilepath, Len(inFilepath) - Len(outTblName))
  outTblName = Replace(outTblName, ".", "#")
End Sub

この回答への補足

まだ試してませんが、

細かいことですが、ひとつ確認させていただきます。

'エクセル起動
  Set xlsApp = New Excel.Application
上記の記述ですと、VBAでなくて、VBからの実行ということになるのでしょうか。
希望としましては、VBAからの実行をしたいのですが。

補足日時:2001/10/30 06:46
    • good
    • 0
この回答へのお礼

ありがとうございます。

実際に試してみます。
わからないことがありましたら補足に追加いたしますので
よろしくおねがいします。

お礼日時:2001/10/30 06:37

とりあえず後半部分だけにお答えします。


前半部分については、他の方にお任せ(^^;
(解答がつかなければ、補足とかで催促してください。)


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

いわゆる「オブジェクト指向」ってやつが関係しています。
まず、OpenRecordsetっていうのは、Databaseオブジェクトに対して、レコードセットを作成せよって命令なのです。

顧客DBと売上DBの二つのデータベースがあるとして、
Dim DB_Kokyaku As DAO.Database 'Database型の変数を宣言する
Dim DB_Uriage As DAO.Database

Dim RS_Kokyaku As DAO.Recordset 'Recordset型の変数を宣言
Dim RS_Uriage as DAO.Recordset



Set DB_Kokyaku = DBEngine.OpenDatabase("顧客DB")
Set DB_Uriage = DBEngine.OpenDatabase("売上DB")

Set RS_Kokyaku = DB_Kokyaku.OpenRecordset("顧客テーブル")
Set RS_Uriage = DB_Uriage.OpenRecordset("売上テーブル")

RS_Kokyaku.MoveLast
Msgbox "顧客テーブルの件数は" & RS_Kokyaku.RecordCount & "件です。"

RS_Uriage.MoveLast
Msgbox "売上テーブルの件数は" & RS_Uriage.RecordCount & "件です。"

上記のコードを読めば、Set DB =… の意義がわかっていただけると思います。

でも、一々、Database型の変数を宣言して、Set DB = としてデータベースを開くなんて、メンドクサイですよね。開きたいテーブル/クエリ/SQLは「今使ってるデータベース」の中にあるのに…

そこで CurrentDBメソッドの登場。
CurrentDBはAccessに最初から組み込まれている関数で、
「Access ウィンドウで現在開かれているデータベース (Databaseオブジェクト) のオブジェクト変数を返します。」(ヘルプより)

つまり、CurrentDB.なんたら とするのは

Dim DB As Database
Set DB = OpenDatabase("現在Accessで開いているDBの名前")
DB.なんたら

とするのと同じです。加えて動作も高速ですしね。
ってことで、普段はCurrentDBの方を使っとけばいいんです。
で、現在Accessで開いていないDBを使うときだけ、
Set DB = …
としてやればいいと。
    • good
    • 0
この回答へのお礼

毎度お世話になっております。

まだ、試しておりませんが使わせていただきます。

お礼日時:2001/10/30 06:51

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

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

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

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

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

Q大量のCSVファイルをExcel形式に変換する

お世話になります。
大量のCSV(.csvファイルをExcel(.xls)ファイルに変換したい
と考えております。
リネームソフトを使って、(.csv)⇒(.xls)の一括変換を
したところ、拡張子は確かに.xlsに変換されたのですが、
中身はCSVのままとなっておりました。
(↑ファイル名とシート名が同期を取っているので)

このCSVを確実にエクセル形式へと変換したいのですが、
どなた様かいいお考えをお持ちでしたら教えてください。
ググってみたところ、そういったアドインがあるのですが、
できれば費用をかけずに行いたいです…。

Aベストアンサー

こんにちは。

すでに、マクロが1つ出ているようですが、私も作ってみました。

これは、ファイルをマルチセレクトして、そのファイル群を、Excelのマクロにより、一気に、CSV から XLS(Excel標準フォーマット)変換するマクロです。出来上がったら、Explorer 等で、確認してみてください。

>アドインがあるのですが、
私の個人的な意見ですが、この程度のものは、アドイン化すべきものではありませんから、よほど付加価値をつけないと公開用のアドインにはなりませんが、一般的にみて、アマチュアの作ったアドインは、押しなべて、あまり出来の良いものが少ないように思います。ですから、なるべく、一般のマクロで解決するように望みます。


'---------------------------------------------------

'<標準モジュール>
Sub CSV2XLS()
  'CSV を XLS に変換するマクロ
  Dim myArray() As String
  Dim FileName As Variant
  Dim fn As Variant
  Dim xlFileName As String
  Dim xlFileBaseName As String
  Dim TextLine As String
  Dim FileNo As Integer
  Dim i As Long
  Dim k As Long
  '基本となるフォルダ
  'BASE_DIR=""なら、マクロのあるブックと同じ場所のフォルダ
  Const BASE_DIR As String = ""
  If BASE_DIR <> "" Then
   ChDir BASE_DIR
   Else
   ChDir ThisWorkbook.Path
  End If
  FileName = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv", MultiSelect:=True)
  If VarType(FileName) = vbBoolean Then
   Exit Sub
  End If
  Application.ScreenUpdating = False
  For Each fn In FileName
   On Error GoTo NextStatus
   With Workbooks.Open(fn)
     xlFileName = Mid$(fn, 1, InStrRev(fn, ".") - 1) & ".xls"
     Do
      k = k + 1 '同名の時枝番をつける
      If k > 3 Then Exit Do
      If Dir(xlFileName) = "" Then
        .SaveAs xlFileName
        xlFileBaseName = Mid$(xlFileName, InStrRev(xlFileName, "\") + 1)
        Workbooks(xlFileBaseName).Close False
        k = 0
        Exit Do
        Else
        xlFileName = Mid$(fn, 1, InStrRev(fn, ".") - 1) & "_" & CStr(k) & ".xls"
      End If
     Loop
   End With
NextStatus:
  Next fn
  Application.ScreenUpdating = True
  MsgBox "終了しました。",64
End Sub

'---------------------------------------------------

こんにちは。

すでに、マクロが1つ出ているようですが、私も作ってみました。

これは、ファイルをマルチセレクトして、そのファイル群を、Excelのマクロにより、一気に、CSV から XLS(Excel標準フォーマット)変換するマクロです。出来上がったら、Explorer 等で、確認してみてください。

>アドインがあるのですが、
私の個人的な意見ですが、この程度のものは、アドイン化すべきものではありませんから、よほど付加価値をつけないと公開用のアドインにはなりませんが、一般的にみて、アマチュアの...続きを読む

QVBからストアドの動的SQLを呼んで値をレコードセットで取得する方法

お世話になります。

VBからストアドの動的SQLを呼んで、VB側で値をレコードセットで取得する方法を探しています。

■ストアド
CREATE OR REPLACE PACKAGE SAMPLE as

CURSOR c2 IS select A from TBL;
TYPE TANTOYOSANDATA IS REF CURSOR RETURN c2%ROWTYPE;

PROCEDURE GetNUMBER(C IN NUMBER,
          CU OUT TANTOYOSANDATA);
end;
/

--
CREATE OR REPLACE PACKAGE BODY SAMPLE IS

PROCEDURE GetNUMBER(C IN NUMBER,
            CU OUT TANTOYOSANDATA) IS

CUR INTEGER;
STATUS INTEGER;
ROW_PROCESSED INTEGER;
A NUMBER;

BEGIN
--カーソルをOPENする
CUR :=DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(CUR,'SELECT A FROM TBL ',DBMS_SQL.V7);

DBMS_SQL.DEFINE_COLUMN(CUR,1,A);

ROW_PROCESSED :=DBMS_SQL.EXECUTE(CUR);
STATUS :=DBMS_SQL.FETCH_ROWS(CUR);

WHILE (STATUS <> 0) LOOP
DBMS_SQL.COLUMN_VALUE(CUR,1,A);

STATUS :=DBMS_SQL.FETCH_ROWS(CUR);
END LOOP;

END;

END SAMPLE;
/

■VB側

Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")
Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)

Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin SAMPLE.GetTANTOINFO(1,:CU)); end;", "CU", ORADYN_DEFAULT)

' If Recordset.EOF Then
Do While Not Recordset.EOF
Label11.Caption = Recordset(0)
Recordset.movenext
 Loop


復帰値をRecordSetで受けて
それをまわしながら1レコードずつ取得する方法を探しています

よろしくお願いします。

お世話になります。

VBからストアドの動的SQLを呼んで、VB側で値をレコードセットで取得する方法を探しています。

■ストアド
CREATE OR REPLACE PACKAGE SAMPLE as

CURSOR c2 IS select A from TBL;
TYPE TANTOYOSANDATA IS REF CURSOR RETURN c2%ROWTYPE;

PROCEDURE GetNUMBER(C IN NUMBER,
          CU OUT TANTOYOSANDATA);
end;
/

--
CREATE OR REPLACE PACKAGE BODY SAMPLE IS

PROCEDURE GetNUMBER(C IN NUMBER,
            CU OUT TANTOYOSANDATA) IS
...続きを読む

Aベストアンサー

DBMSはデバッグ用にしか使った事がないのですが・・・
カーソルを開いて、カーソルに返さないでもいいのでは?

ところでこのストアド、動的ではないような気が・・・
それにSQL文のみで実現するのでは?
それともこのストアドは、質問用のサンプルで、実際には動的なのですか?

もし質問の内容が正規なものなら無理にストアドを使用しないで
  Dim GoORASESSION  As Object
  Dim GoORADATABASE  As OraDatabase
  Dim Recordset    As OraDynaset
  Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")
  Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
  
  Set Recordset = GoORADATABASE.DbCreateDynaset("select A from tbl", ORADYN_DEFAULT)
  Do While Not Recordset.EOF
    Debug.Print Recordset.Fields(0).Value
    Recordset.MoveNext
  Loop
これじゃダメですか?

これがはずれで、どうしてもストアドを使用するなら、DBMSを使用しない書き方しかわからないのですが・・・
カーソルにA列の値だけセットしたいという意味ですよね?

DBMSはデバッグ用にしか使った事がないのですが・・・
カーソルを開いて、カーソルに返さないでもいいのでは?

ところでこのストアド、動的ではないような気が・・・
それにSQL文のみで実現するのでは?
それともこのストアドは、質問用のサンプルで、実際には動的なのですか?

もし質問の内容が正規なものなら無理にストアドを使用しないで
  Dim GoORASESSION  As Object
  Dim GoORADATABASE  As OraDatabase
  Dim Recordset    As OraDynaset
  Set GoORASESSION = CreateObject(...続きを読む

QエクセルデータからCSVファイルへの変換について

現在エクセルファイルにあるデータをCSVファイルへ変換する作業(エクセルでデータを作成して、保存時にCSVファイルを選択)をしているのですが、以下の例の場合うまく変換ができません・・・。
基本的な質問かもしれませんがどなたかご存知でしたら教えていただけると助かります。
よろしくお願いします。

【例】
        (エクセル) ⇒  (CSV)

うまくいく   12345     12345

うまくいかない 01234     1234


上記のようにエクセル上は文字列で管理されている
ケースだとCSVファイルに変換した時数列に変換
され、上記例のうまくいかないケースのように
頭に0がある場合CSVだと0が消えてしまいます。

よろしくお願いします。

Aベストアンサー

> CSVファイルに変換した時数列に変換

ちがいます。
いったんCSVで保存したものをエクセルで開いたときにそうなるのです。
CSVをエクセルでそのまま開かず、メニューの「データ」、「外部データの取り込み」、「すべてのファイル」、で取り込み、書式で文字列を選べばOKです。
あるいはCSVを拡張子を.TXTにしてテキストで取り込んでもOK

QVB.NET データセットとADOレコードセットについて。

最近.NETの勉強を始めました。質問なのですが
(1)参考書として買った本にはデータセットが基本の構文がずらりと載っているのですが、
(2)勉強用に貰ったVBデータはADOで基盤が作ってあり、データセットは1つも出てきていません。例えばデータグリッド等は無しです。
(1)と(2)は、今後プログラムを書くにあたり、どうとらえていけばよいんでしょうか?

大きいシステムの流れはVBデータでつかめますが、細かい、(例えば、コンボボックスの値をデータから抽出したい)等の事が分からなくてネットでも見つける事ができません。データグリッドも使いたいのですが。
参考書には載っていますが、全てデータセットを使ってあります。
データセットとADOレコードセットは共に書くことは不可なのですか?
テーブルごと仮で持ってくる時、こっちはデータセットでこっちは違うとかだやはり困りますよね。
実際のお仕事の現場ではどのようにされていますか?
明確なADOの使い道(こんな時はADOだ。など)も簡単に教えていただけるとありがたいです。

Aベストアンサー

>ADOレコードセット
VB6ユーザですね?

ADOではなくADO.NETを利用する話ですよね?
まずデータセット構造に慣れましょう

データセット
├データテーブル1
├データテーブル2
・・・
└データテーブルX

データテーブル構造
X方向:データカラム(ズ)/旧で言うとフィールド的イメージかな?
Y方向:データロウ(ズ)/旧で言うとレコード的イメージかな?
┌┬┬┬┬┬┬┐
├┼┼┼┼┼┼┤
├┼┼┼┼┼┼┤
├┼┼┼┼┼┼┤
・・・・・・・・
└┴┴┴┴┴┴┘

さらにデータセットには、リレーショナルを追加したり、各データテーブルには、キーを張ることもできます。

データセットはXMLへの入出力が容易で、データ内容をファイルに出力したり、テストデータの読み込みをするのに非常に便利です。
複数のテーブルデータを保持しているデータセットは、複数テーブルの情報をそのままXML出力できます。もちろん複数テーブルの読み込みも可能です。

データの更新や追加などは、パラメータとしてデータセットを利用することにより、1セッションで複数の更新/追加を行います。

データグリッドを利用するには、データテーブルからデータビューを生成し、バインドします。
http://okweb.jp/kotaeru.php3?q=1583980


簡単に書きましたが、私は.NET関連の本を一冊も買っていません。
あなたも他の言語経験があれば、ここの掲示板の履歴やそのリンク先を見ながら、ひたすら実践で慣れることの方が、覚えが早いと思います。

>ADOレコードセット
VB6ユーザですね?

ADOではなくADO.NETを利用する話ですよね?
まずデータセット構造に慣れましょう

データセット
├データテーブル1
├データテーブル2
・・・
└データテーブルX

データテーブル構造
X方向:データカラム(ズ)/旧で言うとフィールド的イメージかな?
Y方向:データロウ(ズ)/旧で言うとレコード的イメージかな?
┌┬┬┬┬┬┬┐
├┼┼┼┼┼┼┤
├┼┼┼┼┼┼┤
├┼┼┼┼┼┼┤
・・・・・・・・
└┴┴┴┴┴┴┘

さらにデータセットには、リレーショナルを追加したり、各データテーブル...続きを読む

QCSVファイルをEXCELに変換の自動化作業

CSVファイルをEXCELに変換の自動化作業
{CSVファイルをEXCELに変換するため、
excel  ツールバーよりデータ(D)→外部データの取り込み(D)→テキストファイルのインポート→ファイルの種類変更→全てのファイル→○○.csvのファイル指定→“,”の区切り選択、、ウィザードに従って変更し次へで進む→A1が指定されるのでそのまま完了→CSVがEXCELファイルに変換された。
参照したabc1.csvの名前に対して新しいabc1.xlsとなずけて登録する。これらの作業をMYドキュメントのhenkan ホルダーに入っているCSVファイルに同様に作業して同じくhenkan ホルダーに入れる。}
上記の{ }内の作業を何か,excelのVBAのマクロのようなもので実行することはできませんか。
やり方を教えてください。

Aベストアンサー

もともと、CSVとはカンマ区切りのはずですから、そうではないということなら、このコードは、違っています。こういう質問系掲示板は、質問者が分らない部分をお助けするような形で出来上がるものだと思いますので、回答者の回答を最初から否定するような発言は控えていだきたいと思いました。なお、フォルダーの中を一気に変換してしまうようなコードは、必ず変換後の様子を確認してからでなくてはなりませんので、それを確認していただくつもりでした。

私自身は、ここのカテゴリで、私は、一ゲンではありませんので、後々のためにコードを掲示しておきます。以下は、私が考えていたコードであって、その処理後の状態を保証するものではありません。

'<標準モジュール推奨>
Sub DirectryCSV2XLS()
  Dim myCSVFnames() As String
  Dim myCSVFname As String
  Dim xlFileName As String
  Dim i As Long
  Dim j As Long
  Dim n As Variant
  Dim msg As String
'=====================================
  '以下 フォルダー要設定
  Const MY_FOLDER As String = ""C:\Documents and Settings\<User>\My Documents\"
'=====================================
  If Left$(MY_FOLDER, 1) <> "\" Then MsgBox "フォルダーの設定の最後は、「\」が必要です。": Exit Sub
  If Dir(MY_FOLDER, vbDirectory) = "" Then _
   MsgBox "そのフォルダーは存在しません。", vbCritical: Exit Sub
 
  myCSVFname = Dir(MY_FOLDER & "*.csv")
  Do While myCSVFname <> ""
   ReDim Preserve myCSVFnames(i)
   myCSVFnames(i) = myCSVFname
   i = i + 1
   myCSVFname = Dir()
  Loop
  If i = 0 Then MsgBox MY_FOLDER & " には、CSVファイルが存在しません。", vbCritical: Exit Sub
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  For Each n In myCSVFnames
   xlFileName = Mid$(n, 1, InStrRev(n, ".csv")) & ".xls"
   If Dir(MY_FOLDER & "\" & xlFileName) = "" Then
     With Workbooks.Open(MY_FOLDER & "\" & n, Format:=2)
      .SaveAs MY_FOLDER & xlFileName
      Workbooks(xlFileName).Close False
      j = j + 1
     End With
   End If
  Next n
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  If i <> j Then msg = "既に" & CStr(i - j) & "個のCSV ファイルは、XLSに変換されています。"
  MsgBox i & "個のCSVの内、" & j & "個のファイルをXLSに変換しました。" & vbCrLf & msg
End Sub

もともと、CSVとはカンマ区切りのはずですから、そうではないということなら、このコードは、違っています。こういう質問系掲示板は、質問者が分らない部分をお助けするような形で出来上がるものだと思いますので、回答者の回答を最初から否定するような発言は控えていだきたいと思いました。なお、フォルダーの中を一気に変換してしまうようなコードは、必ず変換後の様子を確認してからでなくてはなりませんので、それを確認していただくつもりでした。

私自身は、ここのカテゴリで、私は、一ゲンではありませ...続きを読む

Qレコードセット(ADO.Recordset)で処理レコードは何番目?

excel2010 vbaでoracleに接続(ODBC)してレコード処理します。
変数でカウントしないと自分のレコード番号がわからないのですか。
プロパティ メゾットで知ることはできないですか。
(中略)
dim cut as long
Dim rs as ado.recordset
'--オープン処理
With rs
do until .EOF
 cnt = cnt + 1
rs.xxxx '---ここで何件目かしりたい
.movenext


Loop
End With

Aベストアンサー

多分、次の命令でレコード番号が分かるかと思います。
お試しください。

 rs.AbsolutePosition

QCSVをExcelに変換したい

お世話になります。

CSVファイルをExcelファイルに変換する場合、CSVファイルをExcelで開いて拡張子を「xls」もしくは「xlsx」を指定して保存すればよいかと思いますが、PCにExcelがインストールされてない環境の場合、Excelに変換することは不可能でしょうか。

今回、Accessにてツールを作成し、CSV(カンマ区切り)のデータを読み込もうとしておりますが、そのデータの中には単語の中にカンマが含まれているものがある為、普通にCSVをインポートしようとすると、ズレてしまいます。

なので、インポートする前準備としていったんExcelに変換したいと考えているのですが。。そのPCにExcelがインストールされてないと、やはり変換することは出来ないでしょうか。

もしくは、カンマ区切りのCSVファイルをタブ区切りに変換したりすることは出来ますでしょうか。

ご教授の程、宜しくお願い致します。

Aベストアンサー

>Accessにてツールを作成し、CSV(カンマ区切り)のデータを読み込もうとしておりますが、そのデータの中には単語の中にカンマが含まれているものがある為、普通にCSVをインポートしようとすると、ズレてしまいます。

毎回同じCSVのフォーマットだったら
(項目数やデータ型など)
一度インポートウィザードで進めて行って
設定ボタンから定義を保存し
次回からはその定義名を使用してインポートしては?
VBAならDocmd.transferText のヘルプにあるSpecificationNameに定義名を入れます。
・・・じゃダメかいな?

>インポートする前準備としていったんExcelに変換したい
CSVファイルを直接開くとExcelのお節介機能で
電話番号などの前ゼロがなくなったり、ハイフン付きのデータが日付と解釈されたり・・・
ということががあるので、拡張子CSVをTxtに変えてから
Excelで開こうとするとウィザードが立ち上がって・・・と出来ますが
結局のところ二度手間です。

ご参考まで。

Qダイナセットタイプのレコードセットオブジェクトの作成時

ダイナセットタイプのレコードセットオブジェクトの作成時、
引数にdbInconsistentという定数を使用できるようなのですが、

(例)Set rs = db.OpenRecordset("テーブル名", dbOpenDynaset, dbInconsistent)

dbInconsistentの説明として参考URLのところで
「矛盾を含んでいる場合でもレコードセットの更新が可能になります。
テーブル間のリレーション関係に矛盾が生じる場合でも、
それぞれそのテーブルデータを更新します。」

というようにかかれていました。この
「矛盾を含んでいる場合」
「テーブル間のリレーション関係に矛盾が生じる場合」
とはどういう場合なのかよく分からないのですが
具体的にどういう場合をいうのでしょうか?
ご存知の方いましたらよろしくお願い致します。

参考URL)http://www.accessclub.jp/dao/07.html

Aベストアンサー

dbInconsistentとは逆の、dbConsistentについて考えると分かりやすいと思います。
参考URLにも書いてありますが、
dbConsistentは「Accessの参照整合性に従って制御が掛かる」とありますね。

つまり、「矛盾を含んでいる場合」とは「参照整合性に反する場合」と言い換えることができます。

参照整合性とは、例えば

顧客マスタ(顧客ID,顧客名・・・)
明細テーブル(明細番号,顧客ID,・・・)

の2つのテーブルがあり、明細テーブルは顧客マスタの顧客ID(顧客マスタの主キー)を外部キーとして参照しているとします。

この場合、明細テーブルを更新するときに、明細テーブルの顧客IDは顧客マスタに存在するものでなければなりません。
これが参照整合性です。

「テーブル間のリレーション関係に矛盾が生じる場合」というのは、このケースであれば

明細テーブルの顧客IDに、顧客マスタに無い顧客IDが入っている
(例)顧客マスタの顧客IDは001~100までなのに、明細テーブルの、あるレコードの顧客IDが200になっている

という場合になります。

dbInconsistentはこういった矛盾を無視して更新を掛けられるオプション・・・ということになりますね。

dbInconsistentとは逆の、dbConsistentについて考えると分かりやすいと思います。
参考URLにも書いてありますが、
dbConsistentは「Accessの参照整合性に従って制御が掛かる」とありますね。

つまり、「矛盾を含んでいる場合」とは「参照整合性に反する場合」と言い換えることができます。

参照整合性とは、例えば

顧客マスタ(顧客ID,顧客名・・・)
明細テーブル(明細番号,顧客ID,・・・)

の2つのテーブルがあり、明細テーブルは顧客マスタの顧客ID(顧客マスタの主キー)を外部キーとして参照して...続きを読む

QCSV形式に変換

プログラミング(C言語)で、ファイルの内容をCSV形式に変換し、指定した出力ファイルに出力するプログラムを作成せよ。という課題がありましたが、
ファイルの内容をCSV形式に変換
がわかりません。どのようなプログラムをかいたらよいのでしょうか?

Aベストアンサー

#5です。
よく見たらフィールド内での入れ替えが居るようなので、
#5で書いたやり方ではできませんね。。。
#参考だしいいのかな。。。

読み込みを一行ずつにして、
中を入れ替えて・・・
という作業が必要になります。

QVB2005 DataGrdViewで、SQL文記述

VB6からVB2005に切り替える作業をしています。
DataGridViewにMDBファイルの中身を表示させることは出来ました。
DataSet,BindingSourceを用いています。
コードの記述で、SQLの文章を変更させたいのです。
WHERE文の記述を変えたりしたいのですが。
DataSourceにSQL文を記入することが出来ません。
DataSourceには記述できないのでしょうか?
それとも、根本的に間違っているのでしょうか。
よろしくお願いいたします。

Aベストアンサー

やりたい事は大体わかります。
データグリッドに表示するテーブルやクエリをコードでコントロール
したいという事ですよね。
vbのoledb関連のサンプルを片っ端から探して試すしかないです。

Private Sub Test(ByVal TbName As String)
Try
cmd = New OleDbCommand()
cmd.Connection = cn
cmd.CommandText = "SELECT * FROM " & TbName
cmd.CommandType = CommandType.Text
cn.Open()
myReader = cmd.ExecuteReader
Catch ex As System.Exception
MsgBox(ex.Message)
Exit Sub
Finally
cn.Close()
End Try
End Sub

こんな感じで、与えるデータセットのコマンドオブジェクトを
いじれば良いと思います。

やりたい事は大体わかります。
データグリッドに表示するテーブルやクエリをコードでコントロール
したいという事ですよね。
vbのoledb関連のサンプルを片っ端から探して試すしかないです。

Private Sub Test(ByVal TbName As String)
Try
cmd = New OleDbCommand()
cmd.Connection = cn
cmd.CommandText = "SELECT * FROM " & TbName
cmd.CommandType = CommandType.Text
cn.Open()
myReader = cmd.ExecuteReader...続きを読む


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

人気Q&Aランキング

おすすめ情報