2017-10-17 4 views
1

はvba関数がファイルを開くのに優れていますか?私は、.xls形式としてファイルを保存するための関数を定義しています

Public Function save_as_xls(full_file_path As String) As String 
    save_as_xls = "" 

    Dim src_file As Workbook 
    Set src_file = Workbooks.Open(full_file_path) 
    src_file.SaveAs filename:=full_file_path, FileFormat:=xlExcel8 
    src_file.Close 

    save_as_xls = "OK" 
End Function 

その後、しかし、それは動作しません、src_fileWorkbooks.OpenからNothingを取得=save_as_xls("c:\temp\test.xls")

としてExcelのセルの数式でそれを呼び出します

ファイルを開くことができないvba関数には制限がありますか?私はそれが他の細胞に書き込むことができないことを知っているだけです。

+2

チェックとしてExcelのセルの数式でそれを呼び出すことができます

Private Sub Workbook_BeforeClose(Cancel As Boolean) If TypeName(objExcel) = "Application" Then objExcel.Quit End Sub 

[この回答](https://stackoverflow.com/a/23232311/2165759)。 – omegastripes

+0

おそらく関連[Excel VBAはワークブックを開くことができません](https://stackoverflow.com/questions/7693530/excel-vba-cant-open-workbook)(そうでない場合は* duplicate *) – AntiDrondert

+0

[excel- udf]タグを使用すると、質問の主な部分は、これがUDFとして使用される関数であることです。しかし、タグ自体がその質問に答えてくれているので、**私は**タグを追加すべきであることを100%確信していません。そうしたい場合は、もう一度削除してください。 ([編集履歴](https://stackoverflow.com/posts/46782402/revisions)リンクをクリックして元のバージョンにロールバックしてください) – YowE3K

答えて

4

Excel UDFには一定の制限があるため、ブックを保存することはできません。次のコードに示すように、後でバインドされたExcelのインスタンスを使用して回避策を試すことができます。

標準モジュールにこのコードを入れてください:

Public objExcel As Application 

Public Function SaveAsXls(FilePath As String) As String 

    If objExcel Is Nothing Then 
     Set objExcel = CreateObject("Excel.Application") 
     With objExcel 
      .Visible = True ' for debug 
      .DisplayAlerts = False 
     End With 
    End If 
    With objExcel 
     With .Workbooks.Open(FilePath) 
      .SaveAs _ 
       Filename:=FilePath, _ 
       FileFormat:=xlExcel8 
      .Close True 
     End With 
    End With 
    SaveAsXls = "OK" 

End Function 

ThisWorkbookセクションにこのコードを入れてください:だからあなたは=SaveAsXls("c:\temp\test.xls")

+0

これはどういう意味ですか? A.xlsmにこれらを入れると、A.xlsmが閉じられる前に、 'Workbook_BeforeClose'がトリガされます。これが' SaveAsXls'をどのように引き起こすのでしょうか? – athos

+0

@athosブックが開かれていて、後でバインドされたExcelインスタンスが作成されると、パフォーマンスが向上するようにメモリに残ります。 「Workbook_BeforeClose」はExcelのそのインスタンスを終了してメモリを解放し、プロセス内でExcelをハングしないようにするだけです。 'SaveAsXls'では何もしません。 – omegastripes

+0

@athosこの回答は、あなたの質問のコードで何をしようとしているのかを達成するはずです。 – YowE3K

関連する問題