Excel精英培训网

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

[已解决]运行得不到结果,逐步执行可以,求解!

[复制链接]
发表于 2017-5-7 23:03 | 显示全部楼层 |阅读模式
在【操作表】里运行存放在【宏工作簿】里的宏,调取【数据源】工作簿中相应的数据,为何得不到结果,但是用F8逐步执行却可以。是什么原因?
详见附件,

测试问题.zip

85.94 KB, 下载次数: 9

发表于 2017-5-8 09:05 | 显示全部楼层
那是因为你的语句中打开“数据源”后,未指明操作哪个工作簿的某个工作表,而当前工作表则是“数据源”的一个表,而调试时是始终激活了“操作表”的。
宏修改如下
Sub test()
    Application.ShowWindowsInTaskbar = False
    Dim rng As Range, sr As String, col%, row%, i%, n%, wb
    Set rng = Application.InputBox("请选择【选我测试】所在的单元格", "选择", Type:=8)
    Application.ScreenUpdating = False
    sr = rng.Value
    col = rng.Column
    row = rng.row
    n = Cells(Rows.Count, col).End(xlUp).row
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\数据源.xlsx")
    rng.Offset(0, 1).EntireColumn.Insert , copyorigin:=xlFormatFromLeftOrAbove
    rng.Offset(0, 1) = "测试数据"
    On Error Resume Next
    For i = row + 1 To n
        With Workbooks(1).Sheets(1)
            .Cells(i, col).Offset(0, 1) = Application.WorksheetFunction.VLookup(Right(.Cells(i, col), 4), wb.Sheets("x").Range("d:f"), 2, 0)
            .Cells(i, col).Offset(0, 1) = Application.WorksheetFunction.VLookup(Right(.Cells(i, col), 4), wb.Sheets("y").Range("d:f"), 3, 0)
        End With
    Next i
    wb.Close False
    Set wb = Nothing
    Application.ShowWindowsInTaskbar = True
    Application.ScreenUpdating = True
End Sub
回复

使用道具 举报

 楼主| 发表于 2017-5-8 13:11 | 显示全部楼层
zjdh 发表于 2017-5-8 09:05
那是因为你的语句中打开“数据源”后,未指明操作哪个工作簿的某个工作表,而当前工作表则是“数据源”的一 ...

workbook.open方法不是只在后台打开工作簿而不激活吗,我去试试

回复

使用道具 举报

 楼主| 发表于 2017-5-8 13:44 来自手机 | 显示全部楼层
本帖最后由 hb_wzh 于 2017-5-8 13:56 编辑
zjdh 发表于 2017-5-8 09:05
那是因为你的语句中打开“数据源”后,未指明操作哪个工作簿的某个工作表,而当前工作表则是“数据源”的一 ...

谢谢,测试可用,另外,在运行宏的时侯界面会跳到打开存放宏的工作簿界面,需要返回操作表再操作,有什么办法能始终留在操作表界面,或者不让宏工作簿打开或隐藏,最后代码关闭
操作表的工作表因为来自不同的部门,不固定在第一个工作表,是随机的,这样要如何写代码呢
回复

使用道具 举报

 楼主| 发表于 2017-5-8 13:46 来自手机 | 显示全部楼层
会跳到宏工作簿界面,能不让其打开宏工作簿或不显示吗
回复

使用道具 举报

发表于 2017-5-8 14:57 | 显示全部楼层
本帖最后由 zjdh 于 2017-5-8 15:04 编辑

简单啊,做一个加载宏,先运行该加载宏,打开操作表,点击右键命令中第一个命令即可。
注意,要将加载宏放在数据源所在的文件夹里,否则应改写:
Set wb = Workbooks.Open(ThisWorkbook.Path & "\数据源.xlsx") 的指向

加载宏.rar (13.64 KB, 下载次数: 2)
回复

使用道具 举报

发表于 2017-5-8 15:02 | 显示全部楼层    本楼为最佳答案   
dh.gif
回复

使用道具 举报

 楼主| 发表于 2017-5-8 15:58 | 显示全部楼层
本帖最后由 hb_wzh 于 2017-5-8 17:01 编辑


操作表的工作表因为来自不同的部门,不固定在第一个工作表,是随机的,使用workbooks(1).worksheets(1)得不到结果这样要如何写代码呢
使用加载宏后,能用activesheet吗


回复

使用道具 举报

发表于 2017-5-8 17:07 | 显示全部楼层
本帖最后由 zjdh 于 2017-5-8 17:09 编辑
hb_wzh 发表于 2017-5-8 15:58
操作表的工作表因为来自不同的部门,不固定在第一个工作表,是随机的,使用workbooks(1).worksheets(1) ...

不能!
改成就可以啦
Sub test()
    Application.ShowWindowsInTaskbar = False
    Dim rng As Range, sr As String, col%, row%, i%, n%, wb
    Set sth = ActiveSheet
    Set rng = Application.InputBox("请选择【选我测试】所在的单元格", "选择", Type:=8)
    Application.ScreenUpdating = False
    sr = rng.Value
    col = rng.Column
    row = rng.row
    n = Cells(Rows.Count, col).End(xlUp).row
    Set wb = Workbooks.Open("D:\数据\数据源.xlsx")
    rng.Offset(0, 1).EntireColumn.Insert , copyorigin:=xlFormatFromLeftOrAbove
    rng.Offset(0, 1) = "测试数据"
    On Error Resume Next
    For i = row + 1 To n
        With sth
            .Cells(i, col).Offset(0, 1) = Application.WorksheetFunction.VLookup(Right(.Cells(i, col), 4), wb.Sheets("x").Range("d:f"), 2, 0)
            .Cells(i, col).Offset(0, 1) = Application.WorksheetFunction.VLookup(Right(.Cells(i, col), 4), wb.Sheets("y").Range("d:f"), 3, 0)
        End With
    Next i
    wb.Close False
    Set sth = Nothing
    Set wb = Nothing
    Application.ShowWindowsInTaskbar = True
    Application.ScreenUpdating = True
End Sub

回复

使用道具 举报

 楼主| 发表于 2017-5-8 23:00 来自手机 | 显示全部楼层
zjdh 发表于 2017-5-8 17:07
不能!
改成就可以啦
Sub test()

感谢修改代码,获益匪浅
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 04:36 , Processed in 0.362347 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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