ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7461|回复: 12

[求助] 在数组中怎么让数值变成文本

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-26 22:42 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
求助:
  1. Sub 化()
  2. Dim Arr, r&

  3.     Arr = [a1].CurrentRegion
  4.     r = 2
  5.      Do While Arr(r, 5) <> ""                                                      '循环r行E列不为空的值
  6.      If Arr(r, 5) > 0 Then Arr(r, 7) = Int(Arr(r, 5)) '如果r行E列值大于等于0,那么i行E列=G列单元格值
  7.      If Arr(r, 7) = "" Then Arr(r, 7) = Int(Arr(r, 5)) '如果G列为空,G等于E的值
  8.      If Arr(r, 7) >= 0 Then Arr(r, 7) = Int(Arr(r, 7))
  9.      If Arr(r, 7) >= 0 Then Arr(r, 13) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行E列值大于等于0,那么i行M列 值等于i行M列*0.85

  10.      r = r + 1
  11.     If r > UBound(Arr) Then Exit Do
  12.     Loop
  13.     [a1].CurrentRegion = Arr
  14.     End Sub
复制代码
我的表里Q列值  有的时候是英文,有的时候全是数字,一在数组里一输出全变了

我在网和 和论坛里也都找了
IF Arr(r,17)>0 then Arr(r,17)=text( Arr(r,17),0)     说用TEXT函数   不成功
IF Arr(r,17)>0 then Arr(r,17)=retp( Arr(r,17),1)   不成功
IF Arr(r,17)>0 then Arr(r,17)=concatenate( Arr(r,17))  不成功
IF Arr(r,17)>0 then Arr(r,17)=Left(Arr(r,17),Len(Arr(r,17)))  不成功

还有试过
只有在 数据工具--分列--文本   然后在用VBA代码 执行 能成功


求大神 给看看 .... 我是一个新手.好多不懂的...     数据Q列数值



原数值

原数值

错误数值

错误数值

数据工具 文本

数据工具 文本

数据Q列.zip

6.44 KB, 下载次数: 11

原文件

TA的精华主题

TA的得分主题

发表于 2016-8-26 22:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
避开Q列:
Sub Macro1()
    Dim arr, i&
    With Range("A2:M" & Range("E65536").End(xlUp).Row)
        arr = .Value
        For i = 2 To UBound(arr)
            If Len(arr(i, 5)) Then
                If arr(i, 5) >= 0 Then arr(i, 7) = Int(arr(i, 5))
                If arr(i, 7) = "" Then arr(i, 7) = Int(arr(i, 5))
                If arr(i, 7) >= 0 Then arr(i, 7) = Int(arr(i, 7))
                If arr(i, 7) >= 0 Then arr(i, 13) = Round(arr(i, 7) * 0.856784123165432, 0)
            End If
        Next
        .Value = arr
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2016-8-27 08:55 | 显示全部楼层
数组中不会变,是在写回单元格时变了。
range("q:q")=NumberFormatLocal = "@"
[a1].CurrentRegion = Arr

TA的精华主题

TA的得分主题

发表于 2016-8-27 14:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Arr(r, 7) = Int(Arr(r, 5))
改成:
Arr(r, 7) = "'"&Int(Arr(r, 5))

这是vba的特点文本型数字视为数值,唯有预置单引做实,尤其是赋值给单元格时
vba里的isnumeric函数也不区分文本型数字还是数值

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-28 20:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2016-8-26 22:59
避开Q列:
Sub Macro1()
    Dim arr, i&

但是我的代码有点多
您能给我看看 怎么变Q 回避开
  1. Sub 本地化()
  2. Dim Arr, r&
  3.     Arr = [a1].CurrentRegion
  4.     r = 2
  5.      Do While Arr(r, 5) <> ""                                                      '循环r行E列不为空的值
  6.      If Arr(r, 5) > 0 Then Arr(r, 7) = Int(Arr(r, 5)) '如果r行E列值大于等于0,那么i行E列=G列单元格值
  7.      If Arr(r, 7) = "" Then Arr(r, 7) = Int(Arr(r, 5)) '如果G列为空,G等于E的值
  8.      If Arr(r, 7) >= 0 Then Arr(r, 7) = Int(Arr(r, 7))
  9.      If Arr(r, 7) >= 0 Then Arr(r, 13) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行E列值大于等于0,那么i行M列 值等于i行M列*0.85
  10.      If Arr(r, 9) = "" Then Arr(r, 9) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行I列值为空,那么i行I列*0.85的整数.
  11.      If Arr(r, 9) = 0 Then Arr(r, 9) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行I列值为空,那么i行I列*0.85的整数
  12.      If Arr(r, 9) > 0 Then Arr(r, 9) = Int(Arr(r, 9))                           'I列不为小数
  13.      If Arr(r, 6) > 0 Then Arr(r, 15) = Val(Arr(r, 6))                           'K列等于F列值为数字
  14.      If Arr(r, 9) >= Arr(r, 15) Then Arr(r, 9) = Round(Arr(r, 15), 0)                     '如果I列>=K,那么I=K
  15.      If Arr(r, 9) >= Arr(r, 13) Then Arr(r, 9) = Arr(r, 13)                    '如果I列>=M,那么I=M
  16.      If Arr(r, 7) <= 2 And Arr(r, 7) > 0 Then Arr(r, 9) = Round(Arr(r, 7) * 0.58, 0)
  17.      If Arr(r, 9) <> "" And Arr(r, 9) <> 0 Then Arr(r, 15) = Arr(r, 7) / Arr(r, 9) '验证
  18.      If Arr(r, 15) >= 2.8 Then Arr(r, 9) = Round(Arr(r, 7) * 0.6275, 0)
  19.      If Arr(r, 9) > 10 And Right(Arr(r, 9), 1) <= 3 Then Arr(r, 9) = Mid(Arr(r, 9), 1, Len(Arr(r, 9)) - 1) & 0
  20.      If Arr(r, 5) < 1 And Arr(r, 5) > 0 Then Arr(r, 7) = Arr(r, 5)
  21.      If Arr(r, 5) < 1 And Arr(r, 5) > 0 Then Arr(r, 9) = Arr(r, 5)
  22.      If Arr(r, 15) >= 0 Then Arr(r, 15) = ""                                   ' 删除K,M里面的值 成功
  23.      If Arr(r, 13) >= 0 Then Arr(r, 13) = ""                                   ' 删除K,M里面的值 成功
  24.     r = r + 1
  25.     If r > UBound(Arr) Then Exit Do
  26.     Loop
  27.     [a1].CurrentRegion = Arr
  28.     End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-29 10:29 | 显示全部楼层
