Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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/8/design-patterns/2.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 RemovedUpplicates未按预期工作_Excel_Vba - Fatal编程技术网

Excel RemovedUpplicates未按预期工作

Excel RemovedUpplicates未按预期工作,excel,vba,Excel,Vba,我有一个从网站导出的大型数据集。我使用主“筛选”工作簿中的宏查找文件,并将数据从导出文件的Sheet1复制到筛选工作簿的Sheet1中 将数据复制到筛选工作簿的Sheet1后,我使用VBA将筛选工作簿的Sheet1中的A/B/D/F/H/Z/AA/etc列复制到筛选工作簿的Sheet2中,同时,我在此处使用此代码尝试删除任何重复的行: 工作表(“表2”)。范围(“A:DZ”)。删除的重复列:=15,标题:=xlYes 我发现移除的副本并没有像预期的那样工作 例如,筛选工作簿(和导出工作簿)中的S

我有一个从网站导出的大型数据集。我使用主“筛选”工作簿中的宏查找文件,并将数据从导出文件的Sheet1复制到筛选工作簿的Sheet1中

将数据复制到筛选工作簿的Sheet1后,我使用VBA将筛选工作簿的Sheet1中的A/B/D/F/H/Z/AA/etc列复制到筛选工作簿的Sheet2中,同时,我在此处使用此代码尝试删除任何重复的行:

工作表(“表2”)。范围(“A:DZ”)。删除的重复列:=15,标题:=xlYes

我发现移除的副本并没有像预期的那样工作

例如,筛选工作簿(和导出工作簿)中的Sheet1有3344行。当我使用条件格式手动筛选以突出显示重复项时,我可以找到314行列为重复项(这意味着157行实际数据的真实行和157行实际数据的重复行。我没有发现任何重复项存在超过一次的示例)。所以在Sheet2上,我希望看到3344–157=3157行真实数据。我看不到,甚至没有3030行(3344-314)。相反,我将1897行粘贴到Sheet2中,这是1447行的差异(比预期少1290行)

除此之外,我正在手动检查数据,通过在列中使用Control-F查看情况,并发现在某些情况下,Sheet2中缺少两个重复项(而不是仅删除一个重复行)

重复数据不在连续行上,而是分散在表2中的整个列中。但当我在尝试删除重复项之前对其进行排序时,它似乎不会影响其准确性或使其正确。 我还尝试在代码的不同位置/不同时间使用DeleteDuplicates,但结果总是以相同的数量关闭(缺少1447行,而不是157行)

我在这个网站上只找到了几篇文章,这篇文章是最接近我的文章,但并没有让我安静下来:

其他帮助网站/论坛提到Office2007存在一些bug,使其无法工作(我使用的是2013)

是否有人知道我在哪里可以找到解决方法,或者是否存在,或者这是否仍然是一个真正的bug,或者只是我上面的代码行的一个问题

Adding bits of code I use in this example in case it is something within     these that is causing the problem…
Part of the copy code: 
wsFromSheet.Cells.Copy
wsToFile.Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
wbFromFile.Close True

Part of the ‘paste column code’:
Sheets("Sheet2").Rows(1 & ":" &     Sheets("Sheet2").Columns.Count).ClearContents 'Clear from row 1 down
LastRowFromSiteTracker = xSht.Cells.SpecialCells(xlCellTypeLastCell).Row      'original report has 128 columns
xSht.Range("B1:B" & LastRowFromSiteTracker).Copy ySht.Cells(Rows.Count,    "A").End(xlUp)      'customer name
‘repeat a bunch of times, then…
Application.CutCopyMode = False  'do I need this line?
Worksheets("Sheet2").Range("A:DZ").RemoveDuplicates Columns:=15,   Header:=xlYes 
End Sub


Example/sample of data:

Row Source Data Expected Data   Actual Data
1   1000474608  1000474608  1000474608 (Dup missing from sheet2)
2   1000474608  1000487672  1000487672
3   1000487672  1000487674  1000487674
4   1000487674  1000487676  1000487676 (missing from sheet2, wasn’t a dup)
5   1000487676  1000487678  1000487678
6   1000487678  1000487680  1000487680
7   1000487680  1000487682  1000487682 (Dup missing from sheet2)
8   1000487682  1000520278  1000520278
9   1000487682  1000520280  1000520280
10  1000520278  1000520282  1000520282 (Is there)
11  1000520280  1000520286  1000520286
12  1000520282  1000520336  1000520336 (Is there)
13  1000520282  1000520338  1000520338
14  1000520286  1000520392  1000520392
15  1000520286  1000520394  1000520394
16  1000520336  1000530333  1000530333
17  1000520338      
18  1000520392      
19  1000520394      
20  1000530333      
编辑:编辑:编辑: 所以我尝试了更多的手工测试,用同一组数据做了两件不同的事情,得到了两个不同的结果。我使用了“条件格式-高亮显示主主主功能区中的重复项”和“删除数据功能区中的重复项”

