使用VBA,如何将文件保存到相对目录中

我有以下代码将Excel工作簿的内容保存为制表符分隔的文件。

Sub maketxtfile(className As String, rosterFileHandle As String) Dim i As Long, gradebookContent As String With Worksheets(className).UsedRange For i = 1 To .Rows.Count gradebookContent = gradebookContent & vbCrLf & Join$(Application.Transpose(Application.Transpose(.Rows(i).Value)), vbTab) Next End With Open Replace(ThisWorkbook.FullName, "Fall_2013_2014.xlsm", rosterFileHandle) For Output As #1 Print #1, Mid$(gradebookContent, Len(vbCrLf) + 1) Close #1 End Sub 

问题是,我不希望制表符分隔文件驻留在xlsm文件相同的目录中。 我希望该文件驻留在一个子目录中。 我已经看到使用绝对path名称发布解决scheme。 对我来说这不是一种select,我不一定知道path名将会提前。

我以为我可以做这样的事情:

  Open Replace(ThisWorkbook.FullName, "Fall_2013_2014.xlsm", "rosters/" & rosterFileHandle) For Output As #1 Print #1, Mid$(gradebookContent, Len(vbCrLf) + 1) Close #1 

但是,这给我一个错误。 尽pipe我在Mac上工作,但我试过使用"rosters\"但是这个工作时,它并没有将我的文件放在子目录中,而是放在一个path名为\\的文件中。

我将不胜感激一个解决scheme,将告诉我如何使用相对path名来做到这一点。

顺便说一句,我不介意先在当前目录中创build制表符分隔文件,然后将其移到子目录中。

Mac使用:作为path分隔符; 它只是看起来很奇怪,如果你习惯于DOS / Windows。 或者,如果你是一个诵读困难的* nix用户;-)。

如果“我的其他机器”是指Windows盒子,那么不是,它将不能移植,因为冒号只限于在文件名中分隔盘符。 最好的办法是做这样的事情:

 Function PathSep() As String #If Mac Then PathSep = ":" #Else PathSep = "\" #End If End Function 

那么你可以:

 Open Replace(ThisWorkbook.FullName, "Fall_2013_2014.xlsm", "." & PathSep & "rosters" & PathSep & rosterFileHandle) For Output As #1 

经过多次search,我find了一些可行的方法。

我可以写:

 Open Replace(ThisWorkbook.FullName, "Fall_2013_2014.xlsm", ".:rosters:" & rosterFileHandle) For Output As #1 Print #1, Mid$(gradebookContent, Len(vbCrLf) + 1) Close #1 

使用“:”来表示目录path的语法似乎有点怪异,但它的工作原理。 现在的问题是这是否是便携式的,并将在我的其他机器上正常工作。

这应该做的伎俩

 ThisWorkbook.SaveAs (ThisWorkbook.Path & "\Rosters\" & ThisWorkbook.Name) 

编辑:

更改的代码保存文本文件,而不是使用字符(92)reporesentpath分隔符。

 Sub maketxtfile() Dim i As Long, gradebookContent As String Dim rosterFileHandle As String rosterFileHandle = "tabtest.txt" rosterFileHandle = ThisWorkbook.Path & Chr(92) & "Rosters" & Chr(92) & rosterFileHandle With ActiveSheet.UsedRange For i = 1 To 10 gradebookContent = gradebookContent & vbCrLf & Join$(Application.Transpose(Application.Transpose(.Rows(i).Value)), vbTab) Next End With Open (rosterFileHandle) For Output As #1 Print #1, Mid$(gradebookContent, Len(vbCrLf) + 1) Close #1 End Sub