ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助一个小问题。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-11 15:47 | 显示全部楼层 |阅读模式
本帖最后由 LED147258 于 2022-11-11 16:33 编辑

同样代码。在1个sheet里就好用。

现在我转到4个sheet的工作簿的模块中,就不好用了。我试着做了SET WG=。。然后用WG.range().。也不好用。
求教,怎么改?

Sub 组号()
Dim WD As Worksheet
Set WD = ThisWorkbook.Sheets("排列")
Dim m, n, o, m1, m2, m3, m4, a, b, c, d, a2, b2, c2, d2 As Integer
Dim arr(1 To 4) As String    *这里的arr(1 To 4)对不对?
Dim brr1(), brr2(), brr3()    *这里多个BRR(),怎么一笔带过?
m = 0
n = 0
  o = 0
m1 = 1
m2 = 1
  m3 = 1
   m4 = 1
a = WD.Range("CR2").Value
b = WD.Range("CS2").Value
  c = WD.Range("CT2").Value
   d = WD.Range("CU2").Value
a2 = a + 2
b2 = b + 2
  c2 = c + 2
   d2 = d + 2
arr1 = WD.Range("CR" & 3 & ":CR" & a2)    *这里的ARR1-4,是用ARR1还是ARR(1)
arr2 = WD.Range("CS" & 3 & ":CS" & b2)
  arr3 = WD.Range("CT" & 3 & ":CT" & c2)
   arr4 = WD.Range("CU" & 3 & ":CU" & d2)
For m1 = 1 To a
For m2 = 1 To b
  If Right(arr1(m1, 1), 2) = Left(arr2(m2, 1), 2) Then
  m = m + 1
  ReDim Preserve brr1(1 To m)
  brr1(m) = arr1(m1, 1) & Right(arr2(m2, 1), 2)
For m3 = 1 To c
  If Right(brr1(m), 2) = Left(arr3(m3, 1), 2) Then
  n = n + 1
  ReDim Preserve brr2(1 To n)
  brr2(n) = brr1(m) & Right(arr3(m3, 1), 2)
For m4 = 1 To d
  If Right(brr2(n), 2) = Left(arr4(m4, 1), 2) Then
  o = o + 1
  ReDim Preserve brr3(1 To o)
  brr3(o) = brr2(n) & Right(arr4(m4, 1), 2)
End If
Next m4
End If
Next m3
End If
Next m2
Next m1
WD.Range("CV3").Resize(UBound(brr3), 1) = Application.Transpose(brr3)   *总提示这里有错
Erase arr1
Erase arr2
Erase arr3     *这里这么多ARR,怎么简短的都清除?
Erase arr4
Erase brr1()
Erase brr2()    *这里的BRR,怎么简短的清除内存?
Erase brr3()
Dim arr5, arr6, brr4(), brr5()   **这里,因为上面代码运行完,有个函数计算过程,需要将函数计算结果装入ARR,所以在这里才声明的ARR对吧?
Dim x, y As Long
x = 0
y = 1
arr5 = WD.Range("DP3:DP50001")
arr6 = WD.Range("DQ3:DQ50001")
For y = 1 To 49998
If arr5(y, 1) > 0 Then   *或者提示这里有错
x = x + 1
ReDim Preserve brr4(1 To x)
ReDim Preserve brr5(1 To x)
brr4(x) = arr5(y, 1)
brr5(x) = arr6(y, 1)
End If
Next y
WD.Range("DS3").Resize(UBound(brr4), 1) = Application.Transpose(brr4)   *这两个可能也有错。
WD.Range("DR3").Resize(UBound(brr5), 1) = Application.Transpose(brr5)
Erase arr5
Erase arr6
Erase brr4()
Erase brr5()
MsgBox ("完毕")
End Sub
6813179d078bce538dd23ce835423ed.png
9642fe61952b4b61f1a353cfaba18a2.png

TA的精华主题

TA的得分主题

发表于 2022-11-11 15:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你就几行代码,无法看出是啥问题。

TA的精华主题

TA的得分主题

发表于 2022-11-11 16:04 | 显示全部楼层
猜下应该是这样吧: WD.Range("CV3").Resize(UBound(ARR, 2)) =

