Excel精英培训网

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

[已解决]VBA程序: "新建,筛选,复制,自动填充,另存"请求高人指点

[复制链接]
发表于 2013-3-31 21:42 | 显示全部楼层 |阅读模式
本帖最后由 BrianBrian 于 2013-3-31 21:55 编辑

程序是因为如下需求编的:

1.打开工作薄"VBA.xlsm", 程序运行.
2.工作薄" VBA 筛选测试.xlsx": sheet("ZOSO") 中, 所有"J"列值为 "#N/A" 的行, copy 该行F 和 G的单元格内容到sheet ("IPES data") A列和B列下面空白单元格. 同时"C629"中的公式自动往下填充.
3. 表格按日期另存为一个新的文件. (因每天需要更新的频率太高)

新手刚上路, 还请高人多多帮忙, 不知如下程序是哪出错了. 谢谢!

Sub PRCordcontrolnew()
Dim myapp2 As Object
Dim wkb3 As Object
Dim arr, arr1(), m As Long, n As Long, o As Long, p As Long

Set myapp2 = CreateObject("Excel.Application")
Set wkb3 = myapp2.Workbooks.Open("C:\Documents and Settings\Desktop\VBA 筛选测试.xlsx")
'以新的workbook object"wkb3"调用打开范本文件

wkb3.Sheets("ZOSO").Activate
arr = wkb3.Sheets("ZOSO").Range("E2:I" & Range("E1048576").End(xlUp).Row).Value
o = wkb3.Sheets("ZOSO").Range("C1048576").End(xlUp).Row

For m = 1 To UBound(arr)
If VarType(arr(m, 5)) = vbError Then
n = n + 1
ReDim Preserve arr1(1 To 5, 1 To n) '筛选出数组arr中#N/A值的元素,并归类为新的二维数组 arr1
arr1(1, n) = arr(m, 1) '取 第1维(共5个元素)的第一个元素对应的第二维所有值
arr1(2, n) = arr(m, 2) '取 第1维(共5个元素)的第二个元素对应的第二维所有值
End If
Next m

wkb3.Sheets("IPES data").Activate '把新的数组arr1取得的如上值复制到sheets("IPES")
wkb3.Sheets("IPES data").Range("A" & o).Resize(UBound(arr1, 2), UBound(arr1)) = Application.Transpose(arr1)
wkb3.Sheets("IPES data").Range("A" & o).Resize(UBound(arr1, 2), UBound(arr1)).Borders.LineStyle = 1
wkb3.Sheets("IPES data").Range("A" & o + UBound(arr1, 2)).Select

p = wkb3.Sheets("IPES data").Range("A1048576").End(xlUp).Row
With wkb3.Sheets("IPES data")
.Range("C628").AutoFill Destination:=.Range("C628:C" & p), Type:=xlFillDefault 'Sheet(IPES)单元格C628公式自动往下填充
End With

wkb3.SaveAs Filename:="C:\Documents and Settings\Desktop\PRC order control\" & "PRC Order Control" & Format(Now(), "YYYYMMDDHH") & " .xlsx" 'WK3 按日期和时间另存为新文件
wkb3.Close 0
Set wkb3 = Nothing
Set myapp2 = Nothing
End Sub



最佳答案
2013-4-1 08:30
本帖最后由 hwc2ycy 于 2013-4-1 08:31 编辑
  1. Sub PRCordcontrolnew2()

  2.     On Error Resume Next

  3.     Dim wkb3 As Workbook
  4.     Dim arr, arr1(), m As Long, n As Long, o As Long, p As Long

  5.     Application.ScreenUpdating = False
  6.     Set wkb3 = GetObject(ThisWorkbook.Path & "\VBA 筛选测试.xlsx")
  7.    
  8.     With wkb3.Sheets("ZOSO")
  9.         arr = .Range("E2:I" & .Cells(Rows.Count, 3).End(xlUp).Row)
  10.     End With

  11.     For m = 1 To UBound(arr)
  12.         If VarType(arr(m, 5)) = vbError Then
  13.             n = n + 1
  14.             ReDim Preserve arr1(1 To 2, 1 To n)    '筛选出数组arr中#N/A值的元素,并归类为新的二维数组 arr1
  15.             arr1(1, n) = arr(m, 1)
  16.             arr1(2, n) = arr(m, 2)
  17.         End If
  18.     Next m

  19.     With wkb3.Sheets("IPES data")
  20.         p = .Cells(Rows.Count, 1).End(xlUp).Row
  21.         If p > 1 Then Range("a2:c" & p) = ""
  22.         If n > 0 Then
  23.             .Range("A" & 2).Resize(n, UBound(arr1)) = Application.Transpose(arr1)
  24.             .Range("A" & 2).Resize(n, UBound(arr1)).Borders.LineStyle = 1
  25.             .[c2] = "=MID(RC[-1],11,4)/1000*MID(RC[-1],16,4)/1000*MID(RC[-1],29,4)"
  26.             .Range("C2").AutoFill Destination:=.Range("C2:C" & n + 1), Type:=xlFillDefault    'Sheet(IPES)单元格C628公式自动往下填充
  27.         End If
  28.     End With


  29.     wkb3.SaveAs Filename:="C:\Documents and Settings\Desktop\PRC order control" & "PRC Order Control" & Format(Now(), "YYYYMMDDHH") & " .xlsx"    'WK3 按日期和时间另存为新文件

  30.     wkb3.Close 0

  31.     Set wkb3 = Nothing
  32.    
  33.     Application.ScreenUpdating = True
  34.    
  35. End Sub
