excel 高级过滤器:当我用日期替换纯文本时出现错误1004

nom7f22z  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(76)

我有一个代码,当标题是文本(如'日期1','日期2',...)时工作正常,但日期1,2...。应该是实际日期,可以在另一个工作表中找到(最初来自数据透视表)。
因此,只要我将'date 1'替换为日期,如01/08/2023或公式,以从另一个工作表中获取日期,它就会出错,我在这一行得到一个运行时错误1004:

ShtSource.Range("A13").CurrentRegion.AdvancedFilter xlFilterCopy, CriteriaRange, CopyToRange

字符串
这是完整的代码:

Sub Proposal()
    
    ' voorstel om door te sturen naar de klant
    
    Dim c As Range
    
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    Dim ShtSource As Worksheet: Set ShtSource = ThisWorkbook.Sheets("Voorstel")
    Dim CopyToRange As Range: Set CopyToRange = Workbooks.Add.Sheets(1).Range("A1").Resize(2, 6)
    Dim CriteriaRange As Range: Set CriteriaRange = CopyToRange.Offset(, 8).Resize(2, 1)
    
    CopyToRange.Resize(1) = Array(ShtSource.[a13], ShtSource.[b13], ShtSource.[d13], ShtSource.[f13], ShtSource.[h13], ShtSource.[j13])
    CriteriaRange.Value = Application.Transpose(Array("# Pal", "<>0"))
    ShtSource.Range("A13").CurrentRegion.AdvancedFilter xlFilterCopy, CriteriaRange, CopyToRange
    
    CriteriaRange.ClearContents
    
    Application.DisplayAlerts = True
    
    Range("A1").Select
    Range("A1").Activate
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 15773696
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
    Range("B1:F1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 49407
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    With Selection.Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With
    Columns("A:G").Select
    Range("A1").Activate
    Columns("A:G").EntireColumn.AutoFit
    Range("A1").Select
    
End Sub


我不知道为什么这段代码将不再工作,只要我用同一个单元格中的日期文本替换单元格,我尝试了不同的格式,但这也不起作用。
有人知道问题出在哪里吗?
这是我的文件看起来像:
x1c 0d1x的数据
这就是我需要的结果:


cu6pst1q

cu6pst1q1#

问题出在Range.AdvancedFilter方法的CopyToRange参数上。
首先,我将你的代码简化为一个更短的测试用例:

Sub CopyErrorTest()
    
    Dim ShtSource As Worksheet: Set ShtSource = ThisWorkbook.Sheets("Sheet1")
    Dim CopyToRange As Range: Set CopyToRange = Workbooks.Add.Sheets(1).Range("A1").Resize(2, 6)
    Dim CriteriaRange As Range: Set CriteriaRange = CopyToRange.Offset(, 8).Resize(2, 1)
    
    CopyToRange.Resize(1) = Array(ShtSource.[a13], ShtSource.[b13], ShtSource.[d13], ShtSource.[f13], ShtSource.[h13], ShtSource.[j13])
    CriteriaRange.Value = Application.Transpose(Array("# Pal", "<>0"))
    
    ShtSource.Range("A13").CurrentRegion.AdvancedFilter xlFilterCopy, CriteriaRange, CopyToRange
    
    CriteriaRange.ClearContents
    
End Sub

字符串
在我的测试用例中,我输入了日期1/8/2023,而不是B13中的datum 1。然后,我得到了你得到的错误。你自己试试这个。您将看到它创建的工作簿已经复制了标题,但日期的格式不存在,它被转换为常规格式。这将更改新工作簿上单元格中的测试。由于新工作表中的范围内容不相同,因此会抛出错误。因此,您需要更改新工作表中包含日期的单元格的格式。您可以使用Range.NumberFormat方法来实现这一点。
在我的测试示例中,添加这一行:

CopyToRange.Cells(1, 2).NumberFormat = "m/d/yyyy"


AdvanceFilter行修复这个问题之前,因为我正在更改日期格式(以及单元格中的文本)以匹配我们正在复制的范围。(请记住,您可能不会使用此日期格式,因为这是美国格式。
一般来说,当你的代码没有按预期工作时,试着创建一个非常简单的测试用例来复制这个问题。这更容易遵循和调试,然后您可以将结果带回到“真实的的”代码中。

相关问题