excel - Excel VBA代码将结果粘贴到错误的范围内
问题描述
将一个范围复制到另一个范围的脚本。但是,当我尝试将范围从 Sheet1 复制到 Sheet2 时,结果不会粘贴到 J 列中,而是以 8 列(R 列)的偏移量粘贴。我不明白为什么?RowCountSummary 和 ColumnCountSummary 都设置为 0,即范围的第一个索引?
Sub InsertForecastData()
Dim ColumnsCount As Integer
Dim ColCounter As Integer
Dim RowsCount As Integer
Dim ForeCastRange As Range
Dim ForecastWS As Worksheet
Dim SummaryWs As Worksheet
Dim PasteRange As Range
Dim ColumnCountSummary As Integer
Dim RowCountSummary As Integer
ColumnsCount = 300
ColCounter = 0
RowsCount1 = 0
RowsCount2 = 47
ColumnCountSummary = 0
RowCountSummary = 0
Do While ColCounter <= ColumnsCount
Worksheets("Sheet1").Select
Set ForeCastRange = Worksheets("Sheet1").Range("B2:KN49")
With ForeCastRange
.Range(.Cells(RowsCount1, ColCounter), .Cells(RowsCount2, ColCounter)).Copy
End With
Worksheets("Sheet2").Select
Set PasteRange = Worksheets("Sheet2").Range("J2:J13915")
With PasteRange
.Range(.Cells(RowCountSummary, ColumnCountSummary), .Cells(RowCountSummary + RowsCount2, ColumnCountSummary)).PasteSpecial
End With
RowCountSummary = RowCountSummary + 48
ColCounter = ColCounter + 1
Loop
End Sub
解决方案
以前遇到过这种行为,可以通过这个简单的演示看到
Sub test()
With Sheet1.Range("J3:J100")
Debug.Print .Range(.Cells(0, 0), .Cells(47, 0)).Address
End With
End Sub
结果为 4 美元:51 美元。如果对列 B 到 J 重复运行,则结果为 B、D、F、H、J、L、N、P,显示加倍效果。我认为 B 可以,因为列号为零。
您可以通过设置 RowCountSummary = 1 和 ColumnCountSummary = 1 并添加 .parent 来修复您的代码
With PasteRange
.Parent.Range(.Cells(RowCountSummary, ColumnCountSummary), _
.Cells(RowCountSummary + RowsCount2, ColumnCountSummary)).PasteSpecial
结束于
或者你可以试试这个
Sub InsertForecastData1()
Const columnCount As Integer = 3
Const rowCount As Integer = 48
Const sourceCol As String = "B"
Const targetCol As String = "J"
Const startRow As Integer = 2
Const records As Integer = 300
Dim rngSource as Range, rngTarget As Range
Dim start as Single, finish as Single
Set rngSource = Worksheets("Sheet1").Range(sourceCol & startRow)
Set rngSource = rngSource.Resize(rowCount, columnCount)
Set rngTarget = Worksheets("Sheet2").Range(targetCol & startRow)
start = Timer
Application.ScreenUpdating = False
Dim i As Integer
For i = 1 To records
'Debug.Print rngSource.Address, rngTarget.Address
rngSource.Copy rngTarget
Set rngSource = rngSource.Offset(rowCount, 0)
Set rngTarget = rngTarget.Offset(rowCount, 0)
Next i
Application.ScreenUpdating = True
finish = Timer
MsgBox "Completed " & records & " records in " & finish - start & " secs"
End Sub
请参阅文档的备注部分
推荐阅读
- javascript - 承诺解决时状态更改意外重置
- sql - VBA 到 SQL 存储过程参数格式问题
- nginx - 基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游
- multithreading - 使用多线程时无法初始化 global.run
- python - 尝试制作遗传算法
- github - 通过 livy 提交存储在 github 中的文件以触发 spark
- django - 谷歌云构建错误:找不到 --substitutions 标志
- php - 使用 PHP 中的 PayPal API 直接将资金从一个个人帐户转移到另一个帐户
- json - VB.Net 将 JSON 数组解析为键值对的字典以实现与 Xojo 代码相同的结果,(示例)
- bash - sed 命令 a 需要 \ 后跟文本