Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2864|回复: 7

[已解决]请老师指教i = 1 To Range("a16").End(xlUp).Row的用法

[复制链接]
发表于 2013-3-25 12:11 | 显示全部楼层 |阅读模式
请老师指教i = 1 To Range("a16").End(xlUp).Row的用法,具体看代码。谢谢!
最佳答案
2013-3-25 13:44
原来的代码没有考虑到全是空行的情况。
  1. Sub 表格提取相同行()

  2.     Dim arr1, arr2
  3.     arr1 = Range("A1:G15")
  4.     arr2 = Range("a17:g31")
  5.     Dim key1 As String

  6.     Dim result()
  7.     ReDim result(1 To UBound(arr1), 1 To UBound(arr1, 2))

  8.     Dim i As Byte, j As Byte, k As Byte, l As Byte, m As Byte
  9.     Dim blCancel As Boolean

  10.     '外层ARR1
  11.     For i = LBound(arr1) To UBound(arr1)
  12.         '内层ARR2
  13.         For j = LBound(arr1) To UBound(arr1)
  14.             blCancel = False
  15.             '列对比
  16.             key1 = ""
  17.             For k = LBound(arr1, 2) To UBound(arr1, 2)
  18.                 key1 = key1 & arr1(i, k)
  19.                 If arr1(i, k) <> arr2(j, k) Then
  20.                     blCancel = True
  21.                     Exit For
  22.                 End If
  23.             Next
  24.             If Not blCancel And Len(key1) > 0 Then
  25.                 Debug.Print "arr1(" & i & "--arr2(" & j
  26.                 l = l + 1
  27.                 For m = LBound(arr1, 2) To UBound(arr1, 2)
  28.                     result(l, m) = arr1(i, m)
  29.                 Next
  30.             End If
  31.         Next
  32.     Next

  33.     If l > 0 Then
  34.         Range("u2").Resize(l, UBound(arr1, 2)) = result
  35.     Else
  36.         MsgBox "无相同的数据行"
  37.     End If
  38. End Sub
复制代码

选取数字相同的行.zip

12.96 KB, 下载次数: 15

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-3-25 13:02 | 显示全部楼层
回复

使用道具 举报

发表于 2013-3-25 13:03 | 显示全部楼层
Sub t()
    Dim arr1, arr2, arr3(1 To 11, 1 To 7), i!, j!, k!,m!, n!
    arr1 = Range("A1").CurrentRegion
    arr2 = Range("A17").CurrentRegion
    For i = 1 To UBound(arr1)
        For j = 1 To UBound(arr2)
            For k = 1 To 7
                If arr1(i, k) <> arr2(j, k) Then Exit For
                If k = 7 Then
                    n = n + 1
                    For m = 1 To 7
                        arr3(n, m) = arr1(i, m)
                    Next
                End If
            Next
        Next
    Next
    Range("U2:AA12") = arr3
End Sub
回复

使用道具 举报

发表于 2013-3-25 13:19 | 显示全部楼层
  1. Sub 提取相同行()
  2.     Dim arr1, arr2
  3.     arr1 = Range("A1:G15")
  4.     arr2 = Range("a17:g31")
  5.     Dim result()
  6.     ReDim result(1 To UBound(arr1), 1 To UBound(arr1, 2))
  7.     Dim i As Byte, j As Byte, blCancel As Boolean, k As Byte, l As Byte
  8.     For k = LBound(arr2) To UBound(arr2)
  9.         For i = LBound(arr1) To UBound(arr1)
  10.             For j = LBound(arr1, 2) To UBound(arr1, 2)
  11.                 Debug.Print arr1(i, j) & " vs " & arr2(k, j)
  12.                 If arr1(i, j) <> arr2(k, j) Then
  13.                     blCancel = True
  14.                     Exit For
  15.                 End If
  16.             Next
  17.             If Not blCancel Then
  18.                 l = l + 1
  19.                 For j = LBound(arr1, 2) To UBound(arr1, 2)
  20.                     result(l, j) = arr1(i, j)
  21.                 Next
  22.                 blCancel = False
  23.             End If
  24.         Next
  25.     Next
  26.     If l > 0 Then
  27.         Range("u2").Resize(l, UBound(arr1, 2)) = result
  28.     Else
  29.         MsgBox "无相同的数据行"
  30.     End If
  31. End Sub
