ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 新手求助WPS表格从数组复制到“汇总”工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-20 18:16 | 显示全部楼层 |阅读模式
新手对数组复制还有点蒙圈:点击按钮,将录入工作表中的单元格A3至H3和A5至G5单元格这两组从数组复制到“汇总”工作表B2至P2单元格,重新录入后,继续放在B3至P3单元格单元格,以下是代码:
  1. Sub 保存()
  2.     Application.ScreenUpdating = False
  3.     Dim n As Integer, m As Integer, x As Integer, y As Integer, k As Integer
  4.     Dim data() As Variant
  5.     Dim i As Integer
  6.     Dim rows As Integer


  7.     On Error GoTo ErrorHandler


  8.     ' 检查是否已保存
  9.     If Not IsValueInColumn(Sheets("汇总").Range("D:D"), Sheets("录入").Range("C3").Value) Then
  10.         MsgBox "尚未保存,准备保存!"
  11.     Else
  12.         MsgBox "重复已经保存过了"
  13.         Exit Sub
  14.     End If


  15.     ' 检查信息是否完整
  16.     If Not AllCellsAreFilled() Then
  17.         MsgBox "信息不完整,不能保存!"
  18.         Exit Sub
  19.     End If


  20.     ' 从“录入”工作表中获取数据
  21.     GetDataFromInputSheet data


  22.     ' 将数据复制到“汇总”工作表
  23.     rows = Sheets("汇总").Cells(Sheets("汇总").rows.Count, "B").End(xlUp).Row + 1
  24.     CopyDataToSummarySheet data, rows


  25.     Application.ScreenUpdating = True
  26.     Exit Sub


  27. ErrorHandler:
  28.     MsgBox "发生错误: " & Err.Description
  29.     Application.ScreenUpdating = True
  30. End Sub


  31. ' 检查值是否存在于指定列中
  32. Function IsValueInColumn(rng As Range, valueToFind As Variant) As Boolean
  33.     Dim cell As Range
  34.     For Each cell In rng
  35.         If cell.Value = valueToFind Then
  36.             IsValueInColumn = True
  37.             Exit Function
  38.         End If
  39.     Next cell
  40.     IsValueInColumn = False
  41. End Function


  42. ' 检查所有必要的单元格是否都已填写
  43. Function AllCellsAreFilled() As Boolean
  44.     Dim cellValues() As Variant
  45.     cellValues = Array(Sheets("录入").Range("A3"), Sheets("录入").Range("B3"), Sheets("录入").Range("C3"), _
  46.                   Sheets("录入").Range("D3"), Sheets("录入").Range("B5"), Sheets("录入").Range("C5"), _
  47.                   Sheets("录入").Range("D5"), Sheets("录入").Range("G5"))


  48.     Dim cell As Variant
  49.     For Each cell In cellValues
  50.         If cell.Value = "" Then
  51.             AllCellsAreFilled = False
  52.             Exit Function
  53.         End If
  54.     Next cell
  55.     AllCellsAreFilled = True
  56. End Function
  57. Sub GetDataFromInputSheet(ByRef data() As Variant)
  58.     Dim wsInput As Worksheet
  59.     Set wsInput = Sheets("录入")
  60.    
  61.     ' 假设data是一个8行2列的数组
  62.     Dim i As Integer
  63.     Dim rowOffset As Integer ' 用于在A列和B列之间跳行的偏移量
  64.    
  65.     ' 初始化行偏移量,从A3和B3开始(第3行)
  66.     rowOffset = 3
  67.    
  68.     ' 填充数组
  69.     For i = 1 To 8
  70.         ' 从A列获取数据
  71.         data(i, 1) = wsInput.Cells(rowOffset, "A").Value
  72.         ' 从B列获取数据
  73.         data(i, 2) = wsInput.Cells(rowOffset, "B").Value
  74.         
  75.         ' 根据当前的行号更新下一个要读取的行号
  76.         ' 如果是奇数行,则下一行是偶数行,需要跳过
  77.         If rowOffset Mod 2 = 1 Then
  78.             rowOffset = rowOffset + 2 ' 跳过一行,移动到下一对行(偶数行)
  79.         Else
  80.             rowOffset = rowOffset + 1 ' 移动到下一行(仍然是偶数行)
  81.         End If
  82.     Next i
  83. End Sub
  84. ' 将数据从数组复制到“汇总”工作表
  85. Sub CopyDataToSummarySheet(ByRef data() As Variant, ByVal startRow As Integer)
  86.     Dim wsSummary As Worksheet
  87.     Set wsSummary = Sheets("汇总")


  88.     ' 从startRow开始,将数据从数组复制到“汇总”工作表
  89.     Dim i As Long, j As Long
  90.     For i = LBound(data, 1) To UBound(data, 1)
  91.         For j = LBound(data, 2) To UBound(data, 2)
  92.             wsSummary.Cells(startRow + i - LBound(data, 1), j).Value = data(i, j)
  93.         Next j
  94.     Next i
  95. End Sub

复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-20 18:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
运行时出错,下标越界,新手对数组复制还有点蒙圈。

TA的精华主题

TA的得分主题

发表于 2024-3-21 09:12 | 显示全部楼层
上附件吧,虽然没有看到原始表格内容,但是一个复制,写得够复杂的

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-21 15:12 | 显示全部楼层
LIUZHU 发表于 2024-3-21 09:12
上附件吧,虽然没有看到原始表格内容,但是一个复制,写得够复杂的

传说中的shi山代码,谢谢三楼老大。

工作簿1.zip

32.09 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-3-21 18:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-21 18:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
附件,请审核

工作簿1.zip

30.19 KB, 下载次数: 10

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-21 18:06 | 显示全部楼层
重复录入的目前是要手工删除,在录入的,当然也可以改成覆盖原来的记录

TA的精华主题

TA的得分主题

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

十分谢谢您老大,发现几个小问题,第一个是不会根据发票号码判断是否已经录入重复了,第二个是所有单元格为空时也可录入到汇总表里,

TA的精华主题

TA的得分主题

发表于 2024-3-22 11:29 | 显示全部楼层
第一个把D4改为D3 就可以了,第二个问题应该没问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-25 11:00 | 显示全部楼层
LIUZHU 发表于 2024-3-21 18:00
既然是WPS,用JSA代码简单
  1. function 录入(){
  2.        
  3.         Sheets.Item("录入").Activate();
  4.         if (Sheets.Item("汇总").Cells.Find(Range("d3").Value2)!=null){
  5.                 alert(`发票已存在,请检查是否存在重复报销。`);
  6.                 return;
  7.         }
  8.         let arr=["=ROW()-1"];
  9.         ["a3:h3","a5:g5"].forEach(x=>arr.push(...Range(x).Value2[0]));
  10.         with(Sheets.Item("汇总")){
  11.                 let rng=Range("a"+ Rows.Count).End(xlUp);
  12.                 rng.Offset(1,0).Resize(1,arr.length).Value2=arr;
  13.                 alert("录入成功。")
  14.         }
  15. }

  16. // 定义清除特定单元格内容的函数
  17. function 清除单元() {
  18.     Sheets.Item("录入").Range("A3:F3").ClearContents();
  19.     Sheets.Item("录入").Range("A5:E5").ClearContents();
  20.     alert("指定单元格内容已清除。");
  21. }
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-30 02:37 , Processed in 0.033336 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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