Excel精英培训网

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

[已解决]求大神帮我看下这段VBA语句的意思

[复制链接]
发表于 2014-2-19 15:04 | 显示全部楼层 |阅读模式
求大神帮我看下这段VBA语句的意思,本人看的不是很懂,麻烦帮我在边上写上中文注释,谢谢,麻烦了。附件已传。在线等。3Q~~~~~
最佳答案
2014-2-19 16:47
本帖最后由 hwc2ycy 于 2014-2-19 16:51 编辑

顺便把代码改了下,原来的太复杂了。
  1. Sub 按钮1_Click()
  2.     Dim arr, brr, regex As Object, flag As Boolean, tmp As String
  3.     Dim DocNumber As String, mat_descr As String, Verdor_No As String
  4.     Dim qt As Long, cdt As Single, amount As Single, unit As Single, sap As Integer
  5.     Sheet3.Range("b2").CurrentRegion.Offset(1).ClearContents    '清空 结果数据  表的已有数据
  6.     flag = False
  7.     Set regex = CreateObject("vbscript.regexp")
  8.     regex.Pattern = "^\d+?0 "
  9.     arr = Sheet2.[a1].CurrentRegion
  10.     ReDim brr(1 To UBound(arr), 1 To 7)
  11.     '动态数组,7列
  12.     For i = 1 To UBound(arr)
  13.         If arr(i, 1) Like "Document Number*" Then
  14.             DocNumber = Replace(arr(i, 1), "Document Number ", "")
  15.             ' 文档编号,通过like匹配成功后,替换不需要的数据
  16.         End If
  17.         
  18.         '提取物料资料
  19.         If regex.test(arr(i, 1)) Then  '截取物料所在行的数据
  20.             '正则规则,以数字开始,数字的最后一位必须为0
  21.             '以28行数据为例:   10 NC-5MAH 3,500 IT 3,046.68 CNY 1,000 IT 10,663.38
  22.             n = n + 1
  23.             'n计数变量,表示当前已经找到的物料行数据
  24.             crr = Split(Application.Trim(arr(i, 1)), " ")
  25.             '相关数据之间以空格隔开,字符串转化成数组
  26.             sap = crr(0)    '以28行数据为例:10
  27.             mat_descr = crr(1)  '以28行数据为例:NC-5MAH
  28.             qt = crr(2)    '以28行数据为例:3500
  29.             cdt = crr(4)    '以28行数据为例:3046.68
  30.             unit = crr(6)    '以28行数据为例:1000
  31.             amount = crr(8)    '以28行数据为例:10663,这里数据类型不太合适,如果不考虑数据的精度
  32.             'amount变量没有使用,无意义
  33.             brr(n, 1) = mat_descr    '物料号
  34.             'mat_descr放第1列
  35.             brr(n, 3) = qt   '数量
  36.             brr(n, 4) = Round(cdt / unit * 1.17, 5)    '未税单价 乘 1.17
  37.             brr(n, 5) = Round(cdt / unit * qt, 2)    '未税金额
  38.             brr(n, 6) = sap
  39.             brr(n, 7) = DocNumber
  40.             Verdor_No = ""
  41.         End If

  42.         If arr(i, 1) Like "Vendor Material No*" Then  '截取客户料号所在行数据
  43.             Verdor_No = Replace(arr(i, 1), "Vendor Material No.: ", "")
  44.             '匹配后,取资料号
  45.             '如果有资料号,则把mat_descr列数据放在2列,资料号放一列
  46.             brr(n, 2) = brr(n, 1)
  47.             brr(n, 1) = Verdor_No
  48.         End If
  49.     Next
  50.     If n Then Sheet3.[a2].Resize(n, 7) = brr
  51.     Sheet3.[a2].Resize(n, 7) = brr
  52.     MsgBox "Completed !", vbInformation + vbOKOnly, "Congratulations"
  53. End Sub
复制代码

固定格式转换.rar

21.86 KB, 下载次数: 8

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-2-19 15:40 | 显示全部楼层
本帖最后由 苗凱 于 2014-2-19 17:09 编辑

