Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA代码疑难解答_Vba_Excel - Fatal编程技术网

Excel VBA代码疑难解答

Excel VBA代码疑难解答,vba,excel,Vba,Excel,此代码的要点是从“删除标志”选项卡中获取用户输入,用户在该选项卡中输入项目编号及其所属程序,根据项目编号和程序过滤“主列表”选项卡,然后将标志名称与列匹配并删除标志。但是,偏移不起作用。而是删除标题。当我跨过它时,一切都正常,直到我用“******”标记的行 我是VBA新手,自学成才,非常感谢您的帮助。非常感谢您抽出时间 编辑:删除了“出错时继续下一步”,并修复了一些拼写错误。当前的问题是rng在过滤时没有>1行,并且肯定有两行(一行是标题,一行是返回的数据) Sub-RemoveFlag()

此代码的要点是从“删除标志”选项卡中获取用户输入,用户在该选项卡中输入项目编号及其所属程序,根据项目编号和程序过滤“主列表”选项卡,然后将标志名称与列匹配并删除标志。但是,偏移不起作用。而是删除标题。当我跨过它时,一切都正常,直到我用“******”标记的行

我是VBA新手,自学成才,非常感谢您的帮助。非常感谢您抽出时间

编辑:删除了“出错时继续下一步”,并修复了一些拼写错误。当前的问题是rng在过滤时没有>1行,并且肯定有两行(一行是标题,一行是返回的数据)

Sub-RemoveFlag()
暗淡的cel As范围
变暗rg As范围
d为双色
作为整数的Dim i
将m作为整数
作为整数的Dim n
变暗rng As范围
将wsMaster设置为工作表
将wsFlag设置为工作表
设置wsMaster=工作表(“主列表”)
设置wsFlag=工作表(“删除标志”)
i=6
“如果没有数据。什么也不做。
如果wsFlag.Range(“C6”)=“”则
wsFlag.Activate
其他的
Application.ScreenUpdating=False
'添加前导零
wsFlag.Activate
设置rg=范围(“C6”)
设置rg=Range(rg,rg.Worksheet.Cells(Rows.Count,rg.Column).End(xlUp))
rg.NumberFormat=“@”
对于rg.单元格中的每个单元格
如果是数字(单元格值),则
d=Val(单元值)
cel.Value=格式(d,“000000000000000000”)'十八位数字
如果结束
下一个
'清除“主列表”选项卡上的所有筛选器。
wsMaster。激活
如果wsMaster.AutoFilterMode=True,则
wsMaster.AutoFilterMode=False
如果结束
'循环所有数据行
Do While wsFlag.Cells(i,3).Value“”
'按SKU编号筛选
wsMaster.Range(“A1”).AutoFilter字段:=4,Criteria1:=wsFlag.Cells(i,3).Value
'按程序过滤
wsMaster.Range(“A1”).AutoFilter字段:=2,Criteria1:=wsFlag.Cells(i,2).Value
'如果筛选器不为空,请查找标志的列
Set rng=wsMaster.UsedRange.SpecialCells(xlCellTypeVisible)
如果(rng.Rows.Count>1),则
wsMaster.Range(“A1:Z1”).Find(wsFlag.Cells(i,4),LookIn:=xlValues)。激活
n=ActiveCell.Column
图纸(“主列表”)。范围。偏移量(1,0)。特殊单元格(xlCellTypeVisible)。选择
m=ActiveCell.Row
单元(m,n)=“
wsFlag.Activate
范围(单元格(i,2),单元格(i,4)).ClearContent
其他的
wsFlag.Activate
范围(单元格(i,2),单元格(i,4)).Copy
wsFlag.Range(“F4”).End(xlDown).偏移量(1,0).激活
ActiveCell.PasteSpecial Paste:=xlPasteValues
范围(单元格(i,2),单元格(i,4)).ClearContent
如果结束
wsMaster。激活
wsMaster.AutoFilterMode=False
i=i+1
环
'确保整个主列表选项卡未高亮显示,并在两个选项卡中将“高亮显示的单元格”拉至A1。
wsMaster。激活
wsMaster.Range(“A1”).激活
wsFlag.Activate
范围(“A1”)。激活
“解冻屏幕
Application.ScreenUpdating=True
如果结束
端接头

