ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: cysczhumh

[求助] 这个如何才能让下标不出错?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-5-16 17:47 | 显示全部楼层
代码没啥好改的,不如重写

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-5-17 08:44 | 显示全部楼层
本帖最后由 cysczhumh 于 2025-5-17 09:14 编辑

用DeekSeek修改了程序,主要采用了字典和数组相结合,这样表3中介质可以是任意顺序,就是程序有点长,感觉还有优化的地方。
Sub AppendAndTransformData()
    Application.ScreenUpdating = False
    t = Timer
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim dict As Object
    Dim dataArr1 As Variant, dataArr2 As Variant, resultArr() As Variant
    Dim i As Long, j As Long, lastRow As Long, colCount As Long
    Dim dateStr As String, medium As String
    Dim planVal As Variant, actualVal As Variant
   
    ' 设置工作表对象
    Set ws1 = ThisWorkbook.Sheets("气瓶销售")
    Set ws2 = ThisWorkbook.Sheets("销售周报")
    Set dict = CreateObject("Scripting.Dictionary")
   
    ' 获取Sheet3的日期
    dateStr = ws2.Range("B1").Value
   
    ' 读取Sheet3数据到数组
    lastRow = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
    dataArr2 = ws2.Range("A2:C" & lastRow).Value
   
    ' 创建字典存储Sheet3的数据
    For i = 1 To UBound(dataArr2, 1)
        medium = dataArr2(i, 1)
        
        ' 安全处理数值
        planVal = IIf(IsNumeric(dataArr2(i, 2)), dataArr2(i, 2), 0)
        actualVal = IIf(IsNumeric(dataArr2(i, 3)), dataArr2(i, 3), 0)
        
        ' 存储介质对应的计划和实际值
        dict(medium) = Array(planVal, actualVal)
    Next i
   
    ' 读取Sheet1的数据
    lastRow = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    colCount = ws1.Cells(1, ws1.Columns.Count).End(xlToLeft).Column
    dataArr1 = ws1.Range(ws1.Cells(1, 1), ws1.Cells(lastRow, colCount)).Value
   
    ' 确定结果数组的大小
    Dim newRowCount As Long
    newRowCount = UBound(dataArr1, 1) + 1
   
    ' 重新定义结果数组
    ReDim resultArr(1 To newRowCount, 1 To colCount)
   
    ' 将原有数据复制到结果数组
    For i = 1 To UBound(dataArr1, 1)
        For j = 1 To UBound(dataArr1, 2)
            resultArr(i, j) = dataArr1(i, j)
        Next j
    Next i
   
    ' 添加新行(日期)
    resultArr(newRowCount, 1) = dateStr
   
    ' 根据Sheet1的标题行填充新行的数据
    For j = 2 To colCount Step 2
        medium = ws1.Cells(1, j).Value
        If dict.exists(medium) Then
            resultArr(newRowCount, j) = dict(medium)(0)
            resultArr(newRowCount, j + 1) = dict(medium)(1)
        End If
    Next j
   
    ' 将结果写回Sheet1
    ws1.Cells(1, 1).Resize(newRowCount, colCount - 1).Value = resultArr
   
    ' 清理对象
    Set dict = Nothing
    Set ws1 = Nothing
    Set ws2 = Nothing
   
    Application.ScreenUpdating = True
    MsgBox "OK!数据追加并转换完成!.用时:" & Format((Timer - t), "#0.00") & "秒", vbInformation
   
    End Sub

TA的精华主题

TA的得分主题

发表于 2025-5-17 09:33 | 显示全部楼层
cysczhumh 发表于 2025-5-16 17:09
不对,r-2是表2中数组的行数,在表1中的数组应是(r-2)*2

下边赋值的时候不是已经*2了吗?如果下边不乘2,上边可以乘2,但arr里的i就要除2了。
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-5-17 09:43 | 显示全部楼层
半百 发表于 2025-5-17 09:33
下边赋值的时候不是已经*2了吗?如果下边不乘2,上边可以乘2,但arr里的i就要除2了。

就是把“计划和实际”分别放在奇数行和偶数行的表示

TA的精华主题

TA的得分主题

发表于 2025-5-17 09:59 | 显示全部楼层
cysczhumh 发表于 2025-5-17 09:43
就是把“计划和实际”分别放在奇数行和偶数行的表示

对呀,就是这个意思。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-22 20:25 , Processed in 0.020635 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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