Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: tianxy

[已解决]想用VBA做库存的查询和添加,但是写到最后卡在了FIND取得的行数上。。

[复制链接]
发表于 2017-5-24 09:34 | 显示全部楼层
tianxy 发表于 2017-5-24 05:53
呃,我把代码改成了
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5  ...

那是因为你设置的变量类型错误!应该是
    Dim x As Integer
    Dim y As Integer
    Dim xfind As Integer
    Dim xfind1 As Integer
    Dim xfind2 As Integer
    Dim blank As Integer
把应该是数值变量设置为文本变量啦!



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

使用道具 举报

发表于 2017-5-24 10:00 | 显示全部楼层
本帖最后由 zjdh 于 2017-5-24 10:20 编辑

帮你修改了一下:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target <> "" Then
        If Target.Row > 3 And Target.Row < 201 Then
           x = Target.Row()
            With Worksheets("库存")
                xfind1 = .Range("A:A").Find(Cells(x, 1), LookIn:=xlValues, After:=.[A9999], lookat:=xlWhole).Row
                xfind2 = .Range(.Cells(xfind1 - 1, 2), .Cells(xfind1 + 300, 2)).Find(Cells(x, 2), LookIn:=xlValues, lookat:=xlWhole).Row
                xfind = .Range(.Cells(xfind2 - 1, 3), .Cells(xfind2 + 100, 3)).Find(Cells(x, 3), LookIn:=xlValues, lookat:=xlWhole).Row
                blank = .Cells(xfind, 3).End(2).Column + 1
                Target.Copy .Cells(xfind, blank)
            End With
        End If
    End If
End Sub
回复

使用道具 举报

发表于 2017-5-24 10:27 | 显示全部楼层
本帖最后由 zjdh 于 2017-5-24 13:04 编辑

你的这个思路很容易产生张冠李戴,因为是第三列有相同的数据。
试试将“库存”第2行放到第5行去,在“IPAD MINI4” “白色”行输入数据,结果就错了!!
回复

使用道具 举报

发表于 2017-5-24 13:01 | 显示全部楼层    本楼为最佳答案   
改成用数组不仅速度快,而且无差错:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target <> "" Then
        If Target.Row > 3 And Target.Row < 201 Then
            x = Target.Row()
            With Worksheets("库存")
                ARR = .Range("A1").CurrentRegion
                For I = 2 To UBound(ARR)
                    If ARR(I, 1) & ARR(I, 2) & ARR(I, 3) = Cells(x, 1) & Cells(x, 2) & Cells(x, 3) Then Exit For
                Next
                blank = .Cells(I, 3).End(2).Column + 1
                Target.Copy .Cells(I, blank)
            End With
        End If
    End If
End Sub

评分

参与人数 1 +1 收起 理由
tianxy + 1 赞一个

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-5-25 08:34 | 显示全部楼层
zjdh 发表于 2017-5-24 13:01
改成用数组不仅速度快,而且无差错:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Targ ...

我的天,这么短的代码就可以解决我的问题,结果我写了这么冗长的代码。。还起不了效果。。我该学的还有好多啊,谢谢!谢谢大神,完美解决。。
还有太多东西该学啊,谢谢你帮了我这么多还帮我重写了代码,谢谢,我可耻的做了伸手党。。
回复

使用道具 举报

 楼主| 发表于 2017-5-25 08:46 | 显示全部楼层
zjdh 发表于 2017-5-24 13:01
改成用数组不仅速度快,而且无差错:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Targ ...

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target <> "" Then
        If Target.Row > 3 And Target.Row < 201 Then
            x = Target.Row()
            With Worksheets("库存")
                ARR = .Range("A1").CurrentRegion
                For I = 2 To UBound(ARR)
                    If ARR(I, 1) & ARR(I, 2) & ARR(I, 3) = Cells(x, 1) & Cells(x, 2) & Cells(x, 3) Then Exit For
                Next
                blank = .Cells(I, 3).End(2).Column + 1
                Target.Copy .Cells(I, blank)
            End With
        End If
    End If
End Sub

BAIDU了一下END的用法,又学到新东西了。。
因为第四列是剩余数量,是不会往那里填数字的
那是不是说红字的那句其实变成.Cells(I, 4).End(2).Column + 1 也是可以实现同样的效果的?
谢谢大神,懂了好多新东西

回复

使用道具 举报

发表于 2017-5-25 13:22 | 显示全部楼层
tianxy 发表于 2017-5-25 08:46
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target  "" Then
...

你第4列有公式啊,至少不是空格,所以
.Cells(I, 4).End(2).Column + 1

.Cells(I, 3).End(2).Column + 1
是一样的结果
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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