Excel VBA,range.value = range.value,意外结果

Posted

技术标签:

【中文标题】Excel VBA,range.value = range.value,意外结果【英文标题】:Excel VBA, range.value = range.value, unexpected results 【发布时间】:2014-11-28 15:13:09 【问题描述】:

希望有人能指出为什么这不起作用。基本上通过vba在表的最后一行(Row41)插入新行,这会将最后一行向下推(在数据中创建一个间隙)然后最后一行值向上传输一行,因此空白行位于底部。

除了两个单元格值随机变化之外,现在这个过程工作正常,下面是之前和之后

之前:

细胞 (41,B) = 03/10/14 单元格(41,C) = 12345 单元格(41,E) = 3.00 单元格(41,F) = DD

之后:

细胞 (41,B) = 03/10/14 单元格(41,C) = 12345 单元格(41,E) = 41915 单元格(41,F) = 41915

我已经仔细检查了设定的范围,它们应该是,有什么想法吗?哦,对于代码,Specific_Tbl 变量是 2

    '[Capture table First/Last row number]
    int_FirstRow = .Cells(4, "AC").Offset(0, Specific_Tbl)
    int_LastRow = .Cells(6, "AC").Offset(0, Specific_Tbl)

    '[Insert Blank Row]
    .Range("A" & int_LastRow & ":Z" & int_LastRow).Insert shift:=xlDown

    '[Set Cell Ranges]
    Select Case Specific_Tbl
        Case 1
            '[Remerge Description]
            .Range(.Cells(int_LastRow, "E"), .Cells(int_LastRow, "H")).MergeCells = True
            Set rng_Tmp1 = .Range("B" & int_LastRow & ":C" & int_LastRow & ",E" & int_LastRow & ":J" & int_LastRow)
            Set rng_Tmp2 = .Range("B" & int_LastRow + 1 & ":C" & int_LastRow + 1 & ",E" & int_LastRow + 1 & ":J" & int_LastRow + 1)
        Case 2, 3
            Set rng_Tmp1 = .Range("B" & int_LastRow & ":C" & int_LastRow & ",E" & int_LastRow & ":F" & int_LastRow)
            Set rng_Tmp2 = .Range("B" & int_LastRow + 1 & ":C" & int_LastRow + 1 & ",E" & int_LastRow + 1 & ":F" & int_LastRow + 1)
    End Select

    '[Transfer values and clear]
    rng_Tmp1.Value = rng_Tmp2.Value
    rng_Tmp2.ClearContents

【问题讨论】:

你有没有设置断点并单步执行代码? 嗨,PJ,是的,通过,一切正常,直到 rng_Tmp1.value = rng_Tmp2.value 嗨 pnuts,谢谢,我确实认为它来自日期,但我不明白为什么 谢谢PJ,不管是通过案例1,2还是3,结果都是一样的。在 value = value 范围是正确的,我通过即时窗口 rng_Tmp1 = $B$41:$C$41,$E$41:$F$41, rng_Tmp2 =$B$42:$C$42,$E 检查42 美元:42 美元。而且 pnuts 是正确的,它绝对是 B 列的日期被放入 E 和 F 列,我只是不明白为什么。 也许做一个分割范围 value = value 只是行不通,即使范围完全相同。 【参考方案1】:

不幸的是,我从未发现为什么 excel vba 无法像我认为的那样处理拆分范围。解决方法是通过添加更多范围变量来处理分割范围的每一侧。

    '[Capture table First/Last row number]
    int_FirstRow = .Cells(4, "AC").Offset(0, Specific_Tbl)
    int_LastRow = .Cells(6, "AC").Offset(0, Specific_Tbl)

    '[Insert Blank Row]
    .Range("A" & int_LastRow & ":Z" & int_LastRow).Insert shift:=xlDown

    '[Set Cell Ranges]
    Select Case Specific_Tbl
        Case 1
            '[Remerge Description]
            .Range(.Cells(int_LastRow, "E"), .Cells(int_LastRow, "H")).MergeCells = True
            Set rng_Tmp1 = .Range("B" & int_LastRow & ":C" & int_LastRow)
            Set rng_Tmp2 = .Range("B" & int_LastRow + 1 & ":C" & int_LastRow + 1)
            Set rng_Tmp3 = .Range("E" & int_LastRow & ":J" & int_LastRow)
            Set rng_Tmp4 = .Range("E" & int_LastRow + 1 & ":J" & int_LastRow + 1)
        Case 2, 3
            Set rng_Tmp1 = .Range("B" & int_LastRow & ":C" & int_LastRow)
            Set rng_Tmp2 = .Range("B" & int_LastRow + 1 & ":C" & int_LastRow + 1)
            Set rng_Tmp3 = .Range("E" & int_LastRow & ":F" & int_LastRow)
            Set rng_Tmp4 = .Range("E" & int_LastRow + 1 & ":F" & int_LastRow + 1)
    End Select

    '[Transfer values and clear]
    rng_Tmp1.Value = rng_Tmp2.Value
    rng_Tmp3.Value = rng_Tmp4.Value
    rng_Tmp2.ClearContents
    rng_Tmp4.ClearContents

【讨论】:

以上是关于Excel VBA,range.value = range.value,意外结果的主要内容,如果未能解决你的问题,请参考以下文章

Excel C API 等效于 C# 中的 Interop Range.Value

如何最好地将 0 添加到 range.value 的开头,直到它在 Excel 中的长度为 13 个字符? [复制]

对于 Excel VBA 中的每个类属性

[VBA-EXCEL]Lister les fichiers d';un répertoire donné

如何在不循环的情况下将数组(Range.Value)传递给本机 .NET 类型?

请教excel汇总问题。vba