Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 张雄友

[已解决]多了几列空列

[复制链接]
 楼主| 发表于 2015-4-6 20:52 | 显示全部楼层
grf1973 发表于 2015-4-6 20:38
maxc没定义,初始值就是0.只要计算出一个c,就会变成c,然后跟每一个计算出的c比较,取其大值。

成功了,但是有二个问题:

一,arr = sh.
[A1].Resize(r, Application.Max(c1, c2)) '定义数组!这里为什么用A1?而不是用 Rng1 ???

二,当文件名的数字很大时,如: 车间567000,(当然这只是一个车间的编码),567000大于最大列标了,所以行不通。


多了几列空列8.rar

62.82 KB, 下载次数: 1

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2015-4-6 21:02 | 显示全部楼层
因为用到了rng1.column之类的,这是相对于第1列而言的。如果用相对值可以是可以,但要多个换算过程,比较麻烦。
回复

使用道具 举报

 楼主| 发表于 2015-4-6 21:05 | 显示全部楼层
grf1973 发表于 2015-4-6 21:02
因为用到了rng1.column之类的,这是相对于第1列而言的。如果用相对值可以是可以,但要多个换算过程,比较麻 ...

您的意思是否是说:

一,arr = sh.[A1].Resize(r, Application.Max(c1, c2)) '定义数组!这里可以用A1,或者 A2,B2,但不能用rng1 之类的??
回复

使用道具 举报

 楼主| 发表于 2015-4-6 21:08 | 显示全部楼层
grf1973 发表于 2015-4-6 21:02
因为用到了rng1.column之类的,这是相对于第1列而言的。如果用相对值可以是可以,但要多个换算过程,比较麻 ...

不是的,用 B2,试了,不行的。可能只能只最左上角的值,A1
回复

使用道具 举报

