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 个字符? [复制]
[VBA-EXCEL]Lister les fichiers d';un répertoire donné