Excel精英培训网

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

[已解决]代码如何实现账簿数字分解

[复制链接]
发表于 2013-12-2 11:29 | 显示全部楼层 |阅读模式
本帖最后由 龙送农 于 2013-12-2 15:27 编辑

如何用代码实现函数的这个效果:从I5:I298将数字分解到AB5:AK298

函数:AB5=IF(LEN(I5*100)>=10,MIDB(I5*100,LEN(I5*100)-9,1),"")
          AC5=IF(LEN(I5*100)>=9,MIDB(I5*100,LEN(I5*100)-8,1),"")
         AD5=IF(LEN(I5*100)>=8,MIDB(I5*100,LEN(I5*100)-7,1),"")
         AE5=IF(LEN(I5*100)>=7,MIDB(I5*100,LEN(I5*100)-6,1),"")
         AF5=IF(LEN(I5*100)>=6,MIDB(I5*100,LEN(I5*100)-5,1),"")
         AG5=IF(LEN(I5*100)>=5,MIDB(I5*100,LEN(I5*100)-4,1),"")
         AH5=IF(LEN(I5*100)>=4,MIDB(I5*100,LEN(I5*100)-3,1),"")
         AI5=IF(LEN(I5*100)>=3,MIDB(I5*100,LEN(I5*100)-2,1),"")
         AJ5=IF(LEN(I5*100)>=2,MIDB(I5*100,LEN(I5*100)-1,1),"")
         AK5=IF(I5=0,"",MIDB(I5*100,LEN(I5*100),1))
最佳答案
2013-12-2 12:50
本帖最后由 xdragon 于 2013-12-2 13:10 编辑

龙送农 发表于 2013-12-2 12:36
小数后两位数没实现,如果小数后两位数有数字就填数字,无数字就填0;另加K5:K298数字分解到AM5:AV298和N ...
  1. Sub SplitArea()
  2.   SPLITDATA Range("I5:I298"), Range("AB5")
  3.   SPLITDATA Range("K5:K298"), Range("AM5")
  4.   SPLITDATA Range("N5:N298"), Range("AY5")
  5. End Sub
  6. Sub SPLITDATA(DataSource As Range, OutArea As Range)
  7.   If DataSource.Columns.Count > 1 Then MsgBox "只允许一列转换", , "提示": Exit Sub
  8.   Dim arr, brr(), i As Integer, j As Integer, str As String
  9.   arr = DataSource.Value
  10.   ReDim brr(1 To UBound(arr), 1 To 10)
  11.   For i = 1 To UBound(arr)
  12.     str = IIf(arr(i, 1) = 0, "", Replace(CStr(Format(arr(i, 1), "0.00")), ".", ""))
  13.     For j = 10 - Len(str) + 1 To 10
  14.       brr(i, j) = Mid(str, j - 10 + Len(str), 1)
  15.     Next
  16.   Next
  17.   OutArea.Resize(UBound(brr), 10) = brr
  18. End Sub
复制代码
1.jpg
2.jpg
发表于 2013-12-2 12:15 | 显示全部楼层
本帖最后由 xdragon 于 2013-12-2 12:50 编辑

请参照下面我的回复。。。
回复

使用道具 举报

 楼主| 发表于 2013-12-2 12:36 | 显示全部楼层
本帖最后由 龙送农 于 2013-12-2 12:45 编辑
xdragon 发表于 2013-12-2 12:15
小数后两位数没实现,如果小数后两位数有数字就填数字,无数字就填0;另加K5:K298数字分解到AM5:AV298和N5:N298分解到AY5:BH298。
回复

使用道具 举报

发表于 2013-12-2 12:41 | 显示全部楼层
龙送农 发表于 2013-12-2 12:36
小数后两位数,如果有数字就填数字,无数字就填0


好像有点问题,你稍后,马上就好。。。
回复

使用道具 举报

发表于 2013-12-2 12:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xdragon 于 2013-12-2 13:10 编辑

