Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5563|回复: 13

怎样更快将数组导出为文本

[复制链接]
发表于 2013-12-10 09:55 | 显示全部楼层 |阅读模式
比如数组是这样子的:
选择A1:J100000,输入"=Rand()",Ctrl+回车,复制,选A1,选择性粘贴值。


希望导出为文本文件(*.txt),数组元素之间就用空格间隔吧。
请问如题?谢谢!

发表于 2013-12-10 10:17 | 显示全部楼层
直接另存为txt格式应该是一个比较方便的方法,但是不知道效率如何.
回复

使用道具 举报

 楼主| 发表于 2013-12-10 10:34 | 显示全部楼层
Dj_soo 发表于 2013-12-10 10:17
直接另存为txt格式应该是一个比较方便的方法,但是不知道效率如何.

Sub test()
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlCurrentPlatformText    '间隔较宽,不知怎样规定的
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlTextMac
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlTextMSDOS
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlTextPrinter            '有的无间隔
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlTextWindows
'    ActiveWorkbook.SaveAs Filename:="c:\abc.txt", FileFormat:=xlUnicodeText            '间隔较宽,不知怎样规定的
'
'其它几种都是 运行时错误1004:方法'SaveAs'作用于对象'_Workbook'时失败
End Sub


难道只有ActiveWorkbook.SaveAs 才能更快?
难道以下办法都只是花拳绣腿,处理数据量一大,就不如ActiveWorkbook.SaveAs?

1) Print # 语句
Sub txt_1()
Open "d:\2.txt" For Output As #1
Print #1, "你好!"
Close #1
End Sub

2) Put 语句
Sub txt_2()
Open "d:\2.txt" For Binary As #1
Put #1, , "你还好!"
Close #1
End Sub

3) Write # 语句
Sub txt_3()
Open "d:\2.txt" For Output As #1
Write #1, "你总好!"
Close #1
End Sub

4) WriteLine 方法
Sub txt_4()
Dim fs, a, arr
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("d:\2.txt", True)
a.WriteLine ("你还好!")
a.Close
End Sub

5) Write 方法
Sub txt_5()
Dim fs, a, arr
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("d:\2.txt", True)
a.Write ("老是你好!")
a.Close
End Sub
回复

使用道具 举报

发表于 2013-12-10 10:52 | 显示全部楼层
额,效率上真没测试过,很少用txt处理..
回复

使用道具 举报

 楼主| 发表于 2013-12-10 10:58 | 显示全部楼层
Dj_soo 发表于 2013-12-10 10:52
额,效率上真没测试过,很少用txt处理..

我也没测试过,等有空再试
回复

使用道具 举报

发表于 2013-12-10 11:00 | 显示全部楼层
  1. Option Explicit
  2. Sub PrintText()
  3.     Dim myFileName As String
  4.     Dim myDataAr() As Variant
  5.     Dim myStr As String
  6.     Dim myRow As Long
  7.     Dim myCol As Long
  8.     Dim i As Long
  9.     Dim j As Long
  10.     On Error Resume Next
  11.     myFileName = "文本数据.txt"
  12.     Kill ThisWorkbook.Path & "" & myFileName
  13.     With Sheets(1)
  14.         myRow = .Cells(.Columns(1).Rows.Count, 1).End(xlUp).Row
  15.         myCol = .Cells(1, .Rows(1).Columns.Count).End(xlToLeft).Column
  16.         ReDim myDataAr(1 To myRow, 1 To myCol)
  17.         myDataAr = .Range(.Cells(1, 1), .Cells(myRow, myCol))
  18.         For i = 1 To myRow
  19.             For j = 1 To myCol
  20.                 myDataAr(i, j) = .Cells(i, j).Value
  21.             Next
  22.         Next
  23.         Open ThisWorkbook.Path & "" & myFileName For Output As #1
  24.         For i = 1 To UBound(myDataAr, 1)
  25.             myStr = ""
  26.             For j = 1 To UBound(myDataAr, 2)
  27.                 myStr = myStr & CStr(myDataAr(i, j)) & " "
  28.             Next
  29.             myStr = Left(myStr, (Len(myStr) - 1))
  30.             Print #1, myStr
  31.         Next
  32.         Close #1
  33.     End With
  34.     MsgBox "文件保存成功!"
  35. End Sub
复制代码
执行时间的确稍微长一点,保存的txt文件16M多,有情可原。
回复

使用道具 举报

 楼主| 发表于 2013-12-10 11:09 | 显示全部楼层
轩辕轼轲 发表于 2013-12-10 11:00
执行时间的确稍微长一点,保存的txt文件16M多,有情可原。

谢谢轩辕轼轲!

    For i = 1 To myRow
        For j = 1 To myCol
            myDataAr(i, j) = .Cells(i, j).Value
        Next
    Next
为什么不直接入赋给数组,而从单元格一个个读取呀?是有别的意义么
回复

使用道具 举报

发表于 2013-12-10 11:16 | 显示全部楼层
删除这段就可以了。前面有一个赋值给数组的,我是用我原来写的一段代码来改的。

评分

参与人数 1 +6 金币 +6 收起 理由
爱疯 + 6 + 6 谢谢了!

查看全部评分

回复

使用道具 举报

发表于 2013-12-10 11:38 | 显示全部楼层
爱疯 发表于 2013-12-10 11:09
谢谢轩辕轼轲!

    For i = 1 To myRow
  1. Option Explicit
  2. Sub PrintText()
  3.     Dim myFileName As String
  4.     Dim myDataAr, t
  5.     Dim myStr As String
  6.     Dim myRow As Long
  7.     Dim myCol As Long
  8.     Dim i As Long
  9.     Dim j As Long
  10.     t = Timer
  11.     On Error Resume Next
  12.     myFileName = "文本数据.txt"
  13.     Kill ThisWorkbook.Path & "" & myFileName
  14.     With Sheets(1)
  15.         myRow = .Cells(.Columns(1).Rows.Count, 1).End(xlUp).Row
  16.         myCol = .Cells(1, .Rows(1).Columns.Count).End(xlToLeft).Column
  17.         myDataAr = .Range(.Cells(1, 1), .Cells(myRow, myCol))
  18.         Open ThisWorkbook.Path & "" & myFileName For Output As #1
  19.         For i = 1 To UBound(myDataAr, 1)
  20.             myStr = ""
  21.             For j = 1 To UBound(myDataAr, 2)
  22.                 myStr = myStr & CStr(myDataAr(i, j)) & " "
  23.             Next
  24.             myStr = Left(myStr, (Len(myStr) - 1))
  25.             Print #1, myStr
  26.         Next
  27.         Close #1
  28.     End With
  29.     MsgBox Format(Timer - t, "0.000")
  30. End Sub
  31. Sub FillData()
  32.     Sheets(1).[A1:J100000].Value = Rnd()
  33. End Sub
复制代码
你试试这段,我电脑上速度是1.973秒。

评分

参与人数 1 +10 金币 +10 收起 理由
爱疯 + 10 + 10 学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-12-10 11:41 | 显示全部楼层
轩辕轼轲 发表于 2013-12-10 11:38
你试试这段,我电脑上速度是1.973秒。

谢谢重新修改了!

这问题主要是为学习哪种办法更快?也许差不了多少
所以,暂时先不急

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 05:51 , Processed in 0.154475 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表