あるエクセルのブック内のシートをdドライブに自動的にunicodeのタブ区切りテキストで保存するマクロを作成しています。コードは

for i = 1 to 10

Sheets(i).Select
f_name = "d:\" + Trim(Str(i)) + ".txt"
ActiveWorkbook.SaveAs Filename:=f_name,_
FileFormat:=xlUnicodeText, CreateBackup:=False

next i

こんな感じです。

しかしこれを実行するとイルカが

'aaa.txt'にアクセスできません。ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。または、サーバー上に保存されているドキュメントから応答がありません。

と言うメッセージを出し、そこでキャンセルボタンを押すと

実行時エラー'1004':
'SaveAs'メソッドは失敗しました。'_Workbook'オブジェクト

というメッセージが出ます。さらにデバックを押すと、プログラムコードの
ActiveWorkbook.......の行で止まります。

環境はwindows2000、excel2000です。

何か足りないコードがあるのでしょうか?
よろしくお願いします。

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

A 回答 (2件)

どもども田吾作7です。



Dドライブを指定してるけど、存在してますか?
WIN2000のセキュリティでアクセス権がないとか?

でわでわ

この回答への補足

dドライブは存在しています。
ファイル、フォルダにアクセス権はあります。(たぶん)
ちょっと色々いじってみたのですが、マクロを実行するファイル属性の読み取り専用にチェックを打つとそのようなエラーが出てこなくなりました。
なんででしょう!?よくわかりません。

補足日時:2001/07/13 16:01
    • good
    • 0

どもども田吾作7です。



[マクロでファイルオープン]で質問されてますね。そちらが解決したらこちらの問題も解決するはずです。
ファイルは上書き保存だったんですね。読み取り専用属性を持つファイルのためにこのメッセージが出てると思われます。

でわでわ
    • good
    • 0

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

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

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

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

QRst.FindFirst "名称コード" & "=" & "'101'"

タイトルのコードでは問題ないのですが、 101 を文字変数にすると「抽出条件でデータ型が一致していません」のエラーになります。この場合シングルクオーテーションはどういう意味なのでしょうか。
どうすれば良いのでしょうか。

dim Vcode as string
Vcode = "101"
Rst.FindFirst "名称コード" & "=" & Vcode

Aベストアンサー

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます。
そこで、

rst.FindFirst "フィールド名 = 'xxx'"

このようにすればOKです。
次のステップとして、xxx の部分を変数を使ってやりたい場合。
単純に変数名に置き換えると、

rst.FindFirst "フィールド名 = '変数名'"

ですが、変数を、"" の中に記述すると、文字列として扱われますので、"" の外に
出してやる必要があります。
その場合、文字列と変数をつなぐためには、& を使います。

rst.FindFirst "フィールド名 = '" & 変数名 & "'"

で、このようになります。

FindFirst や、フォームの Filter プロパティで設定する場合は、SQL文のWHERE句の
内容を設定する必要があります。

フィールド名がテキスト型の場合は、

SELECT * FROM テーブル名 WHERE フィールド名 = "xxx"

のようになります。
で、FindFirst メソッドなんかで使う場合は、

rst.FindFirst フィールド名 = "xxx"

としたいところですが、条件の部分は文字列にしないといけません。
で、

rst.FindFirst "フィールド名 = "xxx""

こうすると、

フィールド名 =

で、切れてしまいます...続きを読む

QVB6+SQL サーバー 2000 で 実行時エラー '3704' がでます:

VB6 + SQL サーバー 2000 でDB接続を行っていますが
リストのように SELECT 文の後にInsert 文を実行しようとし
Re.Closeを実行すると
-------------------------------------------------------------
実行時エラー '3704':
オブジェクトが閉じている場合は、操作は許可されません
-------------------------------------------------------------
 とエラーになり、連続するSQL文を実行する場合のopen ,Close は
どのように書けばよろしいのでしょうか。

 ネット上で見つけた資料によるとメソッド RE.CancelUpdate を使うと
ありましたがこれもエラーとなります。

どなたか 教えていただけないでしょうか。

--- sample ----------------------------------------
Dim Cn As New ADODB.Connection
Dim Re As New ADODB.Recordset

Connect = ""
Connect = "Provider = SQLOLEDB;" _
& "Data Source = サーバー;" _
& "User ID = sa;" _
& "Password = パスワード;" _
& "initial Catalog = database;"
'
Cn.Open Connect
'
strSQL = "SELECT * from DBTBL WHERE CODE = '000001'"
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
Re.Close
'
strSQL = "Insert Into MAS1PF (CODE,NAME,TEL,FAX) Values('11111','名前','TEL,'FAX)"
Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
'
Re.Close
Cn.Close

VB6 + SQL サーバー 2000 でDB接続を行っていますが
リストのように SELECT 文の後にInsert 文を実行しようとし
Re.Closeを実行すると
-------------------------------------------------------------
実行時エラー '3704':
オブジェクトが閉じている場合は、操作は許可されません
-------------------------------------------------------------
 とエラーになり、連続するSQL文を実行する場合のopen ,Close は
どのように書けばよろしいのでしょうか。

 ネット上で見つけた資料によるとメソッド ...続きを読む

Aベストアンサー

1:strSQL = "SELECT * from DBTBL WHERE CODE = '000001'"
2:Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行
3:Re.Close
4:strSQL = "Insert Into MAS1PF (CODE,NAME,TEL,FAX) Values('11111','名前','TEL,'FAX)"
5:Re.Open strSQL, Cn, adOpenKeyset 'SQL文を実行

の 3: で Re.Close したまま、5: で Re.Open しているからだと思います。
5: の前に
Set Re = New ADODB.Recordset
を入れると正常に動作するようになると思います。
ちなみに、なぜ 2: ではエラーが発生しないかというと、
Dim Re As ADODB.Recordset
ではなく、
Dim Re As New ADODB.Recordset
として宣言しているからです。

Q[VB5] RDO:エラー'429' ActiveX コンポーネントはオブジェクトを作成できません

Excel97のVBAを使って、RDOでSQLserverに接続しようとすると
「ActiveX コンポーネントはオブジェクトを作成できません」
というエラーがでます。

VB5.0を再セットアップするとよいと以下のURLにはのっていますが

http://www.microsoft.com/japan/support/kb/articles/J043/1/96.asp

VBがインストールされていないマシンでは、どうしたらよいのでしょうか?
RDOのバージョンは2.0です。

Aベストアンサー

--参考URLより--
また、RDO は Visual Basic Enterprise Edition の開発者だけにライセンスされています。(中略)Microsoft Office プラットフォームには実行時モードはなく、RDO 開発プラットフォームとして使用するた
めのライセンスもありません。
-------
分かりづらい文章ですが、

>Excel97のVBAを使って、RDOでSQLserverに接続

これはライセンス違反ではないでしょうか?

参考URL:http://www.microsoft.com/JAPAN/developer/library/VBCon98/vbconrdoconfigurationrequirements.htm

QVB6のAttribute VB_Nameの意味について

VB6のAttribute VB_Nameの意味について

VB6のAttribute VB_Nameの意味がわかりません。
例えばAttribute VB_Name = "AAA"とした場合、このAAAは何を意味するのでしょうか。

Aベストアンサー

仮に添付画像のようなプロジェクトの時、

Form1.frmをテキストエディタで開くと
→Attribute VB_Name = "Form2"

Form1.frmをテキストエディタで開くと
→Attribute VB_Name = "Form2"

Module1.basをテキストエディタで開くと
→Attribute VB_Name = "Module2"

となります。


Attribute VB_Name = "オブジェクト名"
という事です。

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。


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

おすすめ情報