ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 请用数组法修改一段代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-6-27 15:47 | 显示全部楼层 |阅读模式
本帖最后由 天地一相 于 2023-6-29 10:21 编辑

感谢帮助。请用数组办法修改原代码,功能操作不变。原代码:
  1. For c = 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1")) - 2
  2. Sheet3.Range("C1:C520").Value = Sheet4.Range(Sheet4.Cells(1, c), Sheet4.Cells(520, c)).Value
  3. For d = c + 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1")) - 1
  4. Sheet3.Range("D1:D520").Value = Sheet4.Range(Sheet4.Cells(1, d), Sheet4.Cells(520, d)).Value
  5. For e = d + 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1"))
  6. Sheet3.Range("E1:E520").Value = Sheet4.Range(Sheet4.Cells(1, e), Sheet4.Cells(520, e)).Value
  7. Next e, d, c
复制代码



TA的精华主题

TA的得分主题

发表于 2023-6-27 20:01 来自手机 | 显示全部楼层
    您好!根据您提供的VBA代码,我将使用数组方法来重写它:

```vba
Dim dataRange As Range
Dim dataArray() As Variant

' 获取数据范围
Set dataRange = Sheet4.Rows("1:520")

' 将数据范围的值存储到数组中
dataArray = dataRange.Value

' 外层循环,遍历列 c
For c = 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1")) - 2
   ' 内层循环1,遍历列 d
   For d = c + 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1")) - 1
      ' 内层循环2,遍历列 e
      For e = d + 1 To Application.WorksheetFunction.CountA(Sheet4.Rows("1:1"))
         ' 将特定列的数据存储到目标范围
         Sheet3.Range("C1:C520").Value = ArrayColumns(dataArray, c)
         Sheet3.Range("D1:D520").Value = ArrayColumns(dataArray, d)
         Sheet3.Range("E1:E520").Value = ArrayColumns(dataArray, e)
      Next e
   Next d
Next c

' 根据列索引,从二维数组中获取指定列的数据
Function ArrayColumns(dataArray As Variant, columnIndex As Integer) As Variant
   Dim resultArray() As Variant
   Dim i As Long
   
   ReDim resultArray(1 To UBound(dataArray, 1), 1 To 1)
   
   ' 将指定列的数据复制到结果数组中
   For i = 1 To UBound(dataArray, 1)
      resultArray(i, 1) = dataArray(i, columnIndex)
   Next i
   
   ArrayColumns = resultArray
End Function
```

请将上述代码替换原来的代码。这段代码使用了数组方法,通过一次获取数据并存储到数组中,然后使用数组操作进行处理,可以提高代码运行效率。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-6-27 21:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看着眼晕,代码可读性太差了。
代码不是行数越少越好,而是应该可读性好才是真的好,不然,后期维护累死人。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-6-27 23:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykcbf1100 发表于 2023-6-27 21:04
看着眼晕,代码可读性太差了。
代码不是行数越少越好,而是应该可读性好才是真的好,不然,后期维护累死人 ...

谢谢,不会吧,是本站一个高手帮我写的,简单直观易懂,我一下就看明白了。只是感觉速度不快,想着寻个数组的方法改写一下提速提速。数组你擅长呀,帮写一下呗。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-6-27 23:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
格调是我 发表于 2023-6-27 20:01
您好!根据您提供的VBA代码,我将使用数组方法来重写它:

```vba

谢谢,水平有限,稀里糊涂装进去测试,(貌似还有自定义函数什么的),ByRef报警。

TA的精华主题

TA的得分主题

发表于 2023-6-28 10:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub test0() '不比原来的快,只是易看些,我用数组写更耗时点,故不用
  2.   Dim Ran As Range, a As Long, b As Long, c As Long, d As Long, e As Long
  3.   With Sheet4
  4.     a = 520
  5.     b = .Cells(1, .Columns.Count).End(xlToLeft).Column
  6.     Set Ran = .Range("A1").Resize(a, b)
  7.   End With
  8.   With Sheet3
  9.     For c = 1 To b - 2
  10.       .Range("C1").Resize(a) = Ran.Columns(c).Value
  11.       For d = c + 1 To b - 1
  12.         .Range("D1").Resize(a) = Ran.Columns(d).Value
  13.         For e = d + 1 To b
  14.           .Range("E1").Resize(a) = Ran.Columns(e).Value
  15.     Next e, d, c
  16.   End With
  17.   Set Ran = Nothing
  18. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-6-29 08:06 | 显示全部楼层

谢谢,我也发现这部分使用数组没速度上的改善,计算这一句无解,现在想大概汇总结果这部分有空间改善了,因为目前使用的是每符合一组数据就提取汇总写入一组,想着若把符合的先暂时写入数组,结束时一次性写入会更好点。请看下代码,可否修改下。
  1. If Application.WorksheetFunction.CountBlank(Sheet2.Range("B2:B7")) < 6 Then
  2.         For k = 2 To 7
  3.         If Application.WorksheetFunction.CountBlank(Sheet2.Cells(k, "B")) < 1 Then
  4.            n = n + 1
  5.            Sheet1.Cells(n, 1).Value = Sheet3.Range("C1").Value & "-" & Sheet3.Range("D1").Value & "-" & Sheet3.Range("E1").Value
  6.            Sheet1.Range(Sheet1.Cells(n, "B"), Sheet1.Cells(n, "AH")).Value = Sheet2.Range(Sheet2.Cells(k, "A"), Sheet2.Cells(k, "AG")).Value
  7.         End If
  8.         Next k
  9.         End If
复制代码


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

本版积分规则

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

GMT+8, 2024-11-16 19:32 , Processed in 0.037306 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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