Excel VBA 宏给出了意想不到的结果?

Posted

技术标签:

【中文标题】Excel VBA 宏给出了意想不到的结果?【英文标题】:Excel VBA macro gives unexpected results? 【发布时间】:2020-12-16 08:13:46 【问题描述】:

我有一个宏循环遍历工作表 (Sheet4) 以将数据放入另一个工作表 (Ark7)。 'rKvartal' 变量是从第三张表 (Ark4) 中获取的文本字符串。只有满足外循环中的两个条件,才会进入内循环。这部分有效。我的问题是宏列出了内部循环中不小于或等于“rKvartal”变量的数据。 (这必须在宏中完成)宏如下所示:

Dim C, C2 As Range
Dim rKvartal As String


Application.ScreenUpdating = False

    Ark7.Columns("B:F").ClearContents
    
    cValOffset = 101
    cVal = 2 'row# where data in rLog (ark7) goes to
    rKvartal = Sheet3.Range("AP24") 'Criteria to filter data
    
    'Create headers for use in the list being created
    Ark7.Cells(1, 2).Value = "ID"
    Ark7.Cells(1, 3).Value = "Sansynlighed"
    Ark7.Cells(1, 4).Value = "Konsekvens"
    Ark7.Cells(1, 5).Value = "Sum"
    Ark7.Cells(1, 6).Value = "Kvartal"
    
    For Each C In Sheet4.Range("W15:W114")
        If C = "Risk" Or C = "Occured" Then
            For Each C2 In Sheet4.Range("K15:K114")
                    If C2 <= rKvartal Then
                        'All cells that are either a risk or occured and that is less than or equal to e.g Q4 2021
                        Ark7.Cells(cVal, 2).Value = C.Offset(0, -21).Value
                        Ark7.Cells(cVal, 3).Value = C.Offset(0, -15).Value
                        Ark7.Cells(cVal, 4).Value = C.Offset(0, -14).Value
                        Ark7.Cells(cVal, 5).Value = C.Offset(0, -13).Value
                        Ark7.Cells(cVal, 6).Value = C.Offset(0, -12).Value
                        cVal = cVal + 1
                        Exit For
                    End If
            Next C2
        End If
    Next C
    
    ActiveWorkbook.Worksheets("rLog").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("rLog").Sort.SortFields.Add2 key:=Range("E2"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("rLog").Sort
            .SetRange Range("B2:F100")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        
    Ark7.Activate
    Ark7.Range(Cells(1, 2), Cells(8, 6)).Select 
    Application.CutCopyMode = False
    ActiveSheet.ListObjects.Add(xlSrcRange, Ark7.Range(Cells(1, 2), Cells(8, 6)), , xlYes).Name = "RisikoSorteret" 'Laver en tabel eller liste
    ActiveSheet.ListObjects("RisikoSorteret").TableStyle = "Tabeltypografi 3" 'Giver listen en typografi
End Sub

【问题讨论】:

【参考方案1】:

rKvartal 是一个字符串变量,因此数字比较(“小于”或“大于”)将不起作用,因为它们仅适用于数字和日期。 如果文本字符串rKvartal 表示一个数字或日期值,请考虑使用CDec()CDate() 来获取该值。 或者,如果Sheet3.Range("AP24") 将包含数字或日期而不是文本,则只需更改变量类型即可;

'Change
Dim rKvartal As String

'To any one of the below:
Dim rKvartal as Long     'Integer
Dim rKvartal as Date     'Date
Dim rKvartal as Double   'Decimal

【讨论】:

是的,我尝试将 'rKvartal' 调暗到日期,而 'Sheet3.Range("AP24")' 表示确实是一个日期,但不幸的是结果仍然相同......跨度> “代表”是什么意思?单元格是否有 excel 日期值,或者只是表示日期的文本? (要找出答案,请尝试更改单元格的数字格式;如果它可以让您更改为不同的格式,例如短日期、长日期或数值,则为日期值;如果不是,则为文本)。 如果单元格值是文本而不是日期值,您需要将rKvartal = Sheet3.Range("AP24") 更改为rKvartal = CDate(Sheet3.Range("AP24")) sheet3.range("AP23") 中的单元格是未格式化的日期,因此它用数字表示,例如44105 表示 2020 年 10 月 1 日。数据源表中的 C2 变量也是一个未格式化的日期,表示为一个数字 - 所以在我的书中,我比较 apples-apples 作为单步执行代码显示我 44105 尽管如此我仍然得到相同的结果。 好的——我唯一能建议的就是继续单步调试代码,直到它开始做错事,然后检查变量,看看哪个是错的。您可能想要注释掉“application.screenupdating=false”,这样您就可以看到工作表上发生了什么。我正在努力确定应该使该代码产生意外结果的其他任何内容。【参考方案2】:

我自己想通了。内循环是多余的。它只需要条件而不是另一个循环:

    For Each C In Sheet4.Range("W15:W114")
        If C = "Risiko" Or C = "Indtraf" Then
            If C.Offset(0, 1).Value <= rKvartal Then
                'Alle risici der opfylder kriterierne
                Ark7.Cells(cVal, 2).Value = C.Offset(0, -21).Value
                Ark7.Cells(cVal, 3).Value = C.Offset(0, -15).Value
                Ark7.Cells(cVal, 4).Value = C.Offset(0, -14).Value
                Ark7.Cells(cVal, 5).Value = C.Offset(0, -13).Value
                Ark7.Cells(cVal, 6).Value = C.Offset(0, 1).Value
                cVal = cVal + 1
            End If
        End If
    Next C

【讨论】:

以上是关于Excel VBA 宏给出了意想不到的结果?的主要内容,如果未能解决你的问题,请参考以下文章

excel使用宏编写简单算法后运行无输出结果

MS Access VBA 导出查询结果

Excel VBA宏根据日期选择数据并将其移动到新选项卡

如何用EXCEL VBA编写模糊查询程序,并将结果显示在工作表中

有没有办法让 Excel VBA 宏提示输入文件? [复制]

VBA将单元格内容分配为公式而不是其结果