龙送农 发表于 2013-12-2 12:36
小数后两位数没实现,如果小数后两位数有数字就填数字,无数字就填0;另加K5:K298数字分解到AM5:AV298和N ...
  1. Sub SplitArea()
  2.   SPLITDATA Range("I5:I298"), Range("AB5")
  3.   SPLITDATA Range("K5:K298"), Range("AM5")
  4.   SPLITDATA Range("N5:N298"), Range("AY5")
  5. End Sub
  6. Sub SPLITDATA(DataSource As Range, OutArea As Range)
  7.   If DataSource.Columns.Count > 1 Then MsgBox "只允许一列转换", , "提示": Exit Sub
  8.   Dim arr, brr(), i As Integer, j As Integer, str As String
  9.   arr = DataSource.Value
  10.   ReDim brr(1 To UBound(arr), 1 To 10)
  11.   For i = 1 To UBound(arr)
  12.     str = IIf(arr(i, 1) = 0, "", Replace(CStr(Format(arr(i, 1), "0.00")), ".", ""))
  13.     For j = 10 - Len(str) + 1 To 10
  14.       brr(i, j) = Mid(str, j - 10 + Len(str), 1)
  15.     Next
  16.   Next
  17.   OutArea.Resize(UBound(brr), 10) = brr
  18. End Sub
复制代码
回复

使用道具 举报

发表于 2013-12-2 13:15 | 显示全部楼层
本帖最后由 fjmxwrs 于 2013-12-2 14:01 编辑
龙送农 发表于 2013-12-2 12:36
小数后两位数没实现,如果小数后两位数有数字就填数字,无数字就填0;另加K5:K298数字分解到AM5:AV298和N ...

用单元格事件完成的,代码如下
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim crr(1 To 1, 1 To 10), iRow%, iCol%, i%, n%, str1
  3.     If Target.Row < 5 Or Target.Count > 1 Then Exit Sub
  4.     If Target.Column = 9 Or Target.Column = 11 Or Target.Column = 14 Then
  5.         str1 = Target.Value * 100
  6.         i = Len(str1) - 1
  7.         str1 = Format(str1, "0000000000")
  8.         iRow = Target.Row
  9.         iCol = Target.Column
  10.         For j = 10 To 10 - i Step -1
  11.             crr(1, j) = Mid(str1, j, 1)
  12.         Next
  13.         n = Choose(iCol, , , , , , , , , 19, , 28, , , 37)
  14.         Target.Offset(, n).Resize(1, 10).ClearContents
  15.         Target.Offset(, n).Resize(1, 10) = crr
  16.     End If
  17. End Sub
复制代码

对应金额.rar

9.35 KB, 下载次数: 19

回复

使用道具 举报

 楼主| 发表于 2013-12-2 14:23 | 显示全部楼层
xdragon 发表于 2013-12-2 12:50
龙送农 发表于 2013-12-2 12:36
小数后两位数没实现,如果小数后两位数有数字就填数字,无数字就填0;另加 ...

有N5:N298分解到AY5:BH298还没实现。
回复

使用道具 举报

发表于 2013-12-2 14:29 | 显示全部楼层
龙送农 发表于 2013-12-2 14:23
有N5:N298分解到AY5:BH298还没实现。

你好,我这里测试过没有问题,你再检查下你输入的列有没有问题
回复

使用道具 举报

 楼主| 发表于 2013-12-2 14:51 | 显示全部楼层
xdragon 发表于 2013-12-2 14:29
你好,我这里测试过没有问题,你再检查下你输入的列有没有问题

我传附件来了,麻烦您帮看看,老师!

现金日记账987200506.zip

541.61 KB, 下载次数: 15

回复

使用道具 举报

发表于 2013-12-2 14:58 | 显示全部楼层
龙送农 发表于 2013-12-2 14:51
我传附件来了,麻烦您帮看看,老师!

我看了,是这样的,你的N17:N21中,金额都大于你所规定的最大列数了。遇到这种情况怎么处理?忽略前面第一位数字吗?(应该绝对不能忽略的吧)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 08:04 , Processed in 0.373043 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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