TA的精华主题

TA的得分主题

发表于 2022-11-11 16:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没指定sheetbook吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-11 16:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

Sub 组号()
Dim WD As Worksheet
Set WD = ThisWorkbook.Sheets("排列")
Dim m, n, o, m1, m2, m3, m4, a, b, c, d, a2, b2, c2, d2 As Integer
Dim arr(1 To 4) As String
Dim brr1(), brr2(), brr3()
m = 0
n = 0
  o = 0
m1 = 1
m2 = 1
  m3 = 1
   m4 = 1
a = WD.Range("CR2").Value
b = WD.Range("CS2").Value
  c = WD.Range("CT2").Value
   d = WD.Range("CU2").Value
a2 = a + 2
b2 = b + 2
  c2 = c + 2
   d2 = d + 2
arr1 = WD.Range("CR" & 3 & ":CR" & a2)
arr2 = WD.Range("CS" & 3 & ":CS" & b2)
  arr3 = WD.Range("CT" & 3 & ":CT" & c2)
   arr4 = WD.Range("CU" & 3 & ":CU" & d2)
For m1 = 1 To a
For m2 = 1 To b
  If Right(arr1(m1, 1), 2) = Left(arr2(m2, 1), 2) Then
  m = m + 1
  ReDim Preserve brr1(1 To m)
  brr1(m) = arr1(m1, 1) & Right(arr2(m2, 1), 2)
For m3 = 1 To c
  If Right(brr1(m), 2) = Left(arr3(m3, 1), 2) Then
  n = n + 1
  ReDim Preserve brr2(1 To n)
  brr2(n) = brr1(m) & Right(arr3(m3, 1), 2)
For m4 = 1 To d
  If Right(brr2(n), 2) = Left(arr4(m4, 1), 2) Then
  o = o + 1
  ReDim Preserve brr3(1 To o)
  brr3(o) = brr2(n) & Right(arr4(m4, 1), 2)
End If
Next m4
End If
Next m3
End If
Next m2
Next m1
WD.Range("CV3").Resize(UBound(brr3), 1) = Application.Transpose(brr3)


Erase arr1
Erase arr2
Erase arr3
Erase arr4
Erase brr1()
Erase brr2()
Erase brr3()

Dim arr5, arr6, brr4(), brr5()
Dim x, y As Long
x = 0
y = 1
arr5 = WD.Range("DP3:DP50001")
arr6 = WD.Range("DQ3:DQ50001")
For y = 1 To 49998
If arr5(y, 1) > 0 Then
x = x + 1
ReDim Preserve brr4(1 To x)
ReDim Preserve brr5(1 To x)
brr4(x) = arr5(y, 1)
brr5(x) = arr6(y, 1)
End If
Next y

WD.Range("DS3").Resize(UBound(brr4), 1) = Application.Transpose(brr4)
WD.Range("DR3").Resize(UBound(brr5), 1) = Application.Transpose(brr5)
Erase arr5
Erase arr6
Erase brr4()
Erase brr5()
MsgBox ("完毕")

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-11 16:24 | 显示全部楼层

Sub 组号()
Dim WD As Worksheet
Set WD = ThisWorkbook.Sheets("排列")
Dim m, n, o, m1, m2, m3, m4, a, b, c, d, a2, b2, c2, d2 As Integer
Dim arr(1 To 4) As String
Dim brr1(), brr2(), brr3()
m = 0
n = 0
  o = 0
m1 = 1
m2 = 1
  m3 = 1
   m4 = 1
a = WD.Range("CR2").Value
b = WD.Range("CS2").Value
  c = WD.Range("CT2").Value
   d = WD.Range("CU2").Value
a2 = a + 2
b2 = b + 2
  c2 = c + 2
   d2 = d + 2
arr1 = WD.Range("CR" & 3 & ":CR" & a2)
arr2 = WD.Range("CS" & 3 & ":CS" & b2)
  arr3 = WD.Range("CT" & 3 & ":CT" & c2)
   arr4 = WD.Range("CU" & 3 & ":CU" & d2)
For m1 = 1 To a
For m2 = 1 To b
  If Right(arr1(m1, 1), 2) = Left(arr2(m2, 1), 2) Then
  m = m + 1
  ReDim Preserve brr1(1 To m)
  brr1(m) = arr1(m1, 1) & Right(arr2(m2, 1), 2)
