• 締切済み

テキストファイル操作 実行時エラー '52'

お世話になります。 現在 Excel2003の環境でVBAを使いファイル生成プログラムを書いています。生成されるファイルは、フォルダの中へ階層構造上に生成されていき、第5階層まで生成できます。 下記モジュールは、第4階層目のファイルを生成するモジュールとなっており、第1~3のモジュールと、パスの指定以外違いが無いのですが、 上手く生成できるときと、「実行時エラー '52'」が表示されるときがあり、まったく原因がつかめません。 第1~3のモジュールは何の問題も無く動作します。 エラーが出るのは、下記の 「 Open TargetFile For Output As fno」の部分です。 実行時エラー '52'になりうる原因も調べてみましたが、どれも該当しません。 1.操作しようとしたファイルが存在しなかった。 2.操作しようとしたファイルに対するアクセス権がなかった。 3.操作しようとしたファイルを Open 文で開いていない、または不正なファイルユニット番号を使っている。 4.ネットワーク上のファイル(例. \\Server\Share\hoge.txt)を操作しようとした。 どなたかお知恵をお貸し下さいorz '<サンプルモジュール> WBK = ThisWorkbook.Path 'フォルダパスを分割 buf = SH1.OLEObjects("test1").Object.Value A = Split(buf, " > ") 'ターゲットファイル Target = WBK & "\..\..\..\..\..\data\sample\" & A(1) & "\" & A(2) & "\" & A(3) & "\" & A(4) & "\" & A(4) & ".txt" 'ファイル生成及び書き込み fno = FreeFile Open TargetFile For Output As fno For i = 0 To 19 If SHDB.Range("O" & i + 3) <> "" Then Print #fno, SHDB.Range("O" & i + 3); ","; End If Next i Close fno

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

Unicode文字列での長さではなく MBCS(マルチバイト)の長さでの制限のようです Debug.Print LenB(StrConv( TargetFile, vbFromUnicode) ) これが 当方のWinXPSP3 + Excel2003 ですと 260以上ですと Error53 ファイルが見つかりません が発生しました ちなみに C:\Program files\新しいフォルダ\ ... 新しいフォルダ\ABCDEFGH\boot.ini で "新しいフォルダ\" が15個です

xYAMATOx
質問者

補足

redfox63様 ご回答ありがとうございます。 LenB(StrConv( TargetFile, vbFromUnicode) )で確認したところ、ずばりでした…。 設計自体の見直しを図ってみますorz ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

変数TargetFileの内容が255文字を超えていませんか?

xYAMATOx
質問者

お礼

Len(str)でカウントしてみたのですが、 配列内の1つあたりの値を12文字の上限に設定して再度試してみたのですが、195文字となり、255文字以下でもエラーが発生してしまいます・・・。

xYAMATOx
質問者

補足

redfox63様 回答ありがとうございます。 なるほど、見落としておりました…。 255越えるとエラーが発生するんですね…。 その可能性もありえます。 掲載時に記載ミスしてしまいましたが、 TargetFileには、 TargetFile = WBK & "\..\..\..\..\..\data\sample\" & A(1) & "\" & A(2) & "\" & A(3) & "\" & A(4) & "\" & A(4) & ".txt" が格納されるようになっております。 A(1)~A(4)の配列には、一つそれぞれ全角12文字を上限とし、文字が入ります。 例)サービス紹介 これを回避するには、階層を浅くする他ないのでしょうか…。

