我有以下代码将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 路径名来实现此目的。
顺便说一句,我不介意首先在当前目录中创建制表符分隔文件,然后将其移动到子目录中。
答案 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