For m3 = 1 To c
  If Right(brr1(m), 2) = Left(arr3(m3, 1), 2) Then
  n = n + 1
  ReDim Preserve brr2(1 To n)
  brr2(n) = brr1(m) & Right(arr3(m3, 1), 2)
For m4 = 1 To d
  If Right(brr2(n), 2) = Left(arr4(m4, 1), 2) Then
  o = o + 1
  ReDim Preserve brr3(1 To o)
  brr3(o) = brr2(n) & Right(arr4(m4, 1), 2)
End If
Next m4
End If
Next m3
End If
Next m2
Next m1
WD.Range("CV3").Resize(UBound(brr3), 1) = Application.Transpose(brr3)


Erase arr1
Erase arr2
Erase arr3
Erase arr4
Erase brr1()
Erase brr2()
Erase brr3()

Dim arr5, arr6, brr4(), brr5()
Dim x, y As Long
x = 0
y = 1
arr5 = WD.Range("DP3:DP50001")
arr6 = WD.Range("DQ3:DQ50001")
For y = 1 To 49998
If arr5(y, 1) > 0 Then
x = x + 1
ReDim Preserve brr4(1 To x)
ReDim Preserve brr5(1 To x)
brr4(x) = arr5(y, 1)
brr5(x) = arr6(y, 1)
End If
Next y

WD.Range("DS3").Resize(UBound(brr4), 1) = Application.Transpose(brr4)
WD.Range("DR3").Resize(UBound(brr5), 1) = Application.Transpose(brr5)
Erase arr5
Erase arr6
Erase brr4()
Erase brr5()
MsgBox ("完毕")

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-11 16:28 | 显示全部楼层

代码上传了,有空给看一下哪里有错。并给简化一下。

TA的精华主题

TA的得分主题

发表于 2022-11-12 12:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 组号()
    Dim m&, n&, o&, x&, m1&, m2&, m3&, m4&
    Dim arr, brr1(), brr2(), brr3(), brr4()
    With Sheets("排列")
        arr = .Range("CR3:CU" & .[CR1:CU99999].Find("*", , xlValues, , xlByRows, xlPrevious).Row)
        For m1 = 1 To UBound(arr)
            For m2 = 1 To UBound(arr)
                If Right(arr(m1, 1), 2) = Left(arr(m2, 2), 2) Then
                    m = m + 1
                    ReDim Preserve brr1(1 To m)
                    brr1(m) = arr(m1, 1) & Right(arr(m2, 2), 2)
                    For m3 = 1 To UBound(arr)
                        If Right(brr1(m), 2) = Left(arr(m3, 3), 2) Then
                            n = n + 1
                            ReDim Preserve brr2(1 To n)
                            brr2(n) = brr1(m) & Right(arr(m3, 3), 2)
                            For m4 = 1 To UBound(arr)
                                If Right(brr2(n), 2) = Left(arr(m4, 4), 2) Then
                                    o = o + 1
                                    ReDim Preserve brr3(1 To o)
                                    brr3(o) = brr2(n) & Right(arr(m4, 4), 2)
                                End If
                            Next
                        End If
                    Next
                End If
            Next
        Next
        .Range("Cx3").Resize(UBound(brr3), 1) = Application.Transpose(brr3)
        
        arr = .Range("DP3:DQ" & .[DP1:DQ99999].Find("*", , xlValues, , xlByRows, xlPrevious).Row)
        For m4 = 1 To UBound(arr)
            If arr(m4, 1) > 0 Then
                x = x + 1
                ReDim Preserve brr4(1 To 2, 1 To x)
                brr4(1, x) = arr(m4, 1)
                brr4(2, x) = arr(m4, 2)
            End If
        Next
        .Range("Du3").Resize(UBound(brr4, 2), 2) = Application.Transpose(brr4)
    End With
    MsgBox ("完毕")
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-13 21:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
suntao2000 发表于 2022-11-12 12:09
Sub 组号()
    Dim m&, n&, o&, x&, m1&, m2&, m3&, m4&
    Dim arr, brr1(), brr2(), brr3(), brr4()
