Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel vba在空白单元格上向下复制_Vba_Excel_Scripting - Fatal编程技术网

excel vba在空白单元格上向下复制

excel vba在空白单元格上向下复制,vba,excel,scripting,Vba,Excel,Scripting,A列有如下数据(即经常出现的空白单元格): 我绝对不建议使用字符串连接来构建单元地址,就像您在这里所做的那样:Range(origincells(I)和):“&Left(origincells(I),1)和numrows)。这是不必要的混乱,难以书写,难以阅读。例如,使用.Cells、Resize和Offset方法 另外,我会避免使用.Copy,因为这会使您的数据通过系统的剪贴板传输。其他应用程序可能同时读取和写入剪贴板,这将导致异常和不可预测的行为 最后,与在单元格中循环相比,将整个范围一次加

A列有如下数据(即经常出现的空白单元格):

我绝对不建议使用字符串连接来构建单元地址,就像您在这里所做的那样:
Range(origincells(I)和):“&Left(origincells(I),1)和numrows)
。这是不必要的混乱,难以书写,难以阅读。例如,使用
.Cells
Resize
Offset
方法

另外,我会避免使用
.Copy
,因为这会使您的数据通过系统的剪贴板传输。其他应用程序可能同时读取和写入剪贴板,这将导致异常和不可预测的行为

最后,与在单元格中循环相比,将整个范围一次加载到
Variant
数组中,在该数组中执行所有循环和操作,最后将整个内容一次写入工作表,效率更高。这是我在下面使用的方法

这将实现以下目的:

Dim varData As Variant
Dim i As Long

varData = Sheet1.Range("A1:A14") '// Read in the data.

For i = LBound(varData, 1) + 2 To UBound(varData, 1)
    If IsEmpty(varData(i, 1)) Then
        '// Cell is empty. Copy value from above.
        varData(i, 1) = varData(i - 1, 1)
    End If
Next i

'// Write result to sheet.
Sheet1.Range("D1").Resize(UBound(varData, 1) - LBound(varData, 1) + 1, 1) _
    = varData

在上一篇堆栈溢出文章中可以找到一个简单的非VBA解决方案:要使这项工作适合您,只需将数据从a列复制到d列,然后按照d列中的步骤进行操作。
HEADING  <-- this is D1
kfdsl
fdjgnm
fdkj
fdkj
fdkj
gdfkj
4353
4353
fdjk  
fdjk
fdjk
fdjk
blah     <-- this is D14 
For i = 0 To UBound(origincells) 
 numrows = originsheet.Range(Left(origincells(i), 1) & "65536").End(xlUp).Row - 1
 originsheet.Range(origincells(i) & ":" & Left(origincells(i), 1) & numrows).Copy
 destsheet.Range(destcells(i) & ":" & Left(destcells(i), 1) & (Val(Right(origincells(i), 1)) + numrows)).PasteSpecial
Next
Dim varData As Variant
Dim i As Long

varData = Sheet1.Range("A1:A14") '// Read in the data.

For i = LBound(varData, 1) + 2 To UBound(varData, 1)
    If IsEmpty(varData(i, 1)) Then
        '// Cell is empty. Copy value from above.
        varData(i, 1) = varData(i - 1, 1)
    End If
Next i

'// Write result to sheet.
Sheet1.Range("D1").Resize(UBound(varData, 1) - LBound(varData, 1) + 1, 1) _
    = varData