Excel精英培训网

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

[已解决]with 变量未设置

[复制链接]
发表于 2013-6-15 20:19 | 显示全部楼层 |阅读模式
当工作簿中存在空工作表时,会出错,with 变量未设置,要怎么改?
最佳答案
2013-6-15 21:18
Sub 合并()
    Dim sh As Worksheet, arr, brr(0 To 65535, 1 To 255)
    Dim d As Object, i&, j&, m&, n&, c As Range, MyPath$
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = ThisWorkbook.Path & "\"
        If .Show = False Then Exit Sub
        MyPath = .SelectedItems(1) & "\"
    End With
    Application.ScreenUpdating = False
    Set d = CreateObject("scripting.dictionary")
    d("单位名称") = 1
    brr(0, 1) = "单位名称"
    n = 1
    MyName = Dir(MyPath & "*.xls")
    Do While MyName <> ""
        If MyName <> ThisWorkbook.Name Then
            With GetObject(MyPath & MyName)
                For Each sh In .Worksheets
                   If Application.CountA(sh.UsedRange.Cells) > 0 Then              
      Set c = sh.UsedRange.Find("单位名称", , , 1)
                    arr = c.Resize(sh.Cells(65536, c.Column).End(xlUp).Row - c.Row + 1, c.Offset(, 256 - c.Column).End(xlToLeft).Column)
                    For j = 1 To UBound(arr, 2)
                        If Len(arr(1, j)) Then
                            If Not d.Exists(arr(1, j)) Then
                                n = n + 1
                                d(arr(1, j)) = n
                                brr(0, n) = arr(1, j)
                            End If
                        End If
                    Next
                    For i = 2 To UBound(arr)
                        m = m + 1
                        If m > 65535 Then
                        MsgBox "超出最大行数65536,无法合并"
                        Exit Sub
                        End If
                        brr(m, 1) = arr(i, 1)
                        For j = 2 To UBound(arr, 2)
                            If Len(arr(1, j)) Then brr(m, d(arr(1, j))) = arr(i, j)
                        Next
                    Next
                 End If            
          Next
                .Close False
            End With
        End If
        MyName = Dir
    Loop
    Application.ScreenUpdating = True
    Cells.ClearContents
    If m Then [A1].Resize(m + 1, n + 1) = brr
    End Sub

新建文件夹.rar

28.65 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2013-6-15 20:38 | 显示全部楼层
If sh.UsedRange <> "" And Application.CountA(sh.Cells) > 1 Then

加了这句又说不匹配,是不是加错地方了?
回复

使用道具 举报

发表于 2013-6-15 20:48 | 显示全部楼层
回复

使用道具 举报

发表于 2013-6-15 20:54 | 显示全部楼层
Set c = sh.UsedRange.Find("单位名称", , , 1) 这一句中c的结果是nothing ,因为没查找到符合条件的,所以c对象不存在,后面也就会提供对象变量不存在了
回复

使用道具 举报

 楼主| 发表于 2013-6-15 20:56 | 显示全部楼层
妞叫七七 发表于 2013-6-15 20:54
Set c = sh.UsedRange.Find("单位名称", , , 1) 这一句中c的结果是nothing ,因为没查找到符合条件的,所以 ...

怎么改才能忽略空工作表呢?
回复

使用道具 举报

发表于 2013-6-15 21:07 | 显示全部楼层
张雄友 发表于 2013-6-15 20:56
怎么改才能忽略空工作表呢?


前面加一个和件就行 i If Application.CountA(Sh.UsedRange.Cells) > 0 Then

回复

使用道具 举报

 楼主| 发表于 2013-6-15 21:10 | 显示全部楼层
妞叫七七 发表于 2013-6-15 21:07
前面加一个和件就行 i If Application.CountA(Sh.UsedRange.Cells) > 0 Then

前面加一个和件就行 i If Application.CountA(Sh.UsedRange.Cells) > 0 Then?

哪里前面?
回复

使用道具 举报

发表于 2013-6-15 21:18 | 显示全部楼层    本楼为最佳答案   
Sub 合并()
    Dim sh As Worksheet, arr, brr(0 To 65535, 1 To 255)
    Dim d As Object, i&, j&, m&, n&, c As Range, MyPath$
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = ThisWorkbook.Path & "\"
        If .Show = False Then Exit Sub
        MyPath = .SelectedItems(1) & "\"
    End With
    Application.ScreenUpdating = False
    Set d = CreateObject("scripting.dictionary")
    d("单位名称") = 1
    brr(0, 1) = "单位名称"
    n = 1
    MyName = Dir(MyPath & "*.xls")
    Do While MyName <> ""
        If MyName <> ThisWorkbook.Name Then
            With GetObject(MyPath & MyName)
                For Each sh In .Worksheets
                   If Application.CountA(sh.UsedRange.Cells) > 0 Then              
      Set c = sh.UsedRange.Find("单位名称", , , 1)
                    arr = c.Resize(sh.Cells(65536, c.Column).End(xlUp).Row - c.Row + 1, c.Offset(, 256 - c.Column).End(xlToLeft).Column)
                    For j = 1 To UBound(arr, 2)
                        If Len(arr(1, j)) Then
                            If Not d.Exists(arr(1, j)) Then
                                n = n + 1
                                d(arr(1, j)) = n
                                brr(0, n) = arr(1, j)
                            End If
                        End If
                    Next
                    For i = 2 To UBound(arr)
                        m = m + 1
                        If m > 65535 Then
                        MsgBox "超出最大行数65536,无法合并"
                        Exit Sub
                        End If
                        brr(m, 1) = arr(i, 1)
                        For j = 2 To UBound(arr, 2)
                            If Len(arr(1, j)) Then brr(m, d(arr(1, j))) = arr(i, j)
                        Next
                    Next
                 End If            
          Next
                .Close False
            End With
        End If
        MyName = Dir
    Loop
    Application.ScreenUpdating = True
    Cells.ClearContents
    If m Then [A1].Resize(m + 1, n + 1) = brr
    End Sub
回复

使用道具 举报

 楼主| 发表于 2013-6-15 21:24 | 显示全部楼层
妞叫七七 发表于 2013-6-15 21:18
Sub 合并()
    Dim sh As Worksheet, arr, brr(0 To 65535, 1 To 255)
    Dim d As Object, i&, j&, m& ...

End If                Next

怎么有这种写法?
回复

使用道具 举报

发表于 2013-6-15 21:42 | 显示全部楼层
张雄友 发表于 2013-6-15 21:24
End If                Next

怎么有这种写法?

编辑贴子时,少打了个回车,就成这样了

评分

参与人数 1 +1 收起 理由
张雄友 + 1 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 06:34 , Processed in 0.502037 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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