ACCESS2002でVBAを使ってテキストファイルにエクスポートしようとすると
次のようなエラーが出てしまいます。
「予期せぬエラー #3027が発生しました。
データベースまたはオブジェクトは読み取り専用なので更新できません。」
これを回避するにはどうしたらいいのでしょうか。
ちなみにVBAの記述は
DoCmd.TransferText acExportDelim, "", "抽出クエリ", "a:\nk100.txt" , False, ""という記述です。

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

A 回答 (1件)

A:ドライブはフロッピーですよね?


○"抽出クエリ"は単体で動かしたときはきちんと動作しますか?

○a:\nk100.txtには読取専用属性が付いてませんか?

○フロッピーディスクのライトプロテクトは解除されていますか?

○フロッピーには十分な空きがありますか?

○出力先を C:\nk100.txt などとしても変わりませんか?

○一旦Accessを終了後に再度実行してみても変わりませんか?
    • good
    • 0

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

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

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

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

Q[Access VBA] DoCmd.OpenForm ...の書式について(VBAに詳しい方求む!)

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をしました。

Private Sub 詳細記録_Click()
DoCmd.OpenForm 帳票名
End Sub

ボタンをクリックした時点で帳票名フィールドに記載されている
帳票の詳細記録フォームがたちあがります。
例えば帳票名フィールドが
「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。
「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。
(企業秘密のため具体的な帳票名を書けません。)

実はこのような動作をしてくれるのが目的だったのですが
疑問があるんです。
それより前には、上述のと1箇所だけ記述がいろいろ変えてました。

DoCmd.OpenForm "帳票名"

帳票名のところがダブルクォーテーションでくくってあるかないか
の違いです。
くくるとエラーが出ますが、くくらないとうまく行きます。

[帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。

また、" "の中を具体的な帳票の名前にすると
(例:DoCmd.OpenForm "AA")
いつでもそのAAフォームだけがたちあがります。
(帳票名フィールドの記述がBBでも)

たまたまダブルクォーテーションをはずすと
うまく反応してくれたんでよかったんですが
ダブルクオーテーションひとつで
なぜこんなに動きが違うのか?
わかる方よろしくお願いします。

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をし...続きを読む

Aベストアンサー

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています。
Messageは変数であって文字列ではないため、ダブルクォーテーションで括る必要がないのです。

DoCmd.OpenForm でも同様。

DoCmd.OpenForm "帳票A"
は、「帳票A」という文字列をDoCmd.OpenForm命令に渡しています。


帳票フィールドに「帳票A」という文字が格納されているとき、

DoCmd.OpenForm Me![帳票フィールド]

とすると、DoCmd.OpenFormに渡されるのは「Me![帳票フィールド]」という文字列ではなく、帳票フィールドに格納されている「帳票A」という文字列が渡されるのです。

尚、この命令文は

Dim Chouhyou As String
Chouhyou = Me![帳票フィールド]
DoCmd.OpenForm Chouhyou

とするのと同じです。

あんまりいい説明じゃないかもしれませんが、VBA理解の一助にでもなれば幸いです。

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています...続きを読む

QACCESSでTXTにデータエクスポートする際

ACCESSでマクロ組んでます。
マクロでテーブルデータをtxtファイルにエクスポートしたいのですが、テキスト変換を設定する時に、定義名を入れないとダメみたいですが、何を入れればいいのか分かりません
できるだけマクロ使いたいのですが、無理ならばVBAでもと思っています。
access2000を使用しており、デスクトップにデータ出したいと思っています。

Aベストアンサー

定義名は自分で作った定義ファイル名を設定します。
定義ファイルは、以下のように作成します。

テーブルをクリックして選択してい状態で、右クリックでメニューを出し、エクスポートを選択します。
定義ファイルを置いておく場所(mdbと同じディレクトリ)を選択し、
ファイルの種類「テキストファイル(*.txt,*.cvs,*.tab,*.a)」を選択※します。
※ここがポイントで重要です。
そして「保存」ボタンをクリックします。
表示されるウィンドウの左下に「設定」ボタンがありますので、これをクリックしてエクスポート定義ファイルの設定画面を表示します。
ここで希望される、エクスポート方式を選び「保存」ボタンをクリック。
ここで、定義名の入力画面になりますので、「OK」ボタンをクリックし、
定義ファイルの完成です。
あとは、この名前をマクロの定義名に使ってください。

QエクセルVBAで作成した別ブックにVBAを記述したい

VBAで別ファイルの作成は下記で出来ているのですが、出来上がったファイルにVBAを記述する方法がわかりません。
具体的には一番下のSub TEST()を新しいブックの標準モジュールに記述したいのと、sheet1に
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "ChangeTEST"
End Sub
を入れたいです。
また
Private Sub Workbook_Open()
MsgBox "OpenTEST"
End Sub
も入れたいのです。
どうぞご教示ください。

Sub 複製()
Dim wb As Workbook, sc As Integer
sc = Application.SheetsInNewWorkbook

Application.SheetsInNewWorkbook = 1
Set wb = Workbooks.Add
Application.SheetsInNewWorkbook = sc

wb.Sheets("Sheet1").Select
ThisWorkbook.Sheets("Sheet1").Cells.Copy
wb.Sheets("Sheet1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

ActiveSheet.Buttons.Add(123, 195, 68.25, 15).Select
Selection.OnAction = "TEST"
Selection.Characters.Text = "TEST"
ActiveWorkbook.Close
ThisWorkbook.Activate
Sheets("Sheet1").Select
End Sub

Sub TEST()
MsgBox "TEST!!"
End Sub

よろしくお願いします。

VBAで別ファイルの作成は下記で出来ているのですが、出来上がったファイルにVBAを記述する方法がわかりません。
具体的には一番下のSub TEST()を新しいブックの標準モジュールに記述したいのと、sheet1に
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "ChangeTEST"
End Sub
を入れたいです。
また
Private Sub Workbook_Open()
MsgBox "OpenTEST"
End Sub
も入れたいのです。
どうぞご教示ください。

Sub 複製()
Dim wb As Workbook, sc As Integer
sc = Application....続きを読む

Aベストアンサー

わたしも前前からやってみたいと思っていたので、ネットを検索して調べてみました。
こんな感じで出来るようです。

'マクロ挿入
With wb.VBProject.VBComponents.Item("ThisWorkbook").CodeModule
.InsertLines 1, "Private Sub Workbook_Open()"
.InsertLines 2, ""
.InsertLines 3, "   Msgbox""ブックが開かれましたよ!"""
.InsertLines 4, ""
.InsertLines 5, "End Sub"
End With

With wb.VBProject.VBComponents.Item("Sheet1").CodeModule

.InsertLines 1, "Private Sub Worksheet_Change(ByVal Target As Range)"
.InsertLines 2, ""
.InsertLines 3, " MsgBox ""セルの値が変更されましたよ!"""
.InsertLines 4, ""
.InsertLines 5, "End Sub"

End With

wb.VBProject.VBComponents.Add (1) 'Module1挿入
With wb.VBProject.VBComponents.Item("Module1").CodeModule

.InsertLines 1, "Sub TEST()"
.InsertLines 2, ""
.InsertLines 3, "   Msgbox""TESTしたよ!"""
.InsertLines 4, ""
.InsertLines 5, "End Sub"

End With

わたしも前前からやってみたいと思っていたので、ネットを検索して調べてみました。
こんな感じで出来るようです。

'マクロ挿入
With wb.VBProject.VBComponents.Item("ThisWorkbook").CodeModule
.InsertLines 1, "Private Sub Workbook_Open()"
.InsertLines 2, ""
.InsertLines 3, "   Msgbox""ブックが開かれましたよ!"""
.InsertLines 4, ""
.InsertLines 5, "End Sub"
End With

With wb.VBProject.VBComponents.Item("Sheet...続きを読む

QAccess VBA ダイアログ指定 CSVエクスポート

お世話になります
CSVファイルをAccessにインポートしたいのですが。

■検索ボタンクリック→ダイアログBOXでファイル指定→
選んだCSVファイル場所をテキストボックスに保存→
確認ボックス→はい→インポート開始
と言う具合が理想ですが可能ですか?

■また、実行中、待ち時間インジケータでインポートの進捗状況を
把握したいのですが

ちなみにファイル名、ワークシート名は毎回異なりますが列名は同じです。
判る方ご教授お願いします。

Aベストアンサー

インポート定義が保存されていないようですが。

とりあえず
Private Sub 実行_Click()
  'TextConv Me.テキスト1, "テーブルA", "テーブル1"
  TextConv Me.テキスト1, "", "テーブル1"
End Sub
にすれば、インポートは出来ます。

インポート定義ができたら、その名前にしてください。

> ■全データ削除ではなく追加していきたい

'テキストコンバートルーチン
Sub TextConv(strFle As String, strInp As String, strTbl As String)
  If MsgBox("インポートしますか?", 4, "実行確認") = vbYes Then
    DoCmd.TransferText acImportDelim, strInp, strTbl, strFle, True
    '1行目がヘッダーなら、最後の TRUE が必要です。
    MsgBox "テーブルデータを更新しました"
  End If
End Sub

> ■CSVには不要な列もある
ということであれば「インポート定義」は必須です。
もう一度、
手動で、ファイルメニューから
[外部データの取り込み] - [インポート]
ファイルの種類でテキストファイルを選択し、
「Table.csv」を選択してインポートをクリック。
以下、ウィザードの画面で
「区切り記号付き」を選択して「次へ」をクリック。
「フィールド区切り記号」を「カンマ」、
「先頭行をフィールド名として使う」にチェック、
ここで 「設定」ボタンをクリックして、インポート定義の画面に。
必要なら、フィールド名を書き換える。
(CSV の ヘッダとテーブルのフィールド名が異なる場合など)
必要ならデータ型を書き換える。
(0001 というコードが数値にされてしまうと困る場合など)
インポートしないフィールドは「スキップ」欄にチェックする。
ここで 「保存」ボタンをクリック。
必要なら「定義名」を書き換えて、「OK」をクリック。
定義名は忘れないでメモしてね。
デフォルトで表示される名前には、スペースが含まれているので注意。
「OK」をクリックして、インポート定義の画面に。
「OK」をクリックして、ウィザードに戻る。
あとは、次へでインポートを続けても、キャンセルでも結構です。

インポ-ト定義に不具合があるようなら、
再度、手動でインポートし
インポ-ト定義画面で、「定義」ボタンを押せば呼び出せます。
修正して上書きしましょう。

ご健闘をお祈りします。

インポート定義が保存されていないようですが。

とりあえず
Private Sub 実行_Click()
  'TextConv Me.テキスト1, "テーブルA", "テーブル1"
  TextConv Me.テキスト1, "", "テーブル1"
End Sub
にすれば、インポートは出来ます。

インポート定義ができたら、その名前にしてください。

> ■全データ削除ではなく追加していきたい

'テキストコンバートルーチン
Sub TextConv(strFle As String, strInp As String, strTbl As String)
  If MsgBox("インポートしますか?", 4, "実行確認")...続きを読む

Q【Access2000】VBAコーディング Excelデータでエクスポート

いつもお世話になっています。

VBAにて、あるクエリをエクスポートしたいのですが。
クエリというのは、SQL文を書いています。

strSQL = "SELECT * FROM Q_tempソース"
DoCmd.TransferSpreadsheet acExport, 8, strSQL, "C:\temp.xls", True, ""

実行すると、
オブジェクト'SELECT * FROM Q_tempソース'が見つかりませんでした。オブジェクトが存在していること、名前やパスが正しいこと確認してください。
と表示されて処理が中断されます。

ポイントとしては、登録されているクエリではなく、SQL文でエクスポート内容を指定しているからかと思うのですが、
どのように修正すればよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

DoCmd.TransferSpreadsheetアクションのヘルプ読まれました?

そこの指定できるものは、

MSDNからの引用
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/off2000/vbaac/html/acactTransferSpreadsheet.asp

> Table Name
> テーブル名
中略
> Access 2000 では、このアクションを使用するときに、SQL ステート
> メントを使用してエクスポートするデータを指定することはできませ
> ん。SQL ステートメントを使用する代わりに、クエリを作成してから
> 、そのクエリの名前をこの引数に指定する必要があります。

で、テーブル名かクエリ名しか指定できません

> strSQL = "SELECT * FROM Q_tempソース"
strSQL = "Q_tempソース"

に変更すればよいと思いますが・・・Q_tempソースとは、テーブルですか?クエリーですか?

DoCmd.TransferSpreadsheetアクションのヘルプ読まれました?

そこの指定できるものは、

MSDNからの引用
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/off2000/vbaac/html/acactTransferSpreadsheet.asp

> Table Name
> テーブル名
中略
> Access 2000 では、このアクションを使用するときに、SQL ステート
> メントを使用してエクスポートするデータを指定することはできませ
> ん。SQL ステートメントを使用する代わりに、クエリを作成してから
> 、そのクエリの名前をこ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報