Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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处理空白_Excel_Vba - Fatal编程技术网

有条件地将不匹配的行追加到表的底部,并在excel中使用VBA处理空白

有条件地将不匹配的行追加到表的底部,并在excel中使用VBA处理空白,excel,vba,Excel,Vba,我正在尝试在excel中创建一个VBA模块,用于比较两列属性号(主控:a列,表1,目标:a列,表2),并将所有不匹配的值从主控(即主控中存在,但不在目标中)返回到目标表的底部(即,目标表末尾的第一个空白行)。到目前为止,我有一些功能运行得很好,但在测试时发现了一些问题 代码: 我注意到的一个问题是,当目标表中有空格时,事情会变得有点不稳定(示例): 在运行模块之前: M|D 1|1 2| 3|3 之后: M|D 1|1 2| 3|2 |3 注意,空

我正在尝试在excel中创建一个VBA模块,用于比较两列属性号(主控:a列,表1,目标:a列,表2),并将所有不匹配的值从主控(即主控中存在,但不在目标中)返回到目标表的底部(即,目标表末尾的第一个空白行)。到目前为止,我有一些功能运行得很好,但在测试时发现了一些问题

代码:

我注意到的一个问题是,当目标表中有空格时,事情会变得有点不稳定(示例):

在运行模块之前:

  M|D

  1|1

  2|     

  3|3
之后:

M|D

1|1

2| 

3|2

 |3

注意,空白单元格保留,返回结果的顺序改变。

M|D

1|1

2| 

3|3

 |2

期望的结果保留了顺序,以及空白(不应该存在于主数据中,但我正在准备最坏的情况,因为我不是主表的DBA)。在这个实例中没有得到期望的结果是有问题的,因为目的地表需要是“静态的”(即保留行顺序)。。目标表中A列旁边将有多个列,其中多个用户将输入注释,如果目标表移动(在末尾添加行之外)或重新排序,注释将与其原始关联的属性号分离。随后会出现混乱等情况


我对VBA非常熟悉,所以我似乎无法找出我方法中的错误(可能还有更多错误,但我在测试时还没有发现任何其他错误,因此指出这些错误将非常感谢)。此外,如果这些信息相关,主列表是一个SQL连接的表,将定期刷新(因此,该过程将是刷新主控(动态,即行的顺序可以而且确实会更改),运行模块将新的属性号返回到目标工作表的底部,用户添加注释并在excel中筛选目标工作表(静态,即行的顺序不会更改,除非同时筛选或排序所有列)。提前谢谢大家。这个社区帮助我突破了许多障碍,希望这将是另一个成功的故事。

尝试使用类似于:

dim i as long, dim lrs as long, lrd as long
with sheets(1)
    lrs = .cells(.rows.count,1).end(xlup).row
    for i = 2 to lrs 'assumes header in row 1
        if application.iferror(application.match(.cells(i,1),sheets(2).columns(1),0),0)=0 then
            lrd = sheets(2).cells(sheets(2).rows.count,1).end(xlup).row
            sheets(2).cells(lrd+1,1).value = .cells(i,1).value
        end if
    next i
end with

这将允许您检查该值是否存在(使用match),如果不匹配,它将被添加到该列表底部,然后从源数据移动到下一行。

您还可以使用application.isna()而不是iferror来获取true/falseCyril的advanage,我得到一个“未定义属性let过程且属性get过程未返回且对象”这一行出现错误:lrs=.Cells(.Rows.Count,1)。Row(xlUp)。Row“有什么想法吗?如果我遗漏了一些明显的内容,请再次道歉。检查我所做的编辑。抱歉,我将行(xlUp)而不是结束(xlUp)放在了行(xlUp)中正如我在衣领上写下的,而不是在IDECyril中,你这个美丽的天才。它就像一个符咒。我唯一需要改变的是在最后一个变量(lrd)前面加上“Dim”.谢谢你的帮助。Cyril,我想在发布单独的问题之前,我会尽快跟进你,因为你对这个回答非常有帮助。我正试图在最后一个if语句中插入一行,使“新值”的字体颜色被添加到第2页红色的行中,我遇到了问题。我的想法是“新”值会突出,并且我的自动筛选线会将它们显示到顶部。我只是想使用条件格式,但我认为VBA解决方案会更干净。再次感谢您对我的第一个问题的帮助。
dim i as long, dim lrs as long, lrd as long
with sheets(1)
    lrs = .cells(.rows.count,1).end(xlup).row
    for i = 2 to lrs 'assumes header in row 1
        if application.iferror(application.match(.cells(i,1),sheets(2).columns(1),0),0)=0 then
            lrd = sheets(2).cells(sheets(2).rows.count,1).end(xlup).row
            sheets(2).cells(lrd+1,1).value = .cells(i,1).value
        end if
    next i
end with