复制代码

VBA请求帮忙.zip

248.03 KB, 下载次数: 13

发表于 2013-4-1 08:19 | 显示全部楼层
为什么你在IPS DATA输出位置要用ZOSO的最后行位置呢?
公式下拉,中间有空行,公式下拉填充必然有错误。
回复

使用道具 举报

发表于 2013-4-1 08:20 | 显示全部楼层
如果是需要C628的公式,可以直接在筛选的数据里输入再填充。
回复

使用道具 举报

发表于 2013-4-1 08:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hwc2ycy 于 2013-4-1 08:31 编辑
  1. Sub PRCordcontrolnew2()

  2.     On Error Resume Next

  3.     Dim wkb3 As Workbook
  4.     Dim arr, arr1(), m As Long, n As Long, o As Long, p As Long

  5.     Application.ScreenUpdating = False
  6.     Set wkb3 = GetObject(ThisWorkbook.Path & "\VBA 筛选测试.xlsx")
  7.    
  8.     With wkb3.Sheets("ZOSO")
  9.         arr = .Range("E2:I" & .Cells(Rows.Count, 3).End(xlUp).Row)
  10.     End With

  11.     For m = 1 To UBound(arr)
  12.         If VarType(arr(m, 5)) = vbError Then
  13.             n = n + 1
  14.             ReDim Preserve arr1(1 To 2, 1 To n)    '筛选出数组arr中#N/A值的元素,并归类为新的二维数组 arr1
  15.             arr1(1, n) = arr(m, 1)
  16.             arr1(2, n) = arr(m, 2)
  17.         End If
  18.     Next m

  19.     With wkb3.Sheets("IPES data")
  20.         p = .Cells(Rows.Count, 1).End(xlUp).Row
  21.         If p > 1 Then Range("a2:c" & p) = ""
  22.         If n > 0 Then
  23.             .Range("A" & 2).Resize(n, UBound(arr1)) = Application.Transpose(arr1)
  24.             .Range("A" & 2).Resize(n, UBound(arr1)).Borders.LineStyle = 1
  25.             .[c2] = "=MID(RC[-1],11,4)/1000*MID(RC[-1],16,4)/1000*MID(RC[-1],29,4)"
  26.             .Range("C2").AutoFill Destination:=.Range("C2:C" & n + 1), Type:=xlFillDefault    'Sheet(IPES)单元格C628公式自动往下填充
  27.         End If
  28.     End With


  29.     wkb3.SaveAs Filename:="C:\Documents and Settings\Desktop\PRC order control" & "PRC Order Control" & Format(Now(), "YYYYMMDDHH") & " .xlsx"    'WK3 按日期和时间另存为新文件

  30.     wkb3.Close 0

  31.     Set wkb3 = Nothing
  32.    
  33.     Application.ScreenUpdating = True
  34.    
  35. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-4-1 23:29 | 显示全部楼层
谢谢老师! P值, M值都可以跑出来,就是好像最后一步的时候#N/A 的部分值跑不到sheets (IPES), 不知道是我的电脑问题还是,我明早再把数据调出跑跑看看.  老师的条例太清晰了,学习了
回复

使用道具 举报

 楼主| 发表于 2013-4-3 08:15 | 显示全部楼层
终于可以了呵,谢谢老师!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 08:30 , Processed in 0.341246 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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