hhjjpp 发表于 2016-8-27 14:22
Arr(r, 7) = Int(Arr(r, 5))
改成:
Arr(r, 7) = "'"&Int(Arr(r, 5))

老师 我知道这样可以, 但是 单元格 里面的数值会带"'"

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-29 10:30 | 显示全部楼层
Zamyi 发表于 2016-8-27 08:55
数组中不会变,是在写回单元格时变了。
range("q:q")=NumberFormatLocal = "@"
[a1].CurrentRegion = Arr

老师这个没有成功!~

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-29 10:31 | 显示全部楼层
Zamyi 发表于 2016-8-27 08:55
数组中不会变,是在写回单元格时变了。
range("q:q")=NumberFormatLocal = "@"
[a1].CurrentRegion = Arr

Sub 本地化()
Dim Arr, r&
    Arr = [a1].CurrentRegion
    r = 2
     Do While Arr(r, 5) <> ""                                                      '循环r行E列不为空的值
     If Arr(r, 5) > 0 Then Arr(r, 7) = Int(Arr(r, 5)) '如果r行E列值大于等于0,那么i行E列=G列单元格值
     If Arr(r, 7) = "" Then Arr(r, 7) = Int(Arr(r, 5)) '如果G列为空,G等于E的值
     If Arr(r, 7) >= 0 Then Arr(r, 7) = Int(Arr(r, 7))
     If Arr(r, 7) >= 0 Then Arr(r, 13) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行E列值大于等于0,那么i行M列 值等于i行M列*0.85
     If Arr(r, 9) = "" Then Arr(r, 9) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行I列值为空,那么i行I列*0.85的整数.
     If Arr(r, 9) = 0 Then Arr(r, 9) = Round(Arr(r, 7) * 0.856784123165432, 0)  '如果r行I列值为空,那么i行I列*0.85的整数
     If Arr(r, 9) > 0 Then Arr(r, 9) = Int(Arr(r, 9))                           'I列不为小数
     If Arr(r, 6) > 0 Then Arr(r, 15) = Val(Arr(r, 6))                           'K列等于F列值为数字
     If Arr(r, 9) >= Arr(r, 15) Then Arr(r, 9) = Round(Arr(r, 15), 0)                     '如果I列>=K,那么I=K
     If Arr(r, 9) >= Arr(r, 13) Then Arr(r, 9) = Arr(r, 13)                    '如果I列>=M,那么I=M
     If Arr(r, 7) <= 2 And Arr(r, 7) > 0 Then Arr(r, 9) = Round(Arr(r, 7) * 0.58, 0)
     If Arr(r, 9) <> "" And Arr(r, 9) <> 0 Then Arr(r, 15) = Arr(r, 7) / Arr(r, 9) '验证
     If Arr(r, 15) >= 2.8 Then Arr(r, 9) = Round(Arr(r, 7) * 0.6275, 0)
     If Arr(r, 9) > 10 And Right(Arr(r, 9), 1) <= 3 Then Arr(r, 9) = Mid(Arr(r, 9), 1, Len(Arr(r, 9)) - 1) & 0
     If Arr(r, 5) < 1 And Arr(r, 5) > 0 Then Arr(r, 7) = Arr(r, 5)
     If Arr(r, 5) < 1 And Arr(r, 5) > 0 Then Arr(r, 9) = Arr(r, 5)
     If Arr(r, 15) >= 0 Then Arr(r, 15) = ""                                   ' 删除K,M里面的值 成功
     If Arr(r, 13) >= 0 Then Arr(r, 13) = ""                                   ' 删除K,M里面的值 成功
    r = r + 1
    If r > UBound(Arr) Then Exit Do
    Loop
range("q:q")=NumberFormatLocal = "@"
    [a1].CurrentRegion = Arr
    End Sub

TA的精华主题

TA的得分主题

发表于 2016-8-29 16:43 | 显示全部楼层
七喜2016 发表于 2016-8-29 10:30
老师这个没有成功!~

没有问题。

数据Q列.zip

13.23 KB, 下载次数: 98

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-29 16:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

真的!~ 多谢老师!~   
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 05:38 , Processed in 0.051314 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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