Excel精英培训网

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

[已解决][求助]关于VBA数组转变数据类型的问题

[复制链接]
发表于 2011-4-25 10:52 | 显示全部楼层 |阅读模式
本帖最后由 wbzxz 于 2011-4-25 10:54 编辑

这些天在学习过程中,碰到这样一个问题,不知道该如何解决和解释,请大家请指点一下:

问题描述:

有一个数组,里面的元素都是字符型的数字,想转换成长整型的数字;但是有的时候却无法成功;

下面我们先看一下成功的实例:

代码如下:
  1. Option Explicit

  2. Sub test()
  3.     Dim arr
  4.     Dim i As Integer
  5.     arr = Array("1", "2", "3")
  6.     Stop
  7.    
  8.     '用循环对arr数组内容进行字符类型的转换
  9.     For i = 0 To UBound(arr)
  10.         arr(i) = CLng(arr(i))
  11.     Next i
  12.     Stop
  13. End Sub
复制代码


以上代码运行结果,我们可以看出,类型成功的进行了转换,如下图所示,说明这种转换方法是可行的;

正常arr1.jpg


正常arr2.jpg



不成功的实例,但是下面的例子中我却没有成功,代码如下:
  1. Sub Main()
  2.   Dim LineString As String
  3.   Dim ArrLine, arrNest()
  4.   Dim i As Long, j As Integer
  5.   Dim filenames
  6.   Dim sfilename
  7.   
  8.   
  9.   j = 1
  10.   
  11.   filenames = getFilename() '获取需要打开的文件名
  12.   
  13.   For Each sfilename In filenames '获得的文件名有可能是个数组,循环处理每个文件
  14.     Open sfilename For Input As #1 '打开文本文件
  15.     Do While Not EOF(1) '只要没有到文件末尾,就在文本文件内循环
  16.       Line Input #1, LineString '读取文本文件一行数据
  17.       
  18.       ArrLine = Split(LineString, ",") 'split函数用来将字符分隔成数组,用","作为分隔符
  19.         
  20.       '这里就是数组类型转换的代码
  21.       For i = 0 To UBound(ArrLine)
  22.           ArrLine(i) = CLng(ArrLine(i))
  23.       Next i
  24.       
  25.       Stop
  26.     Loop
  27.     Close #1 '关闭文件
  28.   Next
  29.   

  30. End Sub
复制代码


不成功的截图如下:

不正常ArrLine.jpg


附件如下:

test.rar (232.83 KB, 下载次数: 12)
发表于 2011-4-25 11:13 | 显示全部楼层
或许Split创建的数组就这毛病

评分

参与人数 1 +6 收起 理由
wbzxz + 6 一语道破天机。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2011-4-25 11:14 | 显示全部楼层
回复 阿童木 的帖子

哦,原来是这样的啊,我去测试一下,谢谢amule老师指点啊。
回复

使用道具 举报

 楼主| 发表于 2011-4-25 11:23 | 显示全部楼层
本帖最后由 wbzxz 于 2011-4-25 11:24 编辑

回复 阿童木 的帖子

amulee,您说的完全正确,确实是split函数的问题,那我应该怎么样解决这个问题呢?
下面是我的一个解决思路,重新定义一个数组,然后依次把split函数生成的数组元素通过循环赋值给这个数组,赋值的过程中,完成转换;

  1.   Sub test()
  2.     Dim arr, arr1()
  3.     Dim s As String
  4.     Dim i As Integer
  5.    
  6.     s = "1,100,200,300"
  7.     arr = Split(s, ",")
  8.     'arr1 = arr
  9.     Stop
  10.    
  11.     ReDim arr1(0 To UBound(arr))
  12.     For i = 0 To UBound(arr)
  13.        arr1(i) = CLng(arr(i))
  14.     Next i
  15.     Stop
  16.   End Sub
复制代码

但是这个方法感觉真的有些繁琐,请amulee老师指点,有没有什么好的方法啊?
回复

使用道具 举报

发表于 2011-4-25 11:36 | 显示全部楼层    本楼为最佳答案   
Split函数
请参阅     示例     特性

描述

返回一个下标从零开始的一维数组,它包含指定数目的子字符串

Array 函数
请参阅     示例     特性

返回一个包含数组的 Variant


故,可以看到arr = Array("1", "2", "3")之后arr 的每个元素都是variant/string,类型就可变了;而ArrLine = Split(LineString, ",") 后arrline的每个元素是string,你就是直接赋个其它类型给他他也自动转成string型




回复

使用道具 举报

 楼主| 发表于 2011-4-25 11:38 | 显示全部楼层
回复 djyjysxxs 的帖子

天堂鼠老师,非常感谢您啊。我突然有些理解啦。嘿嘿。
我还是想多问一句,您该如何解决这个问题呢,如何进行转换呢?
回复

使用道具 举报

 楼主| 发表于 2011-4-25 11:43 | 显示全部楼层
回复 djyjysxxs 的帖子

苦真人,这句是不是应该修改一下
故,可以看到arr = Array("1", "2", "3")之后arr 的每个元素都是variant/string,类型就可变了




改成这样




故,可以看到arr = Array("1", "2", "3")之后arr 的每个元素都是variant/variant,类型就可变了
回复

使用道具 举报

发表于 2011-4-25 11:50 | 显示全部楼层
没明白你的转换是何意。
其实在ArrLine(i) = CLng(ArrLine(i))中,CLng(ArrLine(i))已经进行了准确的转换,只不过将转换后的值再赋给string型的ArrLine(i)的时候,他又转换成了string。也就是说在ArrLine(i) = CLng(ArrLine(i))中进行了两次转换
回复

使用道具 举报

发表于 2011-4-25 12:06 | 显示全部楼层
不能改,你实践一下看看
回复

使用道具 举报

 楼主| 发表于 2011-4-25 14:11 | 显示全部楼层
回复 djyjysxxs 的帖子

嘿嘿,谢谢苦真人,解释的真清楚啊。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-24 12:08 , Processed in 0.317364 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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