1

我有以下代码将 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\"但是虽然这有效,但它并没有将我的文件放在子目录中,而是放在\\路径名中的文件中。

我将非常感谢一个解决方案,它将向我展示如何使用相对路径名来做到这一点。

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

4

3 回答 3

1

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

我可以写:

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

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

于 2013-08-25T17:00:30.920 回答
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
于 2013-08-26T14:39:54.803 回答
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
于 2013-08-25T16:34:33.787 回答