发表于 2015-4-6 21:20 | 显示全部楼层
先排序,再输出。
  1. Sub 比较()
  2.     [B1:IV65536].ClearContents
  3.     Dim fd As FileDialog, wb As Workbook, sh As Worksheet, Mypath As String, arrf$(), mf&
  4.      With Application.FileDialog(msoFileDialogFolderPicker)
  5.         .AllowMultiSelect = False
  6.         If .Show = -1 Then
  7.             Mypath = .SelectedItems(1)
  8.             If Right(Mypath, 1) <> "" Then Mypath = Mypath & ""
  9.         Else
  10.             If MsgBox("以本工作簿所在路径为默认文件夹吗?" _
  11.                     & vbNewLine & vbNewLine & "单击“否”可退出程序", vbYesNo, "确认默认路径") = vbYes Then
  12.                 Mypath = ThisWorkbook.Path
  13.                 If Right(Mypath, 1) <> "" Then Mypath = Mypath & ""
  14.             Else
  15.                 GoTo The_Exit
  16.             End If
  17.         End If
  18.     End With
  19.     Application.ScreenUpdating = False
  20.     If Mypath <> "" Then  '如果选到
  21.    
  22.         Call GetFiles(Mypath, arrf, mf)
  23.         Set d = CreateObject("scripting.dictionary")        'arrf内排序
  24.         For k = 1 To UBound(arrf)   '读取月份,存入字典
  25.             F = arrf(k)
  26.             If InStr(F, ThisWorkbook.Name) = 0 Then
  27.                 yf = Val(Split(F, "")(UBound(Split(F, ""))))
  28.                 d(F) = yf
  29.             End If
  30.         Next
  31.         For k = 1 To UBound(arrf) - 1 '双循环比较,排序
  32.             For k1 = k + 1 To UBound(arrf)
  33.                 F = arrf(k): F1 = arrf(k1)
  34.                 If InStr(F, ThisWorkbook.Name) = 0 And InStr(F1, ThisWorkbook.Name) = 0 Then
  35.                     If d(F) > d(F1) Then
  36.                         tmp = arrf(k): arrf(k) = arrf(k1): arrf(k1) = tmp
  37.                     End If
  38.                 End If
  39.             Next
  40.         Next
  41.         
  42.         c = 1
  43.         xrr = Sheets("get").Range("A1:A" & Sheets("get").[A65536].End(3).Row)     '当前工作A列数据
  44.         For Each F In arrf     '打开所有文件(已排序)
  45.             If InStr(F, ThisWorkbook.Name) = 0 Then
  46.                 Set wb = Workbooks.Open(F)
  47.                     For Each sh In wb.Worksheets
  48.                         If Application.WorksheetFunction.CountA(sh.UsedRange) Then
  49.                             xname = Split(wb.Name, ".")(0)   '工作表名
  50.                             Set d = CreateObject("scripting.dictionary")
  51.                             'arr = sh.[a1].CurrentRegion
  52.                            ' arr = sh.UsedRange
  53.                         Set rng1 = sh.UsedRange.Find("车间")
  54.                         Set Rng2 = sh.UsedRange.Find("产量")
  55.                         If Not rng1 Is Nothing And Not Rng2 Is Nothing Then
  56.                         c1 = rng1.Column
  57.                         c2 = Rng2.Column
  58.                         r = sh.Cells(Rows.Count, c2).End(3).Row '产量列的最大行
  59.                         arr = sh.[A1].Resize(r, Application.Max(c1, c2)) '定义数组!

  60.                             For i = rng1.Row + 1 To UBound(arr)      '打开工作表A列和B列相关联
  61.                                d(arr(i, 1)) = arr(i, c2)
  62.                             Next
  63.                         End If
  64.                         End If
  65.                     Next
  66.                 wb.Close False
  67.                 ReDim yrr(1 To UBound(xrr), 1 To 1): yrr(1, 1) = xname
  68.                 For i = 2 To UBound(xrr)
  69.                    yrr(i, 1) = d(xrr(i, 1))
  70.                 Next
  71.                 c = c + 1
  72. '                c = getNum(xname) + 1 ''''''''''''''''''''''''''根据月份得到列号
  73. '                 maxc = IIf(c > maxc, c, maxc)
  74.                 Sheets("get").Cells(1, c).Resize(UBound(yrr), 1) = yrr
  75.                 d.RemoveAll
  76.             End If
  77.        Next
  78.     End If
  79. '    With Sheets("get")      '判断空列并删除
  80. '        For j = maxc To 2 Step -1
  81. '            If Application.WorksheetFunction.CountA(.Columns(j)) = 0 Then .Columns(j).Delete
  82. '        Next
  83. '    End With
  84. The_Exit:
  85. Application.ScreenUpdating = True
  86. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2015-4-6 21:22 | 显示全部楼层
因为在代码中定义rng1时用了绝对地址,而绝对地址是相对于[a1]的,所以只能以[a1]起算!
回复

使用道具 举报

 楼主| 发表于 2015-4-6 21:43 | 显示全部楼层
grf1973 发表于 2015-4-6 21:20
先排序,再输出。

附件黄色单元格排序不对。

新建文件夹.rar

77.31 KB, 下载次数: 1

回复

使用道具 举报

发表于 2015-4-7 13:19 | 显示全部楼层
用了个子函数获取年月日。
  1. Function GetLastNum(x)       '获取字符串最后几位数值
  2.     If Len(x) = 0 Then
  3.         GetLastNum = 0
  4.     Else
  5.         For j = Len(x) To 1 Step -1
  6.             If Not IsNumeric(Mid(x, j, 1)) Then Exit For
  7.         Next
  8.         If j = Len(x) Then GetLastNum = 0 Else GetLastNum = Val(Mid(x, j + 1))
  9.     End If
  10. End Function
复制代码

新建文件夹.rar

78.77 KB, 下载次数: 4

评分

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

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-4-7 18:02 | 显示全部楼层
grf1973 发表于 2015-4-7 13:19
用了个子函数获取年月日。

日常工作中,往往为了方便把日期写成:日期是带点数字。就不行了!

日期是带点数字.rar

120.78 KB, 下载次数: 1

回复

使用道具 举报

发表于 2015-4-8 09:11 | 显示全部楼层    本楼为最佳答案   

日期是带点数字.rar

121.27 KB, 下载次数: 2

点评

有时间帮看23,24楼问题,谢谢!  发表于 2015-4-9 20:01

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 19:21 , Processed in 0.258345 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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