复制代码
回复

使用道具 举报

发表于 2013-3-25 13:19 | 显示全部楼层
用了多层循环,其实用字典来实现更快。上次帮人写了个的。
回复

使用道具 举报

发表于 2013-3-25 13:32 | 显示全部楼层
  1. Sub 字典法()
  2.    
  3.     Dim arr1, arr2
  4.     arr1 = Range("A1:G15")
  5.     arr2 = Range("a17:g31")
  6.     Dim result()
  7.     ReDim result(1 To UBound(arr1), 1 To UBound(arr1, 2))
  8.    
  9.     Dim key1 As String, key2 As String
  10.    
  11.     Dim dic1 As Object, dic2 As Object
  12.     Set dic1 = CreateObject("scripting.dictionary")
  13.     Set dic2 = CreateObject("scripting.dictionary")
  14.    
  15.     Dim i As Byte, j As Byte
  16.     For i = LBound(arr1) To UBound(arr1)
  17.         For j = LBound(arr1, 2) To UBound(arr1, 2)
  18.             key1 = key1 & arr1(i, j) & ","
  19.             key2 = key2 & arr2(i, j) & ","
  20.         Next
  21.         dic1(Left(key1, Len(key1) - 1)) = ""
  22.         dic2(Left(key2, Len(key2) - 1)) = ""
  23.         key1 = ""
  24.         key2 = ""
  25.     Next
  26.     Dim a, l As Byte
  27.     Dim arrTemp
  28.     For Each a In dic1.keys
  29.         If dic2.exists(a) Then
  30.             arrTemp = Split(a, ",")
  31.             l = l + 1
  32.             For i = LBound(arrTemp) To UBound(arrTemp)
  33.                 result(l, i + 1) = arrTemp(i)
  34.             Next
  35.         End If
  36.     Next
  37.     If l > 0 Then
  38.         Range("u2").Resize(l, UBound(arr1, 2)) = result
  39.     Else
  40.         MsgBox "无相同的数据行"
  41.     End If
  42. End Sub
复制代码
冒似上面的循环代码结果不对了。
回复

使用道具 举报

发表于 2013-3-25 13:44 | 显示全部楼层    本楼为最佳答案   
原来的代码没有考虑到全是空行的情况。
  1. Sub 表格提取相同行()

  2.     Dim arr1, arr2
  3.     arr1 = Range("A1:G15")
  4.     arr2 = Range("a17:g31")
  5.     Dim key1 As String

  6.     Dim result()
  7.     ReDim result(1 To UBound(arr1), 1 To UBound(arr1, 2))

  8.     Dim i As Byte, j As Byte, k As Byte, l As Byte, m As Byte
  9.     Dim blCancel As Boolean

  10.     '外层ARR1
  11.     For i = LBound(arr1) To UBound(arr1)
  12.         '内层ARR2
  13.         For j = LBound(arr1) To UBound(arr1)
  14.             blCancel = False
  15.             '列对比
  16.             key1 = ""
  17.             For k = LBound(arr1, 2) To UBound(arr1, 2)
  18.                 key1 = key1 & arr1(i, k)
  19.                 If arr1(i, k) <> arr2(j, k) Then
  20.                     blCancel = True
  21.                     Exit For
  22.                 End If
  23.             Next
  24.             If Not blCancel And Len(key1) > 0 Then
  25.                 Debug.Print "arr1(" & i & "--arr2(" & j
  26.                 l = l + 1
  27.                 For m = LBound(arr1, 2) To UBound(arr1, 2)
  28.                     result(l, m) = arr1(i, m)
  29.                 Next
  30.             End If
  31.         Next
  32.     Next

  33.     If l > 0 Then
  34.         Range("u2").Resize(l, UBound(arr1, 2)) = result
  35.     Else
  36.         MsgBox "无相同的数据行"
  37.     End If
  38. End Sub
复制代码
回复

使用道具 举报

发表于 2013-3-25 13:45 | 显示全部楼层
字典法会去重复的相同行。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 12:24 , Processed in 0.432459 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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