“删除重复项”按钮在列p中查找并删除163项,并保留3181行

但是,当我使用Highlight Duplicates条件格式时,会在p列中找到314个重复项,留下3030个非重复项

这两个数字不匹配是没有意义的。我认为这与重复项本身有关——因为大多数重复项本身只有一个dup(123123显示在两行中),但只有少数行被重复多次(234234显示在4或6列中)

因此,我没有使用手动方式,而是使用了我在网上找到的建议,这两种方法在运行时也会提供不同的结果:

3344 Base records

1897 left after scrub of duplicates  (1446 removed)

Dim tmpAddress As String
tmpAddress = "A2:BZ" & Worksheets("ColScrub").UsedRange.Rows.Count 
Worksheets("ColScrub").Range(tmpAddress).RemoveDuplicates Columns:=15, Header:=xlNo


3181 left after scrub of duplicates (162 removed)

Cells.Select
ActiveSheet.Range("$A$1:$EI$3345").RemoveDuplicates Columns:=31, Header:=xlYes
1) 清除的行数与清除的列数相同,而不是行数 此外,您可能没有清除任何内容,因此请使用UsedRange.Rows进行适当的行计数

这条线

Sheets("Sheet2").Rows(1 & ":" & Sheets("Sheet2").Columns.Count).ClearContents 
应该是

Sheets("Sheet2").Rows(1 & ":" & Sheets("Sheet2").UsedRange.Rows.Count).ClearContents 
如果不正确清除旧数据,可能会出现不可预测的结果

2) Excel VBA似乎有点奇怪,因为如果没有明确地“选择”有问题的对象并指定完整的(非列)范围,许多事情将无法正常工作

3) 我还更喜欢省略标题行(注意“A2”),并传递标题:=xlNo

4) 除非您有超过625列,否则BZ应该足够远了

因此,将此添加到您的代码中

Dim tmpAddress as String

tmpAddress = "A2:BZ" & Worksheets("Sheet2").UsedRange.Rows.Count

Worksheets("Sheet2").Activate
Worksheets("Sheet2").Range(tmpAddress).RemoveDuplicates Columns:=15, Header:=xlNo 
希望这有帮助:)

我不知道为什么(或者是否/如何)这有什么不同,但这似乎是我最接近于真正删除重复项的方法。我想把它添加到这里,作为其他类似情况下的答案

 Dim lastrow As Long


With ThisWorkbook.Worksheets("ColScrub")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastrow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row  'Change P1 back to A1 if needed
    Else
        lastrow = 1
    End If

    .Range("A1:AZ" & lastrow).RemoveDuplicates Columns:=Array(16), Header:=xlYes
End With
Dim lastrow尽可能长
使用此工作簿。工作表(“ColScrub”)
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lastrow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
匹配案例:=False)。行“如果需要,将P1更改回A1”
其他的
lastrow=1
如果结束
.Range(“A1:AZ”和lastrow)。移除的重复列:=数组(16),标题:=xlYes
以

我必须直观地检查每一行,以证明这一点,我认为,并排除它不是删除不应该删除的内容-但这似乎消除了“双重重复”(4-6行项目,而不是像其他重复的2行项目)

我进一步的经验表明,如果您有空行或空列,UsedRange是完全不可靠的。UprDRANGE只包含到空白行的行/列。我找到了一个更好的方法来获得最后一个。这些函数使用两个基本假设,这对大多数电子表格都适用

  • 对于LastRow,有一个“键”列,即必须为 数据,例如ID列
  • 对于LastCol,应该有一个标题行(或可以保证最后一列已填充的行)
  • 考虑到这一点,我创建了以下两个函数,每次都能准确地检索最后的值。。。几乎(我的完整函数处理合并单元格的页脚行问题)

    最后一排
    
    公共职能
    
    Public Function Excel_GetLastCol(xlSheet As Excel.Worksheet, _
                                             ByVal HeaderRow As Long) As Long
    ' This could be adjusted for exact max columns Excel allows
    Const MAX_XL_COLS As Long = 16000
    Excel_GetLastCol = xlSheet.Cells(MAX_XL_COLS, HeaderRow).End(xlToLeft).Column
    End Function