按照@Zerk的建议,首先在代码顶部设置两个工作表变量:

Dim wsMaster As Worksheet
Dim wsRemoveFlags As Worksheet

Set wsMaster = Worksheets("Master List")
Set wsRemoveFlags = Worksheets("Remove Flags")

然后用wsMaster替换工作表(“主列表”)的所有其他实例,用wsRemoveFlags替换工作表(“删除标志”)。

有时候,只需在行和列之间循环即可。如下所示:

替换以下各项之间的所有内容:

Do While wsFlag.Cells(i, 3).Value <> ""
   ...
Loop
Do While wsFlag.Cells(i,3).Value“”
...
环
与:

Do While wsFlag.Cells(i,3).Value“”
将r变暗为“长”行
尺寸c为“长”列
最后一排一样长
Dim被发现为布尔值
lastRow=wsMaster.Cells.SpecialCells(xlLastCell.Row)
发现=错误
对于r=2到lastRow,跳过标题行
'查找匹配的程序/SKU
如果wsMaster.Cells(r,2).Value=wsFlag.Cells(i,2).Value_
和wsMaster.Cells(r,3)=wsFlag.Cells(i,3)。然后
'在第行中查找标志
对于c=1至26'的A至Z列
如果wsMaster.Cells(r,c)=wsFlag.Cells(i,4),则
“找到旗子了吗
wsMaster.Cells(r,c)=“”
找到=真
退出“如果标志可以位于多个列中,请删除此项。”。
如果结束
下一个'c
如果结束
下一个
如果没有找到的话
'如果未找到标志wsFlag.Cells(i,4),则需要在此处放置代码。
如果结束
环

您有名为
“主列表”
“主列表”
“Maser列表”
的工作表吗?您的代码引用了所有这些工作表名称-我猜您有一个名为
主列表
,其他都是打字错误。另外,您的
查找
行是否确实找到了什么?如果没有,则您的
ActiveCell
将不会移动,并且它将是find命令之前处于活动状态的任何行。此行“activesheet.Range.Offset(1,0).SpecialCells(xlCellTypeVisible).Select”将解析为错误并被忽略,因此您不会向下偏移标题行并将m设置为该行,从而清除标题。您将“on error resume next(下一步错误恢复)”设置为“on error resume next(下一步错误恢复)”,因此没有意识到错误,这是一种不好的做法,会导致类似的问题。@DarrenBartrup Cook它也会掩盖错误的工作表引用。我很欣赏这一建议,并同意它会显著地清理代码,但是由于代码仍然没有按预期运行,我不会接受这个解决方案。
Do While wsFlag.Cells(i, 3).Value <> ""
   ...
Loop
Do While wsFlag.Cells(i, 3).Value <> "" 
    Dim r As Long  ' Rows
    Dim c As Long  ' Columns
    Dim lastRow As Long
    Dim found As Boolean

    lastRow = wsMaster.Cells.SpecialCells(xlLastCell).Row
    found = False

    For r = 2 To lastRow ' Skipping Header Row
        ' Find Matching Program/SKU
        If wsMaster.Cells(r, 2).Value = wsFlag.Cells(i, 2).Value _
        And wsMaster.Cells(r, 3) = wsFlag.Cells(i, 3).Value Then
            ' Find Flag in Row
            For c = 1 To 26   ' Columns A to Z
                 If wsMaster.Cells(r, c) = wsFlag.Cells(i, 4) Then
                     ' Found Flag
                     wsMaster.Cells(r, c) = ""
                     found = True
                     Exit For ' if flag can be in more than one column, remove this.
                 End If
            Next 'c
        End If
    Next 'r

    If Not found Then
        ' Here is where you need to put code if Flag wsFlag.Cells(i, 4) not found.
    End If
Loop