
No.6ベストアンサー
- 回答日時:
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 でネット検索してみてください。
遅くなって申し訳ありません。
コードまで呈示して頂き、本当にありがとうございます!
とりあえず貼り付けてみて実行してみました。
すると、コモンダイアログが開くところまではいったのですが、最後に「実行時エラー 3027 データベースまたはオブジェクトは読み取り専用なので更新できません」となってしまい、保存できませんでした。
フォーム上のコマンドボタンに下記のコードを付けて実行したのですが…。
DoCmd.TransferText acExportDelim, "", "○○テーブル", FileSaveDialog, False, ""
何度もうまくいかなくて申し訳ありません。。もし何が悪いのかご存知でしたらご教唆いただきたいのですが・・・。
No.8
- 回答日時:
こんにちは
No.2です。原因がわかってよかったです。
折角ですので FileSaveDialog を以下のように修正するともっと使いやすくなると思います。
.lpstrDefExt = ".csv" を追加する。
ダイアログで拡張子が未入力の時 .csv が自動的に追加されます
それと .lpstrFilter のtxt部分をcsvに変更したほうが自然ですよね
ありがとうございます、これでやりたかったことが完全に実現できました!
正直、csvを好きなところに吐き出すだけのことが、こんなに大変なことだとは思っていませんでした。すんなり、ナントカメソッドがあるんじゃないかと思ってました。。
にもかかわらず私のような初心者に対し、ご親切にご指導いただきましたこと、感謝申し上げます。とても勉強になりました。ありがとうございました。
No.7
- 回答日時:
こんにちは。
No.2です。ダイアログは表示されたようなので安心しました。
今度は DoCmd.TransferText メソッドの問題のようですね。Access2002を使ってテストしてみましたが問題なく動作します。 テーブルが存在しなかった場合、出力先テキスト(既存)が Readonly であった場合など、何れも実行時エラーにはなりますが、「実行時エラー 3027 ...」にはなりません。
Access のレベルは若干違いますが原因を把握できません。差し支えなければ実際に指定した出力先の詳細など、もう少し詳しい状況を記載して他の方のアドバイスを受けてみてください。
なお、DoCmd.TransferText メソッドの中に関数呼び出しが組み込まれていますが、ダイアログでキャンセルした場合は不都合が生じます。以下のように記述するのが一般的だと思います。
fileName = FileSaveDialog()
if fileName <> "" then
DoCmd.TransferText acExportDelim, , "○○テーブル", fileName, False
end if
色々やってみたらうまく行きました!!
コードは以下の通りです。
fileName = FileSaveDialog()
If fileName <> "" Then
DoCmd.TransferText acExportDelim, , "main", fileName & ".csv", False
End If
4番目の引数の後ろに、拡張子を付けていなかったのが原因だったみたいです。
今回はとても助かりました。ご親切にご指導いただき、本当にありがとうございました。
No.5
- 回答日時:
No.2です。
お力になれず残念ですが、下記のことが気になったので再度アップしてみました。
> ☆transfertext を使うと、任意の場所に出力できない。
> ☆OutputTo を使うと、任意の場所に出力は出来る
任意の場所とはフォルダのことですよね。後者ができるということはどういうことでしょう?
どちらのメソッドも第4引数で出力先(例えば c:\temp\FaileName.csv)を指定することになっていますので、前者も当然できると思いますが。
ダイアログボックスはパスの指定を正確かつ容易に指定できる手段を提供しているだけで、面倒ですがテキストボックスに直接入力することで代替することもできます。任意の場所への出力とダイアログボックスによるパスの取得は直接関係ないですよね。
ピンボケの返答だったらご容赦ください。
ActiveXコントロールのインストールについては、他の方からのアドバイスを期待しましょう。
たびたび説明が不足で申し訳ありません。
私が「任意」と書かせて頂いた感じは、その場でユーザがフォルダを選べるというイメージなんです。
具体的には、OutputToの4番目の引数に何も入れないと、その場でユーザが好きな場所を選べるのですけれど、そんな感じなのです。
例(DoCmd.OutputTo acTable, "○○テーブル", "MicrosoftExcel(*.xls)", "", False, "")
でも3番目の引数にcsv形式だってことを指示できなくて。
TransferTextだと4番目になにも入れないとエラーになってしまうし。
むずかしいです。。
No.4
- 回答日時:
No.2です。
エラーに関する的確なアドバイスができません。
下記URLを参考にトライしてみてください。
参考URL:http://www.accessclub.jp/bbs3/0033/superbeg13443 …
URLまで教えていただき、ほんとうにありがとうございます。
私は常々以下のことで悩んでいました。
☆transfertext を使うと、csv形式には出来るけど、任意の場所に出力できない。
☆OutputTo を使うと、任意の場所に出力は出来るけど、テキスト形式やエクセル形式にしかならず、csv形式にできない。
色々調べてみたのですが、どうやらCreateObjectを使うには、ライセンスというものが必要みたいなのです。(きっとお金もかかるのだと思います。)
私は普通の事務のOLなので、開発者の方々とは環境が違うのだと思いました。ということで、とりあえずあきらめがつきました。けれどとても勉強になりました。心より感謝申し上げます。
No.3
- 回答日時:
こんにちは。
No.2です。(1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか?
その通りです。
(2)は、もしかして、「CreateObject」というのを使うのでしょうか??
以下の操作を試してください。
現在表示されているツールボックスの「コントロールの選択」アイコンをクリックすると使用可能なコントロールの一覧が表示されますので、Microsoft Common Dialog Control, version xxx ... をダブルクリックしてください(フォーム上にアイコンが表示されると思います)。
(3)出力先を指定してボタンを押したら、csvではきだされる
DoCmdコマンドを利用して
DoCmd.TransferText acExportDelim, , Table名, CSVファイル名, True
詳しくはDoCmd.TransferTextを調べてください。
ご親切な回答、ありがとうございます。
(2)で、Microsoft Common Dialog Control version6 というのを呼び出そうとしたのですが、以下のようなメッセージが出てしまい、再び途方に暮れてしまいました。
「このActiveXコントロールを使用するライセンスがありません。」
ちなみにWindowsXPのHome Edition で、ACCESS2000を使用しています。
なんとか解決する方法はないものでしょうか??
No.2
- 回答日時:
こんにちは
ボタンを押した時にダイアログボックスを表示したいということでしょうか。
Microsoft Common Dialog Controlをフォームに配置し
ボタンのClickイベントでCommonDialog8.ShowSaveメソッドを呼び出します。
ファイル名を獲得後Docmd.TranferTextでCSV出力します。
こんな感じでしょうか。
ご回答ありがとうございます。やりたいことはそうなんです。
けど、うまくいきません…むずかしい…(汗)
えーと、まず、こんなふうに流れをわけてみました。
(1)ボタンをフォームにつくる
(2)それを押したらダイアログボックスが表示される
(3)出力先を指定してボタンを押したら、csvではきだされる
(1)は、ふつうのツールボックスから持ってくるコマンドボタンでもよいのでしょうか?(ふつうのフォームやマクロならなんとか解ります)
(2)は、もしかして、「CreateObject」というのを使うのでしょうか??
(「Commondialog」をインターネットで調べてみました。)
でも、そうすると、「実行時エラー429」というのが出てしまい、ここで止まってしまったのです。(あさっての方向を向いていたらすみません)
どうやって解決していいのかわかりません。。
申し訳ないのですが、ご存知でしたら教えて下さいませんでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- その他(プログラミング・Web制作) Accessの代わりのノンプログラムデータベース作成 4 2022/10/21 09:26
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- Access(アクセス) Access VBA を利用して、フォルダ内のファイルの名称を変更したい 1 2023/08/03 08:27
このQ&Aを見た人はこんなQ&Aも見ています
-
【Access】クエリで抽出したデータをCSV形式でエクスポートできますか?
Access(アクセス)
-
Access VBA ダイアログ指定 CSVエクスポート
Access(アクセス)
-
AccessでSQL結果を直接csvに書き出すには?
Word(ワード)
-
-
4
アクセスvbaでエクセルブックを保存
その他(Microsoft Office)
-
5
accessでクエリをExcelにエクスポートする時にファイル名に日付を追加したい
Access(アクセス)
-
6
Accessのテーブルからcsv出力する際に一部のフィールドを除いて出力したい
Access(アクセス)
-
7
Accessのクエリで、replace関数を使い、データの中にある”をブランクに置き換えたいのですが
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルI/O完了待ち
-
VC++でUTF-8のファイルを出力し...
-
AccessVBA複数レポート条件毎に...
-
CSVに書き出すVBSとHTA
-
SendKeys "^V", True(貼り付け...
-
外国語とCSVについて
-
大量のHTMLデータのテキスト、...
-
Acccess レポートをグループ別...
-
CSVファイルを任意の場所に出力...
-
シェルコマンドの 2>&1 とはど...
-
ファイル出力の場所を指定
-
テキストファイルに改行コード...
-
コマンド(例えばls)の出力結果...
-
テキストの各行に行番号をつけ...
-
I/Oエラー(Delphi)
-
C++ fprintf_sの使い方がわからん
-
gccによって、BOM付きのUTF-8で...
-
CreateProcess関数と実行後の戻...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
【ExcelVBA】UTF-8(BOM無)でC...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
ファイルの文字コードをUTF-8に...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
BitBltについて。
-
Wordマクロで指定したフォルダ...
-
ファイル形式またはファイル拡...
-
CSV形式に変換
-
テキストファイルに改行コード...
-
C++ fprintf_sの使い方がわからん
-
外国語とCSVについて
-
1行ずつではなくまとめてファイ...
-
pcap形式データをテキストへ抽出
-
重複チェックプログラム
-
AviUtlでAVI出力が途中までしか...
-
CBool関数について VB6とVB.net...
-
標準出力とファイルに効率的に...
おすすめ情報