関連するQ&A

  • ExcelVBAで扱うテキストファイルデータ

    MSOffice2003のExcelVBAでテキストファイル(文字コードはUTF-8)内の全角文字データを入力し、そのまま更新しないで、別ファイル名で出力したら、文字化け(ANSI化)した。どうすればUTF-8のまま出力できますか? 「(フ)」(X'EFBBBFEFBC88E38395EFBC89')がX'8145BF814588E3839581458145'に化けます。 テキストファイルはCreateObject("Scripting.FileSystemObject")を定義して、 入力は、Open F_in For Input As #1でOPENし、Line Input #1, I_bufで入力し、 出力は、Open F_out For Output As #2でOPENし、Print #2, I_bufと出力した。

  • 実行時エラー '53'「ファイルが見つかりません。

    Sub test1() Dim strFName As String strFName = "C:\Users\test.html" Open strFName For Output As #1 Print #1, strHTML Close #1 ' 閉じる End Sub このような、フォルダ内にテキストファイルを作成するコードで 実行時エラー '53'「ファイルが見つかりません。」 と言うエラーになる場合があるのですが もしかして、ファイル名が長すぎるとこのようなエラーは発生しますか? その場合、何文字以内ならいいのでしょうか? win8、オフィス2010です。

  • プロシージャの呼び出し、または引数が不正です・・・

    お世話になります。 どなたかお助けください。。 現在、Excel2003のVBAで、シートに配置したテキストボックスに、外部テキストファイルから値を引っ張ってきて、表示するプログラムを書いているのですが、下記の「buf = Space(FileLen(TargetFile(i)))」この部分で 「プロシージャの呼び出し、または引数が不正です」とエラーが出てしまいます。 まったく何が悪いのか検討が付かずこまっています…。 よろしくお願いします。 Private Sub Workbook_Open() Dim 省略… Set SH1 = Worksheets("テスト") TargetFile1 = ThisWorkbook.Path & "\..\..\..\..\..\..\sample\a\b\c" TargetFile2 = ThisWorkbook.Path & "\..\..\..\..\..\..\sample\a\b\d" TargetFile3 = ThisWorkbook.Path & "\..\..\..\..\..\..\sample\a\b\e" TargetFile = Array(TargetFile1, TargetFile2, TargetFile3) '<一つ上の階層のフォルダ名を取得> myParentFolder = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\", -1, vbTextCompare)) '<ファイルのベースネームを取得> Set FSO = CreateObject("Scripting.FileSystemObject") myParentF = FSO.GetFolder(myParentFolder).ParentFolder myParentF2 = FSO.GetFolder(myParentF).ParentFolder myParentF3 = FSO.GetFolder(myParentF2).ParentFolder BaseName0 = FSO.GetBaseName(myParentF3) BaseName1 = FSO.GetBaseName(myParentF2) BaseName2 = FSO.GetBaseName(myParentF) BaseName3 = FSO.GetBaseName(myParentFolder) BaseName4 = FSO.GetBaseName(ThisWorkbook.Path) '<ページ情報を外部テキストから読み込み> '※値が空の場合のみ再度読み込み For i = 0 To 2 If SH1.OLEObjects("TextBox" & i + 1).Object.Value = "" Then n = FreeFile buf = Space(FileLen(TargetFile(i))) Open TargetFile(i) For Binary As #n Get #n, , buf Close #n If i = 0 Or i = 1 Then SH1.OLEObjects("info" & i + 1).Object.Value = buf Else SH1.OLEObjects("info" & i + 1).Object.Value = BaseName0 & " > " & BaseName1 & " > " & BaseName2 & " > " & BaseName3 & " > " & BaseName4 & buf End If End If Next i Set FSO = Nothing End Sub

  • テキストファイルへの書き込み

    gstrMyFileにファイルへのパスが入っているとして、以下を実行すると 今あるファイルへ追記されてしまいます。 今ある行を削除をして新たにbuf()のデータを記入したいのですが、できますか? fileNo = FreeFile Open gstrMyFile For Append As #fileNo For i = 0 To 50 Print #fileNo, buf(i) Next i Close #fileNo

  • エクセルにてテキストファイル読み込みでエラー  

    いつもお世話になっております。 テキストファイル (test.txt)をエクセルマクロにてセルへの読み込みを したいのですが、なぜか エラーになります。 Cells(n, 1) = buf  でエラーのようです。 理由がわかりません。 教えてもらえないでしょうか 普通の文章なら読み込みできるのですが =  を使っているとエラーがでるようです。 test.txtの画像を添付します。 エクセルのマクロの内容は次の通り Sub テキストファイルをセルに転記() Dim buf As String, n As Long Open "C:\Users\a\Desktop\test.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub

  • 実行時エラー’438 の解消

    QNo.3040449 と同じ内容の質問です。本を見ながらコードを書いてみましたが、 実行時エラー’438 オブジェクトはこのプロパティまたは メソッドをサポートしていません。となってしまいました。 どこを変更すれば、よいのでしょうか? また、元データをそれぞれ、<条件>シートの内容で抽出し、 可視セルのみ<集約>にコピーしたのち、他の2つの ファイルのデーターも先に貼り付けたデータの最後行の 下へコピーしたいのですが、コードがよくわかりません。 教えて頂ければ幸いです。 集約するシート:テスト用.xls sheet1.(集約) sheet2.(条件) 元のデータ: 金額一覧表(01~03).xls Sheet1.(01~03)   金額一覧表(04~06).xls Sheet1.(04~06)  金額一覧表(07~10).xls Sheet1.(07~10) <各データは1.5万~3万件> Sub 抽出後コピー() Dim myTbl As Range, myQry As Range, sakiRang As Range Dim Nx As Long Dim WBK As Workbook, WB1 As Workbook Dim SH1 As Worksheet, SH2 As Worksheet Set WBK = Workbooks("テスト用.xls") Set WB1 = Workbooks("金額一覧表(01~3).xls") Set SH1 = WB1.Sheets("(01-03)") WBK.Activate WB1.Activate Nx = SH1.Range("R65536").End(xlUp).Row Set myTbl = WB1.SH1.Range("A1:Nx") ←ここでデバック Set myQry = WBK.Sheets("条件").Range("A1:F27") Set sakiRang = WBK.Sheets("集約").Range("A1") myTbl.AdvancedFilter xlFilterCopy, myQry, sakiRng End Sub

  • 配列をテキストファイルに書き込むことは不可能でしょうか?

    Sub Macro1() Dim No As Long No = FreeFile 文字列 = "1234" Open "D:\Test.txt" For Output As #No Print #No, 文字列 Close #No End Sub 上記のMacro1の文字列の書き込みは可能なのですが Sub Macro2() Dim No As Long Dim 配列 As Variant Range("a1").Value = "1☆2☆3☆4☆" No = FreeFile 配列 = Split(Range("A1").Value, "☆") Open "D:\Test.txt" For Output As #No Print #No, 配列 Close #No End Sub だと「Print #No, 配列」で「型が一致しません」とエラーになってしまいます。 テキストファイルに配列を書き込みたいのですがどうすればいいのでしょうか? よろしくお願い致します。

  • ExcelVBAで実行時エラーが出ます

    このようなマクロを作りました。 Sub WriteCsv() Dim myTxtFile As String, myFNo As Integer Dim myLastRow As Long, i As Long Dim j As Long Dim aaa As Worksheet Set aaa = ActiveSheet Application.ScreenUpdating = False j = 0 myTxtFile = ActiveWorkbook.Path & "\Adress List.txt" Worksheets("List").Activate myLastRow = Range("A4").End(xlDown).Row myFNo = FreeFile Open myTxtFile For Output As #myFNo -----※ For i = 4 To myLastRow If Cells(i, 3) = 1 Then Write #myFNo, Cells(i, 5) j = j + 1 End If Next Close #myFNo   ・・・・   ・・・・ このExcelをフォルダーから実行するとすると、※で[ランタイムエラー52]が発生しますが、デスクトップから実行すると出ません。 どのように修正すればいいんでしょうか? よろしくお願いします。

  • 実行時エラーの原因がわかりません!

    全ての内容は多すぎるので記載することはできないのですが、例えば以下のようなことをしたとき Dim A as Variant,B as Variant   B = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(1000, 255)) A = Range(Cells(1, 1), Cells(1000, 255)) For i = 1 To 1000 A(i, 2) = A(i, 2) + B(i - 1, 2) * 3 - A(i, 1) If A(i, 2) <=0.2 * B(i - 1, 2) * 3 Then Call 再計算 End If B(i, 2) = B(i, 2) + B(i - 1, 2) + B(i, 1) Next Range(Cells(1, 2), Cells(1000, 2)) = Application.Index(A, 0, 2) 最後のApplication.Index(A, 0, 2)の部分で"実行時エラー13:型が一致しません"というものですが、原因がよくわかりません。Aのバリアント型がおかしなことになっているのでしょうか?原因として考えられることがあればどなたかアドバイスお願いします!

  • Excel VBAファイルがない場合メッセージ表示

    ExcelVBAでプログラムを実行させたときに2つのファイルを参照します。  (1)結果コピー先ファイル  (2)データ元ファイル この2つのファイルのうち、いずれかがなかった場合にメッセージを表示させたいのですが思うように表示されません。 以下のように動作させたいのですがうまくいきません。  (1)2種類のファイルがないときには両方のメッセージを   1つの画面に表示したい。  (2)どちらか一方のファイルがないときには、   エラーメッセージを表示させエラーのないファイルを   表示させない。    ※いろいろ試したら(a)がないメッセージが表示されたが、     (b)のファイルが表示された。  (3)正常に処理が終了した場合は、完了メッセージを表示したい。 途中まで書いてみたコードは以下の通りです。  ※実行コードは中略します。 '////////////////////////////////////////////////////// Sub test1() Dim sMsg As String Dim sMyDir As String sMyDir = ThisWorkbook.Path & "\" Dim Ws As Worksheet Dim vTgYear As Variant Dim Wb As Workbook Set Wb = Workbooks("算出プログラム.xls") Set Ws = Wb.Sheets("入力内容") vTgYear = Ws.Range("D17").Value With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With Dim sWbkName As String, StName As String Dim wbk結果1 As Variant sWbkName = "3_結果\結果.xls"   StName = "Sheet1" Dim sWbkSubName As String sWbkSubName = "1_算定表\" & vTgYear & "_算定表.xls" Dim Kname As String, Mname As String Kname = sMyDir & sWbkName Mname = sMyDir & sWbkSubName Dim buf As String On Error GoTo myError Open sMyDir & "3_結果\結果.xls" For Input As #1 Line Input #1, buf Close #1 On Error GoTo ErrorHandler2 If Dir(Mname) <> "" Then Workbooks.Open Filename:=Mname, Password:="aaaaa" Else Dim Wb1 As Workbook Set Wb1 = Workbooks("結果.xls") Set wbk結果 = Wb1.Sheets(StName) Dim wbkA As Variant Dim sShtName As String sShtName = "地域1" Dim Wb2 As Workbook Set Wb2 = Workbooks(vTgYear & "_算定表.xls") Set wbk地域A = Wb2.Sheets(sShtName) wbk結果.Range("F9:N9").Value = wbk地域A.Range("AB7:AK7").Value wbk結果.Range("F10:N10").Value = wbk地域A.Range("AB51:AK51").Value wbk結果.Range("F11:N11").Value = wbk地域A.Range("AB95:AK95").Value wbk結果.Range("F12:N12").Value = wbk地域A.Range("AB139:AK139").Value wbk結果.Range("F13:N13").Value = wbk地域A.Range("AB183:AK183").Value wbk結果.Range("F14:N14").Value = wbk地域A.Range("AB227:AK227").Value wbk結果.Range("F15:N15").Value = wbk地域A.Range("AB271:AK271").Value wbk結果.Range("F16:N16").Value = wbk地域A.Range("AB315:AK315").Value ≪後略≫ Application.DisplayAlerts = False wbk結果1.SaveAs Filename:=sMyDir & "3_結果\" & vTgYear & "_テスト.xls" ' Application.DisplayAlerts = True With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic End With Workbooks(vTgYear & "_算定表.xls").Close SaveChanges:=False MsgBox "計算期間" & "「" & kenko_Label_10 & "」で" & vbLf & "ファイルを作成しました。", vbInformation Close #1 Exit Sub myError: MsgBox "出力先の「結果_健康寿命」ファイルが存在しません。" & _ vbLf & "処理を終了します。", vbOKOnly + vbExclamation Exit Sub ErrorHandler2: MsgBox "指定年の「長野県健康寿命算定表」" & _ vbLf & "ファイルが存在しません。処理を終了します。", vbOKOnly + vbExclamation End If End Sub '////////////////////////////////////////////////////// メッセージ画面以外は正常に動作することを確認しています。 メッセージ画面について教えてください。 素人で申し訳ありませんが、よろしくお願い致します。

専門家に質問してみよう