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

时间:2013-08-25 16:11:45

标签: excel vba excel-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文件驻留在同一目录中。我希望该文件驻留在一个子目录中。我见过使用绝对路径名发布的解决方案。这对我来说不是一个选择,我不一定知道路径名称会提前。

我以为我可以做类似的事情:

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

但这让我错了。虽然我正在使用Mac,但我尝试使用"rosters\"但是虽然这有效,但它并没有将我的文件放在子目录中,而是放在路径名中带有\\的文件中。

我非常感谢一个解决方案,它将告诉我如何使用 relative 路径名来实现此目的。

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

3 个答案:

答案 0 :(得分:1)

经过多次搜索,我发现了一些有用的东西。

我可以写:

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

使用"语法似乎有点奇怪:"指示目录路径,但它的工作原理。现在的问题是这是否可移植,并且可以在我的其他机器上正常工作。

答案 1 :(得分:1)

Mac使用:作为路径分隔符;如果你习惯于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

答案 2 :(得分:0)

这应该可以解决问题

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

编辑:

更改代码以保存文本文件,也使用chr(92)重新发送路径分隔符。

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