excel vba-在shell中对txt文件进行排序

excel vba-在shell中对txt文件进行排序,excel,vba,Excel,Vba,我创建了一个包含4行的.txt文件,其中包含以下行: 四, 一, 三, 二, 然后我使用“Shell”对文件进行排序。结果排序如下: 一, 二, 三, 四, 最后,我读取已排序的文件,并将每一行写入第二个文件,但它们按原始顺序出现 请帮忙 代码如下: Option Explicit Sub my_mac2() Dim my_path, my_tmp_file, my_out_file, my_data_from_tmp, my_command As String Dim my_tmp

我创建了一个包含4行的
.txt
文件,其中包含以下行:

四,

一,

三,

二,

然后我使用“Shell”对文件进行排序。结果排序如下:

一,

二,

三,

四,

最后,我读取已排序的文件,并将每一行写入第二个文件,但它们按原始顺序出现

请帮忙

代码如下:

Option Explicit
Sub my_mac2()
   Dim my_path, my_tmp_file, my_out_file, my_data_from_tmp, my_command As String
   Dim my_tmp_file_num, my_out_file_num As Integer
   my_path = "E:\MASAV\VBA\"
   my_tmp_file = my_path & "_tmp.txt"
   my_out_file = my_path & "_out.txt"
   my_tmp_file_num = FreeFile()
   Open my_tmp_file For Output As #my_tmp_file_num
   Print #my_tmp_file_num, "4"
   Print #my_tmp_file_num, "1"
   Print #my_tmp_file_num, "3"
   Print #my_tmp_file_num, "2"
   Close #my_tmp_file_num
   my_command = "sort " & my_path & "_tmp.txt /O " & my_path & "_tmp.txt"
   Shell my_command, vbHide
   my_tmp_file_num = FreeFile()
   Open my_tmp_file For Input As #my_tmp_file_num
   my_out_file_num = FreeFile()
   Open my_out_file For Output As #my_out_file_num
   While Not EOF(my_tmp_file_num)
       Line Input #my_tmp_file_num, my_data_from_tmp
       Print #my_out_file_num, my_data_from_tmp
   Wend
   Close #my_tmp_file_num
   Close #my_out_file_num
End Sub

执行
sort
命令时,命令行是从

my_command = "sort " & my_path & "_tmp.txt /O " & my_path & "_tmp.txt"
换句话说,您使用输入文件作为输出文件,我怀疑这不是一个好主意。这就是你打算做的吗

您之前确实声明了两个不同的文件名

my_tmp_file = my_path & "_tmp.txt"
my_out_file = my_path & "_out.txt"
那你为什么不把这行改成

my_command = "sort " & my_tmp_file & " /O " & my_out_file

这将在第二个文件中生成输出,并且不需要代码的后续部分。如果要对第一个文件进行排序,可以将第二个文件复制回第一个文件。

虽然不是问题的答案,但请注意,您尚未正确声明变量。除了显式声明的
my_command
my_out_file_num
之外,所有内容都是
Variant
。这些只是在此处放置我的Q时的打字错误。我的宏有FreeFile()和#My_tmp_file_num。无论如何,谢谢。仍在寻找解决方案。对于我来说,此代码正在按预期工作。
\u tmp.txt
文件和
\u out.txt
文件都按正确的顺序排序。请注意:如果要创建原始txt文件,为什么不按所需的顺序创建呢?如果可以控制输入,为什么要使用Shell命令对文件进行排序?我在Shell排序命令之后添加了以下命令:Application.Wait(Now()+CDate(“00:00:01”)),使其等待1秒。现在一切都好了,它也回答了为什么它以前只在bebug模式下工作。再次感谢。你们这些人很有帮助!好啊解决了的!!!!!Floris给了我一个想法,将文件排序到另一个文件(tmp2)中,而不是自己,然后读取“tmp2”,并将其行写入我的“out”文件中。现在“out”文件已排序。但是我仍然想知道为什么以前的版本在调试模式下工作。谢谢大家。加迪