アプリ版:「スタンプのみでお礼する」機能のリリースについて

ACCESS-VBAの初心者です。
ACCESSのテーブルを、csvファイルとして、任意の場所に出力させるには、どのようにしたら良いのでしょうか。
当方初心者につき、なるべく簡単な方法だとさらに助かるのですが。

A 回答 (8件)

No.2です。


便利な使い方があるんですね。知りませんでした!

せっかくやる気を出しているので、以下のAPIでダイアログを表示したらどうでしょうか(ネットで調べたものを多少修正しました)。自分の使いやすいように修正してください。このまま使用するなら該当するフォームにそのまま貼り付けてください(=== の間)。
=============================================================
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
lStructSize As Long '構造体のサイズ
hwndOwner As Long '親ウィンドウのハンドル
hInstance As Long 'モジュールのインスタンスハンドル
lpstrFilter As String 'VBのファイルパターン
lpstrCustomFilter As String 'カスタムフィルタ
nMaxCustFilter As Long '同バイト数
nFilterIndex As Long 'フィルタのインデックス
lpstrFile As String 'フルパス名を受取るバッファ
nMaxFile As Long '同バイト数
lpstrFileTitle As String 'ファイル名を受取るバッファ
nMaxFileTitle As Long '同バイト数
lpstrInitialDir As String '初期ディレクトリ名
lpstrTitle As String 'ダイアログボックスのキャプションタイトル
flags As Long '動作を指定する定数の組合せ
nFileOffset As Integer 'フルパス中のファイル名までのオフセット
nFileExtension As Integer '同 拡張子までのオフセット
lpstrDefExt As String 'デフォルトの拡張子
lCustData As Long 'フックプロシージャに渡すデータ
lpfnHook As Long 'フックプロシージャOFNHookprocへのポインタ
lpTemplateName As String 'テンプレートリソース名
End Type

Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_EXPLORER = &H80000