...

谢谢,十分感谢。
我回头找到问题所在了。是因为原代码指定的单元格错误,导致VBA改写的单元格内容错误或空白。新VBA读不到数据问题。

TA的精华主题

TA的得分主题

发表于 2022-11-13 21:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

不看你的问题,就代码而言:
Sub 组号()
Dim WD As Worksheet
Set WD = ThisWorkbook.Sheets("排列")
Dim m, n, o, m1, m2, m3, m4, a, b, c, d, a2, b2, c2, d2 As Integer
Dim arr(1 To 4) As String    *这里的arr(1 To 4)对不对?‘‘这里arr(1 to 4)只表示一个一维数组’
Dim brr1(), brr2(), brr3()    *这里多个BRR(),怎么一笔带过?“这里没有一笔带过之说,只能这样一个个定义
m = 0
n = 0
  o = 0
m1 = 1
m2 = 1
  m3 = 1
   m4 = 1
a = WD.Range("CR2").Value
b = WD.Range("CS2").Value
  c = WD.Range("CT2").Value
   d = WD.Range("CU2").Value
a2 = a + 2
b2 = b + 2
  c2 = c + 2
   d2 = d + 2
arr1 = WD.Range("CR" & 3 & ":CR" & a2)    *这里的ARR1-4,是用ARR1还是ARR(1)“当然是arr1,arr(1)则是表示数组中的一个值
arr2 = WD.Range("CS" & 3 & ":CS" & b2)
  arr3 = WD.Range("CT" & 3 & ":CT" & c2)
   arr4 = WD.Range("CU" & 3 & ":CU" & d2)
For m1 = 1 To a
For m2 = 1 To b
  If Right(arr1(m1, 1), 2) = Left(arr2(m2, 1), 2) Then
  m = m + 1
  ReDim Preserve brr1(1 To m)
  brr1(m) = arr1(m1, 1) & Right(arr2(m2, 1), 2)
For m3 = 1 To c
  If Right(brr1(m), 2) = Left(arr3(m3, 1), 2) Then
  n = n + 1
  ReDim Preserve brr2(1 To n)
  brr2(n) = brr1(m) & Right(arr3(m3, 1), 2)
For m4 = 1 To d
  If Right(brr2(n), 2) = Left(arr4(m4, 1), 2) Then
  o = o + 1
  ReDim Preserve brr3(1 To o)
  brr3(o) = brr2(n) & Right(arr4(m4, 1), 2)
End If
Next m4
End If
Next m3
End If
Next m2
Next m1
WD.Range("CV3").Resize(UBound(brr3), 1) = Application.Transpose(brr3)   *总提示这里有错“什么错提示?
Erase arr1
Erase arr2
Erase arr3     *这里这么多ARR,怎么简短的都清除?,“如果再多则使用循环!只有4句代码差不多”
Erase arr4
Erase brr1()
Erase brr2()    *这里的BRR,怎么简短的清除内存?“如果再多则使用循环!只有3句代码差不多”
Erase brr3()
Dim arr5, arr6, brr4(), brr5()   **这里,因为上面代码运行完,有个函数计算过程,需要将函数计算结果装入ARR,所以在这里才声明的ARR对吧?
    “任何地方申明都可以,一般只在之前申明就行”
Dim x, y As Long
x = 0
y = 1
arr5 = WD.Range("DP3:DP50001")
arr6 = WD.Range("DQ3:DQ50001")
For y = 1 To 49998
If arr5(y, 1) > 0 Then   *或者提示这里有错 “这是错误应该是出在arr5数组的问题”
x = x + 1
ReDim Preserve brr4(1 To x)
ReDim Preserve brr5(1 To x)
brr4(x) = arr5(y, 1)
brr5(x) = arr6(y, 1)
End If
Next y
WD.Range("DS3").Resize(UBound(brr4), 1) = Application.Transpose(brr4)   *这两个可能也有错。 “这是出错应该是brr4数组的问题”
WD.Range("DR3").Resize(UBound(brr5), 1) = Application.Transpose(brr5)
Erase arr5
Erase arr6
Erase brr4()
Erase brr5()
MsgBox ("完毕")
End Sub

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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