ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 各位大佬帮忙看看代码里哪里出错了

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-11 16:26 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png

image.png
如图,运行后发现数据逻辑上出错了。。。是哪里出问题了?

明细表测试.zip

38.95 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 16:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub GenerateInventorySheet()
  Dim r%, i%, m%
  Dim arr, brr, hg(1 To 17)
  Dim d As Object
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set d = CreateObject("scripting.dictionary")
  
  '禁止屏幕更新和显示警告对话框
  
  With Worksheets("出入库明细")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    ' 获取出入库明细工作表中第一列最后一个非空单元格的行号
    arr = .Range("A2:H" & r)
    ' 将出入库明细工作表中的数据区域存储在 arr 数组中
  End With
  
  ' 将 arr 数组中的数据存储到字典对象 d 中
  For i = 1 To UBound(arr)
    If Not d.exists(arr(i, 1)) Then
      ' 如果字典 d 中不存在以 arr(i, 1) 为键的项,则创建一个新的子字典
      Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
    End If
   
    If Not d(arr(i, 1)).exists(arr(i, 2)) Then
      ' 如果子字典 d(arr(i, 1)) 中不存在以 arr(i, 2) 为键的项,则创建一个新的二维数组 brr
      m = 1
      ReDim brr(1 To 6, 1 To m)
    Else
      ' 子字典中已存在以 arr(i, 2) 为键的项,则获取对应的二维数组 brr
      brr = d(arr(i, 1))(arr(i, 2))
      m = UBound(brr, 2) + 1
      ReDim Preserve brr(1 To 6, 1 To m)
    End If
   
    ' 将 arr(i, j + 2) 的值赋给二维数组 brr 的相应位置
    For j = 1 To 6
      brr(j, m) = arr(i, j + 2)
    Next
   
    ' 将更新后的数组 brr 存储回字典 d 中的相应位置
    d(arr(i, 1))(arr(i, 2)) = brr
  Next
  
  q = 18
  
  With Worksheets("出入库单")
    ' 处理出入库单工作表
   
    For i = 1 To 17
      hg(i) = .Rows(i).RowHeight
      ' 存储原始行高信息
    Next
   
    .Rows("18:" & .Rows.Count).Clear
    ' 清空出入库单工作表中的一部分区域
   
    .Range("B2,F2,A4:F13,C14:F14") = ""
    ' 清空指定区域的数据
   
    .Range("C14,E14").FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
    '.Range("D14").FormulaR1C1 = "=R[-1]C"
    .Range("A15").FormulaR1C1 = "大写金额"
    ' 设置一些单元格的公式
   
    ' 遍历字典 d 的键和值,将数据填充到出入库单工作表中
    For Each aa In d.keys
      For Each bb In d(aa).keys
        brr = d(aa)(bb)
        ReDim crr(1 To UBound(brr, 2), 1 To UBound(brr))
        
        ' 转置数组 brr,存储到数组 crr 中
        For i = 1 To UBound(brr)
          For j = 1 To UBound(brr, 2)
            crr(j, i) = brr(i, j)
          Next
        Next
        
        m = 4
        
        ' 将数组 crr 的值写入出入库单工作表中的相应位置
        For i = 1 To UBound(crr)
          For j = 1 To UBound(crr, 2)
            .Cells(m, j) = crr(i, j)
          Next
         
          If m = 4 Then
            .Range("B2") = bb
            .Range("F2") = aa
          End If
         
          m = m + 1
         
          ' 判断是否需要插入新的一组数据
          If m > 13 Or i = UBound(crr) Then
            .Range("A1:F16").Copy .Cells(q, 1)
            
            ' 设置复制的行高
            For w = 1 To 17
              .Rows(q + w - 1).RowHeight = hg(w)
            Next
            
            m = 4
            q = q + 17
          End If
        Next
      Next
    Next
   
    .Rows("1:17").Delete
    ' 删除原始的行号 1 到 17 的行
  End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 16:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub GenerateInventorySheet()
  Dim r%, i%, m%
  Dim arr, brr, hg(1 To 17)
  Dim d As Object
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set d = CreateObject("scripting.dictionary")
  
  '禁止屏幕更新和显示警告对话框
  
  With Worksheets("出入库明细")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    ' 获取出入库明细工作表中第一列最后一个非空单元格的行号
    arr = .Range("A2:H" & r)
    ' 将出入库明细工作表中的数据区域存储在 arr 数组中
  End With
  
  ' 将 arr 数组中的数据存储到字典对象 d 中
  For i = 1 To UBound(arr)
    If Not d.exists(arr(i, 1)) Then
      ' 如果字典 d 中不存在以 arr(i, 1) 为键的项,则创建一个新的子字典
      Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
    End If
   
    If Not d(arr(i, 1)).exists(arr(i, 2)) Then
      ' 如果子字典 d(arr(i, 1)) 中不存在以 arr(i, 2) 为键的项,则创建一个新的二维数组 brr
      m = 1
      ReDim brr(1 To 6, 1 To m)
    Else
      ' 子字典中已存在以 arr(i, 2) 为键的项,则获取对应的二维数组 brr
      brr = d(arr(i, 1))(arr(i, 2))
      m = UBound(brr, 2) + 1
      ReDim Preserve brr(1 To 6, 1 To m)
    End If
   
    ' 将 arr(i, j + 2) 的值赋给二维数组 brr 的相应位置
    For j = 1 To 6
      brr(j, m) = arr(i, j + 2)
    Next
   
    ' 将更新后的数组 brr 存储回字典 d 中的相应位置
    d(arr(i, 1))(arr(i, 2)) = brr
  Next
  
  q = 18
  
  With Worksheets("出入库单")
    ' 处理出入库单工作表
   
    For i = 1 To 17
      hg(i) = .Rows(i).RowHeight
      ' 存储原始行高信息
    Next
   
    .Rows("18:" & .Rows.Count).Clear
    ' 清空出入库单工作表中的一部分区域
   
    .Range("B2,F2,A4:F13,C14:F14") = ""
    ' 清空指定区域的数据
   
    .Range("C14,E14").FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
    '.Range("D14").FormulaR1C1 = "=R[-1]C"
    .Range("A15").FormulaR1C1 = "大写金额"
    ' 设置一些单元格的公式
   
    ' 遍历字典 d 的键和值,将数据填充到出入库单工作表中
    For Each aa In d.keys
      For Each bb In d(aa).keys
        brr = d(aa)(bb)
        ReDim crr(1 To UBound(brr, 2), 1 To UBound(brr))
        
        ' 转置数组 brr,存储到数组 crr 中
        For i = 1 To UBound(brr)
          For j = 1 To UBound(brr, 2)
            crr(j, i) = brr(i, j)
          Next
        Next
        
        m = 4
        
        ' 将数组 crr 的值写入出入库单工作表中的相应位置
        For i = 1 To UBound(crr)
          For j = 1 To UBound(crr, 2)
            .Cells(m, j) = crr(i, j)
          Next
         
          If m = 4 Then
            .Range("B2") = bb
            .Range("F2") = aa
          End If
         
          m = m + 1
         
          ' 判断是否需要插入新的一组数据
          If m > 13 Or i = UBound(crr) Then
            .Range("A1:F16").Copy .Cells(q, 1)
            
            ' 设置复制的行高
            For w = 1 To 17
              .Rows(q + w - 1).RowHeight = hg(w)
            Next
            
            m = 4
            q = q + 17
          End If
        Next
      Next
    Next
   
    .Rows("1:17").Delete
    ' 删除原始的行号 1 到 17 的行
  End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 16:36 | 显示全部楼层