'--------------------------------------
' ダイアロゴを表示(名前を付けて保存)
'--------------------------------------
Private Function FileSaveDialog(Optional folder As String = "C:\") As String
Dim tOpenFileName As OPENFILENAME
Dim lngRet As Long

With tOpenFileName
.lStructSize = Len(tOpenFileName)
.hwndOwner = Me.hWnd
.hInstance = 0
.lpstrFilter = "テキストファイル(*.txt)" & vbNullChar & "*.txt" _
& vbNullChar & "すべてのファイル(*.*)" & vbNullChar & "*.*"
.nFilterIndex = 1
.lpstrFile = strFileName & String$(256, Chr$(0))
.nMaxFile = 256
.lpstrFileTitle = String$(256, Chr$(0))
.nMaxFileTitle = 256
.lpstrInitialDir = folder
.lpstrTitle = "名前を付けて保存"
.flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or _
OFN_HIDEREADONLY Or OFN_OVERWRITEPROMPT
End With

lngRet = GetSaveFileName(tOpenFileName)
FileSaveDialog = Left$(tOpenFileName.lpstrFile, _
InStr(tOpenFileName.lpstrFile, vbNullChar) - 1)
End Function
=============================================================
呼び出しは fileName = FileSaveDialog("デフォルトフォルダ")
デフォルトフォルダが指定されなかったときは C:\ とみなします。
戻り値は fileName に指定ファイルの FullPath が返されます。
キャンセルした場合は空文字が返ります。
以上お試しください。
APIの詳細は GetSaveFileName でネット検索してみてください。
    • good
    • 0
この回答へのお礼

遅くなって申し訳ありません。
コードまで呈示して頂き、本当にありがとうございます!
とりあえず貼り付けてみて実行してみました。
すると、コモンダイアログが開くところまではいったのですが、最後に「実行時エラー 3027 データベースまたはオブジェクトは読み取り専用なので更新できません」となってしまい、保存できませんでした。
フォーム上のコマンドボタンに下記のコードを付けて実行したのですが…。
DoCmd.TransferText acExportDelim, "", "○○テーブル", FileSaveDialog, False, ""

何度もうまくいかなくて申し訳ありません。。もし何が悪いのかご存知でしたらご教唆いただきたいのですが・・・。

お礼日時:2007/05/13 10:22

こんにちは


No.2です。原因がわかってよかったです。
折角ですので FileSaveDialog を以下のように修正するともっと使いやすくなると思います。
 .lpstrDefExt = ".csv" を追加する。
 ダイアログで拡張子が未入力の時 .csv が自動的に追加されます
それと .lpstrFilter のtxt部分をcsvに変更したほうが自然ですよね
    • good
    • 4
この回答へのお礼

ありがとうございます、これでやりたかったことが完全に実現できました!
正直、csvを好きなところに吐き出すだけのことが、こんなに大変なことだとは思っていませんでした。すんなり、ナントカメソッドがあるんじゃないかと思ってました。。
にもかかわらず私のような初心者に対し、ご親切にご指導いただきましたこと、感謝申し上げます。とても勉強になりました。ありがとうございました。

お礼日時:2007/05/16 10:29

こんにちは。

No.2です。
ダイアログは表示されたようなので安心しました。
今度は DoCmd.TransferText メソッドの問題のようですね。Access2002を使ってテストしてみましたが問題なく動作します。 テーブルが存在しなかった場合、出力先テキスト(既存)が Readonly であった場合など、何れも実行時エラーにはなりますが、「実行時エラー 3027 ...」にはなりません。
Access のレベルは若干違いますが原因を把握できません。差し支えなければ実際に指定した出力先の詳細など、もう少し詳しい状況を記載して他の方のアドバイスを受けてみてください。
なお、DoCmd.TransferText メソッドの中に関数呼び出しが組み込まれていますが、ダイアログでキャンセルした場合は不都合が生じます。以下のように記述するのが一般的だと思います。
fileName = FileSaveDialog()
if fileName <> "" then
 DoCmd.TransferText acExportDelim, , "○○テーブル", fileName, False
end if
    • good
    • 1
この回答へのお礼

色々やってみたらうまく行きました!!
コードは以下の通りです。

fileName = FileSaveDialog()
If fileName <> "" Then
DoCmd.TransferText acExportDelim, , "main", fileName & ".csv", False
End If

4番目の引数の後ろに、拡張子を付けていなかったのが原因だったみたいです。

今回はとても助かりました。ご親切にご指導いただき、本当にありがとうございました。

お礼日時:2007/05/14 12:40

No.2です。


お力になれず残念ですが、下記のことが気になったので再度アップしてみました。
> ☆transfertext を使うと、任意の場所に出力できない。
> ☆OutputTo を使うと、任意の場所に出力は出来る
任意の場所とはフォルダのことですよね。後者ができるということはどういうことでしょう?
どちらのメソッドも第4引数で出力先(例えば c:\temp\FaileName.csv)を指定することになっていますので、前者も当然できると思いますが。

ダイアログボックスはパスの指定を正確かつ容易に指定できる手段を提供しているだけで、面倒ですがテキストボックスに直接入力することで代替することもできます。任意の場所への出力とダイアログボックスによるパスの取得は直接関係ないですよね。
ピンボケの返答だったらご容赦ください。

ActiveXコントロールのインストールについては、他の方からのアドバイスを期待しましょう。
    • good
    • 0
この回答へのお礼

たびたび説明が不足で申し訳ありません。
私が「任意」と書かせて頂いた感じは、その場でユーザがフォルダを選べるというイメージなんです。

具体的には、OutputToの4番目の引数に何も入れないと、その場でユーザが好きな場所を選べるのですけれど、そんな感じなのです。
例(DoCmd.OutputTo acTable, "○○テーブル", "MicrosoftExcel(*.xls)", "", False, "")
でも3番目の引数にcsv形式だってことを指示できなくて。

TransferTextだと4番目になにも入れないとエラーになってしまうし。

むずかしいです。。

お礼日時:2007/05/11 00:24

No.2です。


エラーに関する的確なアドバイスができません。
下記URLを参考にトライしてみてください。

参考URL:http://www.accessclub.jp/bbs3/0033/superbeg13443 …
    • good
    • 0
この回答へのお礼

 URLまで教えていただき、ほんとうにありがとうございます。
 
 私は常々以下のことで悩んでいました。
☆transfertext を使うと、csv形式には出来るけど、任意の場所に出力できない。
☆OutputTo を使うと、任意の場所に出力は出来るけど、テキスト形式やエクセル形式にしかならず、csv形式にできない。

 色々調べてみたのですが、どうやらCreateObjectを使うには、ライセンスというものが必要みたいなのです。(きっとお金もかかるのだと思います。)
 私は普通の事務のOLなので、開発者の方々とは環境が違うのだと思いました。ということで、とりあえずあきらめがつきました。けれどとても勉強になりました。心より感謝申し上げます。

お礼日時:2007/05/10 21:31

こんにちは。

No.2です。

(1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか?
その通りです。

(2)は、もしかして、「CreateObject」というのを使うのでしょうか??
以下の操作を試してください。
現在表示されているツールボックスの「コントロールの選択」アイコンをクリックすると使用可能なコントロールの一覧が表示されますので、Microsoft Common Dialog Control, version xxx ... をダブルクリックしてください(フォーム上にアイコンが表示されると思います)。

(3)出力先を指定してボタンを押したら、csvではきだされる
DoCmdコマンドを利用して
DoCmd.TransferText acExportDelim, , Table名, CSVファイル名, True
詳しくはDoCmd.TransferTextを調べてください。
    • good
    • 0
この回答へのお礼

ご親切な回答、ありがとうございます。

(2)で、Microsoft Common Dialog Control version6 というのを呼び出そうとしたのですが、以下のようなメッセージが出てしまい、再び途方に暮れてしまいました。
「このActiveXコントロールを使用するライセンスがありません。」

ちなみにWindowsXPのHome Edition で、ACCESS2000を使用しています。
なんとか解決する方法はないものでしょうか??

お礼日時:2007/05/10 16:16

こんにちは


ボタンを押した時にダイアログボックスを表示したいということでしょうか。
Microsoft Common Dialog Controlをフォームに配置し
ボタンのClickイベントでCommonDialog8.ShowSaveメソッドを呼び出します。
ファイル名を獲得後Docmd.TranferTextでCSV出力します。
こんな感じでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。やりたいことはそうなんです。
けど、うまくいきません…むずかしい…(汗)

えーと、まず、こんなふうに流れをわけてみました。
(1)ボタンをフォームにつくる
(2)それを押したらダイアログボックスが表示される
(3)出力先を指定してボタンを押したら、csvではきだされる

(1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか?(ふつうのフォームやマクロならなんとか解ります)

(2)は、もしかして、「CreateObject」というのを使うのでしょうか??
(「Commondialog」をインターネットで調べてみました。)
でも、そうすると、「実行時エラー429」というのが出てしまい、ここで止まってしまったのです。(あさっての方向を向いていたらすみません)

どうやって解決していいのかわかりません。。
申し訳ないのですが、ご存知でしたら教えて下さいませんでしょうか。

お礼日時:2007/05/10 12:23

データベースウインドウのテーブル画面にて


出力したいテーブルを右クリック してエクスポート(E)を実行

出力先をどこにするかダイアログボックスが表示されるので
ファイルの種類を Text FILE(Csv,TXT) を選択して
名前を指定してOKを押せばウイザードが表示されます。
あとは指示に従うだけでできます。

この回答への補足

あああ、申し訳ありません、説明不足です。。。
ひとつのツールとして、ユーザが「出力」ボタンを押したときに、ユーザが好きな場所に掃き出せるようにしたいのです。

補足日時:2007/05/09 22:55
    • good
    • 0

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