Excel精英培训网

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

逐行导入文本数据量一大就出错

[复制链接]
发表于 2019-10-10 18:19 | 显示全部楼层 |阅读模式
文本文档分隔符为“|”
大概有5万多行
每行15字段
代码如下
  1. Sub AAA()
  2.     '声明字符串变量用于获取每一次从文件中读取的字符
  3.     Dim ResultOut As String
  4.     Dim arrTemp() As String
  5.     Dim hang As String
  6.     '获取文件名
  7.     Dim FileName As String
  8.     Dim MyRow As Integer
  9.     Dim MyColumn As Integer
  10.     MyRow = 1
  11.     MyColumn = 1
  12.     Dim fd As FileDialog
  13.     Set fd = Application.FileDialog(msoFileDialogFilePicker)

  14.     '判断用户在对话框中的输入是否有效
  15.     If fd.Show = -1 Then
  16.         FileName = fd.SelectedItems(1)
  17.         filenum = FreeFile()
  18.         Open FileName For Input As #filenum
  19.         '从文件中循环读出由逗号分开的数据,并写入单元格
  20.         While Not EOF(filenum)
  21.             Line Input #filenum, ResultOut
  22.             'arrTemp = ResultOut
  23.             'MsgBox ResultOut
  24.             arrTemp = Split(ResultOut, "|")
  25.             'MsgBox arrTemp
  26.             '如果读出的字符串不为空则输入到当前行工作表单元格
  27.             If ResultOut <> "" Then
  28.                 'ActiveSheet.Cells(MyRow, MyColumn).Value = _
  29.                     arrTemp
  30.                    'ActiveSheet.Cells(MyRow, MyColumn).Value = _
  31.                     Application.WorksheetFunction.Transpose(arrTemp)
  32.                 ActiveSheet.Cells(MyRow, MyColumn).Resize(1, ubound(arrtemp)+1) = arrTemp
  33.                                 MyRow = MyRow + 1
  34.             '如果读出的字符串为空则转到工作表的下一行
  35.             Else
  36.                 MyRow = MyRow + 1
  37.                 MyColumn = 1
  38.             End If
  39.         Wend

  40.     '关闭文件
  41.         Close #filenum
  42.         MsgBox ("文件导入成功!")
  43.     End If

  44. End Sub
复制代码
用了十行测试能成功
整个文本测试提示
ActiveSheet.Cells(MyRow, MyColumn).Resize(1, ubound(arrtemp)+1) = arrTemp
这一行出错。
立即窗口运行ubound(arrtemp)结果是88万左右,是不是太多列?怎么解决?
望高手赐教
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2019-10-10 18:25 | 显示全部楼层
自我排查问题应该是在ubound(arrtemp),我是excel2016,最大列应该16000左右,可这个在立即窗口运算有88万多。请问怎么改合适
回复

使用道具 举报

发表于 2019-10-10 22:16 | 显示全部楼层
1)、检查 txt 文件是不是没有换行符啊?88万多,除以15个字段,将近5.87万条记录,看上去 line input 不是读入一行,是读入一块了。
2)、如果 txt 文件很规范,而且确定是全部导入,可以直接用 Excel 打开,然后分列,比一行行读取要快。
用代码的话,就是 workbooks.open "path\xxx.txt",然后分列(用宏录制一段分列代码结合起来)。

最后,纯粹测试好玩,(office 365)Excel只有16384列,但有 1048576行,你把结果纵向输出看看。
  1. ActiveSheet.Cells(MyRow, MyColumn).Resize(UBound(arrTemp) + 1) = _
  2.         Application.WorksheetFunction.Transpose(arrTemp)
复制代码
回复

使用道具 举报

发表于 2019-10-10 22:29 | 显示全部楼层
另外,是不是还有什么代码会变动 MyColumn 的值?
为什么在处理空行的时候要把 MyColumn 恢复到 1?而有数据的时候,却仅仅增加 MyRow,不调整 MyColumn。比如 MyColumn 一直增加,导致超出总列数。

  1. arrTemp = Split(ResultOut, "|")
复制代码

这句代码位置也不好,放到 IF 里面去,有数据时执行才有意义。
回复

使用道具 举报

 楼主| 发表于 2019-10-11 08:10 | 显示全部楼层
rardge2015 发表于 2019-10-10 22:29
另外,是不是还有什么代码会变动 MyColumn 的值?
为什么在处理空行的时候要把 MyColumn 恢复到 1?而有数 ...

代码从网上找来自己拼凑的,你这么一说我也觉得有道理。谢谢!
回复

使用道具 举报

 楼主| 发表于 2019-10-11 08:22 | 显示全部楼层
rardge2015 发表于 2019-10-10 22:16
1)、检查 txt 文件是不是没有换行符啊?88万多,除以15个字段,将近5.87万条记录,看上去 line input 不是 ...

用写字板打开文件是有分行的,调试时在本地窗口里,resultout是只有一行的数据,ubound(arrtemp)值却是88万多。我试试每个循环清空下arrtemp
回复

使用道具 举报

发表于 2019-10-11 11:38 | 显示全部楼层
在循环体内用以下代码测试从第几行开始出现异常,然后去检查 Txt 文件。

  1. arrTemp = Split(ResultOut, "|")
  2. ActiveSheet.Cells(MyRow, MyColumn).Value = UBound(arrTemp)
  3. MyRow = MyRow + 1
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 10:12 , Processed in 0.319520 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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