Sub GenerateInventorySheet()
  Dim r%, i%, m%
  Dim arr, brr, hg(1 To 17)
  Dim d As Object
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set d = CreateObject("scripting.dictionary")
  
  '禁止屏幕更新和显示警告对话框
  
  With Worksheets("出入库明细")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    ' 获取出入库明细工作表中第一列最后一个非空单元格的行号
    arr = .Range("A2:H" & r)
    ' 将出入库明细工作表中的数据区域存储在 arr 数组中
  End With
  
  ' 将 arr 数组中的数据存储到字典对象 d 中
  For i = 1 To UBound(arr)
    If Not d.exists(arr(i, 1)) Then
      ' 如果字典 d 中不存在以 arr(i, 1) 为键的项,则创建一个新的子字典
      Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
    End If
   
    If Not d(arr(i, 1)).exists(arr(i, 2)) Then
      ' 如果子字典 d(arr(i, 1)) 中不存在以 arr(i, 2) 为键的项,则创建一个新的二维数组 brr
      m = 1
      ReDim brr(1 To 6, 1 To m)
    Else
      ' 子字典中已存在以 arr(i, 2) 为键的项,则获取对应的二维数组 brr
      brr = d(arr(i, 1))(arr(i, 2))
      m = UBound(brr, 2) + 1
      ReDim Preserve brr(1 To 6, 1 To m)
    End If
   
    ' 将 arr(i, j + 2) 的值赋给二维数组 brr 的相应位置
    For j = 1 To 6
      brr(j, m) = arr(i, j + 2)
    Next
   
    ' 将更新后的数组 brr 存储回字典 d 中的相应位置
    d(arr(i, 1))(arr(i, 2)) = brr
  Next
  
  q = 18
  
  With Worksheets("出入库单")
    ' 处理出入库单工作表
   
    For i = 1 To 17
      hg(i) = .Rows(i).RowHeight
      ' 存储原始行高信息
    Next
   
    .Rows("18:" & .Rows.Count).Clear
    ' 清空出入库单工作表中的一部分区域
   
    .Range("B2,F2,A4:F13,C14:F14") = ""
    ' 清空指定区域的数据
   
    .Range("C14,E14").FormulaR1C1 = "=SUM(R[-10]C:R[-1]C)"
    '.Range("D14").FormulaR1C1 = "=R[-1]C"
    .Range("A15").FormulaR1C1 = "大写金额"
    ' 设置一些单元格的公式
   
    ' 遍历字典 d 的键和值,将数据填充到出入库单工作表中
    For Each aa In d.keys
      For Each bb In d(aa).keys
        brr = d(aa)(bb)
        ReDim crr(1 To UBound(brr, 2), 1 To UBound(brr))
        
        ' 转置数组 brr,存储到数组 crr 中
        For i = 1 To UBound(brr)
          For j = 1 To UBound(brr, 2)
            crr(j, i) = brr(i, j)
          Next
        Next
        
        m = 4
        
        ' 将数组 crr 的值写入出入库单工作表中的相应位置
        For i = 1 To UBound(crr)
          For j = 1 To UBound(crr, 2)
            .Cells(m, j) = crr(i, j)
          Next
         
          If m = 4 Then
            .Range("B2") = bb
            .Range("F2") = aa
          End If
         
          m = m + 1
         
          ' 判断是否需要插入新的一组数据
          If m > 13 Or i = UBound(crr) Then
            .Range("A1:F16").Copy .Cells(q, 1)
            
            ' 设置复制的行高
            For w = 1 To 17
              .Rows(q + w - 1).RowHeight = hg(w)
            Next
            
            m = 4
            q = q + 17
          End If
        Next
      Next
    Next
   
    .Rows("1:17").Delete
    ' 删除原始的行号 1 到 17 的行
  End With
End Sub

TA的精华主题

TA的得分主题

发表于 2023-7-11 16:37 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-7-11 16:38 | 显示全部楼层
修改好了。像我写的代码。

明细表测试.rar

33.5 KB, 下载次数: 9

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-7-11 16:46 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 16:46 | 显示全部楼层
chxw68 发表于 2023-7-11 16:38
修改好了。像我写的代码。

谢谢大佬,不过最后一行输出结果还是出现个小问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 17:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-11 17:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 00:55 , Processed in 0.034468 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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