![Создание ссылок на ячейки в вызове другого макроса](https://rvso.com/image/1601465/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA%20%D0%BD%D0%B0%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B8%20%D0%B2%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0.png)
Я пытаюсь скопировать переменное количество строк данных (значений и форматов) с одного листа на другой. Чтобы сделать это, я нашел и успешно использовал код VBA в Интернете, который копирует по одной ячейке за разCopy_ValueFormat(cell1 As Range, cell2 As Range)
Но Call падает, когда я вызываю этот код из вложенных циклов For. Ясно, что я неправильно форматирую ссылки на ячейки в Call, так как получаю следующую ошибку: [Run-time error '9': Subscript out of Range]
Может ли кто-нибудь сказать мне, что я делаю не так?
'THIS IS THE VBA I GOT OFF THE
'Copy Value and formats from one cell to another
Sub Copy_ValueFormat(cell1 As Range, cell2 As Range)
Dim sel As Range
Set sel = Selection
Application.ScreenUpdating = False
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteFormats
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteValues
sel.Activate
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
'THIS IS SOME TEST CODE THAT SUCCESSFULLY CALLS "Copy_ValueFormat(...)"
Sub TestCopy()
Call Copy_ValueFormat(Range("ONGOING!B2"), Range("BF2"))
End Sub
'THIS IS MY CODE THA CRASHES WHEN I MAKE THE CALL TO "Copy_ValueFormat(...)"
Sub TestForNext()
Dim i As Long
Dim j As Long
Sheets("JUNK").Select
Cells.ClearContents
For i = 1 To 10 'Row Counter
For j = 1 To 20 'Column Counter
Call Copy_ValueFormat(Sheets("ONGOING!").Cells(i, j), Sheets("JUNK").Cells(i, j))
Next j
Next i
End Sub
решение1
Вам не нужно выбирать что-то, чтобы работать с этим, и идея сбора текущего выбора, чтобы вернуться к нему, не нужна. Вызовы Application.ScreenUpdating
служат только для того, чтобы моргать экраном.
Использование Call
для запуска подпроцедуры было выведено из употребления. Обратите внимание, что без него передаваемые параметры не заключаются в скобки.
Исходный источник копии остается на месте после xlPasteFormats; вам не нужно копировать его снова.
Sub Copy_ValueFormat(cell1 As Range, cell2 As Range)
cell1.Copy
cell2.PasteSpecial Paste:=xlPasteFormats
cell2.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
Sub TestForNext()
Dim i As Long, j As Long
'if you want to halt screen updating, this is where it should be
Application.ScreenUpdating = False
With Worksheets("JUNK")
.Cells.Clear '<~~ clear values and formats
For i = 1 To 10 'Row Counter
For j = 1 To 20 'Column Counter
Copy_ValueFormat Worksheets("ONGOING!").Cells(i, j), .Cells(i, j)
Next j
Next i
End With
Application.ScreenUpdating = True
End Sub