Sub 按钮1_Click()
Dim arr, brr, regex As Object, flag As Boolean, tmp As String
Dim DocNumber As String, mat_descr As String, Verdor_No As String
Dim qt As Long, cdt As Single, amount As Long, unit As Single, sap As Integer
Sheet3.Range("b2").CurrentRegion.Offset(1).ClearContents '清空 结果数据  表的已有数据
flag = False
Set regex = CreateObject("vbscript.regexp")  '创建正则表达式
regex.Pattern = "^\d+?0 "      '规则为以数字开头的至少一位数字,碰到0时截止
arr = [a1].CurrentRegion          'A1的当前区域放入数组ARR
ReDim brr(1 To UBound(arr), 1 To 7)  '重新声明BRR,1到ARR的上标,1到7
For i = 1 To UBound(arr)                   'I等于 1到 ARR的上标
    If arr(i, 1) Like "Document Number*" Then   ' 如果数组的I行1列的值匹配到是以Document Number开头的话
        DocNumber = Replace(arr(i, 1), "Document Number ", "")  '用ARR的值替代为Document Number
    End If
    If regex.test(arr(i, 1)) Then  '截取物料所在行的数据
        n = n + 1
        crr = Split(Application.Trim(arr(i, 1)), " ")  '去掉ARR数组的前后空格然后分离
        sap = crr(0)     'CRR的第一个值保存在SAP中
        mat_descr = crr(1)  'CRR的第2个值保存在mat_descr中
        qt = crr(2)      'CRR的第3个值保存在qt 中
        cdt = crr(4)   'CRR的第5个值保存在cdt 中
        unit = crr(6)  'CRR的第7个值保存在unit中
        amount = crr(8) 'CRR的第9个值保存在amount中
    End If
    If arr(i, 1) Like "Vendor Material No*" Then  '截取客户料号所在行数据
        Verdor_No = Replace(arr(i, 1), "Vendor Material No.: ", "")
        flag = True
    End If
    If n > 0 Then
        If brr(n, 1) = "" Then brr(n, 1) = mat_descr '物料号
        If brr(n, 2) = "" Then brr(n, 2) = Verdor_No '客户料号
        If brr(n, 1) <> "" And brr(n, 2) <> "" And flag Then
            tmp = brr(n, 1)
            brr(n, 1) = brr(n, 2)
            brr(n, 2) = tmp
        End If
        flag = False
        If brr(n, 3) = "" Then brr(n, 3) = qt   '数量
        If brr(n, 4) = "" Then brr(n, 4) = Round(cdt / unit * 1.17, 5) '未税单价 乘 1.17
        If brr(n, 5) = "" Then brr(n, 5) = Round(cdt / unit * qt, 2) '未税金额
        If brr(n, 6) = "" Then brr(n, 6) = sap
        If brr(n, 7) = "" Then brr(n, 7) = DocNumber
        Verdor_No = ""
    End If
Next
Sheet3.[a2].Resize(UBound(brr), 7) = brr
MsgBox "Completed !", vbInformation + vbOKOnly, "Congratulations"
End Sub


回复

使用道具 举报

发表于 2014-2-19 16:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2014-2-19 16:51 编辑

顺便把代码改了下,原来的太复杂了。
  1. Sub 按钮1_Click()
  2.     Dim arr, brr, regex As Object, flag As Boolean, tmp As String
  3.     Dim DocNumber As String, mat_descr As String, Verdor_No As String
  4.     Dim qt As Long, cdt As Single, amount As Single, unit As Single, sap As Integer
  5.     Sheet3.Range("b2").CurrentRegion.Offset(1).ClearContents    '清空 结果数据  表的已有数据
  6.     flag = False
  7.     Set regex = CreateObject("vbscript.regexp")
  8.     regex.Pattern = "^\d+?0 "
  9.     arr = Sheet2.[a1].CurrentRegion
  10.     ReDim brr(1 To UBound(arr), 1 To 7)
  11.     '动态数组,7列
  12.     For i = 1 To UBound(arr)
  13.         If arr(i, 1) Like "Document Number*" Then
  14.             DocNumber = Replace(arr(i, 1), "Document Number ", "")
  15.             ' 文档编号,通过like匹配成功后,替换不需要的数据
  16.         End If
  17.         
  18.         '提取物料资料
  19.         If regex.test(arr(i, 1)) Then  '截取物料所在行的数据
  20.             '正则规则,以数字开始,数字的最后一位必须为0
  21.             '以28行数据为例:   10 NC-5MAH 3,500 IT 3,046.68 CNY 1,000 IT 10,663.38
  22.             n = n + 1
  23.             'n计数变量,表示当前已经找到的物料行数据
  24.             crr = Split(Application.Trim(arr(i, 1)), " ")
  25.             '相关数据之间以空格隔开,字符串转化成数组
  26.             sap = crr(0)    '以28行数据为例:10
  27.             mat_descr = crr(1)  '以28行数据为例:NC-5MAH
  28.             qt = crr(2)    '以28行数据为例:3500
  29.             cdt = crr(4)    '以28行数据为例:3046.68
  30.             unit = crr(6)    '以28行数据为例:1000
  31.             amount = crr(8)    '以28行数据为例:10663,这里数据类型不太合适,如果不考虑数据的精度
  32.             'amount变量没有使用,无意义
  33.             brr(n, 1) = mat_descr    '物料号
  34.             'mat_descr放第1列
  35.             brr(n, 3) = qt   '数量
  36.             brr(n, 4) = Round(cdt / unit * 1.17, 5)    '未税单价 乘 1.17
  37.             brr(n, 5) = Round(cdt / unit * qt, 2)    '未税金额
  38.             brr(n, 6) = sap
  39.             brr(n, 7) = DocNumber
  40.             Verdor_No = ""
  41.         End If

  42.         If arr(i, 1) Like "Vendor Material No*" Then  '截取客户料号所在行数据
  43.             Verdor_No = Replace(arr(i, 1), "Vendor Material No.: ", "")
  44.             '匹配后,取资料号
  45.             '如果有资料号,则把mat_descr列数据放在2列,资料号放一列
  46.             brr(n, 2) = brr(n, 1)
  47.             brr(n, 1) = Verdor_No
  48.         End If
  49.     Next
  50.     If n Then Sheet3.[a2].Resize(n, 7) = brr
  51.     Sheet3.[a2].Resize(n, 7) = brr
  52.     MsgBox "Completed !", vbInformation + vbOKOnly, "Congratulations"
  53. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
nblq + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-2-20 10:53 | 显示全部楼层
hwc2ycy 发表于 2014-2-19 16:47
顺便把代码改了下,原来的太复杂了。

谢谢版主,好人一生平安,我努力在学习ing。
回复

使用道具 举报

发表于 2014-2-20 11:38 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 10:14 , Processed in 0.347078 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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